From 1bcb7275dbd137e7243177d9210df129d8932c8d Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 23 Nov 2022 12:19:28 -0500 Subject: [PATCH] [TD]backport fix for no Detail without BaseView --- src/Mod/TechDraw/App/DrawProjGroup.cpp | 33 +++++++++++++++++++ src/Mod/TechDraw/App/DrawProjGroup.h | 2 ++ src/Mod/TechDraw/Gui/TaskProjGroup.cpp | 3 ++ src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp | 6 +++- 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 43cd573a3e..d2f811d575 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -424,6 +424,39 @@ bool DrawProjGroup::hasProjection(const char *viewProjType) const return false; } +bool DrawProjGroup::canDelete(const char *viewProjType) const +{ +// Base::Console().Message("DPG::canDelete(%s)\n", viewProjType); + TechDraw::DrawProjGroupItem* foundItem(nullptr); + for( const auto it : Views.getValues() ) { + auto view( dynamic_cast(it) ); + if (!view) { + //should never have a item in DPG that is not a DPGI. + Base::Console().Log("PROBLEM - DPG::hasProjection finds non-DPGI in Group %s / %s\n", + getNameInDocument(), viewProjType); + throw Base::TypeError("Error: projection in DPG list is not a DPGI!"); + } + + if (strcmp(viewProjType, view->Type.getValueAsString()) == 0 ) { + foundItem = view; + break; + } + } + + if (foundItem) { + auto linkedItems = foundItem->getInList(); + for (auto& item : linkedItems) { + if (item == this) { + continue; + } + if (item->isDerivedFrom(TechDraw::DrawView::getClassTypeId())) { + return false; + } + } + } + return true; +} + App::DocumentObject * DrawProjGroup::addProjection(const char *viewProjType) { DrawProjGroupItem *view( nullptr ); diff --git a/src/Mod/TechDraw/App/DrawProjGroup.h b/src/Mod/TechDraw/App/DrawProjGroup.h index 33a64e60d5..08a5bacc6e 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.h +++ b/src/Mod/TechDraw/App/DrawProjGroup.h @@ -74,6 +74,8 @@ public: virtual QRectF getRect(void) const override; /// Check if container has a view of a specific type bool hasProjection(const char *viewProjType) const; + ///check if it is safe to delete item + bool canDelete(const char *viewProjType) const; App::DocumentObject * getProjObj(const char *viewProjType) const; DrawProjGroupItem* getProjItem(const char *viewProjType) const; diff --git a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp index be2e31b035..8e27f8fd0d 100644 --- a/src/Mod/TechDraw/Gui/TaskProjGroup.cpp +++ b/src/Mod/TechDraw/Gui/TaskProjGroup.cpp @@ -482,6 +482,9 @@ void TaskProjGroup::setupViewCheckboxes(bool addConnections) const char *viewStr = viewChkIndexToCStr(i); if ( viewStr != nullptr && multiView->hasProjection(viewStr) ) { box->setCheckState(Qt::Checked); + if (!multiView->canDelete(viewStr)) { + box->setEnabled(false); + } } else { box->setCheckState(Qt::Unchecked); } diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp index 7aa6c9cc4e..d6e4680e5c 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp @@ -242,7 +242,11 @@ bool ViewProviderViewPart::setEdit(int ModNum) } TechDraw::DrawViewPart* dvp = getViewObject(); TechDraw::DrawViewDetail* dvd = dynamic_cast(dvp); - if (dvd != nullptr) { + if (dvd != nullptr) { + if (!dvd->BaseView.getValue()) { + Base::Console().Error("DrawViewDetail - %s - has no BaseView!\n", dvd->getNameInDocument()); + return false; + } // clear the selection (convenience) Gui::Selection().clearSelection(); Gui::Control().showDialog(new TaskDlgDetail(dvd));