diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index becb53194e..b28ee5c9e0 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -702,7 +702,6 @@ void TreeWidget::dropEvent(QDropEvent *event) Gui::Document* gui = vpTarget->getDocument(); if (da == Qt::LinkAction) { -#if 0 // Open command gui->openCommand("Drop object"); for (QList::Iterator it = items.begin(); it != items.end(); ++it) { @@ -720,7 +719,6 @@ void TreeWidget::dropEvent(QDropEvent *event) } gui->commitCommand(); -#endif } else { if (!vpTarget->canDropObjects()) { diff --git a/src/Gui/ViewProvider.cpp b/src/Gui/ViewProvider.cpp index e1995d1425..de33ebe772 100644 --- a/src/Gui/ViewProvider.cpp +++ b/src/Gui/ViewProvider.cpp @@ -716,6 +716,19 @@ void ViewProvider::dropObject(App::DocumentObject* obj) throw Base::RuntimeError("ViewProvider::dropObject: no extension for dropping given object available."); } +void ViewProvider::replaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) +{ + auto vector = getExtensionsDerivedFromType(); + for (Gui::ViewProviderExtension* ext : vector) { + if (ext->extensionCanDropObject(newValue)) { + ext->extensionReplaceObject(oldValue, newValue); + return; + } + } + + throw Base::RuntimeError("ViewProvider::dropObject: no extension for dropping given object available."); +} + void ViewProvider::Restore(Base::XMLReader& reader) { setStatus(Gui::isRestoring, true); diff --git a/src/Gui/ViewProvider.h b/src/Gui/ViewProvider.h index 9c6867e444..c5e7a6ff39 100644 --- a/src/Gui/ViewProvider.h +++ b/src/Gui/ViewProvider.h @@ -195,6 +195,8 @@ public: virtual bool canDropObject(App::DocumentObject*) const; /** Add an object to the view provider by drag and drop */ virtual void dropObject(App::DocumentObject*); + /** Replace an object to the view provider by drag and drop */ + virtual void replaceObject(App::DocumentObject*, App::DocumentObject*); //@} /** @name Signals of the view provider */ diff --git a/src/Gui/ViewProviderExtension.h b/src/Gui/ViewProviderExtension.h index 4e4520d100..aba6b3846e 100644 --- a/src/Gui/ViewProviderExtension.h +++ b/src/Gui/ViewProviderExtension.h @@ -63,6 +63,7 @@ public: virtual bool extensionCanDropObjects() const { return false; } virtual bool extensionCanDropObject(App::DocumentObject*) const { return true; } virtual void extensionDropObject(App::DocumentObject*) { } + virtual void extensionReplaceObject(App::DocumentObject* /*oldValue*/, App::DocumentObject* /*newValue*/) { } /// Hides the view provider virtual void extensionHide(void) { } diff --git a/src/Gui/ViewProviderGroupExtension.cpp b/src/Gui/ViewProviderGroupExtension.cpp index 0b5beb1a1f..be1f52945c 100644 --- a/src/Gui/ViewProviderGroupExtension.cpp +++ b/src/Gui/ViewProviderGroupExtension.cpp @@ -110,6 +110,29 @@ void ViewProviderGroupExtension::extensionDropObject(App::DocumentObject* obj) { Gui::Command::doCommand(Gui::Command::App, cmd.toUtf8()); } +void ViewProviderGroupExtension::extensionReplaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) { + + App::DocumentObject* grp = static_cast(getExtendedViewProvider()->getObject()); + App::Document* doc = grp->getDocument(); + + // build Python command for execution + QString cmd; + cmd = QString::fromLatin1("App.getDocument(\"%1\").getObject(\"%2\").removeObject(" + "App.getDocument(\"%1\").getObject(\"%3\"))") + .arg(QString::fromLatin1(doc->getName())) + .arg(QString::fromLatin1(grp->getNameInDocument())) + .arg(QString::fromLatin1(oldValue->getNameInDocument())); + + Gui::Command::doCommand(Gui::Command::App, cmd.toUtf8()); + cmd = QString::fromLatin1("App.getDocument(\"%1\").getObject(\"%2\").addObject(" + "App.getDocument(\"%1\").getObject(\"%3\"))") + .arg(QString::fromLatin1(doc->getName())) + .arg(QString::fromLatin1(grp->getNameInDocument())) + .arg(QString::fromLatin1(newValue->getNameInDocument())); + + Gui::Command::doCommand(Gui::Command::App, cmd.toUtf8()); +} + std::vector< App::DocumentObject* > ViewProviderGroupExtension::extensionClaimChildren(void) const { auto* group = getExtendedViewProvider()->getObject()->getExtensionByType(); diff --git a/src/Gui/ViewProviderGroupExtension.h b/src/Gui/ViewProviderGroupExtension.h index 58c73e0353..2e25622841 100644 --- a/src/Gui/ViewProviderGroupExtension.h +++ b/src/Gui/ViewProviderGroupExtension.h @@ -46,6 +46,7 @@ public: virtual bool extensionCanDropObjects() const override; virtual bool extensionCanDropObject(App::DocumentObject*) const override; virtual void extensionDropObject(App::DocumentObject*) override; + virtual void extensionReplaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) override; virtual void extensionHide(void) override; virtual void extensionShow(void) override; diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.cpp b/src/Mod/Part/Gui/ViewProviderBoolean.cpp index 7aa4668049..2782326343 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.cpp +++ b/src/Mod/Part/Gui/ViewProviderBoolean.cpp @@ -152,6 +152,18 @@ bool ViewProviderBoolean::onDelete(const std::vector &) return true; } +void ViewProviderBoolean::replaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) +{ + Part::Boolean* pBool = static_cast(getObject()); + if (oldValue == pBool->Base.getValue()) { + pBool->Base.setValue(newValue); + } + else if (oldValue == pBool->Tool.getValue()) { + pBool->Tool.setValue(newValue); + } +} + + PROPERTY_SOURCE(PartGui::ViewProviderMultiFuse,PartGui::ViewProviderPart) ViewProviderMultiFuse::ViewProviderMultiFuse() @@ -279,6 +291,13 @@ void ViewProviderMultiFuse::dropObject(App::DocumentObject* obj) pBool->Shapes.setValues(pShapes); } +void ViewProviderMultiFuse::replaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) +{ + Part::MultiFuse* pBool = static_cast(getObject()); + std::vector pShapes = pBool->Shapes.getValues(); + std::replace(pShapes.begin(), pShapes.end(), oldValue, newValue); + pBool->Shapes.setValues(pShapes); +} PROPERTY_SOURCE(PartGui::ViewProviderMultiCommon,PartGui::ViewProviderPart) @@ -406,3 +425,11 @@ void ViewProviderMultiCommon::dropObject(App::DocumentObject* obj) pShapes.push_back(obj); pBool->Shapes.setValues(pShapes); } + +void ViewProviderMultiCommon::replaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) +{ + Part::MultiFuse* pBool = static_cast(getObject()); + std::vector pShapes = pBool->Shapes.getValues(); + std::replace(pShapes.begin(), pShapes.end(), oldValue, newValue); + pBool->Shapes.setValues(pShapes); +} diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.h b/src/Mod/Part/Gui/ViewProviderBoolean.h index 3c379309ab..c9abc06263 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.h +++ b/src/Mod/Part/Gui/ViewProviderBoolean.h @@ -44,6 +44,7 @@ public: QIcon getIcon(void) const; void updateData(const App::Property*); bool onDelete(const std::vector &); + virtual void replaceObject(App::DocumentObject*, App::DocumentObject*); }; /// ViewProvider for the MultiFuse feature @@ -70,6 +71,8 @@ public: bool canDropObjects() const; bool canDropObject(App::DocumentObject*) const; void dropObject(App::DocumentObject*); + /** Replace an object to the view provider by drag and drop */ + virtual void replaceObject(App::DocumentObject*, App::DocumentObject*); }; /// ViewProvider for the MultiFuse feature @@ -96,6 +99,8 @@ public: bool canDropObjects() const; bool canDropObject(App::DocumentObject*) const; void dropObject(App::DocumentObject*); + /** Replace an object to the view provider by drag and drop */ + virtual void replaceObject(App::DocumentObject*, App::DocumentObject*); }; diff --git a/src/Mod/Part/Gui/ViewProviderCompound.cpp b/src/Mod/Part/Gui/ViewProviderCompound.cpp index ed9796dc48..4992579ddb 100644 --- a/src/Mod/Part/Gui/ViewProviderCompound.cpp +++ b/src/Mod/Part/Gui/ViewProviderCompound.cpp @@ -154,3 +154,11 @@ void ViewProviderCompound::dropObject(App::DocumentObject* obj) pShapes.push_back(obj); pComp->Links.setValues(pShapes); } + +void ViewProviderCompound::replaceObject(App::DocumentObject* oldValue, App::DocumentObject* newValue) +{ + Part::Compound* pBool = static_cast(getObject()); + std::vector pShapes = pBool->Links.getValues(); + std::replace(pShapes.begin(), pShapes.end(), oldValue, newValue); + pBool->Links.setValues(pShapes); +} diff --git a/src/Mod/Part/Gui/ViewProviderCompound.h b/src/Mod/Part/Gui/ViewProviderCompound.h index e72b9b278b..0ea8ff955a 100644 --- a/src/Mod/Part/Gui/ViewProviderCompound.h +++ b/src/Mod/Part/Gui/ViewProviderCompound.h @@ -48,6 +48,8 @@ public: bool canDropObjects() const; bool canDropObject(App::DocumentObject*) const; void dropObject(App::DocumentObject*); + /** Replace an object to the view provider by drag and drop */ + virtual void replaceObject(App::DocumentObject*, App::DocumentObject*); protected: void updateData(const App::Property*);