Skip to content

Commit 05df957

Browse files
authored
Fix opacity updates (#237)
* Cache current dataset and handle dataChanged Add a _currentDataset member to ScalarAction and wire up its dataChanged signal when a new source is selected. Previously connections could accumulate; the code now disconnects any existing dataset signal before connecting the new one and forwards updates via a lambda that calls sourceDataChanged(getCurrentDataset()). Also update several parameter names in comments for clarity (variantMap, sourceSelectionIndex, offset). * Embed source dataset picker in ScalarAction Centralize dataset picking for scalar-driven properties by adding a DatasetPickerAction to ScalarAction and removing the separate point-size/opacity pickers from DatasetsAction. DatasetsAction no longer owns point size/opacity picker members; it instead reuses the ScalarAction pickers from the point plot settings and adjusts reset/connect logic accordingly (old filter code was commented out). ScalarAction now manages current dataset selection, connects dataset changes to emit sourceDataChanged and GUI name updates, and includes serialization for the new picker. ScatterplotPlugin was updated to listen to ScalarAction signals (sourceSelectionChanged/sourceDataChanged) for HUD updates and to refresh the scatter plot widget when scalar source data changes. Headers and getters were updated to reflect the new picker location. * Use LabelProxyAction for Size/Opacity pickers Replace direct DatasetPickerAction additions for point size and opacity with LabelProxyAction wrappers (labels "Size" and "Opacity") and include actions/LabelProxyAction.h instead of QMenu. Remove the now-unused setupPointSizeDatasetPickerAction and setupPointOpacityDatasetPickerAction declarations and implementations, and clean up related filter/invalidation code. This simplifies the dataset picker UI wiring and removes dead/commented code in DatasetsAction.cpp/.h.
1 parent 227f92f commit 05df957

File tree

5 files changed

+75
-147
lines changed

5 files changed

+75
-147
lines changed

src/DatasetsAction.cpp

Lines changed: 18 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include <ClusterData/ClusterData.h>
66
#include <ColorData/ColorData.h>
77

8-
#include <QMenu>
8+
#include <actions/LabelProxyAction.h>
99

1010
using namespace mv;
1111
using namespace mv::gui;
@@ -14,48 +14,47 @@ DatasetsAction::DatasetsAction(QObject* parent, const QString& title) :
1414
GroupAction(parent, title),
1515
_scatterplotPlugin(dynamic_cast<ScatterplotPlugin*>(parent->parent())),
1616
_positionDatasetPickerAction(this, "Position"),
17-
_colorDatasetPickerAction(this, "Color"),
18-
_pointSizeDatasetPickerAction(this, "Point size"),
19-
_pointOpacityDatasetPickerAction(this, "Point opacity")
17+
_colorDatasetPickerAction(this, "Color")
2018
{
2119
setIconByName("database");
2220
setToolTip("Manage loaded datasets for position and color");
2321
setConfigurationFlag(WidgetAction::ConfigurationFlag::ForceCollapsedInGroup);
2422
setLabelSizingType(LabelSizingType::Auto);
2523

26-
addAction(&_positionDatasetPickerAction);
27-
addAction(&_colorDatasetPickerAction);
28-
addAction(&_pointSizeDatasetPickerAction);
29-
addAction(&_pointOpacityDatasetPickerAction);
30-
31-
_positionDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
32-
_colorDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
33-
_pointSizeDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
34-
_pointOpacityDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
35-
3624
auto scatterplotPlugin = dynamic_cast<ScatterplotPlugin*>(parent->parent());
3725

3826
Q_ASSERT(scatterplotPlugin);
3927

4028
if (scatterplotPlugin == nullptr)
4129
return;
4230

31+
auto& settingsAction = scatterplotPlugin->getSettingsAction();
32+
auto& plotAction = settingsAction.getPlotAction();
33+
auto& pointPlotAction = plotAction.getPointPlotAction();
34+
35+
addAction(&_positionDatasetPickerAction);
36+
addAction(&_colorDatasetPickerAction);
37+
addAction(new LabelProxyAction(this, "Size", const_cast<DatasetPickerAction*>(&pointPlotAction.getSizeAction().getSourceDatasetPickerAction())));
38+
addAction(new LabelProxyAction(this, "Opacity", const_cast<DatasetPickerAction*>(&pointPlotAction.getOpacityAction().getSourceDatasetPickerAction())));
39+
40+
_positionDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
41+
_colorDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
42+
4343
setupDatasetPickerActions(scatterplotPlugin);
4444

4545
const auto invalidateFilters = [this, scatterplotPlugin]() -> void {
4646
_colorDatasetPickerAction.invalidateFilter();
47-
_pointSizeDatasetPickerAction.invalidateFilter();
48-
_pointOpacityDatasetPickerAction.invalidateFilter();
4947
};
5048

5149
connect(&_positionDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this, scatterplotPlugin, invalidateFilters](Dataset<DatasetImpl> pickedDataset) -> void {
5250
invalidateFilters();
5351
});
5452

55-
const auto resetAuxilliaryDatasets = [this]() -> void {
53+
const auto resetAuxilliaryDatasets = [this, &pointPlotAction]() -> void {
5654
_colorDatasetPickerAction.setCurrentIndex(-1);
57-
_pointSizeDatasetPickerAction.setCurrentIndex(-1);
58-
_pointOpacityDatasetPickerAction.setCurrentIndex(-1);
55+
56+
pointPlotAction.getSizeAction().setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant);
57+
pointPlotAction.getOpacityAction().setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant);
5958
};
6059

