Sketcher: EditModeCoinManager - support to update layer configuration

=====================================================================

- Refactor scenograph creation to enable local update
- Support to perform a local update
This commit is contained in:
Abdullah Tahiri
2023-02-28 08:25:13 +01:00
committed by abdullahtahiriyo
parent c75a7b524b
commit 2f34f01c10
4 changed files with 87 additions and 38 deletions

View File

@@ -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()

View File

@@ -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();
//@}

View File

@@ -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();
}
}

View File

@@ -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;