From 2754104e007e55f0b53bbfcd5e29a9e2dae19d75 Mon Sep 17 00:00:00 2001 From: manongjohn Date: Sun, 7 Nov 2021 22:37:03 -0500 Subject: [PATCH] Add Advance Controls option for Vanishing Points --- toonz/sources/include/tools/tooloptions.h | 6 +++ toonz/sources/tnztools/perspectivetool.cpp | 33 ++++++++++++++- toonz/sources/tnztools/perspectivetool.h | 17 +++++--- toonz/sources/tnztools/tooloptions.cpp | 49 +++++++++++++++++++++- 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/toonz/sources/include/tools/tooloptions.h b/toonz/sources/include/tools/tooloptions.h index 346dc202..a14c6a72 100644 --- a/toonz/sources/include/tools/tooloptions.h +++ b/toonz/sources/include/tools/tooloptions.h @@ -757,19 +757,25 @@ class PerspectiveGridToolOptionBox final : public ToolOptionsBox { QPushButton *m_addPresetButton; QPushButton *m_removePresetButton; + ToolOptionCombo *m_perspectiveType; + ToolOptionCheckbox *m_parallel, *m_advancedControls; + private: class PresetNamePopup; PresetNamePopup *m_presetNamePopup; + void filterControls(); public: PerspectiveGridToolOptionBox(QWidget *parent, TTool *tool, TPaletteHandle *pltHandle, ToolHandle *toolHandle); + void updateStatus(); protected slots: void onAddPreset(); void onRemovePreset(); + void onPerspectiveTypeChanged(int); }; //============================================================================= diff --git a/toonz/sources/tnztools/perspectivetool.cpp b/toonz/sources/tnztools/perspectivetool.cpp index 366795a2..95534ef4 100644 --- a/toonz/sources/tnztools/perspectivetool.cpp +++ b/toonz/sources/tnztools/perspectivetool.cpp @@ -21,6 +21,9 @@ #include +TEnv::IntVar PerspectiveToolAdvancedControls("PerspectiveToolAdvancedControls", + 0); + PerspectiveTool perspectiveTool; //---------------------------------------------------------------------------------------------------------- @@ -344,7 +347,8 @@ void PerspectiveControls::drawControls() { m_spacingPos + unit * TPointD(4, -4)); } - if (m_perspective->getType() == PerspectiveType::VanishingPoint) { + if (m_perspective->getType() == PerspectiveType::VanishingPoint && + m_showAdvanced) { // Draw Left Handle glColor3d(0.70, 0.70, 0.70); tglDrawSegment(m_leftPivotPos, m_leftHandlePos); @@ -457,6 +461,7 @@ PerspectiveTool::PerspectiveTool() , m_color("Color:") , m_horizon("Horizon", false) , m_parallel("Parallel", false) + , m_advancedControls("Advanced Controls", false) , m_preset("Preset:") , m_presetsLoaded(false) , m_modified(false) @@ -478,6 +483,7 @@ PerspectiveTool::PerspectiveTool() m_prop.bind(m_color); m_prop.bind(m_horizon); m_prop.bind(m_parallel); + m_prop.bind(m_advancedControls); m_prop.bind(m_preset); m_type.addValue(L"Vanishing Point"); @@ -493,6 +499,8 @@ PerspectiveTool::PerspectiveTool() m_color.addValue(L"Black", TPixel::Black); m_color.setId("Color"); + m_advancedControls.setValue(PerspectiveToolAdvancedControls); + m_preset.setId("PerspectivePreset"); m_preset.addValue(CUSTOM_WSTR); @@ -519,6 +527,7 @@ void PerspectiveTool::updateTranslation() { m_opacity.setQStringName(tr("Opacity:")); m_horizon.setQStringName(tr("Horizon")); m_parallel.setQStringName(tr("Parallel")); + m_advancedControls.setQStringName(tr("Advanced Controls")); m_preset.setQStringName(tr("Preset:")); m_preset.setItemUIName(CUSTOM_WSTR, tr("")); @@ -549,6 +558,15 @@ bool PerspectiveTool::onPropertyChanged(std::string propertyName) { return true; } + if (propertyName == m_advancedControls.getName()) { + PerspectiveToolAdvancedControls = m_advancedControls.getValue(); + + for (int i = 0; i < m_perspectiveObjs.size(); i++) + m_perspectiveObjs[i]->setShowAdvancedControls( + PerspectiveToolAdvancedControls); + return true; + } + std::set selectedObjects = m_selection.getSelectedObjects(); std::set::iterator it; @@ -667,7 +685,10 @@ void PerspectiveTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { } m_selection.makeCurrent(); invalidateControl(controlIdx); - m_modified = true; + m_modified = true; + m_propertyUpdating = true; + getApplication()->getCurrentTool()->notifyToolChanged(); + m_propertyUpdating = false; return; } @@ -764,6 +785,7 @@ void PerspectiveTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { newObject->setColor(m_color.getColorValue()); newObject->setHorizon(m_horizon.getValue()); newObject->setParallel(m_parallel.getValue()); + newObject->setShowAdvancedControls(PerspectiveToolAdvancedControls); newObject->setActive(true); m_perspectiveObjs.push_back(newObject); @@ -777,6 +799,10 @@ void PerspectiveTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { m_isShifting = true; // Allow click and shift m_modified = true; + m_propertyUpdating = true; + getApplication()->getCurrentTool()->notifyToolChanged(); + m_propertyUpdating = false; + invalidate(); } @@ -1210,6 +1236,7 @@ std::vector PerspectiveTool::copyPerspectiveSet( newObject->setColor(currentObject->getColor()); newObject->setHorizon(currentObject->isHorizon()); newObject->setParallel(currentObject->isParallel()); + newObject->setShowAdvancedControls(PerspectiveToolAdvancedControls); copy.push_back(newObject); } @@ -1253,6 +1280,7 @@ void PerspectiveTool::loadPreset() { if (it == presets.end()) return; m_perspectiveObjs = preset.m_perspectiveSet; + onPropertyChanged(m_advancedControls.getName()); invalidate(); } @@ -1293,6 +1321,7 @@ void PerspectiveTool::removePreset() { void PerspectiveTool::loadLastPreset() { m_perspectiveObjs = m_lastPreset; + onPropertyChanged(m_advancedControls.getName()); invalidate(); } diff --git a/toonz/sources/tnztools/perspectivetool.h b/toonz/sources/tnztools/perspectivetool.h index 665dea92..8ec79937 100644 --- a/toonz/sources/tnztools/perspectivetool.h +++ b/toonz/sources/tnztools/perspectivetool.h @@ -97,6 +97,7 @@ class PerspectiveControls { PerspectiveData *m_perspective; TPointD m_cursorPos; bool m_active; + bool m_showAdvanced; double m_handleRadius = 10; // Common Controls @@ -111,7 +112,7 @@ class PerspectiveControls { public: PerspectiveControls(PerspectiveData *perspective) - : m_perspective(perspective), m_active(false) {} + : m_perspective(perspective), m_active(false), m_showAdvanced(false) {} ~PerspectiveControls() {} void setCursorPos(TPointD pos) { m_cursorPos = pos; } @@ -120,6 +121,9 @@ public: void setActive(bool active) { m_active = active; } bool isActive() { return m_active; } + void setShowAdvancedControls(bool show) { m_showAdvanced = show; } + bool showAdvancedControls() { return m_showAdvanced; } + void setRotationPos(TPointD pos) { m_rotationPos = pos; } TPointD getRotationPos() { return m_rotationPos; } @@ -161,7 +165,7 @@ public: } bool isOverLeftPivot() { - if (!m_perspective || + if (!m_showAdvanced || !m_perspective || m_perspective->getType() != PerspectiveType::VanishingPoint) return false; @@ -170,7 +174,7 @@ public: } bool isOverLeftHandle() { - if (!m_perspective || + if (!m_showAdvanced || !m_perspective || m_perspective->getType() != PerspectiveType::VanishingPoint) return false; @@ -179,7 +183,7 @@ public: } bool isOverRightPivot() { - if (!m_perspective || + if (!m_showAdvanced || !m_perspective || m_perspective->getType() != PerspectiveType::VanishingPoint) return false; @@ -188,7 +192,7 @@ public: } bool isOverRightHandle() { - if (!m_perspective || + if (!m_showAdvanced || !m_perspective || m_perspective->getType() != PerspectiveType::VanishingPoint) return false; @@ -251,7 +255,7 @@ public: TPointD centerPoint = TPointD(0, 0), double rotation = 0.0, double spacing = 100.0, bool horizon = false, double opacity = 30.0, TPixel32 color = TPixel::Magenta, - bool parallel = true) + bool parallel = true, bool showAdvanced = false) : PerspectiveData(perspectiveType, centerPoint, rotation, spacing, horizon, opacity, color, parallel) , PerspectiveControls(this){}; @@ -468,6 +472,7 @@ protected: TBoolProperty m_horizon; TBoolProperty m_parallel; TEnumProperty m_preset; + TBoolProperty m_advancedControls; std::vector m_perspectiveObjs; std::vector m_lastPreset; diff --git a/toonz/sources/tnztools/tooloptions.cpp b/toonz/sources/tnztools/tooloptions.cpp index e78c69f7..04b63dee 100644 --- a/toonz/sources/tnztools/tooloptions.cpp +++ b/toonz/sources/tnztools/tooloptions.cpp @@ -2959,14 +2959,55 @@ PerspectiveGridToolOptionBox::PerspectiveGridToolOptionBox( m_addPresetButton->setFixedSize(QSize(20, 20)); m_removePresetButton->setFixedSize(QSize(20, 20)); + m_perspectiveType = + dynamic_cast(m_controls.value("Type:")); + m_parallel = dynamic_cast(m_controls.value("Parallel")); + m_advancedControls = + dynamic_cast(m_controls.value("Advanced Controls")); + hLayout()->addWidget(m_addPresetButton); hLayout()->addWidget(m_removePresetButton); connect(m_addPresetButton, SIGNAL(clicked()), this, SLOT(onAddPreset())); connect(m_removePresetButton, SIGNAL(clicked()), this, SLOT(onRemovePreset())); - + connect(m_perspectiveType, SIGNAL(currentIndexChanged(int)), this, + SLOT(onPerspectiveTypeChanged(int))); m_layout->addStretch(1); + + filterControls(); +} + +//----------------------------------------------------------------------------- + +void PerspectiveGridToolOptionBox::filterControls() { + PerspectiveTool *perspectiveTool = dynamic_cast(m_tool); + + std::vector objs = + perspectiveTool->getPerspectiveObjects(); + bool isVanishingSelected = + m_perspectiveType->getProperty()->getValue() == L"Vanishing Point"; + bool isLineSelected = m_perspectiveType->getProperty()->getValue() == L"Line"; + for (int i = 0; i < objs.size(); i++) { + if (!objs[i]->isActive()) continue; + if (objs[i]->getType() == PerspectiveType::VanishingPoint) + isVanishingSelected = true; + else if (objs[i]->getType() == PerspectiveType::Line) + isLineSelected = true; + } + + m_parallel->setEnabled(isLineSelected); + m_advancedControls->setEnabled(isVanishingSelected); +} + +//----------------------------------------------------------------------------- + +void PerspectiveGridToolOptionBox::updateStatus() { + filterControls(); + + QMap::iterator it; + for (it = m_controls.begin(); it != m_controls.end(); it++) + it.value()->updateStatus(); } //----------------------------------------------------------------------------- @@ -2997,6 +3038,12 @@ void PerspectiveGridToolOptionBox::onRemovePreset() { m_presetCombo->loadEntries(); } +//----------------------------------------------------------------------------- + +void PerspectiveGridToolOptionBox::onPerspectiveTypeChanged(int index) { + filterControls(); +} + //============================================================================= // ZoomToolOptionBox //-----------------------------------------------------------------------------