6160
connect(&scatterplotPlugin->getPositionDataset(), &Dataset<Points>::changed, this, resetAuxilliaryDatasets);
@@ -74,8 +73,6 @@ void DatasetsAction::connectToPublicAction(WidgetAction* publicAction, bool recu
7473
if (recursive) {
7574
actions().connectPrivateActionToPublicAction(&_positionDatasetPickerAction, &publicDatasetsAction->getPositionDatasetPickerAction(), recursive);
7675
actions().connectPrivateActionToPublicAction(&_colorDatasetPickerAction, &publicDatasetsAction->getColorDatasetPickerAction(), recursive);
77-
actions().connectPrivateActionToPublicAction(&_pointSizeDatasetPickerAction, &publicDatasetsAction->getPointSizeDatasetPickerAction(), recursive);
78-
actions().connectPrivateActionToPublicAction(&_pointOpacityDatasetPickerAction, &publicDatasetsAction->getPointOpacityDatasetPickerAction(), recursive);
7976
}
8077

8178
GroupAction::connectToPublicAction(publicAction, recursive);
@@ -89,8 +86,6 @@ void DatasetsAction::disconnectFromPublicAction(bool recursive)
8986
if (recursive) {
9087
actions().disconnectPrivateActionFromPublicAction(&_positionDatasetPickerAction, recursive);
9188
actions().disconnectPrivateActionFromPublicAction(&_colorDatasetPickerAction, recursive);
92-
actions().disconnectPrivateActionFromPublicAction(&_pointSizeDatasetPickerAction, recursive);
93-
actions().disconnectPrivateActionFromPublicAction(&_pointOpacityDatasetPickerAction, recursive);
9489
}
9590

9691
GroupAction::disconnectFromPublicAction(recursive);
@@ -118,8 +113,6 @@ void DatasetsAction::setupDatasetPickerActions(ScatterplotPlugin* scatterplotPlu
118113
{
119114
setupPositionDatasetPickerAction(scatterplotPlugin);
120115
setupColorDatasetPickerAction(scatterplotPlugin);
121-
setupPointSizeDatasetPickerAction(scatterplotPlugin);
122-
setupPointOpacityDatasetPickerAction(scatterplotPlugin);
123116
}
124117

125118
void DatasetsAction::setupPositionDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin)
@@ -174,90 +167,8 @@ void DatasetsAction::setupColorDatasetPickerAction(ScatterplotPlugin* scatterplo
174167
});
175168
}
176169

