From be80bf94eb06a26792fc2460b3539d0d43673dcc Mon Sep 17 00:00:00 2001 From: Ryan Kembrey Date: Sun, 23 Nov 2025 18:29:16 +1100 Subject: [PATCH 1/5] TechDraw: Implemented View Frame Mode preference (cherry picked from commit bfd3fc72684ce196b350a893ea022f2d5e449a8c) --- .../TechDraw/Gui/DlgPrefsTechDrawGeneral.ui | 66 ++++++++++++++----- .../Gui/DlgPrefsTechDrawGeneralImp.cpp | 2 + src/Mod/TechDraw/Gui/QGIView.cpp | 58 ++++++++++++---- src/Mod/TechDraw/Gui/QGIView.h | 1 + 4 files changed, 99 insertions(+), 28 deletions(-) diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui index bd530379d5..8ac2fc573e 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui @@ -189,10 +189,10 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal - QSizePolicy::Preferred + QSizePolicy::Policy::Preferred @@ -220,7 +220,7 @@ for ProjectionGroups Font for labels - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents @@ -243,7 +243,7 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal @@ -303,7 +303,7 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal @@ -332,7 +332,7 @@ for ProjectionGroups Use first or third-angle multiview projection convention - QComboBox::AdjustToContents + QComboBox::SizeAdjustPolicy::AdjustToContents ProjectionAngle @@ -423,7 +423,7 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal @@ -643,7 +643,7 @@ for ProjectionGroups Diamond - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter NamePattern @@ -693,7 +693,7 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal @@ -815,8 +815,8 @@ for ProjectionGroups View Defaults - - + + @@ -868,6 +868,41 @@ for ProjectionGroups + + + + <html><head/><body><p>Control when the view boundary frames and labels are displayed.</p><p>Auto: Show on hover, On: Always show, Off: Never show.</p></body></html> + + + ViewFrameMode + + + Mod/TechDraw/View + + + + Auto + + + + + On + + + + + Off + + + + + + + + View frames mode + + + @@ -884,7 +919,7 @@ for ProjectionGroups - + @@ -929,7 +964,7 @@ for ProjectionGroups When dragging a view, if it is within this fraction of view size of the correct alignment, it will snap into alignment. - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 0.050000000000000 @@ -945,7 +980,7 @@ for ProjectionGroups - Qt::Horizontal + Qt::Orientation::Horizontal @@ -975,7 +1010,7 @@ for ProjectionGroups Controls the snap radius for highlights. Vertex must be within this factor times the highlight size to be a snap target. - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter 0.600000000000000 @@ -986,7 +1021,6 @@ for ProjectionGroups /Mod/TechDraw/General - diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp index 330b56a251..a734f6a4db 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp @@ -80,6 +80,7 @@ void DlgPrefsTechDrawGeneralImp::saveSettings() ui->cbMultiSelection->onSave(); + ui->cb_viewFramesVisibility->onSave(); ui->cb_useCameraDirection->onSave(); ui->cb_alwaysShowLabel->onSave(); ui->cb_SnapViews->onSave(); @@ -128,6 +129,7 @@ void DlgPrefsTechDrawGeneralImp::loadSettings() ui->cbMultiSelection->setChecked(multiSelectionDefault); ui->cbMultiSelection->onRestore(); + ui->cb_viewFramesVisibility->onRestore(); ui->cb_useCameraDirection->onRestore(); ui->cb_alwaysShowLabel->onRestore(); diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 19b0574b6d..a9650347a4 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -112,8 +112,7 @@ QGIView::QGIView() m_lockHeight = (double) sizeLock.height(); m_lock->hide(); - m_border->hide(); - m_label->hide(); + updateFrameVisibility(); } void QGIView::isVisible(bool state) @@ -198,21 +197,18 @@ QVariant QGIView::itemChange(GraphicsItemChange change, const QVariant &value) if (change == ItemSelectedHasChanged && scene()) { if (isSelected() || hasSelectedChildren(this)) { m_colCurrent = getSelectColor(); - m_border->show(); - m_label->show(); m_lock->setVisible(getViewObject()->isLocked() && getViewObject()->showLock()); } else { dragFinished(); if (!m_isHovered) { m_colCurrent = PreferencesGui::getAccessibleQColor(PreferencesGui::normalQColor()); - m_border->hide(); - m_label->hide(); m_lock->hide(); } else { m_colCurrent = getPreColor(); } } + updateFrameVisibility(); drawBorder(); } @@ -524,8 +520,7 @@ void QGIView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) m_colCurrent = getPreColor(); } - m_border->show(); - m_label->show(); + updateFrameVisibility(); m_lock->setVisible(getViewObject()->isLocked() && getViewObject()->showLock()); @@ -541,16 +536,13 @@ void QGIView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) if (isSelected()) { m_colCurrent = getSelectColor(); - m_border->show(); - m_label->show(); m_lock->setVisible(getViewObject()->isLocked() && getViewObject()->showLock()); } else { m_colCurrent = PreferencesGui::getAccessibleQColor(PreferencesGui::normalQColor()); - m_border->hide(); - m_label->hide(); m_lock->hide(); } + updateFrameVisibility(); drawBorder(); } @@ -603,6 +595,7 @@ void QGIView::updateView(bool forceUpdate) rotateView(); } + updateFrameVisibility(); drawBorder(); QGIView::draw(); @@ -1074,6 +1067,47 @@ void QGIView::makeMark(QPointF pos, QColor color) makeMark(pos.x(), pos.y(), color); } +void QGIView::updateFrameVisibility() +{ + // Get the preference group + auto hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/View"); + + // 0 = Auto (Default), 1 = Always On, 2 = Always Off + int frameMode = hGrp->GetInt("ViewFrameMode", 0); + + bool shouldShow = false; + + if (isSelected()) { + shouldShow = true; + } + else { + if (frameMode == 1) { + // Always On + shouldShow = true; + } + else if (frameMode == 2) { + // Always Off + shouldShow = false; + } + else { + // Auto (Default) + shouldShow = m_isHovered; + } + } + + if (shouldShow) { + m_border->show(); + m_label->show(); + if (m_lock && getViewObject()) { + m_lock->setVisible(getViewObject()->isLocked() && getViewObject()->showLock()); + } + } else { + m_border->hide(); + m_label->hide(); + if (m_lock) m_lock->hide(); + } +} //! Retrieves objects of type T with given indexes template diff --git a/src/Mod/TechDraw/Gui/QGIView.h b/src/Mod/TechDraw/Gui/QGIView.h index 0a77c5f88b..7156d9a217 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -190,6 +190,7 @@ protected: void dumpRect(const char* text, QRectF rect); bool m_isHovered; + void updateFrameVisibility(); Base::Reference getParmGroupCol(); From 103445399feffdb30290ff9833944752b9dc4d44 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 27 Nov 2025 16:55:26 -0500 Subject: [PATCH 2/5] [TD]remove obsolete preference (cherry picked from commit c95ce2c06db85a0f7bce7889f9339a2732b4618a) --- .../TechDraw/Gui/DlgPrefsTechDrawGeneral.ui | 23 +------------------ .../Gui/DlgPrefsTechDrawGeneralImp.cpp | 2 -- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 12 ++++------ 3 files changed, 5 insertions(+), 32 deletions(-) diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui index 8ac2fc573e..2bd622980a 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui @@ -7,7 +7,7 @@ 0 0 676 - 1200 + 1302 @@ -845,27 +845,6 @@ for ProjectionGroups - - - - - true - - - - Displays view labels even when frames are suppressed - - - Always Show Label - - - AlwaysShowLabel - - - /Mod/TechDraw/General - - - diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp index a734f6a4db..33235beb35 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneralImp.cpp @@ -82,7 +82,6 @@ void DlgPrefsTechDrawGeneralImp::saveSettings() ui->cb_viewFramesVisibility->onSave(); ui->cb_useCameraDirection->onSave(); - ui->cb_alwaysShowLabel->onSave(); ui->cb_SnapViews->onSave(); ui->psb_SnapFactor->onSave(); ui->cb_SnapHighlights->onSave(); @@ -131,7 +130,6 @@ void DlgPrefsTechDrawGeneralImp::loadSettings() ui->cb_viewFramesVisibility->onRestore(); ui->cb_useCameraDirection->onRestore(); - ui->cb_alwaysShowLabel->onRestore(); ui->cb_SnapViews->onRestore(); ui->psb_SnapFactor->onRestore(); diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index 8cee4e87d2..53a944ed73 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -65,6 +65,7 @@ ViewProviderDrawingView::ViewProviderDrawingView() : static const char *group = "Base"; auto showLabel = Preferences::alwaysShowLabel(); + // TODO: KeepLabel is not used. Make it ReadOnly or Hidden? ADD_PROPERTY_TYPE(KeepLabel ,(showLabel), group, App::Prop_None, "Keep Label on Page even if toggled off"); ADD_PROPERTY_TYPE(StackOrder,(0),group,App::Prop_None,"Over or under lap relative to other views"); @@ -111,14 +112,9 @@ void ViewProviderDrawingView::onChanged(const App::Property *prop) return; } - if (prop == &Visibility) { - //handled by ViewProviderDocumentObject - } else if (prop == &KeepLabel) { - QGIView* qgiv = getQView(); - if (qgiv) { - qgiv->updateView(true); - } - } + // if (prop == &Visibility) { + // //handled by ViewProviderDocumentObject + // } if (prop == &StackOrder) { QGIView* qgiv = getQView(); From 8d1a43a7555aabf90591f52d62893693dea7568a Mon Sep 17 00:00:00 2001 From: wandererfan Date: Tue, 9 Dec 2025 22:11:05 -0500 Subject: [PATCH 3/5] [TD]restore view frame toggle in context menu #This is the commit message #2: (cherry picked from commit fa8e81f0d63aa896b617776eebf57ca64a1e0c99) --- src/Mod/TechDraw/Gui/CommandDecorate.cpp | 69 +++++++++++++++++++ .../TechDraw/Gui/DlgPrefsTechDrawGeneral.ui | 5 ++ src/Mod/TechDraw/Gui/MDIViewPage.cpp | 11 ++- src/Mod/TechDraw/Gui/MDIViewPage.h | 2 + src/Mod/TechDraw/Gui/PreferencesGui.cpp | 7 ++ src/Mod/TechDraw/Gui/PreferencesGui.h | 6 ++ src/Mod/TechDraw/Gui/QGIView.cpp | 68 ++++++++++-------- src/Mod/TechDraw/Gui/QGIView.h | 11 +++ src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 31 ++++++++- src/Mod/TechDraw/Gui/ViewProviderPage.h | 6 ++ src/Mod/TechDraw/Gui/Workbench.cpp | 3 + 11 files changed, 188 insertions(+), 31 deletions(-) diff --git a/src/Mod/TechDraw/Gui/CommandDecorate.cpp b/src/Mod/TechDraw/Gui/CommandDecorate.cpp index bc707aa168..9868bd8dac 100644 --- a/src/Mod/TechDraw/Gui/CommandDecorate.cpp +++ b/src/Mod/TechDraw/Gui/CommandDecorate.cpp @@ -52,6 +52,7 @@ #include "ViewProviderPage.h" #include "MDIViewPage.h" #include "CommandHelpers.h" +#include "PreferencesGui.h" using namespace TechDrawGui; @@ -61,6 +62,72 @@ using DU = DrawUtil; //internal functions bool _checkSelectionHatch(Gui::Command* cmd); +//=========================================================================== +// TechDraw_ToggleFrame +//=========================================================================== + +DEF_STD_CMD_A(CmdTechDrawToggleFrame) + +CmdTechDrawToggleFrame::CmdTechDrawToggleFrame() + : Command("TechDraw_ToggleFrame") +{ + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); + sMenuText = QT_TR_NOOP("Turn View Frames On/Off"); + sToolTipText = QT_TR_NOOP("Turn View Frames On/Off"); + sWhatsThis = "TechDraw_Toggle"; + sStatusTip = sToolTipText; + sPixmap = "actions/TechDraw_ToggleFrame"; +} + +// This is a toggle. Each press flips the fame state. +// Gui::Action *CmdTechDrawToggleFrame::createAction() +// { +// Gui::Action *action = Gui::Command::createAction(); +// action->setCheckable(true); +// action->setChecked(false); + +// return action; +// } + +void CmdTechDrawToggleFrame::activated(int iMsg) +{ + Q_UNUSED(iMsg); + + if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { + return; + } + + auto mvp = dynamic_cast(Gui::getMainWindow()->activeWindow()); + if (!mvp) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No TechDraw Page"), + QObject::tr("Need a TechDraw Page for this command")); + return; + } + + ViewProviderPage* vpp = mvp->getViewProviderPage(); + if (!vpp) { + return; + } + + vpp->toggleFrameState(); + + // Gui::Action *action = this->getAction(); + // if (action) { + // action->setChecked(vpp->getFrameState()); + // } +} + +bool CmdTechDrawToggleFrame::isActive() +{ + if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { + return false; + } + + auto mvp = dynamic_cast(Gui::getMainWindow()->activeWindow()); + return mvp != nullptr; +} + //=========================================================================== // TechDraw_Hatch //=========================================================================== @@ -297,6 +364,8 @@ void CreateTechDrawCommandsDecorate() rcCmdMgr.addCommand(new CmdTechDrawHatch()); rcCmdMgr.addCommand(new CmdTechDrawGeometricHatch()); rcCmdMgr.addCommand(new CmdTechDrawImage()); + rcCmdMgr.addCommand(new CmdTechDrawToggleFrame()); + // rcCmdMgr.addCommand(new CmdTechDrawLeaderLine()); // rcCmdMgr.addCommand(new CmdTechDrawRichTextAnnotation()); } diff --git a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui index 2bd622980a..243c29fead 100644 --- a/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui +++ b/src/Mod/TechDraw/Gui/DlgPrefsTechDrawGeneral.ui @@ -873,6 +873,11 @@ for ProjectionGroups Off + + + Manual + + diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index 19fa837df7..915f797e64 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -71,6 +71,7 @@ #include "QGVPage.h" #include "ViewProviderPage.h" #include "PagePrinter.h" +#include "PreferencesGui.h" using namespace TechDrawGui; using namespace TechDraw; @@ -89,6 +90,9 @@ MDIViewPage::MDIViewPage(ViewProviderPage* pageVp, Gui::Document* doc, QWidget* m_toggleKeepUpdatedAction = new QAction(tr("Toggle &Keep Updated"), this); connect(m_toggleKeepUpdatedAction, &QAction::triggered, this, &MDIViewPage::toggleKeepUpdated); + m_toggleFrameAction = new QAction(tr("Toggle &Frames"), this); + connect(m_toggleFrameAction, &QAction::triggered, this, &MDIViewPage::toggleFrame); + m_exportSVGAction = new QAction(tr("&Export SVG"), this); connect(m_exportSVGAction, &QAction::triggered, this, qOverload<>(&MDIViewPage::saveSVG)); @@ -435,18 +439,23 @@ PyObject* MDIViewPage::getPyObject() void MDIViewPage::contextMenuEvent(QContextMenuEvent* event) { - // Base::Console().message("MDIVP::contextMenuEvent() - reason: %d\n", event->reason()); if (isContextualMenuEnabled) { QMenu menu; + menu.addAction(m_toggleFrameAction); menu.addAction(m_toggleKeepUpdatedAction); menu.addAction(m_exportSVGAction); menu.addAction(m_exportDXFAction); menu.addAction(m_exportPDFAction); menu.addAction(m_printAllAction); + if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { + m_toggleFrameAction->setEnabled(false); + } menu.exec(event->globalPos()); } } +void MDIViewPage::toggleFrame() { m_vpPage->toggleFrameState(); } + void MDIViewPage::toggleKeepUpdated() { bool state = m_vpPage->getDrawPage()->KeepUpdated.getValue(); diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index c3fa868d65..44f29775be 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -116,6 +116,7 @@ public Q_SLOTS: void saveSVG(); void saveDXF(); void savePDF(); + void toggleFrame(); void toggleKeepUpdated(); void sceneSelectionChanged(); void printAll(); @@ -138,6 +139,7 @@ private: using Connection = boost::signals2::connection; Connection connectDeletedObject; + QAction *m_toggleFrameAction; QAction *m_toggleKeepUpdatedAction; QAction *m_exportSVGAction; QAction *m_exportDXFAction; diff --git a/src/Mod/TechDraw/Gui/PreferencesGui.cpp b/src/Mod/TechDraw/Gui/PreferencesGui.cpp index ce207cc9b1..52e7630b35 100644 --- a/src/Mod/TechDraw/Gui/PreferencesGui.cpp +++ b/src/Mod/TechDraw/Gui/PreferencesGui.cpp @@ -304,3 +304,10 @@ int PreferencesGui::get3dMarkerSize() return hGrp->GetInt("MarkerSize", 9L); } + +ViewFrameMode PreferencesGui::getViewFrameMode() +{ + int temp = Preferences::getPreferenceGroup("View")->GetInt("ViewFrameMode", 0); + return static_cast(temp); +} + diff --git a/src/Mod/TechDraw/Gui/PreferencesGui.h b/src/Mod/TechDraw/Gui/PreferencesGui.h index 9cc2bb08b8..de1e1c537a 100644 --- a/src/Mod/TechDraw/Gui/PreferencesGui.h +++ b/src/Mod/TechDraw/Gui/PreferencesGui.h @@ -27,6 +27,8 @@ #include +#include "QGIView.h" + class QColor; class QString; @@ -95,6 +97,10 @@ static QColor templateClickBoxColor(); static int get3dMarkerSize(); +static ViewFrameMode getViewFrameMode(); +static void setViewFrameMode(ViewFrameMode newMode); + + }; } //end namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index a9650347a4..e47fbf8d2f 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -1069,34 +1069,7 @@ void QGIView::makeMark(QPointF pos, QColor color) void QGIView::updateFrameVisibility() { - // Get the preference group - auto hGrp = App::GetApplication().GetUserParameter() - .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/View"); - - // 0 = Auto (Default), 1 = Always On, 2 = Always Off - int frameMode = hGrp->GetInt("ViewFrameMode", 0); - - bool shouldShow = false; - - if (isSelected()) { - shouldShow = true; - } - else { - if (frameMode == 1) { - // Always On - shouldShow = true; - } - else if (frameMode == 2) { - // Always Off - shouldShow = false; - } - else { - // Auto (Default) - shouldShow = m_isHovered; - } - } - - if (shouldShow) { + if (shouldShowFrame()) { m_border->show(); m_label->show(); if (m_lock && getViewObject()) { @@ -1105,10 +1078,47 @@ void QGIView::updateFrameVisibility() } else { m_border->hide(); m_label->hide(); - if (m_lock) m_lock->hide(); + if (m_lock) { + m_lock->hide(); + } } } +bool QGIView::shouldShowFrame() const +{ + if (isSelected()) { + return true; + } + + ViewFrameMode frameMode = PreferencesGui::getViewFrameMode(); + switch(frameMode) { + case ViewFrameMode::Manual: + return shouldShowFromViewProvider(); + case ViewFrameMode::AlwaysOn: + return true; + case ViewFrameMode::AlwaysOff: + return false; + break; + default: + return m_isHovered; + }; + +} + +bool QGIView::shouldShowFromViewProvider() const +{ + DrawView* feature = getViewObject(); + if (!feature) { + return false; + } + ViewProviderPage* vpPage = getViewProviderPage(feature); + if (!vpPage) { + return false; + } + + return vpPage->getFrameState(); +} + //! 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 7156d9a217..931c8a15f8 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -76,6 +76,15 @@ class QGCustomImage; class QGTracker; class QGIVertex; + +enum class ViewFrameMode { + Auto, + AlwaysOn, + AlwaysOff, + Manual +}; + + class TechDrawGuiExport QGIView : public QObject, public QGraphicsItemGroup { Q_OBJECT @@ -191,6 +200,8 @@ protected: bool m_isHovered; void updateFrameVisibility(); + bool shouldShowFromViewProvider() const; + bool shouldShowFrame() const; Base::Reference getParmGroupCol(); diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 6bfa6531dd..2c981211f0 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -72,7 +72,8 @@ PROPERTY_SOURCE(TechDrawGui::ViewProviderPage, Gui::ViewProviderDocumentObject) // Construction/Destruction ViewProviderPage::ViewProviderPage() - : m_mdiView(nullptr), m_graphicsView(nullptr), m_graphicsScene(nullptr) + : m_mdiView(nullptr), m_graphicsView(nullptr), m_graphicsScene(nullptr), + m_frameToggle(false) { initExtension(this); @@ -80,6 +81,12 @@ ViewProviderPage::ViewProviderPage() static const char* group = "Grid"; // NOLINTBEGIN + // ShowFrames is no longer used + ADD_PROPERTY_TYPE(ShowFrames, (false), group, App::Prop_None, + "Show or hide view frames and labels on this page"); + ShowFrames.setStatus(App::Property::Hidden, true); + ShowFrames.setStatus(App::Property::ReadOnly, true); + ADD_PROPERTY_TYPE(ShowGrid, (PreferencesGui::showGrid()), group, App::Prop_None, "Show or hide a grid on this page"); ADD_PROPERTY_TYPE(GridSpacing, (PreferencesGui::gridSpacing()), group, @@ -98,6 +105,7 @@ ViewProviderPage::ViewProviderPage() //somewhere???? QTBUG-18021??? } + ViewProviderPage::~ViewProviderPage() { removeMDIView();//if the MDIViewPage is still in MainWindow, remove it. @@ -131,6 +139,9 @@ void ViewProviderPage::onChanged(const App::Property* prop) } else if (prop == &Visibility) { //Visibility changes are handled in VPDO::onChanged -> show() or hide() + } else if ( prop == &ShowFrames) { + // I don't think we do anything here because we don't want to trigger a cascade? + return; } Gui::ViewProviderDocumentObject::onChanged(prop); @@ -431,6 +442,24 @@ std::vector ViewProviderPage::claimChildren() const bool ViewProviderPage::isShow() const { return Visibility.getValue(); } + +bool ViewProviderPage::getFrameState() const { return m_frameToggle; } + +void ViewProviderPage::setFrameState(bool state) { m_frameToggle = state; } + +void ViewProviderPage::toggleFrameState() +{ + if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { + return; + } + if (m_graphicsScene) { + setFrameState(!getFrameState()); + m_graphicsScene->refreshViews(); + setTemplateMarkers(getFrameState()); + } +} + + void ViewProviderPage::setTemplateMarkers(bool state) const { App::DocumentObject* templateFeat = nullptr; diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index f0a9b6ce69..7ac3d6cc17 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -122,6 +122,10 @@ public: Gui::MDIView* getMDIView() const override; + bool getFrameState() const; + void setFrameState(bool state); + void toggleFrameState(); + void setTemplateMarkers(bool state) const; bool canDelete(App::DocumentObject* obj) const override; @@ -148,6 +152,8 @@ private: std::string m_pageName; QPointer m_graphicsView; QGSPage* m_graphicsScene; + + bool m_frameToggle{false}; // replacement for ShowFrame property to avoid marking document changed }; }// namespace TechDrawGui diff --git a/src/Mod/TechDraw/Gui/Workbench.cpp b/src/Mod/TechDraw/Gui/Workbench.cpp index 8711cfbf31..46c1fa0c1c 100644 --- a/src/Mod/TechDraw/Gui/Workbench.cpp +++ b/src/Mod/TechDraw/Gui/Workbench.cpp @@ -222,6 +222,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const *views << "Separator"; *views << "TechDraw_ShareView"; *views << "Separator"; + *views << "TechDraw_ToggleFrame"; *views << "Separator"; *views << "TechDraw_ProjectShape"; @@ -380,6 +381,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* decor = new Gui::ToolBarItem(root); decor->setCommand("TechDraw Decoration"); + *decor << "TechDraw_ToggleFrame"; *decor << "TechDraw_Hatch"; *decor << "TechDraw_GeometricHatch"; @@ -476,6 +478,7 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const Gui::ToolBarItem* decor = new Gui::ToolBarItem(root); decor->setCommand("TechDraw Decoration"); + *decor << "TechDraw_ToggleFrame"; *decor << "TechDraw_Hatch"; *decor << "TechDraw_GeometricHatch"; From 0148f9b107384a65e4bec57663e38601ec998eb4 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 15 Dec 2025 19:15:20 -0500 Subject: [PATCH 4/5] [TD]prevent frames on exported/printed page (cherry picked from commit f64408de2efd7c7aac07d17dabe831fbbf007fbc) --- src/Mod/TechDraw/Gui/QGIView.cpp | 21 +++++++++++++++++++++ src/Mod/TechDraw/Gui/QGIView.h | 3 +++ 2 files changed, 24 insertions(+) diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index e47fbf8d2f..7fa224baac 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -1086,6 +1086,10 @@ void QGIView::updateFrameVisibility() bool QGIView::shouldShowFrame() const { + if (isExporting()) { + return false; + } + if (isSelected()) { return true; } @@ -1119,6 +1123,23 @@ bool QGIView::shouldShowFromViewProvider() const return vpPage->getFrameState(); } + +bool QGIView::isExporting() const +{ + auto* view{freecad_cast(getViewObject())}; + auto vpPage = getViewProviderPage(view); + if (!view || !vpPage) { + return false; + } + + QGSPage* scenePage = vpPage->getQGSPage(); + if (!scenePage) { + return false; + } + + return scenePage->getExportingAny(); +} + //! 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 931c8a15f8..85b750774f 100644 --- a/src/Mod/TechDraw/Gui/QGIView.h +++ b/src/Mod/TechDraw/Gui/QGIView.h @@ -185,6 +185,9 @@ public: static bool hasSelectedChildren(QGIView* parent); + bool isExporting() const; + + protected: QGIView* getQGIVByName(std::string name) const; From 9a01694543fbba96706f44fec074273f686194dd Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 15 Jan 2026 20:20:39 -0500 Subject: [PATCH 5/5] [TD]fix vertex display in manual frame mode --- src/Mod/TechDraw/Gui/CommandDecorate.cpp | 9 +++------ src/Mod/TechDraw/Gui/MDIViewPage.cpp | 4 +++- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 14 ++++++++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/Mod/TechDraw/Gui/CommandDecorate.cpp b/src/Mod/TechDraw/Gui/CommandDecorate.cpp index 9868bd8dac..ab6509f272 100644 --- a/src/Mod/TechDraw/Gui/CommandDecorate.cpp +++ b/src/Mod/TechDraw/Gui/CommandDecorate.cpp @@ -120,12 +120,9 @@ void CmdTechDrawToggleFrame::activated(int iMsg) bool CmdTechDrawToggleFrame::isActive() { - if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { - return false; - } - - auto mvp = dynamic_cast(Gui::getMainWindow()->activeWindow()); - return mvp != nullptr; + bool havePage = DrawGuiUtil::needPage(this); + bool haveView = DrawGuiUtil::needView(this); + return (havePage && haveView && PreferencesGui::getViewFrameMode() == ViewFrameMode::Manual); } //=========================================================================== diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index 915f797e64..b8b9505143 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -447,7 +447,9 @@ void MDIViewPage::contextMenuEvent(QContextMenuEvent* event) menu.addAction(m_exportDXFAction); menu.addAction(m_exportPDFAction); menu.addAction(m_printAllAction); - if (PreferencesGui::getViewFrameMode() != ViewFrameMode::Manual) { + if (PreferencesGui::getViewFrameMode() == ViewFrameMode::Manual) { + m_toggleFrameAction->setEnabled(true); + } else { m_toggleFrameAction->setEnabled(false); } menu.exec(event->globalPos()); diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 386dec846a..fd0f288210 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -467,6 +467,7 @@ void QGIViewPart::drawAllVertexes() // dvp and vp already validated auto dvp(static_cast(getViewObject())); auto vp(static_cast(getViewProvider(getViewObject()))); + ViewProviderPage* vpPage = vp->getViewProviderPage(); QColor vertexColor = PreferencesGui::getAccessibleQColor(PreferencesGui::vertexQColor()); const std::vector& verts = dvp->getVertexGeometry(); @@ -482,7 +483,8 @@ void QGIViewPart::drawAllVertexes() cmItem->setZValue(ZVALUE::VERTEX); bool showMark = ( (!isExporting() && vp->ArcCenterMarks.getValue()) || - (isExporting() && Preferences::printCenterMarks()) ); + (isExporting() && Preferences::printCenterMarks()) || + (vpPage->getFrameState() && PreferencesGui::getViewFrameMode() == ViewFrameMode::Manual)); cmItem->setVisible(showMark); } else { //regular Vertex @@ -495,7 +497,8 @@ void QGIViewPart::drawAllVertexes() item->setRadius(getVertexSize()); item->setPrettyNormal(); item->setZValue(ZVALUE::VERTEX); - item->setVisible(m_isHovered || isSelected()); + item->setVisible(m_isHovered || isSelected() || + (vpPage->getFrameState() && PreferencesGui::getViewFrameMode() == ViewFrameMode::Manual)); } } } @@ -1316,6 +1319,13 @@ void QGIViewPart::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) return; } + auto vp(static_cast(getViewProvider(getViewObject()))); + ViewProviderPage* vpPage = vp->getViewProviderPage(); + if (vpPage->getFrameState() && + PreferencesGui::getViewFrameMode() == ViewFrameMode::Manual) { + return; + } + bool hideCenters = hideCenterMarks(); for (auto& child : childItems()) {