diff --git a/gui/include/Visualization/operations/GenerateVariableMenuOperation.h b/gui/include/Visualization/operations/GenerateVariableMenuOperation.h index 6849015..53475ba 100644 --- a/gui/include/Visualization/operations/GenerateVariableMenuOperation.h +++ b/gui/include/Visualization/operations/GenerateVariableMenuOperation.h @@ -7,7 +7,10 @@ #include +#include + class QMenu; +class IVisualizationWidget; class Variable; Q_DECLARE_LOGGING_CATEGORY(LOG_GenerateVariableMenuOperation) @@ -23,8 +26,11 @@ public: * Ctor * @param menu the menu to which to attach the generated menu * @param variable the variable for which to generate the menu + * @param variableContainers the containers that already contain the variable for which to + * generate the menu */ - explicit GenerateVariableMenuOperation(QMenu *menu, std::shared_ptr variable); + explicit GenerateVariableMenuOperation(QMenu *menu, std::shared_ptr variable, + std::set variableContainers); void visitEnter(VisualizationWidget *widget) override final; void visitLeave(VisualizationWidget *widget) override final; diff --git a/gui/src/Visualization/VisualizationWidget.cpp b/gui/src/Visualization/VisualizationWidget.cpp index 7708ca1..061bdfe 100644 --- a/gui/src/Visualization/VisualizationWidget.cpp +++ b/gui/src/Visualization/VisualizationWidget.cpp @@ -3,6 +3,7 @@ #include "Visualization/VisualizationGraphWidget.h" #include "Visualization/VisualizationTabWidget.h" #include "Visualization/VisualizationZoneWidget.h" +#include "Visualization/operations/FindVariableOperation.h" #include "Visualization/operations/GenerateVariableMenuOperation.h" #include "Visualization/operations/RemoveVariableOperation.h" #include "Visualization/operations/RescaleAxeOperation.h" @@ -120,8 +121,14 @@ void VisualizationWidget::attachVariableMenu( // Menu is generated only if there is a single variable if (variables.size() == 1) { if (auto variable = variables.first()) { + // Gets the containers of the variable + FindVariableOperation findVariableOperation{variable}; + accept(&findVariableOperation); + auto variableContainers = findVariableOperation.result(); + // Generates the actions that make it possible to visualize the variable - auto generateVariableMenuOperation = GenerateVariableMenuOperation{menu, variable}; + GenerateVariableMenuOperation generateVariableMenuOperation{ + menu, variable, std::move(variableContainers)}; accept(&generateVariableMenuOperation); } else { diff --git a/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp b/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp index f9f4d37..e6bb455 100644 --- a/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp +++ b/gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp @@ -13,8 +13,13 @@ Q_LOGGING_CATEGORY(LOG_GenerateVariableMenuOperation, "GenerateVariableMenuOperation") struct GenerateVariableMenuOperation::GenerateVariableMenuOperationPrivate { - explicit GenerateVariableMenuOperationPrivate(QMenu *menu, std::shared_ptr variable) - : m_Variable{variable}, m_PlotMenuBuilder{menu}, m_UnplotMenuBuilder{menu} + explicit GenerateVariableMenuOperationPrivate( + QMenu *menu, std::shared_ptr variable, + std::set variableContainers) + : m_Variable{variable}, + m_PlotMenuBuilder{menu}, + m_UnplotMenuBuilder{menu}, + m_VariableContainers{std::move(variableContainers)} { } @@ -47,7 +52,7 @@ struct GenerateVariableMenuOperation::GenerateVariableMenuOperationPrivate { void visitNodeLeavePlot(const IVisualizationWidget &container, const QString &actionName, ActionFun actionFunction) { - if (m_Variable && container.canDrop(*m_Variable)) { + if (isValidContainer(container)) { m_PlotMenuBuilder.addSeparator(); m_PlotMenuBuilder.addAction(actionName, actionFunction); } @@ -66,28 +71,39 @@ struct GenerateVariableMenuOperation::GenerateVariableMenuOperationPrivate { void visitLeafPlot(const IVisualizationWidget &container, const QString &actionName, ActionFun actionFunction) { - if (m_Variable && container.canDrop(*m_Variable)) { + if (isValidContainer(container)) { m_PlotMenuBuilder.addAction(actionName, actionFunction); } } template - void visitLeafUnplot(const IVisualizationWidget &container, const QString &actionName, + void visitLeafUnplot(IVisualizationWidget *container, const QString &actionName, ActionFun actionFunction) { - if (m_Variable && container.contains(*m_Variable)) { + // If the container contains the variable, we generate 'unplot' action + if (m_VariableContainers.count(container) == 1) { m_UnplotMenuBuilder.addAction(actionName, actionFunction); } } + bool isValidContainer(const IVisualizationWidget &container) const noexcept + { + // A container is valid if it can contain the variable and if the variable is not already + // contained in another container + return m_Variable && m_VariableContainers.size() == 0 && container.canDrop(*m_Variable); + } + std::shared_ptr m_Variable; + std::set m_VariableContainers; MenuBuilder m_PlotMenuBuilder; ///< Builder for the 'Plot' menu MenuBuilder m_UnplotMenuBuilder; ///< Builder for the 'Unplot' menu }; -GenerateVariableMenuOperation::GenerateVariableMenuOperation(QMenu *menu, - std::shared_ptr variable) - : impl{spimpl::make_unique_impl(menu, variable)} +GenerateVariableMenuOperation::GenerateVariableMenuOperation( + QMenu *menu, std::shared_ptr variable, + std::set variableContainers) + : impl{spimpl::make_unique_impl( + menu, variable, std::move(variableContainers))} { } @@ -155,7 +171,6 @@ void GenerateVariableMenuOperation::visitEnter(VisualizationZoneWidget *zoneWidg void GenerateVariableMenuOperation::visitLeave(VisualizationZoneWidget *zoneWidget) { - qCCritical(LOG_GenerateVariableMenuOperation(), "Open in a new graph DETECTED !!"); if (zoneWidget) { // 'Plot' menu impl->visitNodeLeavePlot( @@ -187,7 +202,7 @@ void GenerateVariableMenuOperation::visit(VisualizationGraphWidget *graphWidget) }); // 'Unplot' menu - impl->visitLeafUnplot(*graphWidget, QObject::tr("Remove from %1").arg(graphWidget->name()), + impl->visitLeafUnplot(graphWidget, QObject::tr("Remove from %1").arg(graphWidget->name()), [ varW = std::weak_ptr{impl->m_Variable}, graphWidget ]() { if (auto var = varW.lock()) { graphWidget->removeVariable(var);