File indexing completed on 2024-05-26 04:34:17
0001 ''' 0002 SPDX-FileCopyrightText: 2019 Tusooa Zhu <tusooa@vista.aero> 0003 0004 This file is part of Krita-docker-color-slider. 0005 0006 SPDX-License-Identifier: GPL-3.0-or-later 0007 ''' 0008 from PyQt5.QtGui import QColor 0009 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton 0010 0011 from krita import Krita, DockWidget, ManagedColor, DockWidgetFactory, DockWidgetFactoryBase 0012 0013 from .slider_line import SliderLine 0014 from .ui_mixer_slider_docker import UIMixerSliderDocker 0015 0016 0017 class MixerSliderDocker(DockWidget): 0018 # Init the docker 0019 0020 def __init__(self): 0021 super(MixerSliderDocker, self).__init__() 0022 0023 main_program = Krita.instance() 0024 settings = main_program.readSetting("", "MixerSliderColors", 0025 "RGBA,U8,sRGB-elle-V2-srgbtrc.icc,1,0.8,0.4,1|" + 0026 "RGBA,U8,sRGB-elle-V2-srgbtrc.icc,0,0,0,1") # alpha=1 == non-transparent 0027 0028 self.default_left_color = self.qcolor_to_managedcolor(QColor.fromRgbF(0.4, 0.8, 1, 1)) 0029 self.default_right_color = self.qcolor_to_managedcolor(QColor.fromRgbF(0, 0, 0, 1)) 0030 0031 # make base-widget and layout 0032 self.widget = QWidget() 0033 self.sliders = [] 0034 self.top_layout = QVBoxLayout() 0035 self.main_layout = QHBoxLayout() 0036 self.top_layout.addLayout(self.main_layout) 0037 self.top_layout.addStretch(0) 0038 self.settings_button = QPushButton() 0039 icon = main_program.icon("configure") 0040 self.settings_button.setIcon(icon) 0041 self.settings_button.setToolTip(i18n('Change settings')) 0042 self.settings_button.setMaximumSize(30, 30) 0043 self.main_layout.addWidget(self.settings_button) 0044 self.layout = QVBoxLayout() 0045 self.layout.setSpacing(0) 0046 self.main_layout.addLayout(self.layout) 0047 for line in settings.split(";"): 0048 colors = line.split('|') 0049 if len(colors) < 2: # discard old configurations 0050 continue 0051 left_color = self.parse_color(colors[0].split(',')) 0052 right_color = self.parse_color(colors[1].split(',')) 0053 widget = SliderLine(left_color, right_color, self) 0054 self.sliders.append(widget) 0055 self.layout.addWidget(widget) 0056 0057 self.widget.setLayout(self.top_layout) 0058 self.setWindowTitle(i18n("Mixer Slider Docker")) 0059 self.setWidget(self.widget) 0060 [x.show() for x in self.sliders] 0061 0062 self.settings_button.clicked.connect(self.init_ui) 0063 0064 def settings_changed(self): 0065 if self.ui.line_edit is not None: 0066 num_sliders = int(self.ui.line_edit.text()) 0067 if len(self.sliders) > num_sliders: 0068 for extra_line in self.sliders[num_sliders:]: 0069 self.layout.removeWidget(extra_line) 0070 extra_line.setParent(None) 0071 0072 self.sliders = self.sliders[0:num_sliders] 0073 elif len(self.sliders) < num_sliders: 0074 for i in range(num_sliders - len(self.sliders)): 0075 widget = SliderLine(self.default_left_color, self.default_right_color, self) 0076 self.sliders.append(widget) 0077 self.layout.addWidget(widget) 0078 self.write_settings() 0079 0080 def get_color_space(self): 0081 if self.canvas() is not None: 0082 if self.canvas().view() is not None: 0083 canvas_color = self.canvas().view().foregroundColor() 0084 return ManagedColor(canvas_color.colorModel(), canvas_color.colorDepth(), canvas_color.colorProfile()) 0085 return ManagedColor('RGBA', 'U8', 'sRGB-elle-V2-srgbtrc.icc') 0086 0087 def init_ui(self): 0088 self.ui = UIMixerSliderDocker() 0089 self.ui.initialize(self) 0090 0091 def write_settings(self): 0092 main_program = Krita.instance() 0093 setting = ';'.join( 0094 [self.color_to_settings(line.left) + '|' + self.color_to_settings(line.right) 0095 for line in self.sliders]) 0096 0097 main_program.writeSetting("", "MixerSliderColors", setting) 0098 0099 def color_to_settings(self, managedcolor): 0100 return ','.join([managedcolor.colorModel(), 0101 managedcolor.colorDepth(), 0102 managedcolor.colorProfile()] + 0103 [str(c) for c in managedcolor.components()]) 0104 0105 def parse_color(self, array): 0106 color = ManagedColor(array[0], array[1], array[2]) 0107 color.setComponents([float(x) for x in array[3:]]) 0108 return color 0109 0110 def canvasChanged(self, canvas): 0111 pass 0112 0113 def qcolor_to_managedcolor(self, qcolor): 0114 mc = ManagedColor.fromQColor(qcolor, self.canvas()) 0115 return mc 0116 0117 def managedcolor_to_qcolor(self, managedcolor): 0118 return managedcolor.colorForCanvas(self.canvas()) 0119 0120 Application.addDockWidgetFactory(DockWidgetFactory("mixer_slider_docker", DockWidgetFactoryBase.DockRight, MixerSliderDocker))