From 60bd277d7a9b2d13dd6f596d6233e61e21a89060 Mon Sep 17 00:00:00 2001 From: Yash Suthar Date: Thu, 11 Dec 2025 23:43:45 +0530 Subject: [PATCH] UI: Fix select all instances of an object in the tree Signed-off-by: Yash Suthar --- src/Gui/Tree.cpp | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Gui/Tree.cpp b/src/Gui/Tree.cpp index 05a5d5955e..ccfd464ec9 100644 --- a/src/Gui/Tree.cpp +++ b/src/Gui/Tree.cpp @@ -5451,7 +5451,7 @@ void DocumentItem::updateItemSelection(DocumentObjectItem* item) item->setCheckState(false); } - if ((selected && item->selected > 0) || (!selected && !item->selected)) { + if (!selected && !item->selected) { return; } if (item->selected != -1) { @@ -5484,7 +5484,38 @@ void DocumentItem::updateItemSelection(DocumentObjectItem* item) #endif if (!selected) { - Gui::Selection().rmvSelection(docname, objname, subname.c_str()); + // Handles deselection for same name object and subname + bool keep = false; + auto items = getTree()->selectedItems(); + for (auto it : items) { + if (it->type() == TreeWidget::ObjectType) { + auto docitem = static_cast(it); + auto obj2 = docitem->object()->getObject(); + if (!obj2 || !obj2->isAttachedToDocument()) { + continue; + } + + std::ostringstream str2; + App::DocumentObject* topParent2 = nullptr; + docitem->getSubName(str2, topParent2); + + if (topParent2) { + if (!obj2->redirectSubName(str2, topParent2, nullptr)) { + str2 << obj2->getNameInDocument() << '.'; + } + obj2 = topParent2; + } + + if (obj2 == obj && str2.str() == subname) { + keep = true; + break; + } + } + } + + if (!keep) { + Gui::Selection().rmvSelection(docname, objname, subname.c_str()); + } return; } @@ -5492,14 +5523,16 @@ void DocumentItem::updateItemSelection(DocumentObjectItem* item) selected = false; if (!item->mySubs.empty()) { for (auto& sub : item->mySubs) { - if (Gui::Selection().addSelection(docname, objname, (subname + sub).c_str())) { + if (Gui::Selection().isSelected(docname, objname, (subname + sub).c_str()) + || Gui::Selection().addSelection(docname, objname, (subname + sub).c_str())) { selected = true; } } } if (!selected) { item->mySubs.clear(); - if (!Gui::Selection().addSelection(docname, objname, subname.c_str())) { + if (!Gui::Selection().isSelected(docname, objname, subname.c_str()) + && !Gui::Selection().addSelection(docname, objname, subname.c_str())) { // Safely re-access the item DocumentObjectItem* item2 = findItem(vobj->getObject(), subname); if (item2) {