diff --git a/gui/include/Actions/SelectionZoneAction.h b/gui/include/Actions/SelectionZoneAction.h index feca3ab..dffc079 100644 --- a/gui/include/Actions/SelectionZoneAction.h +++ b/gui/include/Actions/SelectionZoneAction.h @@ -27,6 +27,9 @@ public: using ExecuteFunction = std::function &item)>; + using EnableFunction + = std::function &item)>; + /** * @param name the name of the action, displayed to the user * @param fun the function that will be called when the action is executed @@ -34,6 +37,9 @@ public: */ explicit SelectionZoneAction(const QString &name, ExecuteFunction fun); + /// Sets the function which determine if the action should be enabled or disabled + void setEnableFunction(EnableFunction fun); + /// The name of the action QString name() const noexcept; @@ -41,6 +47,9 @@ public slots: /// Executes the action void execute(const QVector &item); + /// Returns true if the action is enabled + bool isEnabled(const QVector &item); + private: class SelectionZoneActionPrivate; spimpl::unique_impl_ptr impl; diff --git a/gui/src/Actions/SelectionZoneAction.cpp b/gui/src/Actions/SelectionZoneAction.cpp index e872010..26cf825 100644 --- a/gui/src/Actions/SelectionZoneAction.cpp +++ b/gui/src/Actions/SelectionZoneAction.cpp @@ -12,6 +12,7 @@ struct SelectionZoneAction::SelectionZoneActionPrivate { QString m_Name; SelectionZoneAction::ExecuteFunction m_Fun; + SelectionZoneAction::EnableFunction m_EnableFun = [](auto zones) { return true; }; }; SelectionZoneAction::SelectionZoneAction(const QString &name, ExecuteFunction fun) @@ -19,6 +20,11 @@ SelectionZoneAction::SelectionZoneAction(const QString &name, ExecuteFunction fu { } +void SelectionZoneAction::setEnableFunction(EnableFunction fun) +{ + impl->m_EnableFun = std::move(fun); +} + QString SelectionZoneAction::name() const noexcept { return impl->m_Name; @@ -28,3 +34,8 @@ void SelectionZoneAction::execute(const QVectorm_Fun(item); } + +bool SelectionZoneAction::isEnabled(const QVector &item) +{ + return impl->m_EnableFun(item); +} diff --git a/gui/src/Visualization/VisualizationActionManager.cpp b/gui/src/Visualization/VisualizationActionManager.cpp index fbdbed1..4ee6694 100644 --- a/gui/src/Visualization/VisualizationActionManager.cpp +++ b/gui/src/Visualization/VisualizationActionManager.cpp @@ -10,6 +10,7 @@ VisualizationActionManager::VisualizationActionManager() {} void VisualizationActionManager::installSelectionZoneActions() { auto &actionController = sqpApp->actionsGuiController(); + actionController.addSectionZoneAction("Remove Selected Zone(s)", [](auto &zones) { for (auto selectionZone : zones) { if (auto graph = selectionZone->parentGraphWidget()) { @@ -17,6 +18,13 @@ void VisualizationActionManager::installSelectionZoneActions() } } }); - actionController.addSectionZoneAction("Align Left", [](auto &zones) {}); - actionController.addSectionZoneAction("Align Right", [](auto &zones) {}); + + auto alignEnableFuntion = [](auto &items) { return items.count() > 0; }; + + auto alignLeftAction = actionController.addSectionZoneAction("Align Left Vertically", [](auto &zones) {}); + alignLeftAction->setEnableFunction(alignEnableFuntion); + + auto alignRightAction + = actionController.addSectionZoneAction("Align Right vertically", [](auto &zones) {}); + alignRightAction->setEnableFunction(alignEnableFuntion); } diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index 43ff586..b3f8fa1 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -621,6 +621,7 @@ void VisualizationGraphWidget::onGraphMenuRequested(const QPoint &pos) noexcept for (auto zoneAction : zoneActions) { auto action = graphMenu.addAction(zoneAction->name()); + action->setEnabled(zoneAction->isEnabled(selectedItems)); QObject::connect(action, &QAction::triggered, [zoneAction, &selectedItems]() { zoneAction->execute(selectedItems); });