From 1b2707f00a63b530b194f050c1ee7d005350501a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Sat, 6 Jul 2024 08:44:36 -0400 Subject: [PATCH] [TD]fix multiselect handling of non-geometry objects --- src/Mod/TechDraw/Gui/MDIViewPage.cpp | 53 ++++++++++++++++++++-------- src/Mod/TechDraw/Gui/MDIViewPage.h | 2 +- src/Mod/TechDraw/Gui/QGSPage.cpp | 6 ++-- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index bece0eba92..17390d23cd 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -775,7 +775,7 @@ void MDIViewPage::sceneSelectionChanged() else { for (auto& sel : treeSel) { // unselect the stored items - removeSelFromTreeSel(sceneSel, sel); + removeUnselectedTreeSelection(sceneSel, sel); } for (auto* item : sceneSel) { @@ -820,7 +820,6 @@ void MDIViewPage::setTreeToSceneSelect() } else if (dynamic_cast(scene) || dynamic_cast(scene)) { if (!obj_name) {//can happen during undo/redo if Dim is selected??? - //Base::Console().Log("INFO - MDIVP::sceneSelectionChanged - dimObj name is null!\n"); continue; } @@ -912,19 +911,43 @@ void MDIViewPage::addSceneItemToTreeSel(QGraphicsItem* sn, [[maybe_unused]]std:: } } -// remove core selection if scene is not selected anymore -void MDIViewPage::removeSelFromTreeSel(QList sceneSel, Gui::SelectionObject& sel) +// remove tree selection if it is no longer selected in the scene +void MDIViewPage::removeUnselectedTreeSelection(QList sceneSelectedItems, + Gui::SelectionObject& treeSelection) { - std::string selDocName = sel.getDocName(); - App::DocumentObject* selObj = sel.getObject(); + std::string selDocName = treeSelection.getDocName(); + App::DocumentObject* selObj = treeSelection.getObject(); - for (auto& sub : sel.getSubNames()) { - bool found = false; - for (auto& sn : sceneSel) { - auto* itemView = dynamic_cast(sn); + // If the selected item is not a geometry item (vertex/edge/face) then the + // loop on subnames below will not handle the item and it will not be removed. + if (treeSelection.getSubNames().empty()) { + bool matchFound{false}; + for (auto& sceneItem : sceneSelectedItems) { + auto* itemView = dynamic_cast(sceneItem); if (!itemView) { - auto* parent = dynamic_cast(sn->parentItem()); + continue; + } + auto itemFeature = itemView->getViewObject(); + auto itemDocName = itemFeature->getDocument()->getName(); + if (selDocName == itemDocName && selObj == itemFeature) { + matchFound = true; + break; + } + } + if (!matchFound) { + Gui::Selection().rmvSelection(treeSelection.getDocName(), treeSelection.getObject()->getNameInDocument()); + } + return; + } + + for (auto& sub : treeSelection.getSubNames()) { + bool found = false; + for (auto& sceneItem : sceneSelectedItems) { + auto* itemView = dynamic_cast(sceneItem); + if (!itemView) { + auto* parent = dynamic_cast(sceneItem->parentItem()); if (!parent) { + // neither sceneItem or its parent are Views continue; } TechDraw::DrawView* viewObj = parent->getViewObject(); @@ -936,11 +959,11 @@ void MDIViewPage::removeSelFromTreeSel(QList sceneSel, Gui::Sele const char* obj_name = viewObj->getNameInDocument(); std::string sub_name; - if (dynamic_cast(sn) || dynamic_cast(sn) || dynamic_cast(sn)) { - sub_name = getSceneSubName(sn); + if (dynamic_cast(sceneItem) || dynamic_cast(sceneItem) || dynamic_cast(sceneItem)) { + sub_name = getSceneSubName(sceneItem); } - else if (dynamic_cast(sn) || dynamic_cast(sn)) { + else if (dynamic_cast(sceneItem) || dynamic_cast(sceneItem)) { if (!obj_name) {//can happen during undo/redo if Dim is selected??? continue; } @@ -967,7 +990,7 @@ void MDIViewPage::removeSelFromTreeSel(QList sceneSel, Gui::Sele } } if (!found) { - Gui::Selection().rmvSelection(sel.getDocName(), sel.getObject()->getNameInDocument(), sub.c_str()); + Gui::Selection().rmvSelection(treeSelection.getDocName(), treeSelection.getObject()->getNameInDocument()); } } } diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index 97902441da..3fec4e8b93 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -131,7 +131,7 @@ protected: bool compareSelections(std::vector treeSel, QList sceneSel); void addSceneItemToTreeSel(QGraphicsItem* sceneItem, std::vector treeSel); - void removeSelFromTreeSel(QList sceneSel, Gui::SelectionObject& sel); + void removeUnselectedTreeSelection(QList sceneSel, Gui::SelectionObject& treeSelection); std::string getSceneSubName(QGraphicsItem* scene); void setTreeToSceneSelect(); void sceneSelectionManager(); diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index c3c9bf3f63..218bea47db 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -126,9 +126,7 @@ void QGSPage::mousePressEvent(QGraphicsSceneMouseEvent * event) itemUnderMouse->type() == QGISVGTemplateType || itemUnderMouse->type() == MysteryType) { // click without item clears selection - for (auto& item : selectedItems()) { - item->setSelected(false); - } + Gui::Selection().clearSelection(); QGraphicsScene::mousePressEvent(event); return; } @@ -149,6 +147,8 @@ void QGSPage::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) QGraphicsScene::mouseReleaseEvent(event); + // what does this do? the event has already been propagated so this will have + // no effect? event->setModifiers(originalModifiers); }