diff --git a/src/Mod/TechDraw/Gui/TaskDetail.cpp b/src/Mod/TechDraw/Gui/TaskDetail.cpp index f4a3776a16..4650b2f577 100644 --- a/src/Mod/TechDraw/Gui/TaskDetail.cpp +++ b/src/Mod/TechDraw/Gui/TaskDetail.cpp @@ -651,6 +651,17 @@ void TaskDlgDetail::modifyStandardButtons(QDialogButtonBox* box) widget->saveButtons(btnOK, btnCancel); } +std::string TaskDlgDetail::getDetailName() const +{ + DrawViewDetail* detailObj = widget->getDetailFeat(); + if (!detailObj) { + return {"not found"}; + } + + return detailObj->getNameInDocument(); +} + + //==== calls from the TaskView =============================================================== void TaskDlgDetail::open() { diff --git a/src/Mod/TechDraw/Gui/TaskDetail.h b/src/Mod/TechDraw/Gui/TaskDetail.h index 5c1ae309fc..bbd0abc62b 100644 --- a/src/Mod/TechDraw/Gui/TaskDetail.h +++ b/src/Mod/TechDraw/Gui/TaskDetail.h @@ -65,6 +65,9 @@ public: QPushButton* btnCancel); void enableTaskButtons(bool button); + TechDraw::DrawViewPart* getBaseFeat(); + TechDraw::DrawViewDetail* getDetailFeat(); + public Q_SLOTS: void onDraggerClicked(bool clicked); void onHighlightMoved(QPointF dragEnd); @@ -93,8 +96,6 @@ protected: void restoreDetailState(); QPointF getAnchorScene(); - TechDraw::DrawViewPart* getBaseFeat(); - TechDraw::DrawViewDetail* getDetailFeat(); private: std::unique_ptr ui; @@ -152,6 +153,8 @@ public: void modifyStandardButtons(QDialogButtonBox* box) override; + std::string getDetailName() const; + private: TaskDetail * widget; Gui::TaskView::TaskBox* taskbox; diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index a3696d81ff..f18ed6643d 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -365,12 +365,28 @@ void ViewProviderViewPart::handleChangedPropertyType(Base::XMLReader &reader, co bool ViewProviderViewPart::onDelete(const std::vector & subNames) { - // Base::Console().message("VPVP::onDelete(%d subNames)\n", subNames.size()); // we cannot delete if the view has a section or detail view (void) subNames; QString bodyMessage; QTextStream bodyMessageStream(&bodyMessage); + // this code should be in a ViewProviderDetail if we had one. Since we do not, we have to deal + // with a derived class here in the parent + Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog(); + auto* dlgDetail = dynamic_cast(dlg); + if (dlgDetail) { + std::string dlgDetailTarget = dlgDetail->getDetailName(); //new method + if (getViewObject()->getNameInDocument() == dlgDetailTarget) { + bodyMessageStream << qApp->translate("Std_Delete", + "Close open dialog before deleting detail object"); + bodyMessage = bodyMessageStream.readLine(); + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("Std_Delete", "Object dependencies"), bodyMessage, + QMessageBox::Ok); + return false; + } + } + // get child views auto viewSection = getViewObject()->getSectionRefs(); auto viewDetail = getViewObject()->getDetailRefs(); @@ -378,6 +394,7 @@ bool ViewProviderViewPart::onDelete(const std::vector & subNames) if (!viewSection.empty() || !viewDetail.empty()) { bodyMessageStream << qApp->translate("Std_Delete", "You cannot delete this view because it has one or more dependent views that would become broken."); + bodyMessage = bodyMessageStream.readLine(); QMessageBox::warning(Gui::getMainWindow(), qApp->translate("Std_Delete", "Object dependencies"), bodyMessage, QMessageBox::Ok);