From a9ee800f88b67b0fbcaba54843ceac5cd903189f Mon Sep 17 00:00:00 2001 From: Alexander Vieth Date: Fri, 13 Mar 2026 14:03:48 +0100 Subject: [PATCH] Fix segfault on close --- .../src/TransferFunctionPlugin.cpp | 40 +++++++++---------- .../src/TransferFunctionPlugin.h | 19 ++++----- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/DVRTransferFunction/src/TransferFunctionPlugin.cpp b/DVRTransferFunction/src/TransferFunctionPlugin.cpp index 1701dd7..2bca6f9 100644 --- a/DVRTransferFunction/src/TransferFunctionPlugin.cpp +++ b/DVRTransferFunction/src/TransferFunctionPlugin.cpp @@ -41,12 +41,12 @@ using namespace mv::util; TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) : ViewPlugin(factory), - _dropWidget(nullptr), _transferFunctionWidget(new TransferFunctionWidget()), + _dropWidget(new DropWidget(_transferFunctionWidget)), _numPoints(0), - _settingsAction(this, "Settings"), - _materialSettings(this, "Material Settings"), - _primaryToolbarAction(this, "Primary Toolbar") + _settingsAction(new SettingsAction(this, "Settings")), + _materialSettings(new MaterialSettings(this, "Material Settings")), + _primaryToolbarAction(new HorizontalToolbarAction(this, "Primary Toolbar")) { setObjectName("TransferFunction"); @@ -59,21 +59,19 @@ TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) : shortcuts.add({ QKeySequence(Qt::CTRL), "Selection", "Remove from selection" }); shortcuts.add({ QKeySequence(Qt::Key_S), "Render", "Scatter mode (default)" }); - - _dropWidget = new DropWidget(_transferFunctionWidget); getWidget().setFocusPolicy(Qt::ClickFocus); - _primaryToolbarAction.addAction(&_settingsAction.getDatasetsAction()); + _primaryToolbarAction->addAction(&_settingsAction->getDatasetsAction()); - _primaryToolbarAction.addAction(&_settingsAction.getSelectionAction()); - _primaryToolbarAction.addAction(&_settingsAction.getPointsAction()); + _primaryToolbarAction->addAction(&_settingsAction->getSelectionAction()); + _primaryToolbarAction->addAction(&_settingsAction->getPointsAction()); connect(_transferFunctionWidget, &TransferFunctionWidget::customContextMenuRequested, this, [this](const QPoint& point) { if (!_positionDataset.isValid()) return; - auto contextMenu = _settingsAction.getContextMenu(); + auto contextMenu = _settingsAction->getContextMenu(); contextMenu->addSeparator(); @@ -172,7 +170,7 @@ void TransferFunctionPlugin::init() layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); - layout->addWidget(_primaryToolbarAction.createWidget(&getWidget())); + layout->addWidget(_primaryToolbarAction->createWidget(&getWidget())); layout->addWidget(_transferFunctionWidget, 100); auto& navigationAction = _transferFunctionWidget->getPointRendererNavigator().getNavigationAction(); @@ -181,12 +179,12 @@ void TransferFunctionPlugin::init() layout->addWidget(navigationWidget); layout->setAlignment(navigationWidget, Qt::AlignCenter); - navigationAction.setParent(&_settingsAction); + navigationAction.setParent(_settingsAction.get()); } getWidget().setLayout(layout); - addDockingAction(&_materialSettings); + addDockingAction(_materialSettings.get()); // Set minimum size for the dock widget getWidget().setMinimumSize(512, 512); @@ -198,12 +196,12 @@ void TransferFunctionPlugin::init() connect(&_positionDataset, &Dataset::dataChanged, this, &TransferFunctionPlugin::updateVolumeData); connect(&_positionDataset, &Dataset::dataSelectionChanged, this, &TransferFunctionPlugin::updateSelection); - connect(&_settingsAction.getPointsAction().getSizeAction(), &DecimalAction::valueChanged, [this](float size) { + connect(&_settingsAction->getPointsAction().getSizeAction(), &DecimalAction::valueChanged, [this](float size) { _transferFunctionWidget->setPointSize(size); _transferFunctionWidget->update(); }); - connect(&_settingsAction.getPointsAction().getOpacityAction(), &DecimalAction::valueChanged, [this](float opacity) { + connect(&_settingsAction->getPointsAction().getOpacityAction(), &DecimalAction::valueChanged, [this](float opacity) { _transferFunctionWidget->setPointOpacity(opacity); _transferFunctionWidget->update(); }); @@ -266,8 +264,8 @@ void TransferFunctionPlugin::updateVolumeData() if (_positionDataset.isValid()) { // ensure point size and opacity is updated - _transferFunctionWidget->setPointOpacity(_settingsAction.getPointsAction().getOpacity()); - _transferFunctionWidget->setPointSize(_settingsAction.getPointsAction().getSize()); + _transferFunctionWidget->setPointOpacity(_settingsAction->getPointsAction().getOpacity()); + _transferFunctionWidget->setPointSize(_settingsAction->getPointsAction().getSize()); // Determine number of points depending on if it's a full dataset or a subset _numPoints = _positionDataset->getNumPoints(); @@ -359,16 +357,16 @@ void TransferFunctionPlugin::fromVariantMap(const QVariantMap& variantMap) variantMapMustContain(variantMap, "Settings"); - _primaryToolbarAction.fromParentVariantMap(variantMap); - _settingsAction.fromParentVariantMap(variantMap); + _primaryToolbarAction->fromParentVariantMap(variantMap); + _settingsAction->fromParentVariantMap(variantMap); } QVariantMap TransferFunctionPlugin::toVariantMap() const { QVariantMap variantMap = ViewPlugin::toVariantMap(); - _primaryToolbarAction.insertIntoVariantMap(variantMap); - _settingsAction.insertIntoVariantMap(variantMap); + _primaryToolbarAction->insertIntoVariantMap(variantMap); + _settingsAction->insertIntoVariantMap(variantMap); return variantMap; } diff --git a/DVRTransferFunction/src/TransferFunctionPlugin.h b/DVRTransferFunction/src/TransferFunctionPlugin.h index b036ccb..dad326d 100644 --- a/DVRTransferFunction/src/TransferFunctionPlugin.h +++ b/DVRTransferFunction/src/TransferFunctionPlugin.h @@ -8,6 +8,7 @@ #include "SettingsAction.h" #include "MaterialSettings.h" +#include #include using namespace mv::plugin; @@ -62,7 +63,7 @@ class TransferFunctionPlugin : public ViewPlugin /** Get reference to the scatter plot widget */ TransferFunctionWidget& getTransferFunctionWidget(); - SettingsAction& getSettingsAction() { return _settingsAction; } + SettingsAction& getSettingsAction() { return *(_settingsAction).get(); } private: void updateVolumeData(); @@ -83,16 +84,16 @@ class TransferFunctionPlugin : public ViewPlugin QVariantMap toVariantMap() const override; private: - mv::gui::DropWidget* _dropWidget; /** Widget for dropping datasets */ - TransferFunctionWidget* _transferFunctionWidget; /** THe visualization widget */ + QPointer _transferFunctionWidget; /** The visualization widget */ + mv::gui::DropWidget* _dropWidget; /** Widget for dropping datasets */ - Dataset _positionDataset; /** Smart pointer to points dataset for point position */ - std::vector _positions; /** Point positions */ - unsigned int _numPoints; /** Number of point positions */ + Dataset _positionDataset; /** Smart pointer to points dataset for point position */ + std::vector _positions; /** Point positions */ + unsigned int _numPoints; /** Number of point positions */ - SettingsAction _settingsAction; /** Group action for all settings */ - MaterialSettings _materialSettings; /** Material settings action */ - HorizontalToolbarAction _primaryToolbarAction; /** Horizontal toolbar for primary content */ + QPointer _settingsAction; /** Group action for all settings */ + QPointer _materialSettings; /** Material settings action */ + QPointer _primaryToolbarAction; /** Horizontal toolbar for primary content */ static const std::int32_t LAZY_UPDATE_INTERVAL = 2;