177-
void DatasetsAction::setupPointSizeDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin)
178-
{
179-
auto& settingsAction = scatterplotPlugin->getSettingsAction();
180-
auto& pointPlotAction = settingsAction.getPlotAction().getPointPlotAction();
181-
auto& pointSizeAction = pointPlotAction.getSizeAction();
182-
183-
_pointSizeDatasetPickerAction.setFilterFunction([this, scatterplotPlugin](mv::Dataset<DatasetImpl> dataset) -> bool {
184-
if (!scatterplotPlugin->getPositionDataset().isValid())
185-
return false;
186-
187-
if (dataset->getDataType() != PointType)
188-
return false;
189-
190-
return true;
191-
});
192-
193-
connect(&_pointSizeDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this, [this, &pointPlotAction, &pointSizeAction, scatterplotPlugin](const int32_t& currentIndex) -> void {
194-
const auto& pointSizeDataset = _pointSizeDatasetPickerAction.getCurrentDataset();
195-
196-
if (pointSizeDataset.isValid())
197-
disconnect(&_pointSizeDataset, &Dataset<>::guiNameChanged, this, nullptr);
198-
199-
_pointSizeDataset = pointSizeDataset;
200-
201-
connect(&_pointSizeDataset, &Dataset<>::guiNameChanged, scatterplotPlugin, &ScatterplotPlugin::updateHeadsUpDisplay);
202-
203-
pointPlotAction.setCurrentPointSizeDataset(_pointSizeDataset);
204-
205-
if (!_pointSizeDataset.isValid())
206-
pointSizeAction.setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant);
207-
});
208-
209-
connect(&pointSizeAction, &ScalarAction::sourceSelectionChanged, this, [this, &pointSizeAction](const uint32_t& sourceSelectionIndex) -> void {
210-
_pointSizeDatasetPickerAction.setCurrentDataset(pointSizeAction.isSourceDataset() ? pointSizeAction.getCurrentDataset() : nullptr);
211-
212-
if (!pointSizeAction.isSourceDataset())
213-
_pointSizeDatasetPickerAction.setCurrentIndex(-1);
214-
});
215-
}
216-
217-
void DatasetsAction::setupPointOpacityDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin)
218-
{
219-
auto& settingsAction = scatterplotPlugin->getSettingsAction();
220-
auto& pointPlotAction = settingsAction.getPlotAction().getPointPlotAction();
221-
auto& pointOpacityAction = pointPlotAction.getOpacityAction();
222-
223-
_pointOpacityDatasetPickerAction.setFilterFunction([this, scatterplotPlugin](mv::Dataset<DatasetImpl> dataset) -> bool {
224-
if (!scatterplotPlugin->getPositionDataset().isValid())
225-
return false;
226-
227-
if (dataset->getDataType() != PointType)
228-
return false;
229-
230-
return true;
231-
});
232-
233-
connect(&_pointOpacityDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this, [this, &pointPlotAction, &pointOpacityAction, scatterplotPlugin](const int32_t& currentIndex) -> void {
234-
const auto& pointOpacityDataset = _pointOpacityDatasetPickerAction.getCurrentDataset();
235-
236-
if (pointOpacityDataset.isValid())
237-
disconnect(&_pointOpacityDataset, &Dataset<>::guiNameChanged, this, nullptr);
238-
239-
_pointOpacityDataset = pointOpacityDataset;
240-
241-
connect(&_pointOpacityDataset, &Dataset<>::guiNameChanged, scatterplotPlugin, &ScatterplotPlugin::updateHeadsUpDisplay);
242-
243-
pointPlotAction.setCurrentPointOpacityDataset(_pointOpacityDataset);
244-
245-
if (!_pointOpacityDataset.isValid())
246-
pointOpacityAction.setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant);
247-
});
248-
249-
connect(&pointOpacityAction, &ScalarAction::sourceSelectionChanged, this, [this, &pointOpacityAction](const uint32_t& sourceSelectionIndex) -> void {
250-
_pointOpacityDatasetPickerAction.setCurrentDataset(pointOpacityAction.isSourceDataset() ? pointOpacityAction.getCurrentDataset() : nullptr);
251-
252-
if (!pointOpacityAction.isSourceDataset())
253-
_pointOpacityDatasetPickerAction.setCurrentIndex(-1);
254-
});
255-
}
256-
257170
void DatasetsAction::invalidateDatasetPickerActionFilters()
258171
{
259172
_positionDatasetPickerAction.invalidateFilter();
260173
_colorDatasetPickerAction.invalidateFilter();
261-
_pointSizeDatasetPickerAction.invalidateFilter();
262-
_pointOpacityDatasetPickerAction.invalidateFilter();
263174
}

