From 2e32a93ba705b9cdb8b2c555227f67734f43f033 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 5 Nov 2025 16:17:35 -0500 Subject: [PATCH] [TD]fix fail to clear frame on selection change --- src/Mod/TechDraw/Gui/QGIView.cpp | 36 +++++++++++++++------------- src/Mod/TechDraw/Gui/QGIView.h | 2 ++ src/Mod/TechDraw/Gui/QGIViewPart.cpp | 3 +-- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 5d62918318..2f546f0e2d 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -168,7 +168,6 @@ void QGIView::alignTo(QGraphicsItem*item, const QString &alignment) QVariant QGIView::itemChange(GraphicsItemChange change, const QVariant &value) { - // Base::Console().message("QGIV::itemChange(%d)\n", change); if(change == ItemPositionChange && scene()) { QPointF newPos = value.toPointF(); //position within parent! TechDraw::DrawView* viewObj = getViewObject(); @@ -196,13 +195,10 @@ QVariant QGIView::itemChange(GraphicsItemChange change, const QVariant &value) return newPos; } + // wf: why scene()? because if our selected state has changed because we have been removed from + // the scene, we don't do anything except wait to be deleted. if (change == ItemSelectedHasChanged && scene()) { - std::vector currentSelection = Gui::Selection().getSelectionEx(); - bool isViewObjectSelected = Gui::Selection().isSelected(getViewObject()); - bool hasSelectedSubElements = - !DrawGuiUtil::getSubsForSelectedObject(currentSelection, getViewObject()).empty(); - - if (isViewObjectSelected || hasSelectedSubElements) { + if (isSelected() || hasSelectedChildren(this)) { m_colCurrent = getSelectColor(); m_border->show(); m_label->show(); @@ -220,7 +216,6 @@ QVariant QGIView::itemChange(GraphicsItemChange change, const QVariant &value) } } drawBorder(); - update(); } return QGraphicsItemGroup::itemChange(change, value); @@ -537,7 +532,6 @@ void QGIView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) m_lock->setVisible(getViewObject()->isLocked() && getViewObject()->showLock()); drawBorder(); - update(); } @@ -560,13 +554,11 @@ void QGIView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) } drawBorder(); - update(); } //sets position in /Gui(graphics), not /App void QGIView::setPosition(qreal xPos, qreal yPos) { - // Base::Console().message("QGIV::setPosition(%.3f, %.3f) (gui)\n", x, y); double newX = xPos; double newY = -yPos; double oldX = pos().x(); @@ -595,8 +587,6 @@ QGIViewClip* QGIView::getClipGroup() void QGIView::updateView(bool forceUpdate) { - // Base::Console().message("QGIV::updateView() - %s\n", getViewObject()->getNameInDocument()); - //allow/prevent dragging if (getViewObject()->isLocked()) { setFlag(QGraphicsItem::ItemIsMovable, false); @@ -678,7 +668,6 @@ void QGIView::toggleCache(bool state) void QGIView::draw() { - // Base::Console().message("QGIV::draw()\n"); double xFeat, yFeat; if (getViewObject()) { xFeat = Rez::guiX(getViewObject()->X.getValue()); @@ -742,10 +731,10 @@ void QGIView::layoutDecorations(const QRectF& contentArea, void QGIView::drawBorder() { - // Base::Console().message("QGIV::drawBorder() - %s\n", getViewName()); auto feat = getViewObject(); - if (!feat) + if (!feat) { return; + } prepareCaption(); @@ -1060,6 +1049,20 @@ void QGIView::makeMark(double xPos, double yPos, QColor color) vItem->setZValue(ZVALUE::VERTEX); } +//! true if parent has any children which are selected +bool QGIView::hasSelectedChildren(QGIView* parent) +{ + QList children = parent->childItems(); + + auto itMatch = std::find_if(children.begin(), children.end(), + [&](QGraphicsItem* child) { + return child->isSelected(); + }); + + return itMatch != children.end(); +} + + void QGIView::makeMark(Base::Vector3d pos, QColor color) { makeMark(pos.x, pos.y, color); @@ -1070,6 +1073,7 @@ void QGIView::makeMark(QPointF pos, QColor color) makeMark(pos.x(), pos.y(), color); } + //! Retrieves objects of type T with given indexes template std::vector QGIView::getObjects(std::vector indexes) diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index d1a3cdb8c7..0a77c5f88b 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -174,6 +174,8 @@ public: bool pseudoEventFilter(QGraphicsItem *watched, QEvent *event) { return sceneEventFilter(watched, event); } + static bool hasSelectedChildren(QGIView* parent); + protected: QGIView* getQGIVByName(std::string name) const; diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index bc21ebce44..e632327b6d 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -116,7 +116,7 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& valu } return QGIView::itemChange(change, value); } - // we are selected + // we are selected, don't change anything? } else if (change == ItemSceneChange && scene()) { // This means we are finished? @@ -140,7 +140,6 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& valu child->hide(); } } - update(); } }); }