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