src/DatasetsAction.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ class DatasetsAction : public GroupAction
2121
Q_INVOKABLE DatasetsAction(QObject* parent, const QString& title);
2222

2323
mv::Dataset<mv::DatasetImpl> getColorDataset() { return _colorDataset; }
24-
mv::Dataset<mv::DatasetImpl> getPointSizeDataset() { return _pointSizeDataset; }
25-
mv::Dataset<mv::DatasetImpl> getPointOpacityDataset() { return _pointOpacityDataset; }
2624

2725
protected: // Linking
2826

@@ -73,37 +71,19 @@ class DatasetsAction : public GroupAction
7371
*/
7472
void setupColorDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin);
7573

76-
/**
77-
* Set up the point size dataset picker action with the point size datasets from the scatter plot plugin
78-
* @param scatterplotPlugin Pointer to scatter plot plugin whose point size datasets are used to populate the dataset picker action
79-
*/
80-
void setupPointSizeDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin);
81-
82-
/**
83-
* Set up the point opacity dataset picker action with the point opacity datasets from the scatter plot plugin
84-
* @param scatterplotPlugin Pointer to scatter plot plugin whose point opacity datasets are used to populate the dataset picker action
85-
*/
86-
void setupPointOpacityDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin);
87-
8874
/** Update the filters of the dataset picker actions based on the current datasets in the scatter plot plugin */
8975
void invalidateDatasetPickerActionFilters();
9076

9177
public: // Action getters
9278

9379
DatasetPickerAction& getPositionDatasetPickerAction() { return _positionDatasetPickerAction; }
9480
DatasetPickerAction& getColorDatasetPickerAction() { return _colorDatasetPickerAction; }
95-
DatasetPickerAction& getPointSizeDatasetPickerAction() { return _pointSizeDatasetPickerAction; }
96-
DatasetPickerAction& getPointOpacityDatasetPickerAction() { return _pointOpacityDatasetPickerAction; }
9781

9882
private:
9983
ScatterplotPlugin* _scatterplotPlugin; /** Pointer to scatter plot plugin */
10084
DatasetPickerAction _positionDatasetPickerAction; /** Dataset picker action for position dataset */
10185
DatasetPickerAction _colorDatasetPickerAction; /** Dataset picker action for color dataset */
102-
DatasetPickerAction _pointSizeDatasetPickerAction; /** Dataset picker action for point size */
103-
DatasetPickerAction _pointOpacityDatasetPickerAction; /** Dataset picker action for point opacity */
10486
mv::Dataset<mv::DatasetImpl> _colorDataset; /** Smart pointer to dataset used for coloring (if any) */
105-
mv::Dataset<mv::DatasetImpl> _pointSizeDataset; /** Smart pointer to dataset for driving point size (if any) */
106-
mv::Dataset<mv::DatasetImpl> _pointOpacityDataset; /** Smart pointer to dataset for driving point opacity (if any) */
10787

10888
friend class mv::AbstractActionsManager;
10989
friend class ScatterplotPlugin;

