From a7853a088cb6c1137a5ffaa75cabcf2f05f017e4 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Sat, 18 Mar 2023 09:41:58 +0100 Subject: [PATCH] ElementWidget: remove unnecesary element pointer ================================================ This should fix this (I cannot reproduce it): https://forum.freecad.org/viewtopic.php?p=667579#p667579 Lately I added the geometry pointer to the item. This has indeed the potential for an already deleted pointer being accessed. This PR removes the geometry pointer from the item and relies on the ViewProvider to indirectly access an updated pointer. --- src/Mod/Sketcher/Gui/TaskSketcherElements.cpp | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index 1eb88e910c..dc8e52e1f4 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -117,7 +117,7 @@ class ElementItem : public QListWidgetItem }; ElementItem(int elementnr, int startingVertex, int midVertex, int endVertex, - Base::Type geometryType, GeometryState state, const QString & lab, const Part::Geometry * geo) : + Base::Type geometryType, GeometryState state, const QString & lab, ViewProviderSketch *sketchView) : ElementNbr(elementnr) , StartingVertex(startingVertex) , MidVertex(midVertex) @@ -132,7 +132,7 @@ class ElementItem : public QListWidgetItem , hovered(SubElementType::none) , rightClicked(false) , label(lab) - , geo(geo) + , sketchView(sketchView) { } @@ -141,9 +141,20 @@ class ElementItem : public QListWidgetItem } bool isVisible() { - auto layer = getSafeGeomLayerId(geo); - return layer != static_cast(Layer::Hidden); + if(State != GeometryState::External) { + const auto geo = sketchView->getSketchObject()->getGeometry(ElementNbr); + if(geo) { + auto layer = getSafeGeomLayerId(geo); + + return layer != static_cast(Layer::Hidden); + } + } + + // 1. external geometry currently is always visible. + // 2. if internal and ElementNbr is out of range, the element + // needs to be updated and the return value is not important. + return true; } int ElementNbr; @@ -166,7 +177,8 @@ class ElementItem : public QListWidgetItem QString label; - const Part::Geometry * geo; + private: + ViewProviderSketch *sketchView; }; class ElementFilterList : public QListWidget @@ -1369,8 +1381,8 @@ void TaskSketcherElements::slotElementsChanged(void) (isNamingBoxChecked ? (tr("Other") + IdInformation()) + (construction ? (QString::fromLatin1("-") + tr("Construction")) : (internalAligned ? (QString::fromLatin1("-") + tr("Internal")) : QString::fromLatin1(""))) : - (QString::fromLatin1("%1-").arg(i) + tr("Other"))) - , (*it) // geometry + (QString::fromLatin1("%1-").arg(i) + tr("Other"))), + sketchView ); ui->listWidgetElements->addItem(itemN); @@ -1461,8 +1473,8 @@ void TaskSketcherElements::slotElementsChanged(void) (QString::fromLatin1("%1-").arg(i - 2) + tr("BSpline"))) : (isNamingBoxChecked ? (tr("Other") + linkname) : - (QString::fromLatin1("%1-").arg(i - 2) + tr("Other"))) - , (*it) // geometry + (QString::fromLatin1("%1-").arg(i - 2) + tr("Other"))), + sketchView ); ui->listWidgetElements->addItem(itemN);