// Tnz6 includes
#include "menubarcommandids.h"
#include "tapp.h"
#include "camerasettingspopup.h"
#include "reslist.h"
#include "castselection.h"
// TnzTools includes
#include "tools/tooloptions.h"
// TnzQt includes
#include "toonzqt/menubarcommand.h"
#include "toonzqt/doublefield.h"
#include "toonzqt/lineedit.h"
#include "toonzqt/checkbox.h"
#include "toonzqt/tselectionhandle.h"
#include "toonzqt/camerasettingswidget.h"
// TnzLib includes
#include "toonz/toonzfolders.h"
#include "toonz/txsheet.h"
#include "toonz/tstageobjecttree.h"
#include "toonz/tcamera.h"
#include "toonz/txshlevelhandle.h"
#include "toonz/txsheethandle.h"
#include "toonz/tscenehandle.h"
#include "toonz/tobjecthandle.h"
#include "toonz/cleanupparameters.h"
#include "toonz/toonzscene.h"
#include "toonz/sceneproperties.h"
#include "toonz/stage2.h"
#include "toonz/txshsimplelevel.h"
#include "toonz/txshleveltypes.h"
// TnzCore includes
#include "tconvert.h"
#include "tsystem.h"
#include "tfilepath_io.h"
// Qt includes
#include <QLabel>
#include <QGridLayout>
#include <QRadioButton>
#include <QComboBox>
#include <QPushButton>
#include <QMoveEvent>
#include <QMainWindow>
using namespace std;
using namespace DVGui;
class CameraSettingsPopup;
//=============================================================================
class OpenCameraStageCommandHandler : public MenuItemHandler
{
CommandId m_id;
public:
OpenCameraStageCommandHandler(CommandId cmdId) : MenuItemHandler(cmdId) {}
void execute()
{
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
TStageObjectId cameraId = TApp::instance()->getCurrentObject()->getObjectId();
CameraSettingsPopup *popup = CameraSettingsPopup::createPopup(cameraId);
int index = cameraId.getIndex();
popup->move(popup->pos() + QPoint(20, 10) * index);
popup->show();
popup->raise();
popup->activateWindow();
}
} OpenCameraStageCommandHandler(MI_CameraStage);
//=============================================================================
std::map<TStageObjectId, CameraSettingsPopup *> CameraSettingsPopup::m_popups;
CameraSettingsPopup::CameraSettingsPopup()
: QDialog(TApp::instance()->getMainWindow())
{
m_nameFld = new LineEdit();
m_cameraSettingsWidget = new CameraSettingsWidget();
m_cameraSettingsWidget->setPresetListFile(ToonzFolder::getReslistPath(false));
//---- layout
QVBoxLayout *mainLay = new QVBoxLayout();
mainLay->setMargin(5);
mainLay->setSpacing(8);
{
QHBoxLayout *nameLay = new QHBoxLayout();
nameLay->setMargin(0);
nameLay->setSpacing(3);
{
nameLay->addWidget(new QLabel(tr("Name:")), 0);
nameLay->addWidget(m_nameFld, 1);
}
mainLay->addLayout(nameLay, 0);
mainLay->addWidget(m_cameraSettingsWidget, 1);
}
setLayout(mainLay);
//---- signal-slot connections
bool ret = true;
ret = ret && connect(m_cameraSettingsWidget, SIGNAL(changed()), SLOT(onChanged()));
ret = ret && connect(m_nameFld, SIGNAL(editingFinished()), SLOT(onNameChanged()));
assert(ret);
}
void CameraSettingsPopup::moveEvent(QMoveEvent *e)
{
QPoint p = pos();
QPoint oldP = e->oldPos();
QDialog::moveEvent(e);
}
void CameraSettingsPopup::showEvent(QShowEvent *e)
{
updateWindowTitle();
updateFields();
m_cameraSettingsWidget->setCurrentLevel(TApp::instance()->getCurrentLevel()->getLevel());
TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
TObjectHandle *objectHandle = TApp::instance()->getCurrentObject();
TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel();
bool ret = true;
ret = ret && connect(sceneHandle, SIGNAL(sceneChanged()), SLOT(updateFields()));
ret = ret && connect(sceneHandle, SIGNAL(sceneSwitched()), SLOT(updateFields()));
ret = ret && connect(objectHandle, SIGNAL(objectChanged(bool)), SLOT(updateFields(bool)));
ret = ret && connect(objectHandle, SIGNAL(objectSwitched()), SLOT(updateFields()));
ret = ret && connect(xsheetHandle, SIGNAL(xsheetSwitched()), SLOT(updateFields()));
ret = ret && connect(xsheetHandle, SIGNAL(xsheetChanged()), SLOT(updateFields()));
ret = ret && connect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), SLOT(onLevelSwitched(TXshLevel *)));
assert(ret);
}
void CameraSettingsPopup::hideEvent(QHideEvent *e)
{
m_cameraSettingsWidget->setCurrentLevel(0);
if (m_cameraId != TStageObjectId::NoneId) {
//Remove the popup from currentlyOpened ones and schedule for deletion
m_popups.erase(m_cameraId);
m_cameraId = TStageObjectId::NoneId;
deleteLater();
}
TSceneHandle *sceneHandle = TApp::instance()->getCurrentScene();
TObjectHandle *objectHandle = TApp::instance()->getCurrentObject();
TXsheetHandle *xsheetHandle = TApp::instance()->getCurrentXsheet();
TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel();
bool ret = true;
ret = ret && disconnect(sceneHandle, SIGNAL(sceneChanged()), this, SLOT(updateFields()));
ret = ret && disconnect(sceneHandle, SIGNAL(sceneSwitched()), this, SLOT(updateFields()));
ret = ret && disconnect(objectHandle, SIGNAL(objectChanged(bool)), this, SLOT(updateFields(bool)));
ret = ret && disconnect(objectHandle, SIGNAL(objectSwitched()), this, SLOT(updateFields()));
ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetSwitched()), this, SLOT(updateFields()));
ret = ret && disconnect(xsheetHandle, SIGNAL(xsheetChanged()), this, SLOT(updateFields()));
ret = ret && disconnect(levelHandle, SIGNAL(xshLevelSwitched(TXshLevel *)), this, SLOT(onLevelSwitched(TXshLevel *)));
assert(ret);
}
CameraSettingsPopup *CameraSettingsPopup::createPopup(const TStageObjectId &id)
{
std::map<TStageObjectId, CameraSettingsPopup *>::iterator it = m_popups.find(id);
if (it == m_popups.end()) {
CameraSettingsPopup *popup = new CameraSettingsPopup();
popup->attachToCamera(id);
m_popups[id] = popup;
return popup;
} else
return it->second;
}
TStageObject *CameraSettingsPopup::getCameraObject()
{
TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
TStageObjectId cameraId = m_cameraId;
if (!cameraId.isCamera())
cameraId = xsheet->getStageObjectTree()->getCurrentCameraId();
if (!cameraId.isCamera())
return 0;
return xsheet->getStageObject(cameraId);
}
TCamera *CameraSettingsPopup::getCamera()
{
TStageObject *cameraObject = getCameraObject();
return cameraObject ? cameraObject->getCamera() : 0;
}
void CameraSettingsPopup::updateWindowTitle()
{
if (m_cameraId.isCamera()) {
setWindowTitle(tr("Camera#%1 Settings").arg(QString::number(1 + m_cameraId.getIndex())));
} else {
setWindowTitle(tr("Current Camera Settings"));
}
}
void CameraSettingsPopup::onChanged()
{
TCamera *camera = getCamera();
if (!camera)
return;
m_cameraSettingsWidget->getFields(camera);
TApp::instance()->getCurrentScene()->notifySceneChanged();
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
emit changed();
}
void CameraSettingsPopup::onNameChanged()
{
TStageObject *cameraObject = getCameraObject();
if (!cameraObject)
return;
string name = m_nameFld->text().toStdString();
string curName = cameraObject->getName();
if (curName == name)
return;
cameraObject->setName(name);
TApp::instance()->getCurrentScene()->notifySceneChanged();
TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
}
void CameraSettingsPopup::updateFields()
{
TStageObject *cameraObject = getCameraObject();
if (!cameraObject)
return; // it should never happen
m_nameFld->setText(QString(cameraObject->getName().c_str()));
TCamera *camera = cameraObject->getCamera();
if (camera)
m_cameraSettingsWidget->setFields(camera);
}
void CameraSettingsPopup::onLevelSwitched(TXshLevel *)
{
m_cameraSettingsWidget->setCurrentLevel(TApp::instance()->getCurrentLevel()->getLevel());
}
//=============================================================================
OpenPopupCommandHandler<CameraSettingsPopup> openCameraSettingsPopup(MI_CameraSettings);