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
repositionframesdialog.cpp
1#include "repositionframesdialog.h"
2#include "ui_repositionframesdialog.h"
3
4#include <QList>
5#include <QListWidgetItem>
6#include <QMessageBox>
7
8#include "selectionmanager.h"
9#include "selectionpainter.h"
10#include "viewmanager.h"
11#include "toolmanager.h"
12#include "layer.h"
13#include "layermanager.h"
14#include "layerbitmap.h"
15#include "scribblearea.h"
16
17
18RepositionFramesDialog::RepositionFramesDialog(QWidget* parent) :
19 QDialog(parent),
20 ui(new Ui::RepositionFramesDialog)
21{
22 ui->setupUi(this);
23}
24
25RepositionFramesDialog::~RepositionFramesDialog()
26{
27 delete ui;
28}
29
30void RepositionFramesDialog::setCore(Editor *editor)
31{
32 mEditor = editor;
33}
34
35void RepositionFramesDialog::initUI()
36{
37 if (mEditor->layers()->currentLayer()->keyExists(mEditor->currentFrame()))
38 {
39 mRepositionFrame = mEditor->currentFrame();
40 }
41 else
42 {
43 mRepositionFrame = mEditor->layers()->currentLayer()->getSelectedFramesByPos().at(0);
44 }
45
46 prepareRepositionSelectedImages(mRepositionFrame);
47
48 updateRadioButtons();
49
50 ui->rbAllKeyframes->setChecked(true);
51 connect(ui->cbOtherLayers, &QCheckBox::stateChanged, this, &RepositionFramesDialog::checkboxStateChanged);
52 connect(ui->rbAllKeyframes, &QRadioButton::clicked, this, &RepositionFramesDialog::updateLayersBox);
53 connect(ui->rbSameKeyframes, &QRadioButton::clicked, this, &RepositionFramesDialog::updateLayersBox);
54 connect(ui->btnReposition, &QPushButton::clicked, this, &RepositionFramesDialog::repositionFrames);
55 connect(ui->btnCancel, &QPushButton::clicked, this, &RepositionFramesDialog::closeClicked);
56 connect(mEditor->getScribbleArea(), &ScribbleArea::selectionUpdated, this, &RepositionFramesDialog::updateDialogText);
57 connect(mEditor->select(), &SelectionManager::selectionReset, this, &RepositionFramesDialog::closeClicked);
58 mEndPoint = mStartPoint = QPoint(0,0);
59 mOriginalPolygonF = mEditor->select()->mySelectionRect();
60 updateDialogSelectedFrames();
61 updateDialogText();
62}
63
64void RepositionFramesDialog::updateDialogText()
65{
66 if (mOriginalPolygonF.boundingRect().isEmpty())
67 {
68 mOriginalPolygonF = mEditor->select()->mySelectionRect();
69 }
70 mCurrentPolygonF = mEditor->select()->selectionTransform().map(mEditor->select()->mySelectionRect());
71 QPoint point = getRepositionPoint();
72 ui->labRepositioned->setText(tr("Repositioned: ( %1, %2 )").arg(point.x()).arg(point.y()));
73}
74
75void RepositionFramesDialog::updateDialogSelectedFrames()
76{
77 QList<int> framelist = mEditor->layers()->currentLayer()->getSelectedFramesByPos();
78 ui->labRepositionFrames->setText(tr("Selected on Layer: %1").arg(mEditor->layers()->currentLayer()->name()));
79 ui->listSelectedFrames->clear();
80 for (int i = 0; i < framelist.count(); i++)
81 {
82 ui->listSelectedFrames->addItem(QString::number(framelist.at(i)));
83 }
84}
85
86void RepositionFramesDialog::repositionFrames()
87{
88 if (mStartPoint == mEndPoint)
89 {
90 QMessageBox::information(this, nullptr,
91 tr("Please move selection to desired destination\n"
92 "or cancel"),
93 QMessageBox::Ok);
94 return;
95 }
96
97 QList<int> frames = mEditor->layers()->currentLayer()->getSelectedFramesByPos();
98 for (int i = 0; i < frames.size(); i++)
99 {
100 mEditor->repositionImage(mEndPoint, frames.at(i));
101 }
102
103 if (!ui->listSelectedLayers->selectedItems().isEmpty())
104 {
105 auto layerManager = mEditor->layers();
106
107 // if only selected keyframe-numbers should be repositioned
108 if (ui->rbSameKeyframes->isChecked())
109 {
110 int currLayer = mEditor->currentLayerIndex();
111 for (int j = 0; j < mLayerIndexes.size(); j++)
112 {
113 QListWidgetItem* item = ui->listSelectedLayers->item(j);
114 if (item->isSelected())
115 {
116 layerManager->setCurrentLayer(mLayerIndexes.at(j));
117 for (int i = 0; i < frames.size(); i++)
118 { // only move frame if it exists
119 if (layerManager->currentLayer()->keyExists(frames.at(i)))
120 {
121 mEditor->repositionImage(mEndPoint, frames.at(i));
122 }
123 }
124 }
125 }
126 layerManager->setCurrentLayer(currLayer);
127 }
128 // if all keyframes on layer should be repositioned
129 else
130 {
131 int currLayer = mEditor->currentLayerIndex();
132 for (int i= 0; i < mLayerIndexes.size(); i++)
133 {
134 QListWidgetItem* item = ui->listSelectedLayers->item(i);
135 if (item->isSelected())
136 {
137 layerManager->setCurrentLayer(mLayerIndexes.at(i));
138 int keyframe = layerManager->currentLayer()->firstKeyFramePosition();
139 do {
140 mEditor->repositionImage(mEndPoint, keyframe);
141 keyframe = layerManager->currentLayer()->getNextKeyFramePosition(keyframe);
142 }
143 while (mEditor->currentFrame() != layerManager->currentLayer()->getMaxKeyFramePosition());
144 }
145 }
146 layerManager->setCurrentLayer(currLayer);
147 }
148 }
149 mEditor->getScribbleArea()->applyTransformedSelection();
150 mEditor->select()->resetSelectionProperties();
151 mEditor->scrubTo(mRepositionFrame);
152
153 accept();
154}
155
156void RepositionFramesDialog::updateRadioButtons()
157{
158 if (ui->cbOtherLayers->isChecked())
159 {
160 ui->rbAllKeyframes->setEnabled(true);
161 ui->rbSameKeyframes->setEnabled(true);
162 ui->listSelectedLayers->setEnabled(true);
163 }
164 else
165 {
166 ui->rbAllKeyframes->setEnabled(false);
167 ui->rbSameKeyframes->setEnabled(false);
168 ui->listSelectedLayers->setEnabled(false);
169 }
170}
171
172void RepositionFramesDialog::checkboxStateChanged(int i)
173{
174 switch (i)
175 {
176 case Qt::Checked:
177 updateLayersToSelect();
178 break;
179 default:
180 ui->listSelectedLayers->clear();
181 break;
182 }
183 updateRadioButtons();
184}
185
186void RepositionFramesDialog::updateLayersBox()
187{
188 updateLayersToSelect();
189}
190
191void RepositionFramesDialog::closeClicked()
192{
193 emit rejected();
194}
195
196void RepositionFramesDialog::updateLayersToSelect()
197{
198 ui->listSelectedLayers->clear();
199
200 mLayerIndexes.clear();
201 auto layerManager = mEditor->layers();
202 if (ui->rbAllKeyframes->isChecked())
203 {
204 for (int i = layerManager->count() - 1; i >= 0; i--)
205 {
206 if (layerManager->getLayer(i)->type() == Layer::BITMAP &&
207 i != layerManager->currentLayerIndex())
208 {
209 ui->listSelectedLayers->addItem(layerManager->getLayer(i)->name());
210 mLayerIndexes.append(i);
211 }
212 }
213 }
214 else
215 {
216 QList<int> frames = layerManager->currentLayer()->getSelectedFramesByPos();
217 bool ok = false;
218 for (int i = layerManager->count() - 1; i >= 0; i--)
219 {
220 if (layerManager->getLayer(i)->type() == Layer::BITMAP &&
221 i != layerManager->currentLayerIndex())
222 {
223 Layer* layer = layerManager->getLayer(i);
224 for (int j = 0; j < frames.size(); j++)
225 {
226 if (layer->keyExists(frames.at(j)))
227 ok = true;
228 }
229 if (ok)
230 {
231 ui->listSelectedLayers->addItem(layer->name());
232 mLayerIndexes.append(i);
233 }
234 ok = false;
235 }
236
237 }
238 }
239}
240
241QPoint RepositionFramesDialog::getRepositionPoint()
242{
243 int x = static_cast<int>(mCurrentPolygonF.boundingRect().x() - mOriginalPolygonF.boundingRect().x());
244 int y = static_cast<int>(mCurrentPolygonF.boundingRect().y() - mOriginalPolygonF.boundingRect().y());
245 mEndPoint = QPoint(x, y);
246 return mEndPoint;
247}
248
249void RepositionFramesDialog::prepareRepositionSelectedImages(int repositionFrame)
250{
251 auto select = mEditor->select();
252 auto layers = mEditor->layers();
253
254 if (select->somethingSelected()) { return; }
255
256 if (layers->currentLayer()->type() == Layer::BITMAP)
257 {
258 mEditor->scrubTo(repositionFrame);
259 LayerBitmap* layer = static_cast<LayerBitmap*>(layers->currentLayer());
260 QRect reposRect = layer->getFrameBounds(repositionFrame);
261 select->setSelection(reposRect);
262 }
263}
264
Editor
Definition: editor.h:71
LayerBitmap
Definition: layerbitmap.h:26
Layer
Definition: layer.h:33
RepositionFramesDialog
Definition: repositionframesdialog.h:16
QAbstractButton::clicked
void clicked(bool checked)
QCheckBox::stateChanged
void stateChanged(int state)
QDialog
QDialog::accept
virtual void accept()
QDialog::rejected
void rejected()
QList
QList::append
void append(const T &value)
QList::at
const T & at(int i) const const
QList::clear
void clear()
QList::count
int count(const T &value) const const
QList::size
int size() const const
QListWidgetItem
QListWidgetItem::isSelected
bool isSelected() const const
QMessageBox::Ok
Ok
QMessageBox::information
QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::tr
QString tr(const char *sourceText, const char *disambiguation, int n)
QPoint
QPoint::x
int x() const const
QPoint::y
int y() const const
QPolygonF::boundingRect
QRectF boundingRect() const const
QRect
QRectF::isEmpty
bool isEmpty() const const
QRectF::x
qreal x() const const
QRectF::y
qreal y() const const
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString::number
QString number(int n, int base)
Qt::Checked
Checked
QTransform::map
QPoint map(const QPoint &point) const const
QWidget
QWidget::setupUi
void setupUi(QWidget *widget)
QWidget::x
x
QWidget::y
y
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39