@@ -14,7 +14,9 @@ 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" )
17+ _colorDatasetPickerAction(this , " Color" ),
18+ _pointSizeDatasetPickerAction(this , " Point size" ),
19+ _pointOpacityDatasetPickerAction(this , " Point opacity" )
1820{
1921 setIconByName (" database" );
2022 setToolTip (" Manage loaded datasets for position and color" );
@@ -23,36 +25,32 @@ DatasetsAction::DatasetsAction(QObject* parent, const QString& title) :
2325
2426 addAction (&_positionDatasetPickerAction);
2527 addAction (&_colorDatasetPickerAction);
28+ addAction (&_pointSizeDatasetPickerAction);
29+ addAction (&_pointOpacityDatasetPickerAction);
2630
27- _positionDatasetPickerAction.setFilterFunction ([this ](mv::Dataset<DatasetImpl> dataset) -> bool {
28- return dataset->getDataType () == PointType;
29- });
30-
31- _colorDatasetPickerAction.setFilterFunction ([this ](mv::Dataset<DatasetImpl> dataset) -> bool {
32- return (dataset->getDataType () == PointType || dataset->getDataType () == ColorType || dataset->getDataType () == ClusterType);
33- });
34-
31+ _positionDatasetPickerAction.setDefaultWidgetFlag (OptionAction::Clearable);
32+ _colorDatasetPickerAction.setDefaultWidgetFlag (OptionAction::Clearable);
33+ _pointSizeDatasetPickerAction.setDefaultWidgetFlag (OptionAction::Clearable);
34+ _pointOpacityDatasetPickerAction.setDefaultWidgetFlag (OptionAction::Clearable);
3535
3636 auto scatterplotPlugin = dynamic_cast <ScatterplotPlugin*>(parent->parent ());
3737
38+ Q_ASSERT (scatterplotPlugin);
39+
3840 if (scatterplotPlugin == nullptr )
3941 return ;
4042
43+ setupDatasetPickerActions (scatterplotPlugin);
44+
4145 connect (&_positionDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this , scatterplotPlugin](Dataset<DatasetImpl> pickedDataset) -> void {
42- scatterplotPlugin->getPositionDataset () = pickedDataset;
46+ _colorDatasetPickerAction.invalidateFilter ();
47+ _pointSizeDatasetPickerAction.invalidateFilter ();
48+ _pointOpacityDatasetPickerAction.invalidateFilter ();
4349 });
4450
45- connect (&scatterplotPlugin->getPositionDataset (), &Dataset<Points>::changed, this , [this ](DatasetImpl* dataset) -> void {
46- _positionDatasetPickerAction.setCurrentDataset (dataset);
47- });
48-
49- connect (&_colorDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this , scatterplotPlugin](Dataset<DatasetImpl> pickedDataset) -> void {
50- scatterplotPlugin->getSettingsAction ().getColoringAction ().setCurrentColorDataset (pickedDataset);
51- });
52-
53- connect (&scatterplotPlugin->getSettingsAction ().getColoringAction (), &ColoringAction::currentColorDatasetChanged, this , [this ](Dataset<DatasetImpl> currentColorDataset) -> void {
54- _colorDatasetPickerAction.setCurrentDataset (currentColorDataset);
55- });
51+ _colorDatasetPickerAction.invalidateFilter ();
52+ _pointSizeDatasetPickerAction.invalidateFilter ();
53+ _pointOpacityDatasetPickerAction.invalidateFilter ();
5654}
5755
5856void DatasetsAction::connectToPublicAction (WidgetAction* publicAction, bool recursive)
@@ -67,6 +65,8 @@ void DatasetsAction::connectToPublicAction(WidgetAction* publicAction, bool recu
6765 if (recursive) {
6866 actions ().connectPrivateActionToPublicAction (&_positionDatasetPickerAction, &publicDatasetsAction->getPositionDatasetPickerAction (), recursive);
6967 actions ().connectPrivateActionToPublicAction (&_colorDatasetPickerAction, &publicDatasetsAction->getColorDatasetPickerAction (), recursive);
68+ actions ().connectPrivateActionToPublicAction (&_pointSizeDatasetPickerAction, &publicDatasetsAction->getPointSizeDatasetPickerAction (), recursive);
69+ actions ().connectPrivateActionToPublicAction (&_pointOpacityDatasetPickerAction, &publicDatasetsAction->getPointOpacityDatasetPickerAction (), recursive);
7070 }
7171
7272 GroupAction::connectToPublicAction (publicAction, recursive);
@@ -80,6 +80,8 @@ void DatasetsAction::disconnectFromPublicAction(bool recursive)
8080 if (recursive) {
8181 actions ().disconnectPrivateActionFromPublicAction (&_positionDatasetPickerAction, recursive);
8282 actions ().disconnectPrivateActionFromPublicAction (&_colorDatasetPickerAction, recursive);
83+ actions ().disconnectPrivateActionFromPublicAction (&_pointSizeDatasetPickerAction, recursive);
84+ actions ().disconnectPrivateActionFromPublicAction (&_pointOpacityDatasetPickerAction, recursive);
8385 }
8486
8587 GroupAction::disconnectFromPublicAction (recursive);
@@ -101,4 +103,166 @@ QVariantMap DatasetsAction::toVariantMap() const
101103 _colorDatasetPickerAction.insertIntoVariantMap (variantMap);
102104
103105 return variantMap;
104- }
106+ }
107+
108+ void DatasetsAction::setupDatasetPickerActions (ScatterplotPlugin* scatterplotPlugin)
109+ {
110+ setupPositionDatasetPickerAction (scatterplotPlugin);
111+ setupColorDatasetPickerAction (scatterplotPlugin);
112+ setupPointSizeDatasetPickerAction (scatterplotPlugin);
113+ setupPointOpacityDatasetPickerAction (scatterplotPlugin);
114+ }
115+
116+ void DatasetsAction::setupPositionDatasetPickerAction (ScatterplotPlugin* scatterplotPlugin)
117+ {
118+ _positionDatasetPickerAction.setFilterFunction ([this ](mv::Dataset<DatasetImpl> dataset) -> bool {
119+ return dataset->getDataType () == PointType;
120+ });
121+
122+ connect (&_positionDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this , scatterplotPlugin](Dataset<DatasetImpl> pickedDataset) -> void {
123+ scatterplotPlugin->getPositionDataset () = pickedDataset;
124+ });
125+
126+ connect (&scatterplotPlugin->getPositionDataset (), &Dataset<Points>::changed, this , [this ](DatasetImpl* dataset) -> void {
127+ _positionDatasetPickerAction.setCurrentDataset (dataset);
128+ });
129+ }
130+
131+ void DatasetsAction::setupColorDatasetPickerAction (ScatterplotPlugin* scatterplotPlugin)
132+ {
133+ auto & settingsAction = scatterplotPlugin->getSettingsAction ();
134+
135+ _colorDatasetPickerAction.setFilterFunction ([this , scatterplotPlugin](mv::Dataset<DatasetImpl> dataset) -> bool {
136+ if (!(dataset->getDataType () == PointType || dataset->getDataType () == ColorType || dataset->getDataType () == ClusterType))
137+ return false ;
138+
139+ const auto positionDataset = scatterplotPlugin->getPositionDataset ();
140+
141+ if (!positionDataset.isValid ())
142+ return false ;
143+
144+ return true ;
145+ });
146+
147+ auto & coloringAction = settingsAction.getColoringAction ();
148+
149+ connect (&_colorDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this , &coloringAction, scatterplotPlugin](Dataset<DatasetImpl> pickedDataset) -> void {
150+ if (_colorDataset.isValid ())
151+ disconnect (&_colorDataset, &Dataset<>::guiNameChanged, this , nullptr );
152+
153+ _colorDataset = pickedDataset;
154+
155+ connect (&_colorDataset, &Dataset<>::guiNameChanged, scatterplotPlugin, &ScatterplotPlugin::updateHeadsUpDisplay);
156+
157+ coloringAction.setCurrentColorDataset (pickedDataset);
158+
159+ if (!pickedDataset.isValid ())
160+ coloringAction.getColorByAction ().setCurrentIndex (0 );
161+ });
162+
163+ connect (&settingsAction.getColoringAction (), &ColoringAction::currentColorDatasetChanged, this , [this ](Dataset<DatasetImpl> currentColorDataset) -> void {
164+ _colorDatasetPickerAction.setCurrentDataset (currentColorDataset);
165+ });
166+ }
167+
168+ void DatasetsAction::setupPointSizeDatasetPickerAction (ScatterplotPlugin* scatterplotPlugin)
169+ {
170+ auto & settingsAction = scatterplotPlugin->getSettingsAction ();
171+ auto & pointPlotAction = settingsAction.getPlotAction ().getPointPlotAction ();
172+ auto & pointSizeAction = pointPlotAction.getSizeAction ();
173+
174+ _pointSizeDatasetPickerAction.setFilterFunction ([this , scatterplotPlugin](mv::Dataset<DatasetImpl> dataset) -> bool {
175+ if (dataset->getDataType () != PointType)
176+ return false ;
177+
178+ const auto positionDataset = scatterplotPlugin->getPositionDataset ();
179+
180+ if (!positionDataset.isValid ())
181+ return false ;
182+
183+ const mv::Dataset<Points> candidatePoints (dataset);
184+
185+ if (candidatePoints->getNumPoints () != positionDataset->getNumPoints ())
186+ return false ;
187+
188+ return true ;
189+ });
190+
191+ connect (&_pointSizeDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this , [this , &pointPlotAction, &pointSizeAction, scatterplotPlugin](const int32_t & currentIndex) -> void {
192+ const auto & pointSizeDataset = _pointSizeDatasetPickerAction.getCurrentDataset ();
193+
194+ if (pointSizeDataset.isValid ())
195+ disconnect (&_pointSizeDataset, &Dataset<>::guiNameChanged, this , nullptr );
196+
197+ _pointSizeDataset = pointSizeDataset;
198+
199+ connect (&_pointSizeDataset, &Dataset<>::guiNameChanged, scatterplotPlugin, &ScatterplotPlugin::updateHeadsUpDisplay);
200+
201+ pointPlotAction.setCurrentPointSizeDataset (_pointSizeDataset);
202+
203+ if (!_pointSizeDataset.isValid ())
204+ pointSizeAction.setCurrentSourceIndex (ScalarSourceModel::DefaultRow::Constant);
205+ });
206+
207+ connect (&pointSizeAction, &ScalarAction::sourceSelectionChanged, this , [this , &pointSizeAction](const uint32_t & sourceSelectionIndex) -> void {
208+ _pointSizeDatasetPickerAction.setCurrentDataset (pointSizeAction.isSourceDataset () ? pointSizeAction.getCurrentDataset () : nullptr );
209+
210+ if (!pointSizeAction.isSourceDataset ())
211+ _pointSizeDatasetPickerAction.setCurrentIndex (-1 );
212+ });
213+ }
214+
215+ void DatasetsAction::setupPointOpacityDatasetPickerAction (ScatterplotPlugin* scatterplotPlugin)
216+ {
217+ auto & settingsAction = scatterplotPlugin->getSettingsAction ();
218+ auto & pointPlotAction = settingsAction.getPlotAction ().getPointPlotAction ();
219+ auto & pointOpacityAction = pointPlotAction.getOpacityAction ();
220+
221+ _pointOpacityDatasetPickerAction.setFilterFunction ([this , scatterplotPlugin](mv::Dataset<DatasetImpl> dataset) -> bool {
222+ if (dataset->getDataType () != PointType)
223+ return false ;
224+
225+ const auto positionDataset = scatterplotPlugin->getPositionDataset ();
226+
227+ if (!positionDataset.isValid ())
228+ return false ;
229+
230+ const mv::Dataset<Points> candidatePoints (dataset);
231+
232+ if (candidatePoints->getNumPoints () != positionDataset->getNumPoints ())
233+ return false ;
234+
235+ return true ;
236+ });
237+
238+ connect (&_pointOpacityDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this , [this , &pointPlotAction, &pointOpacityAction, scatterplotPlugin](const int32_t & currentIndex) -> void {
239+ const auto & pointOpacityDataset = _pointOpacityDatasetPickerAction.getCurrentDataset ();
240+
241+ if (pointOpacityDataset.isValid ())
242+ disconnect (&_pointOpacityDataset, &Dataset<>::guiNameChanged, this , nullptr );
243+
244+ _pointOpacityDataset = pointOpacityDataset;
245+
246+ connect (&_pointOpacityDataset, &Dataset<>::guiNameChanged, scatterplotPlugin, &ScatterplotPlugin::updateHeadsUpDisplay);
247+
248+ pointPlotAction.setCurrentPointOpacityDataset (_pointOpacityDataset);
249+
250+ if (!_pointOpacityDataset.isValid ())
251+ pointOpacityAction.setCurrentSourceIndex (ScalarSourceModel::DefaultRow::Constant);
252+ });
253+
254+ connect (&pointOpacityAction, &ScalarAction::sourceSelectionChanged, this , [this , &pointOpacityAction](const uint32_t & sourceSelectionIndex) -> void {
255+ _pointOpacityDatasetPickerAction.setCurrentDataset (pointOpacityAction.isSourceDataset () ? pointOpacityAction.getCurrentDataset () : nullptr );
256+
257+ if (!pointOpacityAction.isSourceDataset ())
258+ _pointOpacityDatasetPickerAction.setCurrentIndex (-1 );
259+ });
260+ }
261+
262+ void DatasetsAction::invalidateDatasetPickerActionFilters ()
263+ {
264+ _positionDatasetPickerAction.invalidateFilter ();
265+ _colorDatasetPickerAction.invalidateFilter ();
266+ _pointSizeDatasetPickerAction.invalidateFilter ();
267+ _pointOpacityDatasetPickerAction.invalidateFilter ();
268+ }
0 commit comments