Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • app
  • src
onionskinwidget.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2012-2020 Matthew Chiawen Chang
5
6This program is free software; you can redistribute it and/or
7modify it under the terms of the GNU General Public License
8as published by the Free Software Foundation; version 2 of the License.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15*/
16
17#include "onionskinwidget.h"
18#include "ui_onionskin.h"
19
20#include "preferencemanager.h"
21#include "editor.h"
22#include "flowlayout.h"
23#include "util.h"
24
25OnionSkinWidget::OnionSkinWidget(QWidget *parent) :
26 BaseDockWidget(parent),
27 ui(new Ui::OnionSkin)
28{
29 ui->setupUi(this);
30
31 clearFocusOnFinished(ui->onionPrevFramesNumBox);
32 clearFocusOnFinished(ui->onionNextFramesNumBox);
33 clearFocusOnFinished(ui->onionMinOpacityBox);
34 clearFocusOnFinished(ui->onionMaxOpacityBox);
35}
36
37OnionSkinWidget::~OnionSkinWidget()
38{
39 delete ui;
40}
41
42void OnionSkinWidget::initUI()
43{
44 updateUI();
45 makeConnections();
46
47 // Change the horizontal layout in the Distributed Opacity group box to a
48 // flow layout to reduce the minimum width
49 FlowLayout *opacityLayout = new FlowLayout;
50 opacityLayout->setAlignment(Qt::AlignHCenter);
51 opacityLayout->setContentsMargins(0, 6, 0, 6);
52 ui->opacityGroup->layout()->removeWidget(ui->minOpacityGroup);
53 ui->opacityGroup->layout()->removeWidget(ui->maxOpacityGroup);
54 opacityLayout->addWidget(ui->minOpacityGroup);
55 opacityLayout->addWidget(ui->maxOpacityGroup);
56 delete ui->opacityGroup->layout();
57 ui->opacityGroup->setLayout(opacityLayout);
58
59#ifdef __APPLE__
60
61 ui->scrollAreaWidgetContents->layout()->setSpacing(8);
62
63 // Mac only style. ToolButtons are naturally borderless on Win/Linux.
64 QString stylesheet =
65 "QToolButton { border: 0px; } "
66 "QGroupBox::title {"
67 "subcontrol-origin: padding;"
68 "left: 6px;"
69 "padding: 2px 2px 0px 0px;"
70 "background: transparent;"
71 "}"
72 "QGroupBox {"
73 "subcontrol-origin: margin;"
74 "margin-top: 8px;"
75 "padding-top: 16px;"
76 "}"
77 "QToolButton:pressed{ border: 1px solid #FFADAD; border-radius: 2px; background-color: #D5D5D5; }"
78 "QToolButton:checked{ border: 1px solid #ADADAD; border-radius: 2px; background-color: #D5D5D5; }";
79 setStyleSheet(this->styleSheet().append(stylesheet));
80#endif
81}
82
83void OnionSkinWidget::makeConnections()
84{
85 auto spinBoxChanged = static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged);
86 connect(ui->onionMaxOpacityBox, spinBoxChanged, this, &OnionSkinWidget::onionMaxOpacityChange);
87 connect(ui->onionMinOpacityBox, spinBoxChanged, this, &OnionSkinWidget::onionMinOpacityChange);
88 connect(ui->onionPrevFramesNumBox, spinBoxChanged, this, &OnionSkinWidget::onionPrevFramesNumChange);
89 connect(ui->onionNextFramesNumBox, spinBoxChanged, this, &OnionSkinWidget::onionNextFramesNumChange);
90
91 connect(ui->prevFramesGroup, &QGroupBox::clicked, this, &OnionSkinWidget::prevFramesGroupClicked);
92 connect(ui->nextFramesGroup, &QGroupBox::clicked, this, &OnionSkinWidget::nextFramesGroupClicked);
93 connect(ui->onionBlueButton, &QToolButton::clicked, this, &OnionSkinWidget::onionBlueButtonClicked);
94 connect(ui->onionRedButton, &QToolButton::clicked, this, &OnionSkinWidget::onionRedButtonClicked);
95
96 connect(ui->onionSkinMode, &QCheckBox::stateChanged, this, &OnionSkinWidget::onionSkinModeChange);
97 connect(ui->onionWhilePlayback, &QCheckBox::stateChanged, this, &OnionSkinWidget::playbackStateChanged);
98 connect(ui->onionSkinMultiLayer, &QCheckBox::stateChanged, this, &OnionSkinWidget::onionSkinMultipleLayersEnabled);
99
100 PreferenceManager* prefs = editor()->preference();
101 connect(prefs, &PreferenceManager::optionChanged, this, &OnionSkinWidget::updateUI);
102
103}
104
105void OnionSkinWidget::updateUI()
106{
107 PreferenceManager* prefs = editor()->preference();
108
109 ui->prevFramesGroup->setChecked(prefs->isOn(SETTING::PREV_ONION));
110 ui->nextFramesGroup->setChecked(prefs->isOn(SETTING::NEXT_ONION));
111
112 QSignalBlocker b3(ui->onionBlueButton);
113 ui->onionBlueButton->setChecked(prefs->isOn(SETTING::ONION_BLUE));
114
115 QSignalBlocker b4(ui->onionRedButton);
116 ui->onionRedButton->setChecked(prefs->isOn(SETTING::ONION_RED));
117
118 ui->onionMaxOpacityBox->setValue(prefs->getInt(SETTING::ONION_MAX_OPACITY));
119 ui->onionMinOpacityBox->setValue(prefs->getInt(SETTING::ONION_MIN_OPACITY));
120 ui->onionPrevFramesNumBox->setValue(prefs->getInt(SETTING::ONION_PREV_FRAMES_NUM));
121 ui->onionNextFramesNumBox->setValue(prefs->getInt(SETTING::ONION_NEXT_FRAMES_NUM));
122
123 QSignalBlocker b5(ui->onionSkinMode);
124 ui->onionSkinMode->setChecked(prefs->getString(SETTING::ONION_TYPE) == "absolute");
125
126 QSignalBlocker b6(ui->onionWhilePlayback);
127 ui->onionWhilePlayback->setChecked(prefs->isOn(SETTING::ONION_WHILE_PLAYBACK));
128
129 QSignalBlocker b7(ui->onionSkinMultiLayer);
130 ui->onionSkinMultiLayer->setChecked(prefs->isOn(SETTING::ONION_MUTLIPLE_LAYERS));
131}
132
133void OnionSkinWidget::prevFramesGroupClicked(bool isOn)
134{
135 PreferenceManager* prefs = editor()->preference();
136 prefs->set(SETTING::PREV_ONION, isOn);
137}
138
139void OnionSkinWidget::nextFramesGroupClicked(bool isOn)
140{
141 PreferenceManager* prefs = editor()->preference();
142 prefs->set(SETTING::NEXT_ONION, isOn);
143}
144
145void OnionSkinWidget::onionRedButtonClicked(bool isOn)
146{
147 PreferenceManager* prefs = editor()->preference();
148 prefs->set(SETTING::ONION_RED, isOn);
149}
150
151void OnionSkinWidget::onionBlueButtonClicked(bool isOn)
152{
153 PreferenceManager* prefs = editor()->preference();
154 prefs->set(SETTING::ONION_BLUE, isOn);
155}
156
157void OnionSkinWidget::onionMaxOpacityChange(int value)
158{
159 PreferenceManager* prefs = editor()->preference();
160 prefs->set(SETTING::ONION_MAX_OPACITY, value);
161}
162
163void OnionSkinWidget::onionMinOpacityChange(int value)
164{
165 PreferenceManager* prefs = editor()->preference();
166 prefs->set(SETTING::ONION_MIN_OPACITY, value);
167}
168
169void OnionSkinWidget::onionPrevFramesNumChange(int value)
170{
171 PreferenceManager* prefs = editor()->preference();
172 prefs->set(SETTING::ONION_PREV_FRAMES_NUM, value);
173}
174
175void OnionSkinWidget::onionNextFramesNumChange(int value)
176{
177 PreferenceManager* prefs = editor()->preference();
178 prefs->set(SETTING::ONION_NEXT_FRAMES_NUM, value);
179}
180
181void OnionSkinWidget::onionSkinModeChange(int value)
182{
183 PreferenceManager* prefs = editor()->preference();
184 if (value == Qt::Checked)
185 {
186 prefs->set(SETTING::ONION_TYPE, QString("absolute"));
187 }
188 else
189 {
190 prefs->set(SETTING::ONION_TYPE, QString("relative"));
191 }
192}
193
194void OnionSkinWidget::playbackStateChanged(int value)
195{
196 PreferenceManager* prefs = editor()->preference();
197 prefs->set(SETTING::ONION_WHILE_PLAYBACK, value);
198}
199
200void OnionSkinWidget::onionSkinMultipleLayersEnabled(bool value)
201{
202 PreferenceManager* prefs = editor()->preference();
203 prefs->set(SETTING::ONION_MUTLIPLE_LAYERS, value);
204}
BaseDockWidget
Definition: basedockwidget.h:27
FlowLayout
Definition: flowlayout.h:59
PreferenceManager
Definition: preferencemanager.h:28
QAbstractButton::clicked
void clicked(bool checked)
QCheckBox::stateChanged
void stateChanged(int state)
QGroupBox::clicked
void clicked(bool checked)
QLayout::addWidget
void addWidget(QWidget *w)
QLayout::setAlignment
bool setAlignment(QWidget *w, Qt::Alignment alignment)
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QSignalBlocker
QSpinBox
QSpinBox::valueChanged
void valueChanged(int i)
QString
Qt::AlignHCenter
AlignHCenter
Qt::Checked
Checked
QWidget
QWidget::setupUi
void setupUi(QWidget *widget)
QWidget::setStyleSheet
void setStyleSheet(const QString &styleSheet)
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39