Skip to content

Commit a9ee800

Browse files
committed
Fix segfault on close
1 parent 851b40b commit a9ee800

2 files changed

Lines changed: 29 additions & 30 deletions

File tree

DVRTransferFunction/src/TransferFunctionPlugin.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ using namespace mv::util;
4141

4242
TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) :
4343
ViewPlugin(factory),
44-
_dropWidget(nullptr),
4544
_transferFunctionWidget(new TransferFunctionWidget()),
45+
_dropWidget(new DropWidget(_transferFunctionWidget)),
4646
_numPoints(0),
47-
_settingsAction(this, "Settings"),
48-
_materialSettings(this, "Material Settings"),
49-
_primaryToolbarAction(this, "Primary Toolbar")
47+
_settingsAction(new SettingsAction(this, "Settings")),
48+
_materialSettings(new MaterialSettings(this, "Material Settings")),
49+
_primaryToolbarAction(new HorizontalToolbarAction(this, "Primary Toolbar"))
5050
{
5151
setObjectName("TransferFunction");
5252

@@ -59,21 +59,19 @@ TransferFunctionPlugin::TransferFunctionPlugin(const PluginFactory* factory) :
5959
shortcuts.add({ QKeySequence(Qt::CTRL), "Selection", "Remove from selection" });
6060

6161
shortcuts.add({ QKeySequence(Qt::Key_S), "Render", "Scatter mode (default)" });
62-
63-
_dropWidget = new DropWidget(_transferFunctionWidget);
6462

6563
getWidget().setFocusPolicy(Qt::ClickFocus);
6664

67-
_primaryToolbarAction.addAction(&_settingsAction.getDatasetsAction());
65+
_primaryToolbarAction->addAction(&_settingsAction->getDatasetsAction());
6866

69-
_primaryToolbarAction.addAction(&_settingsAction.getSelectionAction());
70-
_primaryToolbarAction.addAction(&_settingsAction.getPointsAction());
67+
_primaryToolbarAction->addAction(&_settingsAction->getSelectionAction());
68+
_primaryToolbarAction->addAction(&_settingsAction->getPointsAction());
7169

7270
connect(_transferFunctionWidget, &TransferFunctionWidget::customContextMenuRequested, this, [this](const QPoint& point) {
7371
if (!_positionDataset.isValid())
7472
return;
7573

76-
auto contextMenu = _settingsAction.getContextMenu();
74+
auto contextMenu = _settingsAction->getContextMenu();
7775

7876
contextMenu->addSeparator();
7977

@@ -172,7 +170,7 @@ void TransferFunctionPlugin::init()
172170

173171
layout->setContentsMargins(0, 0, 0, 0);
174172
layout->setSpacing(0);
175-
layout->addWidget(_primaryToolbarAction.createWidget(&getWidget()));
173+
layout->addWidget(_primaryToolbarAction->createWidget(&getWidget()));
176174
layout->addWidget(_transferFunctionWidget, 100);
177175

178176
auto& navigationAction = _transferFunctionWidget->getPointRendererNavigator().getNavigationAction();
@@ -181,12 +179,12 @@ void TransferFunctionPlugin::init()
181179
layout->addWidget(navigationWidget);
182180
layout->setAlignment(navigationWidget, Qt::AlignCenter);
183181

184-
navigationAction.setParent(&_settingsAction);
182+
navigationAction.setParent(_settingsAction.get());
185183
}
186184

187185
getWidget().setLayout(layout);
188186

189-
addDockingAction(&_materialSettings);
187+
addDockingAction(_materialSettings.get());
190188

191189
// Set minimum size for the dock widget
192190
getWidget().setMinimumSize(512, 512);
@@ -198,12 +196,12 @@ void TransferFunctionPlugin::init()
198196
connect(&_positionDataset, &Dataset<Points>::dataChanged, this, &TransferFunctionPlugin::updateVolumeData);
199197
connect(&_positionDataset, &Dataset<Points>::dataSelectionChanged, this, &TransferFunctionPlugin::updateSelection);
200198

201-
connect(&_settingsAction.getPointsAction().getSizeAction(), &DecimalAction::valueChanged, [this](float size) {
199+
connect(&_settingsAction->getPointsAction().getSizeAction(), &DecimalAction::valueChanged, [this](float size) {
202200
_transferFunctionWidget->setPointSize(size);
203201
_transferFunctionWidget->update();
204202
});
205203

206-
connect(&_settingsAction.getPointsAction().getOpacityAction(), &DecimalAction::valueChanged, [this](float opacity) {
204+
connect(&_settingsAction->getPointsAction().getOpacityAction(), &DecimalAction::valueChanged, [this](float opacity) {
207205
_transferFunctionWidget->setPointOpacity(opacity);
208206
_transferFunctionWidget->update();
209207
});
@@ -266,8 +264,8 @@ void TransferFunctionPlugin::updateVolumeData()
266264
if (_positionDataset.isValid()) {
267265

268266
// ensure point size and opacity is updated
269-
_transferFunctionWidget->setPointOpacity(_settingsAction.getPointsAction().getOpacity());
270-
_transferFunctionWidget->setPointSize(_settingsAction.getPointsAction().getSize());
267+
_transferFunctionWidget->setPointOpacity(_settingsAction->getPointsAction().getOpacity());
268+
_transferFunctionWidget->setPointSize(_settingsAction->getPointsAction().getSize());
271269

272270
// Determine number of points depending on if it's a full dataset or a subset
273271
_numPoints = _positionDataset->getNumPoints();
@@ -359,16 +357,16 @@ void TransferFunctionPlugin::fromVariantMap(const QVariantMap& variantMap)
359357

360358
variantMapMustContain(variantMap, "Settings");
361359

362-
_primaryToolbarAction.fromParentVariantMap(variantMap);
363-
_settingsAction.fromParentVariantMap(variantMap);
360+
_primaryToolbarAction->fromParentVariantMap(variantMap);
361+
_settingsAction->fromParentVariantMap(variantMap);
364362
}
365363

366364
QVariantMap TransferFunctionPlugin::toVariantMap() const
367365
{
368366
QVariantMap variantMap = ViewPlugin::toVariantMap();
369367

370-
_primaryToolbarAction.insertIntoVariantMap(variantMap);
371-
_settingsAction.insertIntoVariantMap(variantMap);
368+
_primaryToolbarAction->insertIntoVariantMap(variantMap);
369+
_settingsAction->insertIntoVariantMap(variantMap);
372370

373371
return variantMap;
374372
}

DVRTransferFunction/src/TransferFunctionPlugin.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "SettingsAction.h"
99
#include "MaterialSettings.h"
1010

11+
#include <QPointer>
1112
#include <QTimer>
1213

1314
using namespace mv::plugin;
@@ -62,7 +63,7 @@ class TransferFunctionPlugin : public ViewPlugin
6263
/** Get reference to the scatter plot widget */
6364
TransferFunctionWidget& getTransferFunctionWidget();
6465

65-
SettingsAction& getSettingsAction() { return _settingsAction; }
66+
SettingsAction& getSettingsAction() { return *(_settingsAction).get(); }
6667

6768
private:
6869
void updateVolumeData();
@@ -83,16 +84,16 @@ class TransferFunctionPlugin : public ViewPlugin
8384
QVariantMap toVariantMap() const override;
8485

8586
private:
86-
mv::gui::DropWidget* _dropWidget; /** Widget for dropping datasets */
87-
TransferFunctionWidget* _transferFunctionWidget; /** THe visualization widget */
87+
QPointer<TransferFunctionWidget> _transferFunctionWidget; /** The visualization widget */
88+
mv::gui::DropWidget* _dropWidget; /** Widget for dropping datasets */
8889

89-
Dataset<Points> _positionDataset; /** Smart pointer to points dataset for point position */
90-
std::vector<mv::Vector2f> _positions; /** Point positions */
91-
unsigned int _numPoints; /** Number of point positions */
90+
Dataset<Points> _positionDataset; /** Smart pointer to points dataset for point position */
91+
std::vector<mv::Vector2f> _positions; /** Point positions */
92+
unsigned int _numPoints; /** Number of point positions */
9293

93-
SettingsAction _settingsAction; /** Group action for all settings */
94-
MaterialSettings _materialSettings; /** Material settings action */
95-
HorizontalToolbarAction _primaryToolbarAction; /** Horizontal toolbar for primary content */
94+
QPointer<SettingsAction> _settingsAction; /** Group action for all settings */
95+
QPointer<MaterialSettings> _materialSettings; /** Material settings action */
96+
QPointer<HorizontalToolbarAction> _primaryToolbarAction; /** Horizontal toolbar for primary content */
9697

9798
static const std::int32_t LAZY_UPDATE_INTERVAL = 2;
9899

0 commit comments

Comments
 (0)