1#include "layeropacitydialog.h"
2#include "ui_layeropacitydialog.h"
4#include "layermanager.h"
5#include "playbackmanager.h"
7#include "layerbitmap.h"
8#include "bitmapimage.h"
9#include "layervector.h"
10#include "vectorimage.h"
13LayerOpacityDialog::LayerOpacityDialog(
QWidget *parent) :
20LayerOpacityDialog::~LayerOpacityDialog()
25void LayerOpacityDialog::setCore(
Editor *editor)
28 mLayerManager = mEditor->layers();
29 mPlayBack = mEditor->playback();
32void LayerOpacityDialog::initUI()
37 connect(ui->chooseOpacitySpinBox, spinboxValueChanged,
this, &LayerOpacityDialog::opacitySpinboxChanged);
47 connect(mEditor, &Editor::objectLoaded,
this, &LayerOpacityDialog::onObjectLoaded);
49 connect(mPlayBack, &PlaybackManager::playStateChanged,
this, &LayerOpacityDialog::onPlayStateChanged);
50 connect(mLayerManager, &LayerManager::currentLayerChanged,
this, &LayerOpacityDialog::onCurrentLayerChanged);
51 connect(mEditor, &Editor::selectedFramesChanged,
this, &LayerOpacityDialog::onSelectedFramesChanged);
56void LayerOpacityDialog::updateUI()
58 Layer* currentLayer = mLayerManager->currentLayer();
59 if (currentLayer ==
nullptr) {
return; }
61 ui->labLayerInfo->setText(
tr(
"Layer: %1").arg(currentLayer->name()));
62 if (currentLayer->type() != Layer::BITMAP && currentLayer->type() != Layer::VECTOR) {
63 setCanAdjust(
false,
false);
67 bool canAdjust =
false;
68 if (ui->rbActiveKeyframe->isChecked()) {
69 KeyFrame* keyframe = currentLayer->getLastKeyFrameAtPosition(mEditor->currentFrame());
70 canAdjust = keyframe !=
nullptr;
71 }
else if (ui->rbSelectedKeyframes->isChecked()) {
72 canAdjust = !currentLayer->getSelectedFramesByPos().
isEmpty();
73 }
else if (ui->rbActiveLayer->isChecked()) {
77 ui->chooseOpacitySlider->setEnabled(canAdjust);
78 ui->chooseOpacitySpinBox->setEnabled(canAdjust);
81void LayerOpacityDialog::onObjectLoaded()
83 Layer* currentLayer = mLayerManager->currentLayer();
84 if (currentLayer ==
nullptr) {
return; }
86 if (currentLayer->type() != Layer::BITMAP && currentLayer->type() != Layer::VECTOR) {
return; }
88 KeyFrame* keyframe = currentLayer->getLastKeyFrameAtPosition(mEditor->currentFrame());
91 updateValues(getOpacityForKeyFrame(currentLayer, keyframe));
99qreal LayerOpacityDialog::getOpacityForKeyFrame(
Layer* layer,
const KeyFrame* keyframe)
const
101 if (layer->type() == Layer::BITMAP) {
103 return bitmap->getOpacity();
104 }
else if (layer->type() == Layer::VECTOR) {
106 return vector->getOpacity();
112void LayerOpacityDialog::setOpacityForKeyFrame(
Layer* layer,
KeyFrame* keyframe, qreal opacity)
114 if (layer->type() == Layer::BITMAP) {
116 bitmap->setOpacity(opacity);
118 }
else if (layer->type() == Layer::VECTOR) {
120 vector->setOpacity(opacity);
125void LayerOpacityDialog::opacitySliderChanged(
int value)
127 ui->chooseOpacitySpinBox->setValue(value * mSpinBoxMultiplier);
128 opacityValueChanged();
131void LayerOpacityDialog::opacitySpinboxChanged(
double value)
133 ui->chooseOpacitySlider->setValue(
static_cast<int>(value * 5.0));
134 opacityValueChanged();
137void LayerOpacityDialog::fade(OpacityFadeType fadeType)
142 Layer* currentLayer = mLayerManager->currentLayer();
143 if (currentLayer ==
nullptr) {
return; }
145 if (currentLayer->type() != Layer::BITMAP && currentLayer->type() != Layer::VECTOR) {
return; }
147 QList<int> selectedKeys = currentLayer->getSelectedFramesByPos();
149 if (selectedKeys.
count() < mMinSelectedFrames) {
return; }
152 int fadeFromPos = selectedKeys.
first();
154 int fadeEnd = selectedKeys.
count();
156 if (fadeType == OpacityFadeType::IN) {
157 fadeFromPos = selectedKeys.
last();
159 fadeEnd = selectedKeys.
count() - 1;
162 KeyFrame* keyframe = currentLayer->getLastKeyFrameAtPosition(fadeFromPos);
163 if (keyframe ==
nullptr) {
return; }
165 qreal initialOpacity = getOpacityForKeyFrame(currentLayer, keyframe);
167 qreal imageCount =
static_cast<qreal
>(selectedKeys.
count());
168 for (
int i = fadeStart; i < fadeEnd; i++)
170 keyframe = currentLayer->getLastKeyFrameAtPosition(selectedKeys.
at(i));
171 if (keyframe ==
nullptr) {
continue; }
173 qreal newOpacity = 0;
174 if (fadeType == OpacityFadeType::IN) {
175 newOpacity =
static_cast<qreal
>((i + 1) / imageCount) * initialOpacity;
177 newOpacity =
static_cast<qreal
>(initialOpacity - (i / imageCount) * initialOpacity);
179 setOpacityForKeyFrame(currentLayer, keyframe, newOpacity);
182 keyframe = currentLayer->getLastKeyFrameAtPosition(mEditor->currentFrame());
183 if (keyframe ==
nullptr) {
return; }
185 qreal imageOpacity = getOpacityForKeyFrame(currentLayer, keyframe);
186 updateValues(imageOpacity);
191void LayerOpacityDialog::fadeInPressed()
193 fade(OpacityFadeType::IN);
196void LayerOpacityDialog::fadeOutPressed()
198 fade(OpacityFadeType::OUT);
201void LayerOpacityDialog::onCurrentLayerChanged(
int)
203 onCurrentFrameChanged(mEditor->currentFrame());
207void LayerOpacityDialog::onCurrentFrameChanged(
int frame)
209 if (mPlayerIsPlaying) {
return; }
211 Layer* currentLayer = mLayerManager->currentLayer();
212 if (currentLayer ==
nullptr) {
return; }
214 if (currentLayer->type() != Layer::BITMAP && currentLayer->type() != Layer::VECTOR) {
215 setCanAdjust(
false,
false);
219 KeyFrame* keyframe = currentLayer->getLastKeyFrameAtPosition(frame);
221 updateValues(getOpacityForKeyFrame(currentLayer, keyframe));
226void LayerOpacityDialog::onSelectedFramesChanged()
228 Layer* currentLayer = mLayerManager->currentLayer();
229 if (currentLayer ==
nullptr) {
return; }
231 QList<int> frames = currentLayer->getSelectedFramesByPos();
233 ui->groupBoxFade->setEnabled(frames.
count() >= mMinSelectedFrames);
237void LayerOpacityDialog::onPlayStateChanged(
bool isPlaying)
239 mPlayerIsPlaying = isPlaying;
241 if (!mPlayerIsPlaying) {
242 onCurrentFrameChanged(mEditor->currentFrame());
247void LayerOpacityDialog::updateValues(qreal opacity)
252 int newOpacity =
static_cast<int>(opacity * mMultiplier);
253 ui->chooseOpacitySlider->setValue(newOpacity);
254 ui->chooseOpacitySpinBox->setValue(newOpacity * mSpinBoxMultiplier);
257void LayerOpacityDialog::opacityValueChanged()
259 if (ui->rbActiveKeyframe->isChecked()) {
260 setOpacityForCurrentKeyframe();
261 }
else if (ui->rbActiveLayer->isChecked()) {
262 setOpacityForLayer();
263 }
else if (ui->rbSelectedKeyframes->isChecked()) {
264 setOpacityForSelectedKeyframes();
268void LayerOpacityDialog::setOpacityForCurrentKeyframe()
270 Layer* currentLayer = mLayerManager->currentLayer();
271 if (currentLayer ==
nullptr) {
return; }
273 if (currentLayer->type() != Layer::BITMAP && currentLayer->type() != Layer::VECTOR) {
return; }
275 KeyFrame* keyframe = currentLayer->getLastKeyFrameAtPosition(mEditor->currentFrame());
276 if (keyframe ==
nullptr) {
return; }
278 qreal opacity = ui->chooseOpacitySlider->value() / mMultiplier;
279 setOpacityForKeyFrame(currentLayer, keyframe, opacity);
284void LayerOpacityDialog::setOpacityForSelectedKeyframes()
286 Layer* currentLayer = mLayerManager->currentLayer();
287 if (currentLayer ==
nullptr) {
return; }
289 QList<int> frames = currentLayer->getSelectedFramesByPos();
291 if (frames.
isEmpty()) {
return; }
293 qreal opacity =
static_cast<qreal
>(ui->chooseOpacitySlider->value()) / mMultiplier;
295 for (
int pos : frames)
297 KeyFrame* keyframe = currentLayer->getKeyFrameAt(
pos);
300 setOpacityForKeyFrame(currentLayer, keyframe, opacity);
306void LayerOpacityDialog::setOpacityForLayer()
308 Layer* currentLayer = mLayerManager->currentLayer();
309 if (currentLayer ==
nullptr) {
return; }
311 qreal opacity =
static_cast<qreal
>(ui->chooseOpacitySlider->value()) / mMultiplier;
313 currentLayer->foreachKeyFrame([
this, currentLayer, opacity](
KeyFrame* keyframe) {
316 setOpacityForKeyFrame(currentLayer, keyframe, opacity);
322void LayerOpacityDialog::setCanAdjust(
bool opacity,
bool fade)
324 ui->groupBoxFade->setEnabled(fade);
325 ui->chooseOpacitySlider->setEnabled(opacity);
326 ui->chooseOpacitySpinBox->setEnabled(opacity);
void framesModified()
This should be emitted after modifying multiple frames.
void scrubbed(int frameNumber)
This should be emitted after scrubbing.
void markFrameAsDirty(const int frameNumber)
Mark the frame position as dirty.
void valueChanged(int value)
void finished(int result)
void valueChanged(double d)
const T & at(int i) const const
int count(const T &value) const const
bool isEmpty() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString tr(const char *sourceText, const char *disambiguation, int n)