From a32d3b104642d371b9091e320058a5ed7f0e8dc6 Mon Sep 17 00:00:00 2001 From: Max Wilfinger Date: Wed, 27 Dec 2023 09:10:30 +0100 Subject: [PATCH 1/2] Change the description of the default 'Toggle active object' command in the right click menu based on the current state of the selected object. --- src/Gui/ViewProviderPart.cpp | 19 +++++++++++++++++-- src/Mod/PartDesign/Gui/ViewProviderBody.cpp | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/Gui/ViewProviderPart.cpp b/src/Gui/ViewProviderPart.cpp index 21f8f3d310..0c9dbd38d5 100644 --- a/src/Gui/ViewProviderPart.cpp +++ b/src/Gui/ViewProviderPart.cpp @@ -68,11 +68,26 @@ void ViewProviderPart::onChanged(const App::Property* prop) { void ViewProviderPart::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) { + App::DocumentObject* activePart = nullptr; + auto activeDoc = Gui::Application::Instance->activeDocument(); + if(!activeDoc) + activeDoc = getDocument(); + auto activeView = activeDoc->setActiveView(this); + activePart = activeView->getActiveObject (PARTKEY); + auto func = new Gui::ActionFunction(menu); - QAction* act = menu->addAction(QObject::tr("Toggle active part")); - func->trigger(act, [this](){ + + if (activePart == this->getObject()){ + QAction* act = menu->addAction(QObject::tr("Unset active object")); + func->trigger(act, [this](){ this->doubleClicked(); }); + } else { + QAction* act = menu->addAction(QObject::tr("Set active object")); + func->trigger(act, [this](){ + this->doubleClicked(); + }); + } ViewProviderDragger::setupContextMenu(menu, receiver, member); } diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp index 59341b9822..697d9ce879 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp @@ -132,10 +132,23 @@ void ViewProviderBody::setupContextMenu(QMenu* menu, QObject* receiver, const ch Q_UNUSED(receiver); Q_UNUSED(member); Gui::ActionFunction* func = new Gui::ActionFunction(menu); - QAction* act = menu->addAction(tr("Toggle active body")); + + auto activeDoc = Gui::Application::Instance->activeDocument(); + if(!activeDoc) + activeDoc = getDocument(); + auto activeView = activeDoc->setActiveView(this); + + if (activeView->isActiveObject(getObject(),PDBODYKEY)) { + QAction* act = menu->addAction(tr("Unset active body")); func->trigger(act, [this]() { this->doubleClicked(); }); + } else { + QAction* act = menu->addAction(tr("Set active body")); + func->trigger(act, [this]() { + this->doubleClicked(); + }); + } Gui::ViewProviderGeometryObject::setupContextMenu(menu, receiver, member); // clazy:exclude=skipped-base-method } From 065266632198a5a097e419adf20e8f35821bce9d Mon Sep 17 00:00:00 2001 From: Max Wilfinger Date: Thu, 28 Dec 2023 11:30:49 +0100 Subject: [PATCH 2/2] use checkbox in menu item to display current object state and refactor the code --- src/Gui/ViewProviderPart.cpp | 41 ++++++++++----------- src/Gui/ViewProviderPart.h | 2 + src/Mod/PartDesign/Gui/ViewProviderBody.cpp | 38 ++++++++++--------- src/Mod/PartDesign/Gui/ViewProviderBody.h | 2 + 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/Gui/ViewProviderPart.cpp b/src/Gui/ViewProviderPart.cpp index 0c9dbd38d5..4543dcbf32 100644 --- a/src/Gui/ViewProviderPart.cpp +++ b/src/Gui/ViewProviderPart.cpp @@ -68,35 +68,20 @@ void ViewProviderPart::onChanged(const App::Property* prop) { void ViewProviderPart::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) { - App::DocumentObject* activePart = nullptr; - auto activeDoc = Gui::Application::Instance->activeDocument(); - if(!activeDoc) - activeDoc = getDocument(); - auto activeView = activeDoc->setActiveView(this); - activePart = activeView->getActiveObject (PARTKEY); - auto func = new Gui::ActionFunction(menu); - if (activePart == this->getObject()){ - QAction* act = menu->addAction(QObject::tr("Unset active object")); - func->trigger(act, [this](){ - this->doubleClicked(); + QAction* act = menu->addAction(QObject::tr("Active object")); + act->setCheckable(true); + act->setChecked(isActivePart()); + func->trigger(act, [this](){ + this->toggleActivePart(); }); - } else { - QAction* act = menu->addAction(QObject::tr("Set active object")); - func->trigger(act, [this](){ - this->doubleClicked(); - }); - } ViewProviderDragger::setupContextMenu(menu, receiver, member); } -bool ViewProviderPart::doubleClicked() +bool ViewProviderPart::isActivePart() { - //make the part the active one - - //first, check if the part is already active. App::DocumentObject* activePart = nullptr; auto activeDoc = Gui::Application::Instance->activeDocument(); if(!activeDoc) @@ -108,6 +93,16 @@ bool ViewProviderPart::doubleClicked() activePart = activeView->getActiveObject (PARTKEY); if (activePart == this->getObject()){ + return true; + } else { + return false; + } +} + +void ViewProviderPart::toggleActivePart() +{ + //make the part the active one + if (isActivePart()){ //active part double-clicked. Deactivate. Gui::Command::doCommand(Gui::Command::Gui, "Gui.ActiveDocument.ActiveView.setActiveObject('%s', None)", @@ -120,7 +115,11 @@ bool ViewProviderPart::doubleClicked() this->getObject()->getDocument()->getName(), this->getObject()->getNameInDocument()); } +} +bool ViewProviderPart::doubleClicked() +{ + toggleActivePart(); return true; } diff --git a/src/Gui/ViewProviderPart.h b/src/Gui/ViewProviderPart.h index 5cd942feca..60f6058040 100644 --- a/src/Gui/ViewProviderPart.h +++ b/src/Gui/ViewProviderPart.h @@ -43,6 +43,8 @@ public: bool doubleClicked() override; void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override; + bool isActivePart(); + void toggleActivePart(); /// deliver the icon shown in the tree view /// override from ViewProvider.h diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp index 697d9ce879..874c49bc4b 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.cpp +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.cpp @@ -133,29 +133,18 @@ void ViewProviderBody::setupContextMenu(QMenu* menu, QObject* receiver, const ch Q_UNUSED(member); Gui::ActionFunction* func = new Gui::ActionFunction(menu); - auto activeDoc = Gui::Application::Instance->activeDocument(); - if(!activeDoc) - activeDoc = getDocument(); - auto activeView = activeDoc->setActiveView(this); - - if (activeView->isActiveObject(getObject(),PDBODYKEY)) { - QAction* act = menu->addAction(tr("Unset active body")); + QAction* act = menu->addAction(tr("Active body")); + act->setCheckable(true); + act->setChecked(isActiveBody()); func->trigger(act, [this]() { - this->doubleClicked(); + this->toggleActiveBody(); }); - } else { - QAction* act = menu->addAction(tr("Set active body")); - func->trigger(act, [this]() { - this->doubleClicked(); - }); - } Gui::ViewProviderGeometryObject::setupContextMenu(menu, receiver, member); // clazy:exclude=skipped-base-method } -bool ViewProviderBody::doubleClicked() +bool ViewProviderBody::isActiveBody() { - //first, check if the body is already active. auto activeDoc = Gui::Application::Instance->activeDocument(); if(!activeDoc) activeDoc = getDocument(); @@ -163,7 +152,16 @@ bool ViewProviderBody::doubleClicked() if(!activeView) return false; - if (activeView->isActiveObject(getObject(),PDBODYKEY)) { + if (activeView->isActiveObject(getObject(),PDBODYKEY)){ + return true; + } else { + return false; + } +} + +void ViewProviderBody::toggleActiveBody() +{ + if (isActiveBody()) { //active body double-clicked. Deactivate. Gui::Command::doCommand(Gui::Command::Gui, "Gui.ActiveDocument.ActiveView.setActiveObject('%s', None)", PDBODYKEY); @@ -175,7 +173,7 @@ bool ViewProviderBody::doubleClicked() // and set correct active objects auto* part = App::Part::getPartOfObject ( getObject() ); - if ( part && part != activeView->getActiveObject ( PARTKEY ) ) { + if ( part && !isActiveBody() ) { Gui::Command::doCommand(Gui::Command::Gui, "Gui.ActiveDocument.ActiveView.setActiveObject('%s',%s)", PARTKEY, Gui::Command::getObjectCmd(part).c_str()); @@ -185,7 +183,11 @@ bool ViewProviderBody::doubleClicked() "Gui.ActiveDocument.ActiveView.setActiveObject('%s',%s)", PDBODYKEY, Gui::Command::getObjectCmd(getObject()).c_str()); } +} +bool ViewProviderBody::doubleClicked() +{ + toggleActiveBody(); return true; } diff --git a/src/Mod/PartDesign/Gui/ViewProviderBody.h b/src/Mod/PartDesign/Gui/ViewProviderBody.h index dc55944c2c..f601d71652 100644 --- a/src/Mod/PartDesign/Gui/ViewProviderBody.h +++ b/src/Mod/PartDesign/Gui/ViewProviderBody.h @@ -58,6 +58,8 @@ public: bool doubleClicked() override; void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override; + bool isActiveBody(); + void toggleActiveBody(); std::vector< std::string > getDisplayModes() const override; void setDisplayMode(const char* ModeName) override;