src/ScalarAction.cpp

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,23 @@ using namespace mv::gui;
99
ScalarAction::ScalarAction(QObject* parent, const QString& title, const float& minimum /*= 0.0f*/, const float& maximum /*= 100.0f*/, const float& value /*= 0.0f*/) :
1010
GroupAction(parent, title),
1111
_magnitudeAction(this, title, minimum, maximum, value),
12-
_sourceAction(this, QString("%1 source").arg(title))
12+
_sourceAction(this, QString("%1 source").arg(title)),
13+
_sourceDatasetPickerAction(this, "Source dataset")
1314
{
1415
setDefaultWidgetFlags(GroupAction::Horizontal);
1516
setShowLabels(false);
1617

1718
addAction(&_magnitudeAction);
1819
addAction(&_sourceAction);
1920

21+
_sourceDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable);
22+
2023
connect(&_sourceAction.getPickerAction(), &OptionAction::currentIndexChanged, this, [this](const std::uint32_t& currentIndex) {
2124
bool emitSourceSelectionChanged = true;
2225

2326
if (currentIndex >= ScalarSourceModel::DefaultRow::DatasetStart) {
27+
_sourceDatasetPickerAction.setCurrentDataset(_sourceAction.getModel().getDataset(currentIndex));
28+
2429
if (auto scatterplotPlugin = dynamic_cast<ScatterplotPlugin*>(findPluginAncestor())) {
2530
auto positionDataset = scatterplotPlugin->getPositionDataset();
2631
auto scalarSourcePointsDataset = Dataset<Points>(getCurrentDataset());
@@ -33,12 +38,39 @@ ScalarAction::ScalarAction(QObject* parent, const QString& title, const float& m
3338
scatterplotPlugin->addNotification(QString("The number of points in the scalar source dataset does not match the number of points in the position dataset. (numPositions=%1, numScalars:%2)").arg(QString::number(numPositions), QString::number(numScalars)));
3439
}
3540
}
41+
} else {
42+
_sourceDatasetPickerAction.setCurrentIndex(-1);
3643
}
3744

3845
if (emitSourceSelectionChanged)
3946
emit sourceSelectionChanged(currentIndex);
4047
});
4148

49+
connect(&_sourceDatasetPickerAction, &DatasetPickerAction::datasetPicked, this, [this](const Dataset<>& dataset) {
50+
if (_currentDataset.isValid()) {
51+
disconnect(&_currentDataset, &Dataset<>::dataChanged, this, nullptr);
52+
disconnect(&_currentDataset, &Dataset<>::guiNameChanged, this, nullptr);
53+
}
54+
55+
_currentDataset = dataset;
56+
57+
const auto datasetRowIndex = _sourceAction.getModel().getRowIndex(_currentDataset);
58+
59+
_sourceAction.getPickerAction().setCurrentIndex(_currentDataset.isValid() ? datasetRowIndex : ScalarSourceModel::DefaultRow::Constant);
60+
61+
if (!_currentDataset.isValid())
62+
return;
63+
64+
connect(&_currentDataset, &Dataset<>::dataChanged, this, [this]() -> void {
65+
emit sourceDataChanged(getCurrentDataset());
66+
});
67+
68+
connect(&_currentDataset, &Dataset<>::guiNameChanged, this, [this]() -> void {
69+
if (auto scatterplotPlugin = dynamic_cast<ScatterplotPlugin*>(findPluginAncestor()))
70+
scatterplotPlugin->updateHeadsUpDisplay();
71+
});
72+
});
73+
4274
connect(&_magnitudeAction, &DecimalAction::valueChanged, this, [this](const float& value) {
4375
emit magnitudeChanged(value);
4476
});
@@ -88,22 +120,12 @@ void ScalarAction::removeAllDatasets()
88120

