From 2f34f01c10e637e299dfc8fd8a6dc56ebd67e88d Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Tue, 28 Feb 2023 08:25:13 +0100 Subject: [PATCH] Sketcher: EditModeCoinManager - support to update layer configuration ===================================================================== - Refactor scenograph creation to enable local update - Support to perform a local update --- src/Mod/Sketcher/Gui/EditModeCoinManager.cpp | 62 ++++++++++--------- src/Mod/Sketcher/Gui/EditModeCoinManager.h | 6 +- .../Gui/EditModeGeometryCoinManager.cpp | 50 ++++++++++++--- .../Gui/EditModeGeometryCoinManager.h | 7 +++ 4 files changed, 87 insertions(+), 38 deletions(-) diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp index 5f2949d657..377f072296 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.cpp @@ -147,8 +147,8 @@ void EditModeCoinManager::ParameterObserver::initParameters() [this, drawingParameters = Client.drawingParameters](const std::string & param){updateColor(drawingParameters.PreselectColor, param);}}, {"SelectionColor", [this, drawingParameters = Client.drawingParameters](const std::string & param){updateColor(drawingParameters.SelectColor, param);}}, - {"CursorTextColor", - [this, drawingParameters = Client.drawingParameters](const std::string & param){updateColor(drawingParameters.CursorTextColor, param);}}, + {"CursorTextColor", + [this, drawingParameters = Client.drawingParameters](const std::string & param){updateColor(drawingParameters.CursorTextColor, param);}}, }; for( auto & val : str2updatefunction){ @@ -231,12 +231,12 @@ void EditModeCoinManager::ParameterObserver::updateElementSizeParameters(const s // simple scaling factor for hardcoded pixel values in the Sketcher Client.drawingParameters.pixelScalingFactor = viewScalingFactor * dpi / 96; // 96 ppi is the standard pixel density for which pixel quantities were calculated - // 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. + // 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. // - // DPI considerations: - // With hdpi monitors, the coin font labels do not respect the size passed in pixels: + // DPI considerations: + // With hdpi monitors, the coin font labels do not respect the size passed in pixels: // https://forum.freecadweb.org/viewtopic.php?f=3&t=54347&p=467610#p467610 // https://forum.freecadweb.org/viewtopic.php?f=10&t=49972&start=40#p467471 // @@ -248,8 +248,8 @@ void EditModeCoinManager::ParameterObserver::updateElementSizeParameters(const s // This means that the following correction does not have a documented basis, but appears necessary so that the Sketcher is usable in // HDPI monitors. - Client.drawingParameters.coinFontSize = std::lround(sketcherfontSize * 96.0f / dpi); // this is in pixels - Client.drawingParameters.labelFontSize = std::lround(sketcherfontSize * 72.0f / dpi); // this is in points, as SoDatumLabel uses points + Client.drawingParameters.coinFontSize = std::lround(sketcherfontSize * 96.0f / dpi); // this is in pixels + Client.drawingParameters.labelFontSize = std::lround(sketcherfontSize * 72.0f / dpi); // this is in points, as SoDatumLabel uses points Client.drawingParameters.constraintIconSize = std::lround(0.8 * sketcherfontSize); // For marker size the global default is used. @@ -271,8 +271,8 @@ void EditModeCoinManager::ParameterObserver::updateColor(SbColor &sbcolor, const unsigned long color = (unsigned long)(sbcolor.getPackedValue()); color = hGrp->GetUnsigned(parametername.c_str(), color); sbcolor.setPackedValue((uint32_t)color, transparency); - - Client.updateInventorColors(); + + Client.updateInventorColors(); } void EditModeCoinManager::ParameterObserver::subscribeToParameters() @@ -638,6 +638,12 @@ void EditModeCoinManager::setConstraintSelectability(bool enabled /* = true */) pEditModeConstraintCoinManager->setConstraintSelectability(enabled); } + +void EditModeCoinManager::updateGeometryLayersConfiguration() +{ + pEditModeGeometryCoinManager->updateGeometryLayersConfiguration(); +} + void EditModeCoinManager::createEditModeInventorNodes() { // 1 - Create the edit root node @@ -730,16 +736,16 @@ void EditModeCoinManager::createEditModeInventorNodes() // no caching for frequently-changing data structures Coordsep->renderCaching = SoSeparator::OFF; - editModeScenegraphNodes.textMaterial = new SoMaterial; - editModeScenegraphNodes.textMaterial->setName("CoordTextMaterials"); - editModeScenegraphNodes.textMaterial->diffuseColor = drawingParameters.CursorTextColor; - Coordsep->addChild(editModeScenegraphNodes.textMaterial); + editModeScenegraphNodes.textMaterial = new SoMaterial; + editModeScenegraphNodes.textMaterial->setName("CoordTextMaterials"); + editModeScenegraphNodes.textMaterial->diffuseColor = drawingParameters.CursorTextColor; + Coordsep->addChild(editModeScenegraphNodes.textMaterial); - editModeScenegraphNodes.textFont = new SoFont(); - editModeScenegraphNodes.textFont->name.setValue("Helvetica"); - editModeScenegraphNodes.textFont->size.setValue(drawingParameters.coinFontSize); + editModeScenegraphNodes.textFont = new SoFont(); + editModeScenegraphNodes.textFont->name.setValue("Helvetica"); + editModeScenegraphNodes.textFont->size.setValue(drawingParameters.coinFontSize); - Coordsep->addChild(editModeScenegraphNodes.textFont); + Coordsep->addChild(editModeScenegraphNodes.textFont); editModeScenegraphNodes.textPos = new SoTranslation(); Coordsep->addChild(editModeScenegraphNodes.textPos); @@ -819,18 +825,18 @@ void EditModeCoinManager::updateInventorNodeSizes() editModeScenegraphNodes.ConstraintDrawStyle->lineWidth = 1 * drawingParameters.pixelScalingFactor; editModeScenegraphNodes.InformationDrawStyle->lineWidth = 1 * drawingParameters.pixelScalingFactor; - editModeScenegraphNodes.textFont->size.setValue(drawingParameters.coinFontSize); - + editModeScenegraphNodes.textFont->size.setValue(drawingParameters.coinFontSize); + pEditModeConstraintCoinManager->rebuildConstraintNodes(); } -void EditModeCoinManager::updateInventorColors() -{ - editModeScenegraphNodes.RootCrossMaterials->diffuseColor.set1Value(0, drawingParameters.CrossColorH); - editModeScenegraphNodes.RootCrossMaterials->diffuseColor.set1Value(1, drawingParameters.CrossColorV); - editModeScenegraphNodes.textMaterial->diffuseColor = drawingParameters.CursorTextColor; -} - +void EditModeCoinManager::updateInventorColors() +{ + editModeScenegraphNodes.RootCrossMaterials->diffuseColor.set1Value(0, drawingParameters.CrossColorH); + editModeScenegraphNodes.RootCrossMaterials->diffuseColor.set1Value(1, drawingParameters.CrossColorV); + editModeScenegraphNodes.textMaterial->diffuseColor = drawingParameters.CursorTextColor; +} + /************************ Edit node access ************************/ SoSeparator* EditModeCoinManager::getRootEditNode() diff --git a/src/Mod/Sketcher/Gui/EditModeCoinManager.h b/src/Mod/Sketcher/Gui/EditModeCoinManager.h index 561c7a7a76..e704e5e91f 100644 --- a/src/Mod/Sketcher/Gui/EditModeCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeCoinManager.h @@ -214,6 +214,8 @@ public: // This specific overload is to use a specific geometry list, which may be a temporal one void drawConstraintIcons(const GeoListFacade & geolistfacade); + + void updateGeometryLayersConfiguration(); //@} /** @name coin node access*/ @@ -256,8 +258,8 @@ private: void updateInventorNodeSizes(); - void updateInventorColors(); - + void updateInventorColors(); + /** @name coin nodes creation*/ void createEditModeInventorNodes(); //@} diff --git a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp index 78c3e54c64..ce6f1426df 100644 --- a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp @@ -409,17 +409,53 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol editModeScenegraphNodes.RootCrossMaterials->diffuseColor.finishEditing(); } +void EditModeGeometryCoinManager::updateGeometryLayersConfiguration() +{ + // Several cases: + // 1) The number of layers have changed + // 2) The number of layers is the same, but the configuration needs to be updated + + // TODO: Quite some room for improvement here: + emptyGeometryRootNodes(); + createEditModePointInventorNodes(); + createEditModeCurveInventorNodes(); +} + +auto concat (std::string string, int i) +{ + return string+std::to_string(i); +}; + void EditModeGeometryCoinManager::createEditModeInventorNodes() +{ + createGeometryRootNodes(); + + createEditModePointInventorNodes(); + + createEditModeCurveInventorNodes(); +} + +void EditModeGeometryCoinManager::createGeometryRootNodes() { // stuff for the points ++++++++++++++++++++++++++++++++++++++ editModeScenegraphNodes.PointsGroup = new SmSwitchboard; editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.PointsGroup); - auto concat = [](std::string string, int i) { - return string+std::to_string(i); - }; + // stuff for the Curves +++++++++++++++++++++++++++++++++++++++ + editModeScenegraphNodes.CurvesGroup = new SmSwitchboard; + editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.CurvesGroup); +} + +void EditModeGeometryCoinManager::emptyGeometryRootNodes() +{ + Gui::coinRemoveAllChildren(editModeScenegraphNodes.PointsGroup); + Gui::coinRemoveAllChildren(editModeScenegraphNodes.CurvesGroup); +} + +void EditModeGeometryCoinManager::createEditModePointInventorNodes() +{ for(int i=0; i < geometryLayerParameters.CoinLayers; i++) { SoSeparator * sep = new SoSeparator; sep->ref(); @@ -454,11 +490,10 @@ void EditModeGeometryCoinManager::createEditModeInventorNodes() editModeScenegraphNodes.PointsGroup->addChild(sep); sep->unref(); } +} - // stuff for the Curves +++++++++++++++++++++++++++++++++++++++ - editModeScenegraphNodes.CurvesGroup = new SmSwitchboard; - editModeScenegraphNodes.EditRoot->addChild(editModeScenegraphNodes.CurvesGroup); - +void EditModeGeometryCoinManager::createEditModeCurveInventorNodes() +{ for(int i=0; i < geometryLayerParameters.CoinLayers; i++) { SoSeparator * sep = new SoSeparator; sep->ref(); @@ -499,5 +534,4 @@ void EditModeGeometryCoinManager::createEditModeInventorNodes() editModeScenegraphNodes.CurvesGroup->addChild(sep); sep->unref(); } - } diff --git a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.h b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.h index fe62ef2b26..e6bf1203ae 100644 --- a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.h +++ b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.h @@ -94,10 +94,17 @@ public: void updateGeometryColor(const GeoListFacade & geolistfacade, bool issketchinvalid); + void updateGeometryLayersConfiguration(); + /** @name coin nodes creation*/ void createEditModeInventorNodes(); //@} +private: + void createGeometryRootNodes(); + void emptyGeometryRootNodes(); + void createEditModePointInventorNodes(); + void createEditModeCurveInventorNodes(); private: ViewProviderSketch & viewProvider;