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))