89121
Dataset<DatasetImpl> ScalarAction::getCurrentDataset()
90122
{
91-
auto& scalarSourceModel = _sourceAction.getModel();
92-
93-
const auto currentSourceIndex = _sourceAction.getPickerAction().getCurrentIndex();
94-
95-
if (currentSourceIndex < ScalarSourceModel::DefaultRow::DatasetStart)
96-
return {};
97-
98-
return scalarSourceModel.getDataset(currentSourceIndex);
123+
return _sourceDatasetPickerAction.getCurrentDataset();
99124
}
100125

101126
void ScalarAction::setCurrentDataset(const Dataset<DatasetImpl>& dataset)
102127
{
103-
const auto datasetRowIndex = _sourceAction.getModel().getRowIndex(dataset);
104-
105-
if (datasetRowIndex >= 0)
106-
_sourceAction.getPickerAction().setCurrentIndex(datasetRowIndex);
128+
_sourceDatasetPickerAction.setCurrentDataset(dataset);
107129
}
108130

109131
void ScalarAction::setCurrentSourceIndex(std::int32_t sourceIndex)
@@ -162,6 +184,7 @@ void ScalarAction::fromVariantMap(const QVariantMap& variantMap)
162184

163185
_magnitudeAction.fromParentVariantMap(variantMap);
164186
_sourceAction.fromParentVariantMap(variantMap);
187+
_sourceDatasetPickerAction.fromParentVariantMap(variantMap);
165188
}
166189

167190
QVariantMap ScalarAction::toVariantMap() const
@@ -170,6 +193,7 @@ QVariantMap ScalarAction::toVariantMap() const
170193

171194
_magnitudeAction.insertIntoVariantMap(variantMap);
172195
_sourceAction.insertIntoVariantMap(variantMap);
196+
_sourceDatasetPickerAction.insertIntoVariantMap(variantMap);
173197

174198
return variantMap;
175-
}
199+
}

src/ScalarAction.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <actions/GroupAction.h>
4+
#include <actions/DatasetPickerAction.h>
45

56
#include "ScalarSourceAction.h"
67

@@ -81,7 +82,7 @@ class ScalarAction : public GroupAction
8182

8283
/**
8384
* Load widget action from variant map
84-
* @param Variant map representation of the widget action
85+
* @param variantMap Variant map representation of the widget action
8586
*/
8687
void fromVariantMap(const QVariantMap& variantMap) override;
8788

@@ -96,11 +97,13 @@ class ScalarAction : public GroupAction
9697
DecimalAction& getMagnitudeAction() { return _magnitudeAction; }
9798
ScalarSourceAction& getSourceAction() { return _sourceAction; }
9899

100+
const DatasetPickerAction& getSourceDatasetPickerAction() { return _sourceDatasetPickerAction; }
101+
99102
signals:
100103

101104
/**
102105
* Signals that the source selection changed
103-
* @param sourceIndex Index of the selected source (0 is constant, 1 is selection, above is a dataset)
106+
* @param sourceSelectionIndex Index of the selected source (0 is constant, 1 is selection, above is a dataset)
104107
*/
105108
void sourceSelectionChanged(const std::uint32_t& sourceSelectionIndex);
106109

@@ -125,13 +128,15 @@ class ScalarAction : public GroupAction
125128

126129
/**
127130
* Signals that the scalar offset changed
128-
* @param magnitude Scalar magnitude
131+
* @param offset Scalar offset
129132
*/
130133
void offsetChanged(const float& offset);
131134

132135
private:
133-
DecimalAction _magnitudeAction; /** Scalar magnitude action */
134-
ScalarSourceAction _sourceAction; /** Scalar source action */
136+
DatasetPickerAction _sourceDatasetPickerAction; /** Dataset picker action for source dataset selection */
137+
DecimalAction _magnitudeAction; /** Scalar magnitude action */
138+
ScalarSourceAction _sourceAction; /** Scalar source action */
139+
Dataset<> _currentDataset; /** Cached current dataset (if any) */
135140

136141
friend class mv::AbstractActionsManager;
137142
};

0 commit comments

Comments
 (0)