From f0da095cf8df2162950e495578da286e00ceb63a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 3 Nov 2025 16:44:51 -0500 Subject: [PATCH] [TD]fix center marks not shown --- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 153 +++++++++++++++++++-------- src/Mod/TechDraw/Gui/QGIViewPart.h | 10 +- 2 files changed, 115 insertions(+), 48 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index b2d4c0b904..bc21ebce44 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -63,6 +63,7 @@ #include "ZVALUE.h" #include "PathBuilder.h" #include "QGIBreakLine.h" +#include "QGSPage.h" using namespace TechDraw; using namespace TechDrawGui; @@ -101,8 +102,15 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& valu bool selectState = value.toBool(); if (!selectState && !isUnderMouse()) { // hide everything + bool hideCenters = hideCenterMarks(); for (auto& child : childItems()) { - if (child->type() == UserType::QGIVertex || child->type() == UserType::QGICMark) { + if (child->type() == UserType::QGIVertex) { + child->hide(); + continue; + } + + if (child->type() == UserType::QGICMark && + hideCenters) { child->hide(); } } @@ -116,15 +124,21 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& valu } else if (change == QGraphicsItem::ItemSceneHasChanged) { if (scene()) { + // added to 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()) { + bool hideCenters = hideCenterMarks(); for (auto* child : childItems()) { - if ((child->type() == UserType::QGIVertex || child->type() == UserType::QGICMark) && + if (child->type() == UserType::QGIVertex && !child->isSelected()) { child->hide(); } + if (child->type() == UserType::QGICMark && + hideCenters) { + child->hide(); + } } update(); } @@ -159,7 +173,6 @@ bool QGIViewPart::sceneEventFilter(QGraphicsItem *watched, QEvent *event) //! selected, remove it from the view. bool QGIViewPart::removeSelectedCosmetic() const { - // Base::Console().message("QGIVP::removeSelectedCosmetic()\n"); auto dvp(dynamic_cast(getViewObject())); if (!dvp) { throw Base::RuntimeError("Graphic has no feature!"); @@ -458,7 +471,8 @@ void QGIViewPart::drawAllVertexes() QColor vertexColor = PreferencesGui::getAccessibleQColor(PreferencesGui::vertexQColor()); const std::vector& verts = dvp->getVertexGeometry(); - std::vector::const_iterator vert = verts.begin(); + auto vert = verts.begin(); + bool hideCenters = hideCenterMarks(); for (int i = 0; vert != verts.end(); ++vert, i++) { if ((*vert)->isCenter()) { if (showCenterMarks()) { @@ -469,7 +483,7 @@ void QGIViewPart::drawAllVertexes() cmItem->setSize(getVertexSize() * vp->CenterScale.getValue()); cmItem->setPrettyNormal(); cmItem->setZValue(ZVALUE::VERTEX); - cmItem->setVisible(m_isHovered); + cmItem->setVisible(!hideCenters); } } else { //regular Vertex @@ -482,7 +496,7 @@ void QGIViewPart::drawAllVertexes() item->setRadius(getVertexSize()); item->setPrettyNormal(); item->setZValue(ZVALUE::VERTEX); - item->setVisible(m_isHovered); + item->setVisible(m_isHovered || isSelected()); } } } @@ -513,39 +527,6 @@ bool QGIViewPart::showThisEdge(BaseGeomPtr geom) return false; } -// returns true if vertex dots should be shown -bool QGIViewPart::showVertices() -{ - // dvp and vp already validated - auto dvp(static_cast(getViewObject())); - - if (dvp->CoarseView.getValue()) { - // never show vertices in CoarseView - return false; - } - return true; -} - - -// returns true if arc center marks should be shown -bool QGIViewPart::showCenterMarks() -{ - // dvp and vp already validated - auto dvp(static_cast(getViewObject())); - auto vp(static_cast(getViewProvider(dvp))); - - if (!vp->ArcCenterMarks.getValue()) { - // no center marks if view property is false - return false; - } - if (prefPrintCenters()) { - // frames are off, view property is true and Print Center Marks is true - return true; - } - - return true; -} - bool QGIViewPart::formatGeomFromCosmetic(std::string cTag, QGIEdge* item) { @@ -1202,11 +1183,6 @@ bool QGIViewPart::prefFaceEdges() return result; } -bool QGIViewPart::prefPrintCenters() -{ - bool printCenters = Preferences::getPreferenceGroup("Decorations")->GetBool("PrintCenterMarks", false);//true matches v0.18 behaviour - return printCenters; -} Base::Color QGIViewPart::prefBreaklineColor() { @@ -1330,11 +1306,98 @@ void QGIViewPart::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { QGIView::hoverLeaveEvent(event); + if (isSelected()) { + // if the view is selected, we should leave things alone. + return; + } + + bool hideCenters = hideCenterMarks(); + for (auto& child : childItems()) { - if ((child->type() == UserType::QGIVertex || child->type() == UserType::QGICMark) && + if (child->type() == UserType::QGIVertex && !child->isSelected()) { child->hide(); + continue; + } + + if (child->type() == UserType::QGICMark) { + if (child->isSelected()) { + continue; + } + + if (hideCenters) { + child->hide(); + } } } update(); } + + +bool QGIViewPart::isExporting() const +{ + // dvp already validated + auto viewPart {freecad_cast(getViewObject())}; + auto vpPage = getViewProviderPage(viewPart); + + QGSPage* scenePage = vpPage->getQGSPage(); + if (!scenePage) { + return false; + } + + return scenePage->getExportingAny(); +} + + +// returns true if vertex dots should be shown +bool QGIViewPart::showVertices() const +{ + // dvp already validated + auto dvp(static_cast(getViewObject())); + + if (dvp->CoarseView.getValue()) { + // never show vertices in CoarseView + return false; + } + + // if (isSelected()) { + // return true; + // } + + // if we have selected verts? + + return true; +} + + +// returns true if arc center marks should be shown +bool QGIViewPart::showCenterMarks() const +{ + // dvp and vp already validated + auto dvp(static_cast(getViewObject())); + auto vp(static_cast(getViewProvider(dvp))); + + if (isExporting() && Preferences::printCenterMarks()) { + return true; + } + + return vp->ArcCenterMarks.getValue(); +} + +//! true if center marks (type of vertex) should be hidden +bool QGIViewPart::hideCenterMarks() const +{ + // printing + if (isExporting() && + Preferences::printCenterMarks()) { + return false; + } + + // on screen + if (showCenterMarks()) { + return false; + } + + return true; +} + diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index b762e425e5..dcf1201eb6 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -126,6 +126,11 @@ public: virtual double getLineWidth(); virtual double getVertexSize(); + bool isExporting() const; + bool hideCenterMarks() const; + + + protected: bool sceneEventFilter(QGraphicsItem *watched, QEvent *event) override; QPainterPath drawPainterPath(TechDraw::BaseGeomPtr baseGeom) const; @@ -142,14 +147,13 @@ protected: void removePrimitives(); void removeDecorations(); bool prefFaceEdges(); - bool prefPrintCenters(); Base::Color prefBreaklineColor(); bool formatGeomFromCosmetic(std::string cTag, QGIEdge* item); bool formatGeomFromCenterLine(std::string cTag, QGIEdge* item); - bool showCenterMarks(); - bool showVertices(); + bool showCenterMarks() const; + bool showVertices() const; private: QList deleteItems;