Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOnionSkinsDocker.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8#include "ui_KisOnionSkinsDocker.h"
9
10#include <QSlider>
11#include <QGridLayout>
12#include <QEvent>
13
14#include "kis_icon_utils.h"
15#include "kis_image_config.h"
17#include "kis_signals_blocker.h"
19#include "KisViewManager.h"
20#include "kis_action_manager.h"
21#include "kis_action.h"
23#include "KisMainWindow.h"
25
28
30 QDockWidget(i18n("Onion Skins"), parent),
31 ui(new Ui::OnionSkinsDocker),
32 m_updatesCompressor(300, KisSignalCompressor::FIRST_ACTIVE),
33 m_toggleOnionSkinsAction(0)
34{
35 QWidget* mainWidget = new QWidget(this);
36 setWidget(mainWidget);
37
38 KisImageConfig config(true);
39 ui->setupUi(mainWidget);
40
41 mainWidget->setContentsMargins(10, 10, 10, 10);
42
43
44 ui->doubleTintFactor->setMinimum(0);
45 ui->doubleTintFactor->setMaximum(100);
46 KisSpinBoxI18nHelper::setText(ui->doubleTintFactor,
47 i18nc("{n} is the number value, % is the percent sign", "Tint: {n}%"));
48
49 ui->btnBackwardColor->setToolTip(i18n("Tint color for past frames"));
50 ui->btnForwardColor->setToolTip(i18n("Tint color for future frames"));
51
52
53 QVBoxLayout *layout = ui->slidersLayout;
54
56 connect(m_equalizerWidget, SIGNAL(sigConfigChanged()), &m_updatesCompressor, SLOT(start()));
59 });
60 layout->addWidget(m_equalizerWidget, 1);
61
62 connect(ui->btnBackwardColor, SIGNAL(changed(KoColor)), &m_updatesCompressor, SLOT(start()));
63 connect(ui->btnForwardColor, SIGNAL(changed(KoColor)), &m_updatesCompressor, SLOT(start()));
64 connect(ui->doubleTintFactor, SIGNAL(valueChanged(qreal)), &m_updatesCompressor, SLOT(start()));
65
66 connect(&m_updatesCompressor, SIGNAL(timeout()),
67 SLOT(changed()));
68
69
70 {
71 const bool isShown = config.showAdditionalOnionSkinsSettings();
72 ui->btnShowHide->setChecked(isShown);
73 connect(ui->btnShowHide, SIGNAL(toggled(bool)), SLOT(slotShowAdditionalSettings(bool)));
75 }
76
77 setEnabled(false);
78
79 {
83 m_filterButtonGroup->setExclusive(false);
85 QWidget* filterButtonContainer = ui->colorFilterGroupbox;
86 QLayout* filterButtonLayout = ui->filterButtons;
87 filterButtonLayout->setSpacing(2);
88 QVector<QColor> availableColors = scm.allColorLabels();
89 QSet<int> viableColors;
90 for (int i = 0; i < availableColors.count(); i++) {
91 KisColorLabelButton* colorLabelButton = new KisColorLabelButton(availableColors[i], 22, filterButtonContainer);
92 filterButtonLayout->addWidget(colorLabelButton);
93 m_filterButtonGroup->addButton(colorLabelButton, i);
94 colorLabelButton->installEventFilter(m_dragFilter);
95 viableColors << i;
96 }
97
99
100 connect(m_filterButtonGroup, SIGNAL(idToggled(int,bool)), this, SLOT(slotFilteredColorsChanged()));
101 connect(ui->colorFilterGroupbox, SIGNAL(toggled(bool)), this, SLOT(slotFilteredColorsChanged()));
102 connect(ui->resetFilter, SIGNAL(pressed()), m_filterButtonGroup, SLOT(reset()) );
103 }
104
105 loadSettings();
107
108 // this mostly hides the checkboxes since no filtering is done by default
110
111 resize(sizeHint());
112}
113
114
119
121{
122 setEnabled(canvas != 0);
123}
124
129
131{
132 KisActionManager *actionManager = view->actionManager();
133
134 m_toggleOnionSkinsAction = actionManager->createAction("toggle_onion_skin");
135 connect(m_toggleOnionSkinsAction, SIGNAL(triggered()), SLOT(slotToggleOnionSkins()));
136
138 connect(view->mainWindow(), SIGNAL(themeChanged()), this, SLOT(slotUpdateIcons()));
139}
140
145
147{
148 // what colors are selected to filter??
149 QSet<int> selectedFilterColors = m_filterButtonGroup->getActiveLabels();
150
151 // show all colors if the filter is off and ignore the checkboxes
152 if(ui->colorFilterGroupbox->isChecked() == false) {
153 selectedFilterColors.clear();
154 selectedFilterColors << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8; // show everything
155 }
156
157 m_filterButtonGroup->setAllVisibility(ui->colorFilterGroupbox->isChecked());
158 ui->resetFilter->setVisible(ui->colorFilterGroupbox->isChecked());
159
160 // existing code
163}
164
166{
168 m_toggleOnionSkinsAction->setIcon(KisIconUtils::loadIcon("onion_skin_options"));
169 }
170}
171
173{
174 ui->lblPrevColor->setVisible(value);
175 ui->lblNextColor->setVisible(value);
176
177 ui->btnBackwardColor->setVisible(value);
178 ui->btnForwardColor->setVisible(value);
179
180 ui->doubleTintFactor->setVisible(value);
181
182 QIcon icon = KisIconUtils::loadIcon(value ? "arrow-down" : "arrow-up");
183 ui->btnShowHide->setIcon(icon);
184
186}
187
189{
190 KisImageConfig config(false);
191
193 config.setNumberOfOnionSkins(v.maxDistance);
194
195 for (int i = -v.maxDistance; i <= v.maxDistance; i++) {
196 config.setOnionSkinOpacity(i, v.value[i] * 255.0 / 100.0);
197 config.setOnionSkinState(i, v.state[i]);
198 }
199
200 config.setOnionSkinTintFactor(ui->doubleTintFactor->value() * 255.0 / 100.0);
201 config.setOnionSkinTintColorBackward(ui->btnBackwardColor->color().toQColor());
202 config.setOnionSkinTintColorForward(ui->btnForwardColor->color().toQColor());
203
205}
206
208{
209 KisImageConfig config(true);
210
211 KisSignalsBlocker b(ui->doubleTintFactor,
212 ui->btnBackwardColor,
213 ui->btnForwardColor,
215
216 ui->doubleTintFactor->setValue(qRound(config.onionSkinTintFactor() * 100.0 / 255));
219 ui->btnBackwardColor->setColor(bcol);
221 ui->btnForwardColor->setColor(bcol);
222
224}
225
227{
228 KisImageConfig config(true);
229
231 v.maxDistance = 10;
232
233 for (int i = -v.maxDistance; i <= v.maxDistance; i++) {
234 int value = config.onionSkinOpacity(i, useDefaults);
235
236 v.value.insert(i, qRound(value * 100.0 / 255.0));
237 v.state.insert(i, config.onionSkinState(i));
238 }
239
241}
float value(const T *src, size_t ch)
qreal v
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
void setAllVisibility(const bool vis)
void setViableLabels(const QSet< int > &buttons)
void setMinimumRequiredChecked(int checkedBtns)
EqualizerValues getValues() const
void setValues(const EqualizerValues &values)
QColor onionSkinTintColorBackward() const
void setOnionSkinState(int offset, bool value)
int onionSkinOpacity(int offset, bool requestDefault=false) const
int onionSkinTintFactor() const
void setOnionSkinTintColorForward(const QColor &value)
bool onionSkinState(int offset) const
void setOnionSkinTintFactor(int value)
void setOnionSkinOpacity(int offset, int value)
bool showAdditionalOnionSkinsSettings(bool requestDefault=false) const
QColor onionSkinTintColorForward() const
void setNumberOfOnionSkins(int value)
void setShowAdditionalOnionSkinsSettings(bool value)
void setOnionSkinTintColorBackward(const QColor &value)
QVector< QColor > allColorLabels() const
void setColorLabelFilter(QSet< int > colors)
static KisOnionSkinCompositor * instance()
class KisColorLabelMouseDragFilter * m_dragFilter
void setViewManager(KisViewManager *kisview) override
class KisColorLabelFilterGroup * m_filterButtonGroup
KisSignalCompressor m_updatesCompressor
KisOnionSkinsDocker(QWidget *parent=0)
Ui::OnionSkinsDocker * ui
void initEqualizerSettings(bool useDefaults=false)
void slotShowAdditionalSettings(bool value)
void setCanvas(KoCanvasBase *canvas) override
KisEqualizerWidget * m_equalizerWidget
KisAction * m_toggleOnionSkinsAction
KisMainWindow * mainWindow() const
KisActionManager * actionManager() const
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
QIcon loadIcon(const QString &name)
void setText(QSpinBox *spinBox, const QStringView textTemplate)
static KoColorSpaceRegistry * instance()