diff --git a/toonz/sources/include/toonz/preferences.h b/toonz/sources/include/toonz/preferences.h index 4a1c251..968fe06 100644 --- a/toonz/sources/include/toonz/preferences.h +++ b/toonz/sources/include/toonz/preferences.h @@ -360,7 +360,8 @@ public: frontOnionColor = m_frontOnionColor, backOnionColor = m_backOnionColor, inksOnly = m_inksOnly; } - + bool getOnionSkinDuringPlayback() { return m_onionSkinDuringPlayback; } + void setOnionSkinDuringPlayback(bool on); // Transparency Check tab void setTranspCheckData(const TPixel &bg, const TPixel &ink, @@ -457,7 +458,7 @@ private: m_levelsBackupEnabled, m_minimizeSaveboxAfterEditing, m_sceneNumberingEnabled, m_animationSheetEnabled, m_inksOnly; bool m_fillOnlySavebox, m_show0ThickLines, m_regionAntialias; - + bool m_onionSkinDuringPlayback; TPixel32 m_viewerBGColor, m_previewBGColor, m_chessboardColor1, m_chessboardColor2; bool m_showRasterImagesDarkenBlendedInViewer, diff --git a/toonz/sources/toonz/comboviewerpane.cpp b/toonz/sources/toonz/comboviewerpane.cpp index 65668d0..6a10ad9 100644 --- a/toonz/sources/toonz/comboviewerpane.cpp +++ b/toonz/sources/toonz/comboviewerpane.cpp @@ -180,6 +180,8 @@ ComboViewerPanel::ComboViewerPanel(QWidget *parent, Qt::WFlags flags) ret = ret && connect(m_flipConsole, SIGNAL(playStateChanged(bool)), TApp::instance()->getCurrentFrame(), SLOT(setPlaying(bool))); + ret = ret && connect(m_flipConsole, SIGNAL(playStateChanged(bool)), this, + SLOT(onPlayingStatusChanged(bool))); ret = ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget))); @@ -574,6 +576,28 @@ void ComboViewerPanel::onXshLevelSwitched(TXshLevel *) { //----------------------------------------------------------------------------- +void ComboViewerPanel::onPlayingStatusChanged(bool playing) { + if (Preferences::instance()->getOnionSkinDuringPlayback()) return; + OnionSkinMask osm = + TApp::instance()->getCurrentOnionSkin()->getOnionSkinMask(); + if (playing) { + m_onionSkinActive = osm.isEnabled(); + if (m_onionSkinActive) { + osm.enable(false); + TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm); + TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); + } + } else { + if (m_onionSkinActive) { + osm.enable(true); + TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm); + TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); + } + } +} + +//----------------------------------------------------------------------------- + void ComboViewerPanel::changeWindowTitle() { TApp *app = TApp::instance(); ToonzScene *scene = app->getCurrentScene()->getScene(); diff --git a/toonz/sources/toonz/comboviewerpane.h b/toonz/sources/toonz/comboviewerpane.h index c49f00e..8f935ca 100644 --- a/toonz/sources/toonz/comboviewerpane.h +++ b/toonz/sources/toonz/comboviewerpane.h @@ -50,6 +50,7 @@ class ComboViewerPanel final : public TPanel, public FlipConsoleOwner { Ruler *m_vRuler; Ruler *m_hRuler; bool m_visibleFlag[CVPARTS_COUNT]; + bool m_onionSkinActive = false; TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_subcameraPreviewButton; @@ -103,7 +104,7 @@ public slots: void changeWindowTitle(); void updateFrameRange(); void onXshLevelSwitched(TXshLevel *); - + void onPlayingStatusChanged(bool playing); // for showing/hiding the parts void onShowHideActionTriggered(QAction *); void enableFlipConsoleForCamerastand(bool on); diff --git a/toonz/sources/toonz/preferencespopup.cpp b/toonz/sources/toonz/preferencespopup.cpp index 0f0cfeb..c76a3c9 100644 --- a/toonz/sources/toonz/preferencespopup.cpp +++ b/toonz/sources/toonz/preferencespopup.cpp @@ -615,6 +615,12 @@ void PreferencesPopup::onOnionSkinVisibilityChanged(int index) { //----------------------------------------------------------------------------- +void PreferencesPopup::onOnionSkinDuringPlaybackChanged(int index) { + m_pref->setOnionSkinDuringPlayback(index == Qt::Checked); +} + +//----------------------------------------------------------------------------- + void PreferencesPopup::onActualPixelOnSceneModeChanged(int index) { m_pref->enableActualPixelViewOnSceneEditingMode(index == Qt::Checked); } @@ -1048,9 +1054,11 @@ PreferencesPopup::PreferencesPopup() bool onlyInks; m_pref->getOnionData(frontColor, backColor, onlyInks); m_onionSkinVisibility = new CheckBox(tr("Onion Skin ON")); - m_frontOnionColor = new ColorField(this, false, frontColor); - m_backOnionColor = new ColorField(this, false, backColor); - m_inksOnly = new DVGui::CheckBox(tr("Display Lines Only ")); + m_onionSkinDuringPlayback = + new CheckBox(tr("Show Onion Skin During Playback")); + m_frontOnionColor = new ColorField(this, false, frontColor); + m_backOnionColor = new ColorField(this, false, backColor); + m_inksOnly = new DVGui::CheckBox(tr("Display Lines Only ")); m_inksOnly->setChecked(onlyInks); int thickness = m_pref->getOnionPaperThickness(); @@ -1278,6 +1286,7 @@ PreferencesPopup::PreferencesPopup() //--- Onion Skin ------------------------------ m_onionSkinVisibility->setChecked(m_pref->isOnionSkinEnabled()); + m_onionSkinDuringPlayback->setChecked(m_pref->getOnionSkinDuringPlayback()); m_frontOnionColor->setEnabled(m_pref->isOnionSkinEnabled()); m_backOnionColor->setEnabled(m_pref->isOnionSkinEnabled()); m_inksOnly->setEnabled(m_pref->isOnionSkinEnabled()); @@ -1746,6 +1755,8 @@ PreferencesPopup::PreferencesPopup() onionLay->addLayout(onionColorLay, 0); onionLay->addWidget(m_inksOnly, 0, Qt::AlignLeft | Qt::AlignVCenter); + onionLay->addWidget(m_onionSkinDuringPlayback, 0, + Qt::AlignLeft | Qt::AlignVCenter); onionLay->addStretch(1); } @@ -1989,6 +2000,8 @@ PreferencesPopup::PreferencesPopup() SLOT(onOnionDataChanged(int))); ret = ret && connect(m_onionSkinVisibility, SIGNAL(stateChanged(int)), SLOT(onOnionSkinVisibilityChanged(int))); + ret = ret && connect(m_onionSkinDuringPlayback, SIGNAL(stateChanged(int)), + SLOT(onOnionSkinDuringPlaybackChanged(int))); ret = ret && connect(m_onionPaperThickness, SIGNAL(editingFinished()), SLOT(onOnionPaperThicknessChanged())); diff --git a/toonz/sources/toonz/preferencespopup.h b/toonz/sources/toonz/preferencespopup.h index 8e8b640..e2cb9a7 100644 --- a/toonz/sources/toonz/preferencespopup.h +++ b/toonz/sources/toonz/preferencespopup.h @@ -68,7 +68,7 @@ private: QPushButton *m_addLevelFormat, *m_removeLevelFormat, *m_editLevelFormat; DVGui::CheckBox *m_inksOnly, *m_enableVersionControl, *m_levelsBackup, - *m_onionSkinVisibility, *m_pixelsOnlyCB; + *m_onionSkinVisibility, *m_pixelsOnlyCB, *m_onionSkinDuringPlayback; DVGui::FileField *m_ffmpegPathFileFld; @@ -141,6 +141,7 @@ private slots: void onColumnIconChange(const QString &); void onReplaceAfterSaveLevelAsChanged(int index); void onOnionSkinVisibilityChanged(int); + void onOnionSkinDuringPlaybackChanged(int); void onActualPixelOnSceneModeChanged(int); void onMultiLayerStylePickerChanged(int); void onLevelNameOnEachMarkerChanged(int); diff --git a/toonz/sources/toonz/viewerpane.cpp b/toonz/sources/toonz/viewerpane.cpp index aba4bed..4dd7bcb 100644 --- a/toonz/sources/toonz/viewerpane.cpp +++ b/toonz/sources/toonz/viewerpane.cpp @@ -27,6 +27,7 @@ #include "toonz/tpalettehandle.h" #include "toonz/tonionskinmaskhandle.h" #include "toutputproperties.h" +#include "toonz/preferences.h" // TnzQt includes #include "toonzqt/menubarcommand.h" @@ -143,6 +144,8 @@ SceneViewerPanel::SceneViewerPanel(QWidget *parent, Qt::WFlags flags) ret = ret && connect(m_flipConsole, SIGNAL(playStateChanged(bool)), TApp::instance()->getCurrentFrame(), SLOT(setPlaying(bool))); + ret = ret && connect(m_flipConsole, SIGNAL(playStateChanged(bool)), this, + SLOT(onPlayingStatusChanged(bool))); ret = ret && connect(m_flipConsole, SIGNAL(buttonPressed(FlipConsole::EGadget)), m_sceneViewer, SLOT(onButtonPressed(FlipConsole::EGadget))); @@ -433,6 +436,28 @@ void SceneViewerPanel::onXshLevelSwitched(TXshLevel *) { changeWindowTitle(); } //----------------------------------------------------------------------------- +void SceneViewerPanel::onPlayingStatusChanged(bool playing) { + if (Preferences::instance()->getOnionSkinDuringPlayback()) return; + OnionSkinMask osm = + TApp::instance()->getCurrentOnionSkin()->getOnionSkinMask(); + if (playing) { + m_onionSkinActive = osm.isEnabled(); + if (m_onionSkinActive) { + osm.enable(false); + TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm); + TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); + } + } else { + if (m_onionSkinActive) { + osm.enable(true); + TApp::instance()->getCurrentOnionSkin()->setOnionSkinMask(osm); + TApp::instance()->getCurrentOnionSkin()->notifyOnionSkinMaskChanged(); + } + } +} + +//----------------------------------------------------------------------------- + void SceneViewerPanel::changeWindowTitle() { TApp *app = TApp::instance(); // zoom = sqrt(m_sceneViewer->getViewMatrix().det()); diff --git a/toonz/sources/toonz/viewerpane.h b/toonz/sources/toonz/viewerpane.h index 5ed1a30..d308604 100644 --- a/toonz/sources/toonz/viewerpane.h +++ b/toonz/sources/toonz/viewerpane.h @@ -36,6 +36,7 @@ class SceneViewerPanel final : public TPanel, public FlipConsoleOwner { TPanelTitleBarButtonSet *m_referenceModeBs; TPanelTitleBarButton *m_previewButton; TPanelTitleBarButton *m_subcameraPreviewButton; + bool m_onionSkinActive = false; public: #if QT_VERSION >= 0x050500 @@ -71,7 +72,7 @@ protected slots: void onFrameSwitched(); void onSceneSwitched(); void onFrameTypeChanged(); - + void onPlayingStatusChanged(bool playing); void enableFullPreview(bool enabled); void enableSubCameraPreview(bool enabled); }; diff --git a/toonz/sources/toonzlib/preferences.cpp b/toonz/sources/toonzlib/preferences.cpp index 294170f..886e841 100644 --- a/toonz/sources/toonzlib/preferences.cpp +++ b/toonz/sources/toonzlib/preferences.cpp @@ -283,6 +283,7 @@ Preferences::Preferences() , m_columnIconLoadingPolicy((int)LoadAtOnce) , m_moveCurrentFrameByClickCellArea(true) , m_onionSkinEnabled(true) + , m_onionSkinDuringPlayback(false) , m_multiLayerStylePickerEnabled(false) , m_paletteTypeOnLoadRasterImageAsColorModel(0) , m_showKeyframesOnXsheetCellArea(true) @@ -535,6 +536,7 @@ Preferences::Preferences() getValue(*m_settings, "moveCurrentFrameByClickCellArea", m_moveCurrentFrameByClickCellArea); getValue(*m_settings, "onionSkinEnabled", m_onionSkinEnabled); + getValue(*m_settings, "onionSkinDuringPlayback", m_onionSkinDuringPlayback); getValue(*m_settings, "multiLayerStylePickerEnabled", m_multiLayerStylePickerEnabled); getValue(*m_settings, "paletteTypeOnLoadRasterImageAsColorModel", @@ -898,6 +900,13 @@ void Preferences::enableOnionSkin(bool on) { //----------------------------------------------------------------- +void Preferences::setOnionSkinDuringPlayback(bool on) { + m_onionSkinDuringPlayback = on; + m_settings->setValue("onionSkinDuringPlayback", on ? "1" : "0"); +} + +//----------------------------------------------------------------- + void Preferences::setShow0ThickLines(bool on) { m_show0ThickLines = on; m_settings->setValue(s_show0ThickLines, s_bool[on]);