1 /*
2
3 Pencil2D - Traditional Animation Software
4 Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5 Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; version 2 of the License.
10
11 This program 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 */
17 #include "pegbaralignmentdialog.h"
18 #include "ui_pegbaralignmentdialog.h"
19
20 #include <QListWidget>
21 #include <QListWidgetItem>
22 #include <QMessageBox>
23 #include "layermanager.h"
24 #include "selectionmanager.h"
25
PegBarAlignmentDialog(Editor * editor,QWidget * parent)26 PegBarAlignmentDialog::PegBarAlignmentDialog(Editor *editor, QWidget *parent) :
27 QDialog(parent),
28 ui(new Ui::PegBarAlignmentDialog)
29 {
30 ui->setupUi(this);
31 mEditor = editor;
32 connect(ui->btnAlign, &QPushButton::clicked, this, &PegBarAlignmentDialog::alignPegs);
33 connect(ui->btnCancel, &QPushButton::clicked, this, &PegBarAlignmentDialog::closeClicked);
34 connect(ui->lwLayers, &QListWidget::clicked, this, &PegBarAlignmentDialog::updatePegRegDialog);
35
36 connect(mEditor->layers(), &LayerManager::layerCountChanged, this, &PegBarAlignmentDialog::updatePegRegLayers);
37 connect(mEditor->select(), &SelectionManager::selectionChanged, this, &PegBarAlignmentDialog::updatePegRegDialog);
38 connect(mEditor, &Editor::scrubbed, this, &PegBarAlignmentDialog::updatePegRegDialog);
39 connect(mEditor->layers(), &LayerManager::currentLayerChanged, this, &PegBarAlignmentDialog::updatePegRegDialog);
40
41 ui->btnAlign->setEnabled(false);
42 mLayernames.clear();
43 }
44
~PegBarAlignmentDialog()45 PegBarAlignmentDialog::~PegBarAlignmentDialog()
46 {
47 delete ui;
48 }
49
setLayerList(QStringList layerList)50 void PegBarAlignmentDialog::setLayerList(QStringList layerList)
51 {
52 ui->lwLayers->clear();
53 mLayernames = layerList;
54 for (int i = 0; i < mLayernames.count(); i++)
55 {
56 ui->lwLayers->addItem(mLayernames.at(i));
57 }
58 }
59
getLayerList()60 QStringList PegBarAlignmentDialog::getLayerList()
61 {
62 QStringList selectedLayers;
63 selectedLayers.clear();
64 for (int i = 0; i < ui->lwLayers->count(); i++)
65 {
66 if (ui->lwLayers->item(i)->isSelected())
67 selectedLayers.append(ui->lwLayers->item(i)->text());
68 }
69 return selectedLayers;
70 }
71
updateRefKeyLabelText()72 void PegBarAlignmentDialog::updateRefKeyLabelText()
73 {
74 ui->labRefKey->setText(QStringLiteral("%1 - %2").arg(mRefLayer).arg(mRefkey));
75 }
76
setAreaSelected(bool b)77 void PegBarAlignmentDialog::setAreaSelected(bool b)
78 {
79 mAreaSelected = b;
80 setBtnAlignEnabled();
81 }
82
setReferenceSelected(bool b)83 void PegBarAlignmentDialog::setReferenceSelected(bool b)
84 {
85 mReferenceSelected = b;
86 setBtnAlignEnabled();
87 }
88
setLayerSelected(bool b)89 void PegBarAlignmentDialog::setLayerSelected(bool b)
90 {
91 mLayerSelected = b;
92 setBtnAlignEnabled();
93 }
94
updatePegRegLayers()95 void PegBarAlignmentDialog::updatePegRegLayers()
96 {
97 QStringList bitmaplayers;
98 for (int i = 0; i < mEditor->layers()->count(); i++)
99 {
100 if (mEditor->layers()->getLayer(i)->type() == Layer::BITMAP)
101 {
102 bitmaplayers.append(mEditor->layers()->getLayer(i)->name());
103 }
104 }
105 setLayerList(bitmaplayers);
106 }
107
updatePegRegDialog()108 void PegBarAlignmentDialog::updatePegRegDialog()
109 {
110 // is something selected in scribblearea?
111 setAreaSelected(mEditor->select()->somethingSelected());
112
113 const Layer* currentLayer = mEditor->layers()->currentLayer();
114 // is the reference key valid?
115 setRefLayer(currentLayer->name());
116 setRefKey(mEditor->currentFrame());
117
118 bool isReferenceSelected = (currentLayer->type() == Layer::BITMAP &&
119 currentLayer->keyExists(mEditor->currentFrame()));
120 setReferenceSelected(isReferenceSelected);
121
122 // has minimum one layer been selected?
123 const QStringList bitmaplayers = getLayerList();
124
125 if (bitmaplayers.isEmpty())
126 {
127 setLayerSelected(false);
128 }
129 else
130 {
131 setRefLayer(currentLayer->name());
132 setRefKey(mEditor->currentFrame());
133 setLayerSelected(true);
134 }
135
136 setBtnAlignEnabled();
137 }
138
alignPegs()139 void PegBarAlignmentDialog::alignPegs()
140 {
141 const QStringList bitmaplayers = getLayerList();
142 if (bitmaplayers.isEmpty())
143 {
144 QMessageBox::information(this, "Pencil2D",
145 tr("No layers selected!", "PegBar Dialog error message"),
146 QMessageBox::Ok);
147 return;
148 }
149
150 Status result = mEditor->pegBarAlignment(bitmaplayers);
151 if (!result.ok())
152 {
153 QMessageBox::information(this, "Pencil2D",
154 result.description(),
155 QMessageBox::Ok);
156 return;
157 }
158 done(QDialog::Accepted);
159 }
160
setBtnAlignEnabled()161 void PegBarAlignmentDialog::setBtnAlignEnabled()
162 {
163 if (mAreaSelected && mReferenceSelected && mLayerSelected)
164 ui->btnAlign->setEnabled(true);
165 else
166 ui->btnAlign->setEnabled(false);
167 }
168
setRefLayer(QString s)169 void PegBarAlignmentDialog::setRefLayer(QString s)
170 {
171 mRefLayer = s;
172 updateRefKeyLabelText();
173 }
174
setRefKey(int i)175 void PegBarAlignmentDialog::setRefKey(int i)
176 {
177 mRefkey = i;
178 updateRefKeyLabelText();
179 }
180
closeClicked()181 void PegBarAlignmentDialog::closeClicked()
182 {
183 done(QDialog::Accepted);
184 }
185