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