diff --git a/toonz/sources/include/toonzqt/flipconsole.h b/toonz/sources/include/toonzqt/flipconsole.h index def79e2..9474eb7 100644 --- a/toonz/sources/include/toonzqt/flipconsole.h +++ b/toonz/sources/include/toonzqt/flipconsole.h @@ -184,45 +184,45 @@ class DVAPI FlipConsole final : public QWidget { public: enum EGadget { - eBegin = 0, - ePlay = 0x1, - eLoop = 0x2, - ePause = 0x4, - ePrev = 0x8, - eNext = 0x10, - eFirst = 0x20, - eLast = 0x40, - eRed = 0x80, - eGreen = 0x100, - eBlue = 0x200, - eGRed = 0x400, - eGGreen = 0x800, - eGBlue = 0x1000, - eMatte = 0x2000, - eFrames = 0x4000, - eRate = 0x8000, - eSound = 0x10000, - eHisto = 0x20000, - eBlackBg = 0x40000, - eWhiteBg = 0x80000, - eCheckBg = 0x100000, - eSaveImg = 0x200000, - eCompare = 0x400000, - eCustomize = 0x800000, - eSave = 0x1000000, - eDefineSubCamera = 0x2000000, - eFilledRaster = 0x4000000, // Used only in LineTest - eDefineLoadBox = 0x8000000, - eUseLoadBox = 0x10000000, - eLocator = 0x20000000, - eEnd = 0x40000000 + eBegin, + ePlay, + eLoop, + ePause, + ePrev, + eNext, + eFirst, + eLast, + eRed, + eGreen, + eBlue, + eGRed, + eGGreen, + eGBlue, + eMatte, + eFrames, + eRate, + eSound, + eHisto, + eBlackBg, + eWhiteBg, + eCheckBg, + eSaveImg, + eCompare, + eCustomize, + eSave, + eDefineSubCamera, + eFilledRaster, // Used only in LineTest + eDefineLoadBox, + eUseLoadBox, + eLocator, + eZoomIn, + eZoomOut, + eFlipHorizontal, + eFlipVertical, + eResetView, + eEnd }; - static const UINT cFullConsole = eEnd - 1; - static const UINT cFilterRgb = eRed | eGreen | eBlue; - static const UINT cFilterGRgb = eGRed | eGGreen | eGBlue; - static const UINT eFilterRgbm = cFilterRgb | eMatte; - static FlipConsole *m_currentConsole; static QList m_visibleConsoles; static bool m_isLinkedPlaying; @@ -230,8 +230,9 @@ public: // blanksEnabled==true->at begin of each loop a number of blank frames are // drawn (according to rpeferences settings) - FlipConsole(QVBoxLayout *layout, UINT gadgetsMask, bool isLinkable, - QWidget *customWidget, const QString &customizeId, + FlipConsole(QVBoxLayout *layout, std::vector gadgetsMask, + bool isLinkable, QWidget *customWidget, + const QString &customizeId, FlipConsoleOwner *consoleOwner, // call // consoleOwner->onDrawFrame() // intead of emitting drawFrame @@ -294,6 +295,12 @@ public: void playNextFrame(); void updateCurrentFPS(int val); + bool hasButton(std::vector buttonMask, FlipConsole::EGadget buttonId) { + if (buttonMask.size() == 0) return true; + return std::find(buttonMask.begin(), buttonMask.end(), buttonId) == + buttonMask.end(); + } + signals: void buttonPressed(FlipConsole::EGadget button); @@ -309,7 +316,7 @@ private: QAction *m_customSep, *m_rateSep, *m_histoSep, *m_bgSep, *m_vcrSep, *m_compareSep, *m_saveSep, *m_colorFilterSep, *m_soundSep, *m_subcamSep, - *m_filledRasterSep; + *m_filledRasterSep, *m_viewerSep; QToolBar *m_playToolBar; QActionGroup *m_colorFilterGroup; @@ -325,7 +332,7 @@ private: QFrame *createFpsSlider(); QAction *m_doubleRedAction, *m_doubleGreenAction, *m_doubleBlueAction; DoubleButton *m_doubleRed, *m_doubleGreen, *m_doubleBlue; - UINT m_gadgetsMask; + std::vector m_gadgetsMask; int m_from, m_to, m_step; int m_currentFrame, m_framesCount; ImagePainter::VisualSettings m_settings; @@ -358,7 +365,7 @@ private: QActionGroup *group, DoubleButton *&w); QFrame *createFrameSlider(); - void createPlayToolBar(bool withCustomWidget); + void createPlayToolBar(QWidget *customWidget); DVGui::IntLineEdit *m_editCurrFrame; FlipSlider *m_currFrameSlider; diff --git a/toonz/sources/toonz/Resources/fliphoriz_off.svg b/toonz/sources/toonz/Resources/fliphoriz_off.svg new file mode 100644 index 0000000..8511ae8 --- /dev/null +++ b/toonz/sources/toonz/Resources/fliphoriz_off.svg @@ -0,0 +1,65 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/fliphoriz_on.svg b/toonz/sources/toonz/Resources/fliphoriz_on.svg new file mode 100644 index 0000000..a757489 --- /dev/null +++ b/toonz/sources/toonz/Resources/fliphoriz_on.svg @@ -0,0 +1,72 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/fliphoriz_over.svg b/toonz/sources/toonz/Resources/fliphoriz_over.svg new file mode 100644 index 0000000..682a84d --- /dev/null +++ b/toonz/sources/toonz/Resources/fliphoriz_over.svg @@ -0,0 +1,65 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/flipvert_off.svg b/toonz/sources/toonz/Resources/flipvert_off.svg new file mode 100644 index 0000000..0ffab5c --- /dev/null +++ b/toonz/sources/toonz/Resources/flipvert_off.svg @@ -0,0 +1,68 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/flipvert_on.svg b/toonz/sources/toonz/Resources/flipvert_on.svg new file mode 100644 index 0000000..b064a92 --- /dev/null +++ b/toonz/sources/toonz/Resources/flipvert_on.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/flipvert_over.svg b/toonz/sources/toonz/Resources/flipvert_over.svg new file mode 100644 index 0000000..1666dec --- /dev/null +++ b/toonz/sources/toonz/Resources/flipvert_over.svg @@ -0,0 +1,68 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/reset.svg b/toonz/sources/toonz/Resources/reset.svg new file mode 100644 index 0000000..30b5cee --- /dev/null +++ b/toonz/sources/toonz/Resources/reset.svg @@ -0,0 +1,69 @@ + +image/svg+xml + + + + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/reset_over.svg b/toonz/sources/toonz/Resources/reset_over.svg new file mode 100644 index 0000000..85eabd2 --- /dev/null +++ b/toonz/sources/toonz/Resources/reset_over.svg @@ -0,0 +1,66 @@ + +image/svg+xml + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/zoomin.svg b/toonz/sources/toonz/Resources/zoomin.svg new file mode 100644 index 0000000..053b269 --- /dev/null +++ b/toonz/sources/toonz/Resources/zoomin.svg @@ -0,0 +1,67 @@ + +image/svg+xml + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/zoomin_over.svg b/toonz/sources/toonz/Resources/zoomin_over.svg new file mode 100644 index 0000000..d96b417 --- /dev/null +++ b/toonz/sources/toonz/Resources/zoomin_over.svg @@ -0,0 +1,65 @@ + +image/svg+xml + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/zoomout.svg b/toonz/sources/toonz/Resources/zoomout.svg new file mode 100644 index 0000000..eccb446 --- /dev/null +++ b/toonz/sources/toonz/Resources/zoomout.svg @@ -0,0 +1,65 @@ + +image/svg+xml + \ No newline at end of file diff --git a/toonz/sources/toonz/Resources/zoomout_over.svg b/toonz/sources/toonz/Resources/zoomout_over.svg new file mode 100644 index 0000000..2329d26 --- /dev/null +++ b/toonz/sources/toonz/Resources/zoomout_over.svg @@ -0,0 +1,65 @@ + +image/svg+xml + \ No newline at end of file diff --git a/toonz/sources/toonz/colormodelviewer.cpp b/toonz/sources/toonz/colormodelviewer.cpp index 9bd2029..fc96799 100644 --- a/toonz/sources/toonz/colormodelviewer.cpp +++ b/toonz/sources/toonz/colormodelviewer.cpp @@ -79,14 +79,19 @@ TPaletteHandle *getPaletteHandle() { */ ColorModelViewer::ColorModelViewer(QWidget *parent) : FlipBook(parent, QString(tr("Color Model")), - FlipConsole::cFullConsole & - (~(FlipConsole::eFilterRgbm | FlipConsole::cFilterGRgb | - FlipConsole::eRate | FlipConsole::eSound | - FlipConsole::eSaveImg | FlipConsole::eHisto | - FlipConsole::eCompare | FlipConsole::eCustomize | - FlipConsole::eSave | FlipConsole::eFilledRaster | - FlipConsole::eDefineLoadBox | FlipConsole::eUseLoadBox | - FlipConsole::eDefineSubCamera | FlipConsole::eLocator)), + std::vector( + {FlipConsole::eRed, FlipConsole::eGreen, + FlipConsole::eBlue, FlipConsole::eMatte, + FlipConsole::eGRed, FlipConsole::eGGreen, + FlipConsole::eGBlue, FlipConsole::eRate, + FlipConsole::eSound, FlipConsole::eSaveImg, + FlipConsole::eHisto, FlipConsole::eCompare, + FlipConsole::eCustomize, FlipConsole::eSave, + FlipConsole::eFilledRaster, FlipConsole::eDefineLoadBox, + FlipConsole::eUseLoadBox, FlipConsole::eDefineSubCamera, + FlipConsole::eLocator, FlipConsole::eZoomIn, + FlipConsole::eZoomOut, FlipConsole::eFlipHorizontal, + FlipConsole::eFlipVertical, FlipConsole::eResetView}), eDontKeepFilesOpened, true) , m_mode(0) , m_currentRefImgPath(TFilePath()) { diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index f0c4a5d..6904b77 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -123,11 +123,9 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) m_keyFrameButton->setXsheetHandle(app->getCurrentXsheet()); // FlipConsole - int buttons = FlipConsole::cFullConsole; - // buttons &= (~FlipConsole::eSound); - buttons &= (~FlipConsole::eFilledRaster); - buttons &= (~FlipConsole::eDefineLoadBox); - buttons &= (~FlipConsole::eUseLoadBox); + std::vector buttonMask = {FlipConsole::eFilledRaster, + FlipConsole::eDefineLoadBox, + FlipConsole::eUseLoadBox}; /* --- layout --- */ QVBoxLayout *mainLayout = new QVBoxLayout(); @@ -147,7 +145,7 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) } mainLayout->addLayout(viewerL, 1); m_flipConsole = - new FlipConsole(mainLayout, buttons, false, m_keyFrameButton, + new FlipConsole(mainLayout, buttonMask, false, m_keyFrameButton, "SceneViewerConsole", this, true); } setLayout(mainLayout); @@ -188,6 +186,10 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget))); ret = ret && connect(m_sceneViewer, SIGNAL(previewStatusChanged()), this, SLOT(update())); + ret = ret && connect(m_sceneViewer, SIGNAL(onFlipHChanged(bool)), this, + SLOT(setFlipHButtonChecked(bool))); + ret = ret && connect(m_sceneViewer, SIGNAL(onFlipVChanged(bool)), this, + SLOT(setFlipVButtonChecked(bool))); ret = ret && connect(app->getCurrentScene(), SIGNAL(sceneSwitched()), this, SLOT(onSceneSwitched())); @@ -863,6 +865,14 @@ void ComboViewerPanel::onButtonPressed(FlipConsole::EGadget button) { } } +void ComboViewerPanel::setFlipHButtonChecked(bool checked) { + m_flipConsole->setChecked(FlipConsole::eFlipHorizontal, checked); +} + +void ComboViewerPanel::setFlipVButtonChecked(bool checked) { + m_flipConsole->setChecked(FlipConsole::eFlipVertical, checked); +} + //----------------------------------------------------------------------------- void ComboViewerPanel::setVisiblePartsFlag(UINT flag) { diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index 614e8f6..df778a3 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -122,6 +122,8 @@ public slots: void onShowHideActionTriggered(QAction *); void enableFlipConsoleForCamerastand(bool on); void onButtonPressed(FlipConsole::EGadget button); + void setFlipHButtonChecked(bool checked); + void setFlipVButtonChecked(bool checked); protected slots: void onFrameChanged(); diff --git a/toonz/sources/toonz/flipbook.cpp b/toonz/sources/toonz/flipbook.cpp index 4bc2e62..a9b6ad1 100644 --- a/toonz/sources/toonz/flipbook.cpp +++ b/toonz/sources/toonz/flipbook.cpp @@ -162,7 +162,7 @@ inline TRectD getImageBoundsD(const TImageP &img) { \sa FlipBookPool class. */ FlipBook::FlipBook(QWidget *parent, QString viewerTitle, - UINT flipConsoleButtonMask, UCHAR flags, + std::vector flipConsoleButtonMask, UCHAR flags, bool isColorModel) //, bool showOnlyPlayBackgroundButton) : QWidget(parent), m_viewerTitle(viewerTitle), @@ -201,7 +201,9 @@ FlipBook::FlipBook(QWidget *parent, QString viewerTitle, new ImageUtils::FullScreenWidget(this); m_imageViewer = new ImageViewer( - fsWidget, this, flipConsoleButtonMask == FlipConsole::cFullConsole); + fsWidget, this, + std::find(flipConsoleButtonMask.begin(), flipConsoleButtonMask.end(), + FlipConsole::eHisto) == flipConsoleButtonMask.end()); fsWidget->setWidget(m_imageViewer); setFocusProxy(m_imageViewer); diff --git a/toonz/sources/toonz/flipbook.h b/toonz/sources/toonz/flipbook.h index 97a0cf6..474550f 100644 --- a/toonz/sources/toonz/flipbook.h +++ b/toonz/sources/toonz/flipbook.h @@ -186,10 +186,11 @@ public: enum Flags { eDontKeepFilesOpened = 0x1 }; FlipBook(QWidget *parent = 0, QString viewerTitle = QString(), - UINT flipConsoleButtonMask = FlipConsole::cFullConsole & - (~(FlipConsole::eFilledRaster | - FlipConsole::eDefineSubCamera | - FlipConsole::eLocator)), + std::vector flipConsoleButtonMask = + {FlipConsole::eFilledRaster, FlipConsole::eDefineSubCamera, + FlipConsole::eLocator, FlipConsole::eZoomIn, + FlipConsole::eZoomOut, FlipConsole::eFlipHorizontal, + FlipConsole::eFlipVertical, FlipConsole::eResetView}, UCHAR flags = 0, bool isColorModel = false); ~FlipBook(); void setLevel(const TFilePath &path, TPalette *palette = 0, int from = -1, diff --git a/toonz/sources/toonz/magpiefileimportpopup.cpp b/toonz/sources/toonz/magpiefileimportpopup.cpp index 72a90ab..274c5b5 100644 --- a/toonz/sources/toonz/magpiefileimportpopup.cpp +++ b/toonz/sources/toonz/magpiefileimportpopup.cpp @@ -111,20 +111,44 @@ MagpieFileImportPopup::MagpieFileImportPopup() QVBoxLayout *frameLayout = new QVBoxLayout(frame); frameLayout->setMargin(0); frameLayout->setSpacing(0); - UINT buttonMask = - FlipConsole::cFullConsole & - (~(FlipConsole::eRate | FlipConsole::eSound | FlipConsole::eSaveImg | - FlipConsole::eHisto | FlipConsole::eCompare | FlipConsole::eCustomize | - FlipConsole::eSave | FlipConsole::eBegin | FlipConsole::eEnd | - FlipConsole::eFirst | FlipConsole::eNext | FlipConsole::ePause | - FlipConsole::ePlay | FlipConsole::ePrev | FlipConsole::eRate | - FlipConsole::eWhiteBg | FlipConsole::eCheckBg | FlipConsole::eBlackBg | - FlipConsole::eNext | FlipConsole::eLast | FlipConsole::eLoop | - FlipConsole::eGRed | FlipConsole::eGGreen | FlipConsole::eGBlue | - FlipConsole::eRed | FlipConsole::eGreen | FlipConsole::eBlue | - FlipConsole::eMatte | FlipConsole::eDefineSubCamera | - FlipConsole::eDefineLoadBox | FlipConsole::eUseLoadBox | - FlipConsole::eFilledRaster | FlipConsole::eLocator)); + std::vector buttonMask = {FlipConsole::eRate, + FlipConsole::eSound, + FlipConsole::eSaveImg, + FlipConsole::eHisto, + FlipConsole::eCompare, + FlipConsole::eCustomize, + FlipConsole::eSave, + FlipConsole::eBegin, + FlipConsole::eEnd, + FlipConsole::eFirst, + FlipConsole::eNext, + FlipConsole::ePause, + FlipConsole::ePlay, + FlipConsole::ePrev, + FlipConsole::eRate, + FlipConsole::eWhiteBg, + FlipConsole::eCheckBg, + FlipConsole::eBlackBg, + FlipConsole::eNext, + FlipConsole::eLast, + FlipConsole::eLoop, + FlipConsole::eGRed, + FlipConsole::eGGreen, + FlipConsole::eGBlue, + FlipConsole::eRed, + FlipConsole::eGreen, + FlipConsole::eBlue, + FlipConsole::eMatte, + FlipConsole::eDefineSubCamera, + FlipConsole::eDefineLoadBox, + FlipConsole::eUseLoadBox, + FlipConsole::eFilledRaster, + FlipConsole::eLocator, + FlipConsole::eZoomIn, + FlipConsole::eZoomOut, + FlipConsole::eFlipHorizontal, + FlipConsole::eFlipVertical, + FlipConsole::eResetView}; m_flipbook = new FlipBook(this, tr("Import Magpie File"), buttonMask); m_flipbook->setFixedHeight(250); frameLayout->addWidget(m_flipbook); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index 4ff0e27..c65f669 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -2000,6 +2000,7 @@ void SceneViewer::flipX() { m_isFlippedX = !m_isFlippedX; invalidateAll(); emit onZoomChanged(); + emit onFlipHChanged(m_isFlippedX); } //----------------------------------------------------------------------------- @@ -2010,6 +2011,21 @@ void SceneViewer::flipY() { m_isFlippedY = !m_isFlippedY; invalidateAll(); emit onZoomChanged(); + emit onFlipVChanged(m_isFlippedY); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::zoomIn() { + m_lastMousePos = rect().center(); + zoomQt(true, false); +} + +//----------------------------------------------------------------------------- + +void SceneViewer::zoomOut() { + m_lastMousePos = rect().center(); + zoomQt(false, false); } //----------------------------------------------------------------------------- @@ -2063,6 +2079,9 @@ void SceneViewer::fitToCamera() { bool tempIsFlippedY = m_isFlippedY; resetSceneViewer(); + m_isFlippedX = tempIsFlippedX; + m_isFlippedY = tempIsFlippedY; + TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet(); int frame = TApp::instance()->getCurrentFrame()->getFrame(); TStageObjectId cameraId = xsh->getStageObjectTree()->getCurrentCameraId(); @@ -2101,6 +2120,8 @@ void SceneViewer::fitToCamera() { // Scale and center on the center of \a rect. QPoint c = viewRect.center(); zoom(TPointD(c.x(), c.y()), ratio); + emit onFlipHChanged(m_isFlippedX); + emit onFlipVChanged(m_isFlippedY); } //----------------------------------------------------------------------------- @@ -2120,6 +2141,8 @@ void SceneViewer::resetSceneViewer() { m_isFlippedX = false; m_isFlippedY = false; emit onZoomChanged(); + emit onFlipHChanged(m_isFlippedX); + emit onFlipVChanged(m_isFlippedY); invalidateAll(); } diff --git a/toonz/sources/toonz/sceneviewer.h b/toonz/sources/toonz/sceneviewer.h index d6139f1..3c8369c 100644 --- a/toonz/sources/toonz/sceneviewer.h +++ b/toonz/sources/toonz/sceneviewer.h @@ -397,6 +397,8 @@ public slots: void setActualPixelSize(); void flipX(); void flipY(); + void zoomIn(); + void zoomOut(); void onXsheetChanged(); void onObjectSwitched(); // when tool options are changed, update tooltip immediately @@ -431,6 +433,8 @@ public slots: signals: void onZoomChanged(); + void onFlipHChanged(bool); + void onFlipVChanged(bool); void freezeStateChanged(bool); void previewStatusChanged(); // when pan/zoom on the viewer, notify to level strip in order to update the diff --git a/toonz/sources/toonz/sceneviewerevents.cpp b/toonz/sources/toonz/sceneviewerevents.cpp index 192f250..34251c2 100644 --- a/toonz/sources/toonz/sceneviewerevents.cpp +++ b/toonz/sources/toonz/sceneviewerevents.cpp @@ -214,6 +214,22 @@ void SceneViewer::onButtonPressed(FlipConsole::EGadget button) { m_locator->raise(); m_locator->activateWindow(); break; + + case FlipConsole::eZoomIn: + zoomIn(); + break; + case FlipConsole::eZoomOut: + zoomOut(); + break; + case FlipConsole::eFlipHorizontal: + flipX(); + break; + case FlipConsole::eFlipVertical: + flipY(); + break; + case FlipConsole::eResetView: + resetSceneViewer(); + break; } } diff --git a/toonz/sources/toonz/toonz.qrc b/toonz/sources/toonz/toonz.qrc index 7a2dd82..7297f28 100644 --- a/toonz/sources/toonz/toonz.qrc +++ b/toonz/sources/toonz/toonz.qrc @@ -470,5 +470,17 @@ Resources/shift_and_trace_reset.svg Resources/up.svg Resources/down.svg + Resources/zoomin.svg + Resources/zoomin_over.svg + Resources/zoomout.svg + Resources/zoomout_over.svg + Resources/fliphoriz_on.svg + Resources/fliphoriz_off.svg + Resources/fliphoriz_over.svg + Resources/flipvert_on.svg + Resources/flipvert_off.svg + Resources/flipvert_over.svg + Resources/reset.svg + Resources/reset_over.svg diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index a82f7e7..7051191 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -118,15 +118,13 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) m_keyFrameButton->setObjectHandle(app->getCurrentObject()); m_keyFrameButton->setXsheetHandle(app->getCurrentXsheet()); - int buttons = FlipConsole::cFullConsole; + std::vector buttonMask = {FlipConsole::eFilledRaster, + FlipConsole::eDefineLoadBox, + FlipConsole::eUseLoadBox}; - // buttons &= (~FlipConsole::eSound); - buttons &= (~FlipConsole::eFilledRaster); - buttons &= (~FlipConsole::eDefineLoadBox); - buttons &= (~FlipConsole::eUseLoadBox); - - m_flipConsole = new FlipConsole(mainLayout, buttons, false, m_keyFrameButton, - "SceneViewerConsole", this, true); + m_flipConsole = + new FlipConsole(mainLayout, buttonMask, false, m_keyFrameButton, + "SceneViewerConsole", this, true); m_flipConsole->enableButton(FlipConsole::eMatte, false, false); m_flipConsole->enableButton(FlipConsole::eSave, false, false); @@ -156,6 +154,10 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) ret = ret && connect(m_sceneViewer, SIGNAL(previewStatusChanged()), this, SLOT(update())); + ret = ret && connect(m_sceneViewer, SIGNAL(onFlipHChanged(bool)), this, + SLOT(setFlipHButtonChecked(bool))); + ret = ret && connect(m_sceneViewer, SIGNAL(onFlipVChanged(bool)), this, + SLOT(setFlipVButtonChecked(bool))); ret = ret && connect(app->getCurrentScene(), SIGNAL(sceneSwitched()), this, SLOT(onSceneSwitched())); @@ -743,3 +745,11 @@ void SceneViewerPanel::onButtonPressed(FlipConsole::EGadget button) { m_playSound = !m_playSound; } } + +void SceneViewerPanel::setFlipHButtonChecked(bool checked) { + m_flipConsole->setChecked(FlipConsole::eFlipHorizontal, checked); +} + +void SceneViewerPanel::setFlipVButtonChecked(bool checked) { + m_flipConsole->setChecked(FlipConsole::eFlipVertical, checked); +} diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index 327c130..9d0034e 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -88,6 +88,8 @@ public slots: void updateFrameRange(); void updateFrameMarkers(); void onButtonPressed(FlipConsole::EGadget button); + void setFlipHButtonChecked(bool checked); + void setFlipVButtonChecked(bool checked); protected slots: diff --git a/toonz/sources/toonzqt/flipconsole.cpp b/toonz/sources/toonzqt/flipconsole.cpp index fbfcbb1..586f6f5 100644 --- a/toonz/sources/toonzqt/flipconsole.cpp +++ b/toonz/sources/toonzqt/flipconsole.cpp @@ -428,10 +428,11 @@ enum { eShowFilledRaster = 0x200, eShowDefineLoadBox = 0x400, eShowUseLoadBox = 0x800, - eShowHowMany = 0x1000 + eShowViewerControls = 0x1000, + eShowHowMany = 0x2000 }; -FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, +FlipConsole::FlipConsole(QVBoxLayout *mainLayout, std::vector gadgetsMask, bool isLinkable, QWidget *customWidget, const QString &customizeId, FlipConsoleOwner *consoleOwner, bool enableBlanks) @@ -470,6 +471,7 @@ FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, , m_customizeId(customizeId) , m_histoSep(0) , m_filledRasterSep(0) + , m_viewerSep(0) , m_bgSep(0) , m_vcrSep(0) , m_compareSep(0) @@ -484,14 +486,14 @@ FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, QString s = QSettings().value(m_customizeId).toString(); if (s != "") m_customizeMask = s.toUInt(); - if (m_gadgetsMask == 0) return; + if (m_gadgetsMask.size() == 0) return; // mainLayout->setMargin(1); // mainLayout->setSpacing(0); // create toolbars other than frame slider - if (m_gadgetsMask & (~eFrames)) { - createPlayToolBar(customWidget != 0); + if (hasButton(m_gadgetsMask, eFrames)) { + createPlayToolBar(customWidget); m_playToolBarContainer = new ToolBarContainer(); @@ -505,7 +507,7 @@ FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, hLayout->addWidget(scrollableContainer); // show fps - if (m_gadgetsMask & eRate) { + if (hasButton(m_gadgetsMask, eRate)) { QFrame *fpsSliderFrame = createFpsSlider(); hLayout->addWidget(fpsSliderFrame, 1); } @@ -516,16 +518,11 @@ FlipConsole::FlipConsole(QVBoxLayout *mainLayout, UINT gadgetsMask, } // create frame slider - if (m_gadgetsMask & eFrames) { + if (hasButton(m_gadgetsMask, eFrames)) { m_frameSliderFrame = createFrameSlider(); mainLayout->addWidget(m_frameSliderFrame); } - if (customWidget) { - m_customAction = m_playToolBar->addWidget(customWidget); - m_customSep = m_playToolBar->addSeparator(); - } - applyCustomizeMask(); bool ret = connect(&m_playbackExecutor, SIGNAL(nextFrame(int)), this, @@ -672,7 +669,6 @@ protected: //----------------------------------------------------------------------------- void FlipConsole::enableButton(UINT button, bool enable, bool doShowHide) { - if (!m_playToolBar) return; QList list = m_playToolBar->actions(); @@ -1053,13 +1049,21 @@ void FlipConsole::applyCustomizeMask() { if (m_filledRasterSep) m_filledRasterSep->setVisible(m_customizeMask & eShowFilledRaster); + enableButton(eZoomIn, m_customizeMask & eShowViewerControls); + enableButton(eZoomOut, m_customizeMask & eShowViewerControls); + enableButton(eFlipHorizontal, m_customizeMask & eShowViewerControls); + enableButton(eFlipVertical, m_customizeMask & eShowViewerControls); + enableButton(eResetView, m_customizeMask & eShowViewerControls); + if (m_viewerSep) + m_viewerSep->setVisible(m_customizeMask & eShowViewerControls); + update(); } //---------------------------------------------------------------------------------------------- void FlipConsole::createCustomizeMenu(bool withCustomWidget) { - if (m_gadgetsMask & eCustomize) { + if (hasButton(m_gadgetsMask, eCustomize)) { QIcon icon = createQIcon("options"); QToolButton *button = new QToolButton(); button->setIcon(icon); @@ -1072,37 +1076,48 @@ void FlipConsole::createCustomizeMenu(bool withCustomWidget) { m_playToolBar->addWidget(button); m_playToolBar->addSeparator(); - if (m_gadgetsMask & eSave) addMenuItem(eShowSave, tr("Save"), menu); + if (hasButton(m_gadgetsMask, eSave)) + addMenuItem(eShowSave, tr("Save"), menu); - if (m_gadgetsMask & eSaveImg || m_gadgetsMask & eCompare) + if (hasButton(m_gadgetsMask, eSaveImg) || + hasButton(m_gadgetsMask, eCompare)) addMenuItem(eShowCompare, tr("Snapshot"), menu); - if (m_gadgetsMask & eDefineSubCamera) + if (hasButton(m_gadgetsMask, eDefineSubCamera)) addMenuItem(eShowDefineSubCamera, tr("Define Sub-camera"), menu); - if (m_gadgetsMask & eDefineLoadBox) + if (hasButton(m_gadgetsMask, eDefineLoadBox)) addMenuItem(eShowDefineLoadBox, tr("Define Loading Box"), menu); - if (m_gadgetsMask & eUseLoadBox) + if (hasButton(m_gadgetsMask, eUseLoadBox)) addMenuItem(eShowUseLoadBox, tr("Use Loading Box"), menu); - if (m_gadgetsMask & eWhiteBg || m_gadgetsMask & eBlackBg || - m_gadgetsMask & eCheckBg) + if (hasButton(m_gadgetsMask, eWhiteBg) || + hasButton(m_gadgetsMask, eBlackBg) || + hasButton(m_gadgetsMask, eCheckBg)) addMenuItem(eShowBg, tr("Background Colors"), menu); - if (m_gadgetsMask & eRate) + if (hasButton(m_gadgetsMask, eRate)) addMenuItem(eShowFramerate, tr("Framerate"), menu); addMenuItem(eShowVcr, tr("Playback Controls"), menu); - if ((m_gadgetsMask & eRed) || (m_gadgetsMask & eGreen) || - (m_gadgetsMask & eBlue) || (m_gadgetsMask & eMatte)) + if (hasButton(m_gadgetsMask, eRed) || hasButton(m_gadgetsMask, eGreen) || + hasButton(m_gadgetsMask, eBlue) || hasButton(m_gadgetsMask, eMatte)) addMenuItem(eShowcolorFilter, tr("Color Channels"), menu); if (withCustomWidget) addMenuItem(eShowCustom, tr("Set Key"), menu); - if (m_gadgetsMask & eHisto) addMenuItem(eShowHisto, tr("Histogram"), menu); + if (hasButton(m_gadgetsMask, eHisto)) + addMenuItem(eShowHisto, tr("Histogram"), menu); - if (m_gadgetsMask & eFilledRaster) + if (hasButton(m_gadgetsMask, eFilledRaster)) addMenuItem(eFilledRaster, tr("Display Areas as Filled"), menu); + if (hasButton(m_gadgetsMask, eZoomIn) || + hasButton(m_gadgetsMask, eZoomOut) || + hasButton(m_gadgetsMask, eFlipHorizontal) || + hasButton(m_gadgetsMask, eFlipVertical) || + hasButton(m_gadgetsMask, eResetView)) + addMenuItem(eShowViewerControls, tr("Viewer Controls"), menu); + bool ret = connect(menu, SIGNAL(triggered(QAction *)), this, SLOT(onCustomizeButtonPressed(QAction *))); assert(ret); @@ -1111,8 +1126,9 @@ void FlipConsole::createCustomizeMenu(bool withCustomWidget) { //----------------------------------------------------------------------------- -void FlipConsole::createPlayToolBar(bool withCustomWidget) { - bool ret = true; +void FlipConsole::createPlayToolBar(QWidget *customWidget) { + bool ret = true; + bool withCustomWidget = customWidget != 0; m_playToolBar = new QToolBar(this); m_playToolBar->setMovable(false); @@ -1124,18 +1140,18 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { createCustomizeMenu(withCustomWidget); - if (m_gadgetsMask & eSave) { + if (hasButton(m_gadgetsMask, eSave)) { createButton(eSave, "save", tr("&Save Images"), false); // m_saveSep = m_playToolBar->addSeparator(); } // snapshot bool separator = false; - if (m_gadgetsMask & eSaveImg) { + if (hasButton(m_gadgetsMask, eSaveImg)) { createButton(eSaveImg, "snapshot", tr("&Snapshot"), false); separator = true; } - if (m_gadgetsMask & eCompare) { + if (hasButton(m_gadgetsMask, eCompare)) { createButton(eCompare, "compare", tr("&Compare to Snapshot"), true); separator = true; } @@ -1143,17 +1159,17 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { // sub camera separator = false; - if (m_gadgetsMask & eDefineSubCamera) { + if (hasButton(m_gadgetsMask, eDefineSubCamera)) { createButton(eDefineSubCamera, "define_subcamera_preview", tr("&Define Sub-camera"), true); separator = true; } - if (m_gadgetsMask & eDefineLoadBox) { + if (hasButton(m_gadgetsMask, eDefineLoadBox)) { createButton(eDefineLoadBox, "define_subcamera_preview", tr("&Define Loading Box"), true); separator = true; } - if (m_gadgetsMask & eUseLoadBox) { + if (hasButton(m_gadgetsMask, eUseLoadBox)) { createButton(eUseLoadBox, "use_subcamera_preview", tr("&Use Loading Box"), true); separator = true; @@ -1162,61 +1178,63 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { // preview BGs QActionGroup *group = new QActionGroup(m_playToolBar); - if (m_gadgetsMask & eWhiteBg) + if (hasButton(m_gadgetsMask, eWhiteBg)) createOnOffButton(eWhiteBg, "preview_white", tr("&White Background"), group); - if (m_gadgetsMask & eBlackBg) + if (hasButton(m_gadgetsMask, eBlackBg)) createOnOffButton(eBlackBg, "preview_black", tr("&Black Background"), group); - if (m_gadgetsMask & eCheckBg) + if (hasButton(m_gadgetsMask, eCheckBg)) createOnOffButton(eCheckBg, "preview_checkboard", tr("&Checkered Background"), group); - if (m_gadgetsMask & eWhiteBg) m_bgSep = m_playToolBar->addSeparator(); + if (hasButton(m_gadgetsMask, eWhiteBg)) + m_bgSep = m_playToolBar->addSeparator(); // VCR buttons QActionGroup *playGroup = new QActionGroup(m_playToolBar); - if (m_gadgetsMask & eFirst) + if (hasButton(m_gadgetsMask, eFirst)) createButton(eFirst, "framefirst", tr("&First Frame"), false); - if (m_gadgetsMask & ePrev) + if (hasButton(m_gadgetsMask, ePrev)) createButton(ePrev, "frameprev", tr("&Previous Frame"), false); - if (m_gadgetsMask & ePause) + if (hasButton(m_gadgetsMask, ePause)) createCheckedButtonWithBorderImage(ePause, "pause", tr("Pause"), true, playGroup, "A_Flip_Pause"); - if (m_gadgetsMask & ePlay) + if (hasButton(m_gadgetsMask, ePlay)) createCheckedButtonWithBorderImage(ePlay, "play", tr("Play"), true, playGroup, "A_Flip_Play"); - if (m_gadgetsMask & eLoop) + if (hasButton(m_gadgetsMask, eLoop)) createCheckedButtonWithBorderImage(eLoop, "loop", tr("Loop"), true, playGroup, "A_Flip_Loop"); - if (m_gadgetsMask & eNext) + if (hasButton(m_gadgetsMask, eNext)) createButton(eNext, "framenext", tr("&Next frame"), false); - if (m_gadgetsMask & eLast) + if (hasButton(m_gadgetsMask, eLast)) createButton(eLast, "framelast", tr("&Last Frame"), false); // separator - if (m_gadgetsMask & ePlay) m_vcrSep = m_playToolBar->addSeparator(); + if (hasButton(m_gadgetsMask, ePlay)) m_vcrSep = m_playToolBar->addSeparator(); // Channel Selector m_colorFilterGroup = new QActionGroup(m_playToolBar); m_colorFilterGroup->setExclusive(false); - if ((m_gadgetsMask & eRed) && !(m_gadgetsMask & eGRed)) + if (hasButton(m_gadgetsMask, eRed) && !hasButton(m_gadgetsMask, eGRed)) createButton(eRed, "channelred", tr("Red Channel"), true); - else if ((m_gadgetsMask & eRed) && (m_gadgetsMask & eGRed)) + else if (hasButton(m_gadgetsMask, eRed) && hasButton(m_gadgetsMask, eGRed)) m_doubleRedAction = createDoubleButton( eRed, eGRed, "half_R", "half_bw", tr("Red Channel"), tr("Red Channel in Grayscale"), m_colorFilterGroup, m_doubleRed); - if ((m_gadgetsMask & eGreen) && !(m_gadgetsMask & eGGreen)) + if (hasButton(m_gadgetsMask, eGreen) && !hasButton(m_gadgetsMask, eGGreen)) createButton(eGreen, "channelgreen", tr("Green Channel"), true); - else if ((m_gadgetsMask & eGreen) && (m_gadgetsMask & eGGreen)) + else if (hasButton(m_gadgetsMask, eGreen) && + hasButton(m_gadgetsMask, eGGreen)) m_doubleGreenAction = createDoubleButton( eGreen, eGGreen, "half_G", "half_bw", tr("Green Channel"), tr("Green Channel in Grayscale"), m_colorFilterGroup, m_doubleGreen); - if ((m_gadgetsMask & eBlue) && !(m_gadgetsMask & eGBlue)) + if (hasButton(m_gadgetsMask, eBlue) && !hasButton(m_gadgetsMask, eGBlue)) createButton(eBlue, "channelblue", tr("Blue Channel"), true); - else if ((m_gadgetsMask & eBlue) && (m_gadgetsMask & eGBlue)) + else if (hasButton(m_gadgetsMask, eBlue) && hasButton(m_gadgetsMask, eGBlue)) m_doubleBlueAction = createDoubleButton( eBlue, eGBlue, "half_B", "half_bw", tr("Blue Channel"), tr("Blue Channel in Grayscale"), m_colorFilterGroup, m_doubleBlue); @@ -1224,34 +1242,57 @@ void FlipConsole::createPlayToolBar(bool withCustomWidget) { ret = ret && connect(m_colorFilterGroup, SIGNAL(triggered(QAction *)), this, SLOT(onButtonPressed(QAction *))); - if (m_gadgetsMask & eMatte) + if (hasButton(m_gadgetsMask, eMatte)) createButton(eMatte, "channelmatte", tr("Alpha Channel"), true); // separator - if (m_gadgetsMask & eRed || m_gadgetsMask & eGRed) + if (hasButton(m_gadgetsMask, eRed) || hasButton(m_gadgetsMask, eGRed)) m_colorFilterSep = m_playToolBar->addSeparator(); // Sound & Histogram & Locator - if (m_gadgetsMask & eSound || m_gadgetsMask & eHisto || - m_gadgetsMask & eLocator) { - if (m_gadgetsMask & eSound) { + if (hasButton(m_gadgetsMask, eSound) || hasButton(m_gadgetsMask, eHisto) || + hasButton(m_gadgetsMask, eLocator)) { + if (hasButton(m_gadgetsMask, eSound)) { createButton(eSound, "sound", tr("&Soundtrack "), true); m_soundSep = m_playToolBar->addSeparator(); } - if (m_gadgetsMask & eHisto) + if (hasButton(m_gadgetsMask, eHisto)) createButton(eHisto, "histograms", tr("&Histogram"), false); - if (m_gadgetsMask & eLocator) + if (hasButton(m_gadgetsMask, eLocator)) createButton(eLocator, "locator", tr("&Locator"), false); - if (m_gadgetsMask & eHisto || m_gadgetsMask & eLocator) + if (hasButton(m_gadgetsMask, eHisto) || hasButton(m_gadgetsMask, eLocator)) m_histoSep = m_playToolBar->addSeparator(); } - if (m_gadgetsMask & eFilledRaster) { + if (hasButton(m_gadgetsMask, eFilledRaster)) { createOnOffButton(eFilledRaster, "preview_white", tr("&Display Areas as Filled"), 0); m_filledRasterSep = m_playToolBar->addSeparator(); } + if (withCustomWidget) { + m_customAction = m_playToolBar->addWidget(customWidget); + m_customSep = m_playToolBar->addSeparator(); + } + + if (hasButton(m_gadgetsMask, eZoomIn) || hasButton(m_gadgetsMask, eZoomOut) || + hasButton(m_gadgetsMask, eFlipHorizontal) || + hasButton(m_gadgetsMask, eFlipVertical) || + hasButton(m_gadgetsMask, eResetView)) { + if (hasButton(m_gadgetsMask, eZoomIn)) + createButton(eZoomIn, "zoomin", tr("&Zoom In"), false); + if (hasButton(m_gadgetsMask, eZoomOut)) + createButton(eZoomOut, "zoomout", tr("&Zoom Out"), false); + if (hasButton(m_gadgetsMask, eFlipHorizontal)) + createOnOffButton(eFlipHorizontal, "fliphoriz", tr("&Flip Horizontally"), + 0); + if (hasButton(m_gadgetsMask, eFlipVertical)) + createOnOffButton(eFlipVertical, "flipvert", tr("&Flip Vertically"), 0); + if (hasButton(m_gadgetsMask, eResetView)) + createButton(eResetView, "reset", tr("&Reset View"), false); + m_viewerSep = m_playToolBar->addSeparator(); + } + // for all actions in this toolbar ret = ret && connect(m_playToolBar, SIGNAL(actionTriggered(QAction *)), this, SLOT(onButtonPressed(QAction *)));