1
2
3 // Tnz6 includes
4 #include "menubarcommandids.h"
5 #include "tapp.h"
6 #include "camerasettingspopup.h"
7 #include "reslist.h"
8 #include "castselection.h"
9
10 // TnzTools includes
11 #include "tools/tooloptions.h"
12
13 // TnzQt includes
14 #include "toonzqt/menubarcommand.h"
15 #include "toonzqt/doublefield.h"
16 #include "toonzqt/lineedit.h"
17 #include "toonzqt/checkbox.h"
18 #include "toonzqt/tselectionhandle.h"
19 #include "toonzqt/camerasettingswidget.h"
20
21 // TnzLib includes
22 #include "toonz/toonzfolders.h"
23 #include "toonz/txsheet.h"
24 #include "toonz/tstageobjecttree.h"
25 #include "toonz/tcamera.h"
26 #include "toonz/txshlevelhandle.h"
27 #include "toonz/txsheethandle.h"
28 #include "toonz/tscenehandle.h"
29 #include "toonz/tobjecthandle.h"
30 #include "toonz/cleanupparameters.h"
31 #include "toonz/toonzscene.h"
32 #include "toonz/sceneproperties.h"
33 #include "toonz/stage2.h"
34 #include "toonz/txshsimplelevel.h"
35 #include "toonz/txshleveltypes.h"
36 #include "toonz/preferences.h"
37
38 // TnzCore includes
39 #include "tconvert.h"
40 #include "tsystem.h"
41 #include "tfilepath_io.h"
42
43 // Qt includes
44 #include <QLabel>
45 #include <QGridLayout>
46 #include <QRadioButton>
47 #include <QComboBox>
48 #include <QPushButton>
49 #include <QMoveEvent>
50 #include <QMainWindow>
51
52 using namespace std;
53 using namespace DVGui;
54
55 class CameraSettingsPopup;
56
57 //=============================================================================
58
59 class OpenCameraStageCommandHandler final : public MenuItemHandler {
60 CommandId m_id;
61
62 public:
OpenCameraStageCommandHandler(CommandId cmdId)63 OpenCameraStageCommandHandler(CommandId cmdId) : MenuItemHandler(cmdId) {}
execute()64 void execute() override {
65 TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
66 TStageObjectId cameraId =
67 TApp::instance()->getCurrentObject()->getObjectId();
68 CameraSettingsPopup *popup = CameraSettingsPopup::createPopup(cameraId);
69 int index = cameraId.getIndex();
70 popup->move(popup->pos() + QPoint(20, 10) * index);
71 popup->show();
72 popup->raise();
73 popup->activateWindow();
74 }
75 } OpenCameraStageCommandHandler(MI_CameraStage);
76
77 //=============================================================================
78
79 std::map<TStageObjectId, CameraSettingsPopup *> CameraSettingsPopup::m_popups;
80
CameraSettingsPopup()81 CameraSettingsPopup::CameraSettingsPopup()
82 : QDialog(TApp::instance()->getMainWindow()) {
83 m_nameFld = new LineEdit();
84 m_cameraSettingsWidget = new CameraSettingsWidget();
85
86 m_cameraSettingsWidget->setPresetListFile(ToonzFolder::getReslistPath(false));
87
88 //---- layout
89 QVBoxLayout *mainLay = new QVBoxLayout();
90 mainLay->setMargin(5);
91 mainLay->setSpacing(8);
92 {
93 QHBoxLayout *nameLay = new QHBoxLayout();
94 nameLay->setMargin(0);
95 nameLay->setSpacing(3);
96 {
97 nameLay->addWidget(new QLabel(tr("Name:")), 0);
98 nameLay->addWidget(m_nameFld, 1);
99 }
100 mainLay->addLayout(nameLay, 0);
101
102 mainLay->addWidget(m_cameraSettingsWidget, 1);
103 }
104 setLayout(mainLay);
105
106 //---- signal-slot connections
107 bool ret = true;
108 ret = ret &&
109 connect(m_cameraSettingsWidget, SIGNAL(changed()), SLOT(onChanged()));
110 ret = ret &&
111 connect(m_nameFld, SIGNAL(editingFinished()), SLOT(onNameChanged()));
112 assert(ret);
113 }
114
moveEvent(QMoveEvent * e)115 void CameraSettingsPopup::moveEvent(QMoveEvent *e) {
116 QPoint p = pos();
117 QPoint oldP = e->oldPos();
118 QDialog::moveEvent(e);
119 }
120
showEvent(QShowEvent * e)121 void CameraSettingsPopup::showEvent(QShowEvent *e) {
122 updateWindowTitle();
123 updateFields();
124 m_cameraSettingsWidget->setCurrentLevel(
125 TApp::instance()->getCurrentLevel()->getLevel());
126
127 TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
128 TObjectHandle *objectHandle = TApp::instance()->getCurrentObject();
129 TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
130 TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel();
131
132 bool ret = true;
133 ret =
134 ret && connect(sceneHandle, SIGNAL(sceneChanged()), SLOT(updateFields()));
135 ret = ret &&
136 connect(sceneHandle, SIGNAL(sceneSwitched()), SLOT(updateFields()));
137 ret = ret && connect(objectHandle, SIGNAL(objectChanged(bool)),
138 SLOT(updateFields(bool)));
139 ret = ret &&
140 connect(objectHandle, SIGNAL(objectSwitched()), SLOT(updateFields()));
141 ret = ret &&
142 connect(xsheetHandle, SIGNAL(xsheetSwitched()), SLOT(updateFields()));
143 ret = ret &&
144 connect(xsheetHandle, SIGNAL(xsheetChanged()), SLOT(updateFields()));
145 ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)),
146 SLOT(onLevelSwitched(TXshLevel *)));
147 assert(ret);
148 }
149
hideEvent(QHideEvent * e)150 void CameraSettingsPopup::hideEvent(QHideEvent *e) {
151 m_cameraSettingsWidget->setCurrentLevel(0);
152
153 if (m_cameraId != TStageObjectId::NoneId) {
154 // Remove the popup from currentlyOpened ones and schedule for deletion
155 m_popups.erase(m_cameraId);
156 m_cameraId = TStageObjectId::NoneId;
157 deleteLater();
158 }
159
160 TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
161 TObjectHandle *objectHandle = TApp::instance()->getCurrentObject();
162 TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
163 TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel();
164
165 bool ret = true;
166 ret = ret && disconnect(sceneHandle, SIGNAL(sceneChanged()), this,
167 SLOT(updateFields()));
168 ret = ret && disconnect(sceneHandle, SIGNAL(sceneSwitched()), this,
169 SLOT(updateFields()));
170 ret = ret && disconnect(objectHandle, SIGNAL(objectChanged(bool)), this,
171 SLOT(updateFields(bool)));
172 ret = ret && disconnect(objectHandle, SIGNAL(objectSwitched()), this,
173 SLOT(updateFields()));
174 ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetSwitched()), this,
175 SLOT(updateFields()));
176 ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this,
177 SLOT(updateFields()));
178 ret = ret && disconnect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)),
179 this, SLOT(onLevelSwitched(TXshLevel *)));
180 assert(ret);
181 }
182
createPopup(const TStageObjectId & id)183 CameraSettingsPopup *CameraSettingsPopup::createPopup(
184 const TStageObjectId &id) {
185 std::map<TStageObjectId, CameraSettingsPopup *>::iterator it =
186 m_popups.find(id);
187 if (it == m_popups.end()) {
188 CameraSettingsPopup *popup = new CameraSettingsPopup();
189 popup->attachToCamera(id);
190 m_popups[id] = popup;
191 return popup;
192 } else
193 return it->second;
194 }
195
getCameraObject()196 TStageObject *CameraSettingsPopup::getCameraObject() {
197 TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
198 TStageObjectId cameraId = m_cameraId;
199 if (!cameraId.isCamera())
200 cameraId = xsheet->getStageObjectTree()->getCurrentCameraId();
201 if (!cameraId.isCamera()) return 0;
202 return xsheet->getStageObject(cameraId);
203 }
204
getCamera()205 TCamera *CameraSettingsPopup::getCamera() {
206 TStageObject *cameraObject = getCameraObject();
207 return cameraObject ? cameraObject->getCamera() : 0;
208 }
209
updateWindowTitle()210 void CameraSettingsPopup::updateWindowTitle() {
211 if (m_cameraId.isCamera()) {
212 setWindowTitle(tr("Camera#%1 Settings")
213 .arg(QString::number(1 + m_cameraId.getIndex())));
214 } else {
215 setWindowTitle(tr("Current Camera Settings"));
216 }
217 }
218
onChanged()219 void CameraSettingsPopup::onChanged() {
220 TCamera *camera = getCamera();
221 if (!camera) return;
222 if (m_cameraSettingsWidget->getFields(camera)) {
223 TApp::instance()->getCurrentScene()->notifySceneChanged();
224 TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
225
226 emit changed();
227 }
228 }
229
onNameChanged()230 void CameraSettingsPopup::onNameChanged() {
231 TStageObject *cameraObject = getCameraObject();
232 if (!cameraObject) return;
233 std::string name = m_nameFld->text().toStdString();
234 std::string curName = cameraObject->getName();
235 if (curName == name) return;
236 cameraObject->setName(name);
237 TApp::instance()->getCurrentScene()->notifySceneChanged();
238 TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
239 }
240
updateFields()241 void CameraSettingsPopup::updateFields() {
242 TStageObject *cameraObject = getCameraObject();
243 if (!cameraObject) return; // it should never happen
244 m_nameFld->setText(QString(cameraObject->getName().c_str()));
245 TCamera *camera = cameraObject->getCamera();
246 if (Preferences::instance()->getPixelsOnly()) {
247 TDimension res = camera->getRes();
248 camera->setSize(
249 TDimensionD(res.lx / Stage::standardDpi, res.ly / Stage::standardDpi));
250 }
251 if (camera) m_cameraSettingsWidget->setFields(camera);
252 }
253
onLevelSwitched(TXshLevel *)254 void CameraSettingsPopup::onLevelSwitched(TXshLevel *) {
255 m_cameraSettingsWidget->setCurrentLevel(
256 TApp::instance()->getCurrentLevel()->getLevel());
257 }
258
259 //=============================================================================
260
261 OpenPopupCommandHandler<CameraSettingsPopup> openCameraSettingsPopup(
262 MI_CameraSettings);
263