1''' 2 Copyright (C) 2019 Tusooa Zhu <tusooa@vista.aero> 3 4 This file is part of Krita-docker-color-slider. 5 6 Krita-docker-color-slider is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 Krita-docker-color-slider is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with Krita-docker-color-slider. If not, see <https://www.gnu.org/licenses/>. 18''' 19from PyQt5.QtGui import QColor 20from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton 21 22from krita import Krita, DockWidget, ManagedColor, DockWidgetFactory, DockWidgetFactoryBase 23 24from .slider_line import SliderLine 25from .ui_mixer_slider_docker import UIMixerSliderDocker 26 27 28class MixerSliderDocker(DockWidget): 29 # Init the docker 30 31 def __init__(self): 32 super(MixerSliderDocker, self).__init__() 33 34 main_program = Krita.instance() 35 settings = main_program.readSetting("", "MixerSliderColors", 36 "RGBA,U8,sRGB-elle-V2-srgbtrc.icc,1,0.8,0.4,1|" + 37 "RGBA,U8,sRGB-elle-V2-srgbtrc.icc,0,0,0,1") # alpha=1 == non-transparent 38 39 self.default_left_color = self.qcolor_to_managedcolor(QColor.fromRgbF(0.4, 0.8, 1, 1)) 40 self.default_right_color = self.qcolor_to_managedcolor(QColor.fromRgbF(0, 0, 0, 1)) 41 42 # make base-widget and layout 43 self.widget = QWidget() 44 self.sliders = [] 45 self.top_layout = QVBoxLayout() 46 self.main_layout = QHBoxLayout() 47 self.top_layout.addLayout(self.main_layout) 48 self.top_layout.addStretch(0) 49 self.settings_button = QPushButton() 50 icon = main_program.icon("configure") 51 self.settings_button.setIcon(icon) 52 self.settings_button.setToolTip(i18n('Change settings')) 53 self.settings_button.setMaximumSize(30, 30) 54 self.main_layout.addWidget(self.settings_button) 55 self.layout = QVBoxLayout() 56 self.layout.setSpacing(0) 57 self.main_layout.addLayout(self.layout) 58 for line in settings.split(";"): 59 colors = line.split('|') 60 if len(colors) < 2: # discard old configurations 61 continue 62 left_color = self.parse_color(colors[0].split(',')) 63 right_color = self.parse_color(colors[1].split(',')) 64 widget = SliderLine(left_color, right_color, self) 65 self.sliders.append(widget) 66 self.layout.addWidget(widget) 67 68 self.widget.setLayout(self.top_layout) 69 self.setWindowTitle(i18n("Mixer Slider Docker")) 70 self.setWidget(self.widget) 71 [x.show() for x in self.sliders] 72 73 self.settings_button.clicked.connect(self.init_ui) 74 75 def settings_changed(self): 76 if self.ui.line_edit is not None: 77 num_sliders = int(self.ui.line_edit.text()) 78 if len(self.sliders) > num_sliders: 79 for extra_line in self.sliders[num_sliders:]: 80 self.layout.removeWidget(extra_line) 81 extra_line.setParent(None) 82 83 self.sliders = self.sliders[0:num_sliders] 84 elif len(self.sliders) < num_sliders: 85 for i in range(num_sliders - len(self.sliders)): 86 widget = SliderLine(self.default_left_color, self.default_right_color, self) 87 self.sliders.append(widget) 88 self.layout.addWidget(widget) 89 self.write_settings() 90 91 def get_color_space(self): 92 if self.canvas() is not None: 93 if self.canvas().view() is not None: 94 canvas_color = self.canvas().view().foregroundColor() 95 return ManagedColor(canvas_color.colorModel(), canvas_color.colorDepth(), canvas_color.colorProfile()) 96 return ManagedColor('RGBA', 'U8', 'sRGB-elle-V2-srgbtrc.icc') 97 98 def init_ui(self): 99 self.ui = UIMixerSliderDocker() 100 self.ui.initialize(self) 101 102 def write_settings(self): 103 main_program = Krita.instance() 104 setting = ';'.join( 105 [self.color_to_settings(line.left) + '|' + self.color_to_settings(line.right) 106 for line in self.sliders]) 107 108 main_program.writeSetting("", "MixerSliderColors", setting) 109 110 def color_to_settings(self, managedcolor): 111 return ','.join([managedcolor.colorModel(), 112 managedcolor.colorDepth(), 113 managedcolor.colorProfile()] + 114 [str(c) for c in managedcolor.components()]) 115 116 def parse_color(self, array): 117 color = ManagedColor(array[0], array[1], array[2]) 118 color.setComponents([float(x) for x in array[3:]]) 119 return color 120 121 def canvasChanged(self, canvas): 122 pass 123 124 def qcolor_to_managedcolor(self, qcolor): 125 mc = ManagedColor.fromQColor(qcolor, self.canvas()) 126 return mc 127 128 def managedcolor_to_qcolor(self, managedcolor): 129 return managedcolor.colorForCanvas(self.canvas()) 130 131Application.addDockWidgetFactory(DockWidgetFactory("mixer_slider_docker", DockWidgetFactoryBase.DockRight, MixerSliderDocker)) 132