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