From c39ba514078675ed285ceb1142ea5b45a5c06269 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 18 Aug 2025 22:41:41 -0400 Subject: [PATCH] [TD]fix crash in vertex show/hide --- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 52 ++++++++++++---------------- src/Mod/TechDraw/Gui/QGIViewPart.h | 1 - 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index d23e746b89..18139679ce 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -102,28 +102,22 @@ QGIViewPart::~QGIViewPart() QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& value) { if (change == ItemSelectedHasChanged && scene()) { - //There's nothing special for QGIVP to do when selection changes! + bool selectState = value.toBool(); + if (!selectState && !isUnderMouse()) { + // hide everything + for (auto& child : childItems()) { + if (child->type() == UserType::QGIVertex) { + child->hide(); + } + } + return QGIView::itemChange(change, value); + } + // we are selected } else if (change == ItemSceneChange && scene()) { - QObject::disconnect(m_selectionChangedConnection); + // this is means we are finished? tidy(); } - else if (change == QGraphicsItem::ItemSceneHasChanged) { - if (scene()) { - m_selectionChangedConnection = connect(scene(), &QGraphicsScene::selectionChanged, this, [this]() { - // When selection changes, if the mouse is not over the view, - // hide any non-selected vertices. - if (!isUnderMouse()) { - for (QGraphicsItem* item : m_vertexItems) { - if (item && !item->isSelected()) { - item->setVisible(false); - } - } - update(); - } - }); - } - } return QGIView::itemChange(change, value); } @@ -445,11 +439,9 @@ void QGIViewPart::drawAllEdges() void QGIViewPart::drawAllVertexes() { - m_vertexItems.clear(); // dvp and vp already validated auto dvp(static_cast(getViewObject())); auto vp(static_cast(getViewProvider(getViewObject()))); - QColor vertexColor = PreferencesGui::getAccessibleQColor(PreferencesGui::vertexQColor()); const std::vector& verts = dvp->getVertexGeometry(); @@ -457,9 +449,8 @@ void QGIViewPart::drawAllVertexes() for (int i = 0; vert != verts.end(); ++vert, i++) { if ((*vert)->isCenter()) { if (showCenterMarks()) { - QGICMark* cmItem = new QGICMark(i); + auto* cmItem = new QGICMark(i); addToGroup(cmItem); - m_vertexItems.append(cmItem); cmItem->setPos(Rez::guiX((*vert)->x()), Rez::guiX((*vert)->y())); cmItem->setThick(0.5F * getLineWidth());//need minimum? cmItem->setSize(getVertexSize() * vp->CenterScale.getValue()); @@ -470,9 +461,8 @@ void QGIViewPart::drawAllVertexes() } else { //regular Vertex if (showVertices()) { - QGIVertex* item = new QGIVertex(i); + auto* item = new QGIVertex(i); addToGroup(item); - m_vertexItems.append(item); item->setPos(Rez::guiX((*vert)->x()), Rez::guiX((*vert)->y())); item->setNormalColor(vertexColor); item->setFillColor(vertexColor); @@ -1314,11 +1304,12 @@ void QGIViewPart::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { QGIView::hoverEnterEvent(event); - for (QGraphicsItem* item : m_vertexItems) { - if (item) { - item->setVisible(true); + for (auto& child : childItems()) { + if (child->type() == UserType::QGIVertex) { + child->show(); } } + update(); } @@ -1326,9 +1317,10 @@ void QGIViewPart::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { QGIView::hoverLeaveEvent(event); - for (QGraphicsItem* item : m_vertexItems) { - if (item && !item->isSelected()) { - item->setVisible(false); + for (auto& child : childItems()) { + if (child->type() == UserType::QGIVertex && + !child->isSelected()) { + child->hide(); } } update(); diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index 28e94e588a..b762e425e5 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -149,7 +149,6 @@ protected: bool formatGeomFromCenterLine(std::string cTag, QGIEdge* item); bool showCenterMarks(); - QList m_vertexItems; bool showVertices(); private: