From 292b4c22ad527a3e0e812f5a7734c83ba9c535ab Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Mon, 14 Oct 2024 15:29:49 +0200 Subject: [PATCH] Assembly: Fix context menu 'Activate object' not working and causing crash (#17092) * Assembly: Add setupContextMenu to ViewProviderAssembly.h * Assembly: Fix right click 'activate object' menu not setting edit * add QMenu header * Add NOLINT * Add one more space before //NOLINT or clang cries... * Fix isInEditMode * add isInEditMode to ViewProviderAssemblyPy.xml * add isInEditMode to ViewProviderAssemblyPyImp.cpp * update activeAssembly() in Utils to make sure isInEditMode --- src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 23 ++++++++++++++----- src/Mod/Assembly/Gui/ViewProviderAssembly.h | 1 + .../Assembly/Gui/ViewProviderAssemblyPy.xml | 9 ++++++++ .../Gui/ViewProviderAssemblyPyImp.cpp | 10 ++++++++ src/Mod/Assembly/UtilsAssembly.py | 3 ++- 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index 7e775a9a0e..a3e35fcfd4 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +49,7 @@ #include +#include #include #include #include @@ -112,6 +114,20 @@ QIcon ViewProviderAssembly::getIcon() const return Gui::BitmapFactory().pixmap("Geoassembly.svg"); } +void ViewProviderAssembly::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) +{ + auto func = new Gui::ActionFunction(menu); + + QAction* act = menu->addAction(QObject::tr("Active object")); + act->setCheckable(true); + act->setChecked(isActivePart()); + func->trigger(act, [this]() { + this->doubleClicked(); + }); + + ViewProviderDragger::setupContextMenu(menu, receiver, member); // NOLINT +} + bool ViewProviderAssembly::doubleClicked() { if (isInEditMode()) { @@ -292,12 +308,7 @@ void ViewProviderAssembly::setEditViewer(Gui::View3DInventorViewer* viewer, int bool ViewProviderAssembly::isInEditMode() const { - App::DocumentObject* activePart = getActivePart(); - if (!activePart) { - return false; - } - - return activePart == this->getObject(); + return asmDragger != nullptr; } App::DocumentObject* ViewProviderAssembly::getActivePart() const diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.h b/src/Mod/Assembly/Gui/ViewProviderAssembly.h index 6c7665e54e..d7637ed2f4 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.h +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.h @@ -103,6 +103,7 @@ public: QIcon getIcon() const override; bool doubleClicked() override; + void setupContextMenu(QMenu* menu, QObject* receiver, const char* member) override; bool onDelete(const std::vector& subNames) override; bool canDelete(App::DocumentObject* obj) const override; diff --git a/src/Mod/Assembly/Gui/ViewProviderAssemblyPy.xml b/src/Mod/Assembly/Gui/ViewProviderAssemblyPy.xml index 8d0f9dfad9..9ede675da9 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssemblyPy.xml +++ b/src/Mod/Assembly/Gui/ViewProviderAssemblyPy.xml @@ -14,6 +14,15 @@ This is the ViewProviderAssembly class + + + + Return true if the assembly object is currently in edit mode. + + isInEditMode() -> bool + + + diff --git a/src/Mod/Assembly/Gui/ViewProviderAssemblyPyImp.cpp b/src/Mod/Assembly/Gui/ViewProviderAssemblyPyImp.cpp index c733b11c17..47551d257a 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssemblyPyImp.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssemblyPyImp.cpp @@ -42,6 +42,16 @@ std::string ViewProviderAssemblyPy::representation() const return str.str(); } +PyObject* ViewProviderAssemblyPy::isInEditMode(PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) { + return nullptr; + } + + Py::Boolean val(getViewProviderAssemblyPtr()->isInEditMode()); + return Py::new_reference_to(val); +} + Py::Boolean ViewProviderAssemblyPy::getEnableMovement() const { return {getViewProviderAssemblyPtr()->getEnableMovement()}; diff --git a/src/Mod/Assembly/UtilsAssembly.py b/src/Mod/Assembly/UtilsAssembly.py index 98dc4d18aa..3c2bdcfee2 100644 --- a/src/Mod/Assembly/UtilsAssembly.py +++ b/src/Mod/Assembly/UtilsAssembly.py @@ -52,7 +52,8 @@ def activePartOrAssembly(): def activeAssembly(): active_assembly = activePartOrAssembly() if active_assembly is not None and active_assembly.isDerivedFrom("Assembly::AssemblyObject"): - return active_assembly + if active_assembly.ViewObject.isInEditMode(): + return active_assembly return None