diff --git a/src/Mod/Part/BasicShapes/ViewProviderShapes.py b/src/Mod/Part/BasicShapes/ViewProviderShapes.py index 787d6ae011..1e308f0a20 100644 --- a/src/Mod/Part/BasicShapes/ViewProviderShapes.py +++ b/src/Mod/Part/BasicShapes/ViewProviderShapes.py @@ -36,6 +36,7 @@ class ViewProviderTube: def __init__(self, obj): ''' Set this object to the proxy object of the actual view provider ''' obj.Proxy = self + obj.addExtension("PartGui::ViewProviderAttachExtensionPython", self) def attach(self, obj): ''' Setup the scene sub-graph of the view provider, this method is mandatory ''' diff --git a/src/Mod/Part/Gui/ViewProviderAttachExtension.cpp b/src/Mod/Part/Gui/ViewProviderAttachExtension.cpp index c7f04339be..2b789892ca 100644 --- a/src/Mod/Part/Gui/ViewProviderAttachExtension.cpp +++ b/src/Mod/Part/Gui/ViewProviderAttachExtension.cpp @@ -28,12 +28,17 @@ # define _USE_MATH_DEFINES # include # endif //_MSC_VER +# include +# include #endif #include "ViewProviderAttachExtension.h" +#include "TaskAttacher.h" #include +#include #include +#include using namespace PartGui; @@ -104,6 +109,36 @@ void ViewProviderAttachExtension::extensionUpdateData(const App::Property* prop) } +void ViewProviderAttachExtension::extensionSetupContextMenu(QMenu* menu, QObject*, const char*) +{ + // toggle command to display components + Gui::ActionFunction* func = new Gui::ActionFunction(menu); + QAction* act = menu->addAction(QObject::tr("Attachment editor")); + if (Gui::Control().activeDialog()) + act->setDisabled(true); + func->trigger(act, boost::bind(&ViewProviderAttachExtension::showAttachmentEditor, this)); +} + +void ViewProviderAttachExtension::showAttachmentEditor() +{ + // See PropertyEnumAttacherItem::openTask() + Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog(); + TaskDlgAttacher* task; + task = qobject_cast(dlg); + + if (dlg && !task) { + // there is already another task dialog which must be closed first + Gui::Control().showDialog(dlg); + return; + } + + if (!task) { + task = new TaskDlgAttacher(getExtendedViewProvider()); + } + + Gui::Control().showDialog(task); +} + namespace Gui { EXTENSION_PROPERTY_SOURCE_TEMPLATE(PartGui::ViewProviderAttachExtensionPython, PartGui::ViewProviderAttachExtension) diff --git a/src/Mod/Part/Gui/ViewProviderAttachExtension.h b/src/Mod/Part/Gui/ViewProviderAttachExtension.h index ede18a5ea0..0df1ec2b1d 100644 --- a/src/Mod/Part/Gui/ViewProviderAttachExtension.h +++ b/src/Mod/Part/Gui/ViewProviderAttachExtension.h @@ -42,7 +42,10 @@ public: virtual QIcon extensionMergeOverlayIcons(const QIcon & orig) const override; virtual void extensionUpdateData(const App::Property*) override; + virtual void extensionSetupContextMenu(QMenu*, QObject*, const char*) override; +private: + void showAttachmentEditor(); }; typedef Gui::ViewProviderExtensionPythonT ViewProviderAttachExtensionPython; diff --git a/src/Mod/Part/Gui/ViewProviderPrimitive.h b/src/Mod/Part/Gui/ViewProviderPrimitive.h index 4247b3b8f9..65e0f5a5b8 100644 --- a/src/Mod/Part/Gui/ViewProviderPrimitive.h +++ b/src/Mod/Part/Gui/ViewProviderPrimitive.h @@ -25,6 +25,7 @@ #define PARTGUI_VIEWPROVIDERPRIMITIVE_H #include +#include namespace PartGui { @@ -47,6 +48,9 @@ protected: private: void startDefaultEditMode(); + +private: + ViewProviderAttachExtension extension; }; } // namespace PartGui diff --git a/src/Mod/PartDesign/Gui/ViewProvider.cpp b/src/Mod/PartDesign/Gui/ViewProvider.cpp index 87aec1239f..45aff0b35d 100644 --- a/src/Mod/PartDesign/Gui/ViewProvider.cpp +++ b/src/Mod/PartDesign/Gui/ViewProvider.cpp @@ -96,6 +96,8 @@ void ViewProvider::setupContextMenu(QMenu* menu, QObject* receiver, const char* { QAction* act = menu->addAction(QObject::tr("Set colors..."), receiver, member); act->setData(QVariant((int)ViewProvider::Color)); + // Call the extensions + Gui::ViewProvider::setupContextMenu(menu, receiver, member); } bool ViewProvider::setEdit(int ModNum)