Skip to content

Commit 2410be6

Browse files
authored
Merge pull request #226 from ManiVaultStudio/feature/fix_linux_crash_hud
Fix HUD issues on macOS and Linux
2 parents 69024fc + ae308cb commit 2410be6

File tree

4 files changed

+274
-62
lines changed

4 files changed

+274
-62
lines changed

src/DatasetsAction.cpp

Lines changed: 186 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5856
void 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+
}

src/DatasetsAction.h

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

23+
mv::Dataset<mv::DatasetImpl> getColorDataset() { return _colorDataset; }
24+
mv::Dataset<mv::DatasetImpl> getPointSizeDataset() { return _pointSizeDataset; }
25+
mv::Dataset<mv::DatasetImpl> getPointOpacityDataset() { return _pointOpacityDataset; }
26+
2327
protected: // Linking
2428

2529
/**
@@ -39,7 +43,7 @@ class DatasetsAction : public GroupAction
3943

4044
/**
4145
* Load widget action from variant map
42-
* @param Variant map representation of the widget action
46+
* @param variantMap Variant map representation of the widget action
4347
*/
4448
void fromVariantMap(const QVariantMap& variantMap) override;
4549

@@ -49,17 +53,60 @@ class DatasetsAction : public GroupAction
4953
*/
5054
QVariantMap toVariantMap() const override;
5155

56+
protected: // Dataset picker action setup
57+
58+
/**
59+
* Set up the dataset picker actions with the datasets from the scatter plot plugin
60+
* @param scatterplotPlugin Pointer to scatter plot plugin whose datasets are used to populate the dataset picker actions
61+
*/
62+
void setupDatasetPickerActions(ScatterplotPlugin* scatterplotPlugin);
63+
64+
/**
65+
* Set up the position dataset picker action with the position datasets from the scatter plot plugin
66+
* @param scatterplotPlugin Pointer to scatter plot plugin whose position datasets are used to populate the dataset picker action
67+
*/
68+
void setupPositionDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin);
69+
70+
/**
71+
* Set up the color dataset picker action with the color datasets from the scatter plot plugin
72+
* @param scatterplotPlugin Pointer to scatter plot plugin whose color datasets are used to populate the dataset picker action
73+
*/
74+
void setupColorDatasetPickerAction(ScatterplotPlugin* scatterplotPlugin);
75+
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+
88+
/** Update the filters of the dataset picker actions based on the current datasets in the scatter plot plugin */
89+
void invalidateDatasetPickerActionFilters();
90+
5291
public: // Action getters
5392

5493
DatasetPickerAction& getPositionDatasetPickerAction() { return _positionDatasetPickerAction; }
5594
DatasetPickerAction& getColorDatasetPickerAction() { return _colorDatasetPickerAction; }
95+
DatasetPickerAction& getPointSizeDatasetPickerAction() { return _pointSizeDatasetPickerAction; }
96+
DatasetPickerAction& getPointOpacityDatasetPickerAction() { return _pointOpacityDatasetPickerAction; }
5697

5798
private:
58-
ScatterplotPlugin* _scatterplotPlugin; /** Pointer to scatter plot plugin */
59-
DatasetPickerAction _positionDatasetPickerAction; /** Dataset picker action for position dataset */
60-
DatasetPickerAction _colorDatasetPickerAction; /** Dataset picker action for color dataset */
99+
ScatterplotPlugin* _scatterplotPlugin; /** Pointer to scatter plot plugin */
100+
DatasetPickerAction _positionDatasetPickerAction; /** Dataset picker action for position dataset */
101+
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 */
104+
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) */
61107

62108
friend class mv::AbstractActionsManager;
109+
friend class ScatterplotPlugin;
63110
};
64111

65112
Q_DECLARE_METATYPE(DatasetsAction)

0 commit comments

Comments
 (0)