diff --git a/src/DatasetsAction.cpp b/src/DatasetsAction.cpp index 3cc6381..e77793e 100644 --- a/src/DatasetsAction.cpp +++ b/src/DatasetsAction.cpp @@ -14,7 +14,9 @@ DatasetsAction::DatasetsAction(QObject* parent, const QString& title) : GroupAction(parent, title), _scatterplotPlugin(dynamic_cast(parent->parent())), _positionDatasetPickerAction(this, "Position"), - _colorDatasetPickerAction(this, "Color") + _colorDatasetPickerAction(this, "Color"), + _pointSizeDatasetPickerAction(this, "Point size"), + _pointOpacityDatasetPickerAction(this, "Point opacity") { setIconByName("database"); setToolTip("Manage loaded datasets for position and color"); @@ -23,15 +25,28 @@ DatasetsAction::DatasetsAction(QObject* parent, const QString& title) : addAction(&_positionDatasetPickerAction); addAction(&_colorDatasetPickerAction); + addAction(&_pointSizeDatasetPickerAction); + addAction(&_pointOpacityDatasetPickerAction); + + _colorDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable); + _pointSizeDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable); + _pointOpacityDatasetPickerAction.setDefaultWidgetFlag(OptionAction::Clearable); _positionDatasetPickerAction.setFilterFunction([this](mv::Dataset dataset) -> bool { return dataset->getDataType() == PointType; - }); + }); _colorDatasetPickerAction.setFilterFunction([this](mv::Dataset dataset) -> bool { return (dataset->getDataType() == PointType || dataset->getDataType() == ColorType || dataset->getDataType() == ClusterType); - }); + }); + + _pointSizeDatasetPickerAction.setFilterFunction([this](mv::Dataset dataset) -> bool { + return dataset->getDataType() == PointType; + }); + _pointOpacityDatasetPickerAction.setFilterFunction([this](mv::Dataset dataset) -> bool { + return dataset->getDataType() == PointType; + }); auto scatterplotPlugin = dynamic_cast(parent->parent()); @@ -45,14 +60,55 @@ DatasetsAction::DatasetsAction(QObject* parent, const QString& title) : connect(&scatterplotPlugin->getPositionDataset(), &Dataset::changed, this, [this](DatasetImpl* dataset) -> void { _positionDatasetPickerAction.setCurrentDataset(dataset); }); - - connect(&_colorDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this, scatterplotPlugin](Dataset pickedDataset) -> void { - scatterplotPlugin->getSettingsAction().getColoringAction().setCurrentColorDataset(pickedDataset); + + auto& coloringAction = scatterplotPlugin->getSettingsAction().getColoringAction(); + + connect(&_colorDatasetPickerAction, &DatasetPickerAction::datasetPicked, [this, &coloringAction](Dataset pickedDataset) -> void { + coloringAction.getColorByAction().setCurrentIndex(pickedDataset.isValid() ? 2 : 0); + coloringAction.setCurrentColorDataset(pickedDataset); }); connect(&scatterplotPlugin->getSettingsAction().getColoringAction(), &ColoringAction::currentColorDatasetChanged, this, [this](Dataset currentColorDataset) -> void { _colorDatasetPickerAction.setCurrentDataset(currentColorDataset); }); + + auto& pointPlotAction = scatterplotPlugin->getSettingsAction().getPlotAction().getPointPlotAction(); + auto& pointSizeAction = pointPlotAction.getSizeAction(); + auto& pointOpacityAction = pointPlotAction.getOpacityAction(); + + const auto pointSizeSourceChanged = [this, &pointSizeAction]() -> void { + _pointSizeDatasetPickerAction.setCurrentDataset(pointSizeAction.isSourceDataset() ? pointSizeAction.getCurrentDataset() : nullptr); + + if (!pointSizeAction.isSourceDataset()) + _pointSizeDatasetPickerAction.setCurrentIndex(-1); + }; + + connect(&pointSizeAction, &ScalarAction::sourceSelectionChanged, this, pointSizeSourceChanged); + connect(&pointSizeAction, &ScalarAction::sourceDataChanged, this, pointSizeSourceChanged); + + connect(&_pointSizeDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this, [this, &pointSizeAction](const int32_t& currentIndex) -> void { + pointSizeAction.setCurrentDataset(_pointSizeDatasetPickerAction.getCurrentDataset()); + + if (currentIndex < 0) + pointSizeAction.setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant); + }); + + const auto pointOpacitySourceChanged = [this, &pointOpacityAction]() -> void { + _pointOpacityDatasetPickerAction.setCurrentDataset(pointOpacityAction.isSourceDataset() ? pointOpacityAction.getCurrentDataset() : nullptr); + + if (!pointOpacityAction.isSourceDataset()) + _pointOpacityDatasetPickerAction.setCurrentIndex(-1); + }; + + connect(&pointOpacityAction, &ScalarAction::sourceSelectionChanged, this, pointOpacitySourceChanged); + connect(&pointOpacityAction, &ScalarAction::sourceDataChanged, this, pointOpacitySourceChanged); + + connect(&_pointOpacityDatasetPickerAction, &DatasetPickerAction::currentIndexChanged, this, [this, &pointOpacityAction](const int32_t& currentIndex) -> void { + pointOpacityAction.setCurrentDataset(_pointOpacityDatasetPickerAction.getCurrentDataset()); + + if (currentIndex < 0) + pointOpacityAction.setCurrentSourceIndex(ScalarSourceModel::DefaultRow::Constant); + }); } void DatasetsAction::connectToPublicAction(WidgetAction* publicAction, bool recursive) @@ -67,6 +123,8 @@ void DatasetsAction::connectToPublicAction(WidgetAction* publicAction, bool recu if (recursive) { actions().connectPrivateActionToPublicAction(&_positionDatasetPickerAction, &publicDatasetsAction->getPositionDatasetPickerAction(), recursive); actions().connectPrivateActionToPublicAction(&_colorDatasetPickerAction, &publicDatasetsAction->getColorDatasetPickerAction(), recursive); + actions().connectPrivateActionToPublicAction(&_pointSizeDatasetPickerAction, &publicDatasetsAction->getPointSizeDatasetPickerAction(), recursive); + actions().connectPrivateActionToPublicAction(&_pointOpacityDatasetPickerAction, &publicDatasetsAction->getPointOpacityDatasetPickerAction(), recursive); } GroupAction::connectToPublicAction(publicAction, recursive); @@ -80,6 +138,8 @@ void DatasetsAction::disconnectFromPublicAction(bool recursive) if (recursive) { actions().disconnectPrivateActionFromPublicAction(&_positionDatasetPickerAction, recursive); actions().disconnectPrivateActionFromPublicAction(&_colorDatasetPickerAction, recursive); + actions().disconnectPrivateActionFromPublicAction(&_pointSizeDatasetPickerAction, recursive); + actions().disconnectPrivateActionFromPublicAction(&_pointOpacityDatasetPickerAction, recursive); } GroupAction::disconnectFromPublicAction(recursive); diff --git a/src/DatasetsAction.h b/src/DatasetsAction.h index 1730a06..db10a3e 100644 --- a/src/DatasetsAction.h +++ b/src/DatasetsAction.h @@ -53,11 +53,15 @@ class DatasetsAction : public GroupAction DatasetPickerAction& getPositionDatasetPickerAction() { return _positionDatasetPickerAction; } DatasetPickerAction& getColorDatasetPickerAction() { return _colorDatasetPickerAction; } + DatasetPickerAction& getPointSizeDatasetPickerAction() { return _pointSizeDatasetPickerAction; } + DatasetPickerAction& getPointOpacityDatasetPickerAction() { return _pointOpacityDatasetPickerAction; } private: ScatterplotPlugin* _scatterplotPlugin; /** Pointer to scatter plot plugin */ DatasetPickerAction _positionDatasetPickerAction; /** Dataset picker action for position dataset */ DatasetPickerAction _colorDatasetPickerAction; /** Dataset picker action for color dataset */ + DatasetPickerAction _pointSizeDatasetPickerAction; /** Dataset picker action for point size */ + DatasetPickerAction _pointOpacityDatasetPickerAction; /** Dataset picker action for point opacity */ friend class mv::AbstractActionsManager; }; diff --git a/src/ScatterplotPlugin.cpp b/src/ScatterplotPlugin.cpp index 94d4826..9adb621 100644 --- a/src/ScatterplotPlugin.cpp +++ b/src/ScatterplotPlugin.cpp @@ -288,6 +288,8 @@ ScatterplotPlugin::ScatterplotPlugin(const PluginFactory* factory) : getLearningCenterAction().addVideos(QStringList({ "Practitioner", "Developer" })); setOverlayActionsTargetWidget(_scatterPlotWidget); + + connect(&mv::projects(), &AbstractProjectManager::projectOpened, this, &ScatterplotPlugin::updateHeadsUpDisplay); } ScatterplotPlugin::~ScatterplotPlugin() @@ -342,9 +344,6 @@ void ScatterplotPlugin::init() connect(&_positionDataset, &Dataset<>::guiNameChanged, this, &ScatterplotPlugin::updateHeadsUpDisplay); const auto currentColorDatasetChanged = [this](Dataset currentColorDataset) -> void { - if (_colorDataset == currentColorDataset) - return; - if (_colorDataset.isValid()) disconnect(&_colorDataset, &Dataset<>::guiNameChanged, this, nullptr); @@ -360,8 +359,35 @@ void ScatterplotPlugin::init() currentColorDatasetChanged(_settingsAction.getColoringAction().getCurrentColorDataset()); }); - connect(&_settingsAction.getPlotAction().getPointPlotAction().getSizeAction(), &ScalarAction::sourceDataChanged, this, &ScatterplotPlugin::updateHeadsUpDisplay); - connect(&_settingsAction.getPlotAction().getPointPlotAction().getOpacityAction(), &ScalarAction::sourceDataChanged, this, &ScatterplotPlugin::updateHeadsUpDisplay); + const auto currentPointSizeDatasetChanged = [this]() -> void { + auto currentPointSizeDataset = _settingsAction.getPlotAction().getPointPlotAction().getSizeAction().getCurrentDataset(); + + if (_pointSizeDataset.isValid()) + disconnect(&_pointSizeDataset, &Dataset<>::guiNameChanged, this, nullptr); + + _pointSizeDataset = currentPointSizeDataset; + + connect(&_pointSizeDataset, &Dataset<>::guiNameChanged, this, &ScatterplotPlugin::updateHeadsUpDisplay); + + updateHeadsUpDisplay(); + }; + + connect(&_settingsAction.getPlotAction().getPointPlotAction().getSizeAction(), &ScalarAction::sourceSelectionChanged, this, currentPointSizeDatasetChanged); + + const auto currentPointOpacityDatasetChanged = [this]() -> void { + auto currentPointOpacityDataset = _settingsAction.getPlotAction().getPointPlotAction().getOpacityAction().getCurrentDataset(); + + if (_pointOpacityDataset.isValid()) + disconnect(&_pointOpacityDataset, &Dataset<>::guiNameChanged, this, nullptr); + + _pointOpacityDataset = currentPointOpacityDataset; + + connect(&_pointOpacityDataset, &Dataset<>::guiNameChanged, this, &ScatterplotPlugin::updateHeadsUpDisplay); + + updateHeadsUpDisplay(); + }; + + connect(&_settingsAction.getPlotAction().getPointPlotAction().getOpacityAction(), &ScalarAction::sourceSelectionChanged, this, currentPointOpacityDatasetChanged); connect(&_settingsAction.getMiscellaneousAction().getBackgroundColorAction(), &ColorAction::colorChanged, this, &ScatterplotPlugin::updateHeadsUpDisplayTextColor); @@ -1016,6 +1042,9 @@ void ScatterplotPlugin::updateSelection() void ScatterplotPlugin::updateHeadsUpDisplay() { + if (mv::projects().isOpeningProject()) + return; + getHeadsUpDisplayAction().removeAllHeadsUpDisplayItems(); if (_positionDataset.isValid()) { @@ -1033,7 +1062,6 @@ void ScatterplotPlugin::updateHeadsUpDisplay() addMetaDataToHeadsUpDisplay("Size", _settingsAction.getPlotAction().getPointPlotAction().getSizeAction().getCurrentDataset(), datasetsItem); addMetaDataToHeadsUpDisplay("Opacity", _settingsAction.getPlotAction().getPointPlotAction().getOpacityAction().getCurrentDataset(), datasetsItem); - } else { getHeadsUpDisplayAction().addHeadsUpDisplayItem("No datasets loaded", "", ""); } @@ -1065,12 +1093,7 @@ void ScatterplotPlugin::fromVariantMap(const QVariantMap& variantMap) _primaryToolbarAction.fromParentVariantMap(variantMap); _settingsAction.fromParentVariantMap(variantMap); - updateHeadsUpDisplay(); - if (pointRenderer.getNavigator().getNavigationAction().getSerializationCountFrom() == 0) { - qDebug() << "Resetting view"; - - _scatterPlotWidget->update(); } diff --git a/src/ScatterplotPlugin.h b/src/ScatterplotPlugin.h index 4155039..301364d 100644 --- a/src/ScatterplotPlugin.h +++ b/src/ScatterplotPlugin.h @@ -116,7 +116,9 @@ class ScatterplotPlugin : public ViewPlugin ScatterplotWidget* _scatterPlotWidget; /** The visualization widget */ Dataset _positionDataset; /** Smart pointer to points dataset for point position */ Dataset _positionSourceDataset; /** Smart pointer to source of the points dataset for point position (if any) */ - Dataset _colorDataset; /** Smart pointer to dataset used for coloring (if any) */ + Dataset _colorDataset; /** Smart pointer to dataset used for coloring (if any) */ + Dataset _pointSizeDataset; /** Smart pointer to dataset for driving point size (if any) */ + Dataset _pointOpacityDataset; /** Smart pointer to dataset for driving point opacity (if any) */ std::vector _positions; /** Point positions */ unsigned int _numPoints; /** Number of point positions */ SettingsAction _settingsAction; /** Group action for all settings */