From 50db055a0fcc85e24450a7c090548aaf7218f166 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Sat, 13 Sep 2025 12:03:39 +0200 Subject: [PATCH] Sketcher: Coin resize when screen change. Fix #23267 (#23865) * Sketcher: Coin resize when screen change. Fix #23267 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update ViewProviderSketch.cpp --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/Mod/Sketcher/Gui/EditModeCoinManager.cpp | 99 ++++++++++---------- src/Mod/Sketcher/Gui/EditModeCoinManager.h | 3 +- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 12 +++ src/Mod/Sketcher/Gui/ViewProviderSketch.h | 3 + 4 files changed, 65 insertions(+), 52 deletions(-) diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp index 53f4630bf8..91108d8353 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp @@ -135,15 +135,15 @@ void EditModeCoinManager::ParameterObserver::initParameters() }}, {"ViewScalingFactor", [this](const std::string& param) { - updateElementSizeParameters(param); + Client.updateElementSizeParameters(); }}, {"MarkerSize", [this](const std::string& param) { - updateElementSizeParameters(param); + Client.updateElementSizeParameters(); }}, {"EditSketcherFontSize", [this](const std::string& param) { - updateElementSizeParameters(param); + Client.updateElementSizeParameters(); }}, {"EdgeWidth", [this, &drawingParameters = Client.drawingParameters](const std::string& param) { @@ -355,54 +355,6 @@ void EditModeCoinManager::ParameterObserver::updateOverlayVisibilityParameter( Client.overlayParameters.visibleInformationChanged = true; } -void EditModeCoinManager::ParameterObserver::updateElementSizeParameters( - const std::string& parametername) -{ - (void)parametername; - - // Add scaling to Constraint icons - ParameterGrp::handle hGrp = - App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); - - double viewScalingFactor = hGrp->GetFloat("ViewScalingFactor", 1.0); - viewScalingFactor = std::clamp(viewScalingFactor, 0.5, 5.0); - - int markerSize = hGrp->GetInt("MarkerSize", 7); - - int defaultFontSizePixels = - Client.defaultApplicationFontSizePixels(); // returns height in pixels, not points - - int sketcherfontSize = hGrp->GetInt("EditSketcherFontSize", defaultFontSizePixels); - int constraintSymbolSizePref = hGrp->GetInt("ConstraintSymbolSize", defaultFontSizePixels); - - double dpi = Client.getApplicationLogicalDPIX(); - double devicePixelRatio = Client.getDevicePixelRatio(); - - // simple scaling factor for hardcoded pixel values in the Sketcher - Client.drawingParameters.pixelScalingFactor = devicePixelRatio * viewScalingFactor; - - // About sizes: - // SoDatumLabel takes the size in points, not in pixels. This is because it uses QFont - // internally. Coin, at least our coin at this time, takes pixels, not points. - - Client.drawingParameters.coinFontSize = - std::lround(sketcherfontSize * devicePixelRatio); // in pixels (Coin uses pixels) - Client.drawingParameters.labelFontSize = std::lround( - sketcherfontSize * devicePixelRatio * 72.0f / dpi); // in points (SoDatumLabel uses points) - Client.drawingParameters.constraintIconSize = constraintSymbolSizePref; - - auto supportedsizes = Gui::Inventor::MarkerBitmaps::getSupportedSizes("CIRCLE_LINE"); - auto scaledMarkerSize = std::lround(markerSize * devicePixelRatio); - auto const it = - std::lower_bound(supportedsizes.begin(), supportedsizes.end(), scaledMarkerSize); - if (it != supportedsizes.end()) { - scaledMarkerSize = *it; - } - Client.drawingParameters.markerSize = scaledMarkerSize; - - Client.updateInventorNodeSizes(); -} - void EditModeCoinManager::ParameterObserver::updateWidth(int& width, const std::string& parametername, int def) @@ -1117,6 +1069,51 @@ void EditModeCoinManager::setEditDrawStyle(GeometryCreationMode mode) toCopy->linePatternScaleFactor; } +void EditModeCoinManager::updateElementSizeParameters() +{ + // Add scaling to Constraint icons + ParameterGrp::handle hGrp = + App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); + + double viewScalingFactor = hGrp->GetFloat("ViewScalingFactor", 1.0); + viewScalingFactor = std::clamp(viewScalingFactor, 0.5, 5.0); + + int markerSize = hGrp->GetInt("MarkerSize", 7); + + int defaultFontSizePixels = + defaultApplicationFontSizePixels(); // returns height in pixels, not points + + int sketcherfontSize = hGrp->GetInt("EditSketcherFontSize", defaultFontSizePixels); + int constraintSymbolSizePref = hGrp->GetInt("ConstraintSymbolSize", defaultFontSizePixels); + + double dpi = getApplicationLogicalDPIX(); + double devicePixelRatio = getDevicePixelRatio(); + + // simple scaling factor for hardcoded pixel values in the Sketcher + drawingParameters.pixelScalingFactor = devicePixelRatio * viewScalingFactor; + + // About sizes: + // SoDatumLabel takes the size in points, not in pixels. This is because it uses QFont + // internally. Coin, at least our coin at this time, takes pixels, not points. + + drawingParameters.coinFontSize = + std::lround(sketcherfontSize * devicePixelRatio); // in pixels (Coin uses pixels) + drawingParameters.labelFontSize = std::lround(sketcherfontSize * devicePixelRatio * 72.0f + / dpi); // in points (SoDatumLabel uses points) + drawingParameters.constraintIconSize = constraintSymbolSizePref; + + auto supportedsizes = Gui::Inventor::MarkerBitmaps::getSupportedSizes("CIRCLE_LINE"); + auto scaledMarkerSize = std::lround(markerSize * devicePixelRatio); + auto const it = + std::lower_bound(supportedsizes.begin(), supportedsizes.end(), scaledMarkerSize); + if (it != supportedsizes.end()) { + scaledMarkerSize = *it; + } + drawingParameters.markerSize = scaledMarkerSize; + + updateInventorNodeSizes(); +} + /************************ Delegated constraint public interface **********/ // public function that triggers drawing of most constraint icons diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.h b/src/Mod/Sketcher/Gui/EditModeCoinManager.h index 572cf9d7fe..c6c02a6660 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.h @@ -143,7 +143,6 @@ class SketcherGuiExport EditModeCoinManager void updateCurvedEdgeCountSegmentsParameter(const std::string& parametername); void updateLineRenderingOrderParameters(const std::string& parametername); void updateConstraintPresentationParameters(const std::string& parametername); - void updateElementSizeParameters(const std::string& parametername); void updateWidth(int& width, const std::string& parametername, int def); void updatePattern(unsigned int& pattern, const std::string& pname, unsigned int def); void updateColor(SbColor& sbcolor, const std::string& parametername); @@ -262,6 +261,8 @@ public: // Updates the Axes extension to span the specified area. void updateAxesLength(const Base::BoundBox2d& bb); + void updateElementSizeParameters(); + private: // This function populates the coin nodes with the information of the current geometry void processGeometry(const GeoListFacade& geolistfacade); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index b345dcf316..48862204f7 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #endif @@ -3738,6 +3739,15 @@ void ViewProviderSketch::setEditViewer(Gui::View3DInventorViewer* viewer, int Mo cameraSensor.attach(viewer->getCamera()); blockContextMenu = false; + + if (auto* window = viewer->window()->windowHandle()) { + screenChangeConnection = QObject::connect(window, &QWindow::screenChanged, [this](QScreen*) { + if (isInEditMode() && editCoinManager) { + editCoinManager->updateElementSizeParameters(); + draw(); + } + }); + } } void ViewProviderSketch::unsetEditViewer(Gui::View3DInventorViewer* viewer) @@ -3753,6 +3763,8 @@ void ViewProviderSketch::unsetEditViewer(Gui::View3DInventorViewer* viewer) viewer->setSelectionEnabled(true); blockContextMenu = false; + + QObject::disconnect(screenChangeConnection); } void ViewProviderSketch::camSensDeleteCB(void* data, SoSensor *s) diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.h b/src/Mod/Sketcher/Gui/ViewProviderSketch.h index 69be10135e..a57f805b6e 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -956,6 +957,8 @@ private: boost::signals2::connection connectRedoDocument; boost::signals2::connection connectSolverUpdate; + QMetaObject::Connection screenChangeConnection; + // modes while sketching SketchMode Mode;