From e5aabf0f62fb95bfae50d45599a1d5442821bf11 2017-09-14 07:14:23 From: Alexandre Leroux Date: 2017-09-14 07:14:23 Subject: [PATCH] Handles desynchronisation when removing variable from a graph (1) - Prevents the zone widget that a variable will be removed from graph, to call desynchronisation in the Variable controller --- diff --git a/core/include/Variable/VariableController.h b/core/include/Variable/VariableController.h index 3350511..1fd9c9c 100644 --- a/core/include/Variable/VariableController.h +++ b/core/include/Variable/VariableController.h @@ -111,11 +111,15 @@ public slots: /// Cancel the current request for the variable void onAbortProgressRequested(std::shared_ptr variable); - /// synchronization group methods + // synchronization group methods void onAddSynchronizationGroupId(QUuid synchronizationGroupId); void onRemoveSynchronizationGroupId(QUuid synchronizationGroupId); void onAddSynchronized(std::shared_ptr variable, QUuid synchronizationGroupId); + /// Desynchronizes the variable of the group whose identifier is passed in parameter + /// @remarks the method does nothing if the variable is not part of the group + void desynchronize(std::shared_ptr variable, QUuid synchronizationGroupId); + void initialize(); void finalize(); diff --git a/core/src/Variable/VariableController.cpp b/core/src/Variable/VariableController.cpp index 50b88cc..3aa437b 100644 --- a/core/src/Variable/VariableController.cpp +++ b/core/src/Variable/VariableController.cpp @@ -389,6 +389,36 @@ void VariableController::onAddSynchronized(std::shared_ptr variable, } } +void VariableController::desynchronize(std::shared_ptr variable, + QUuid synchronizationGroupId) +{ + // Gets variable id + auto variableIt = impl->m_VariableToIdentifierMap.find(variable); + if (variableIt == impl->m_VariableToIdentifierMap.cend()) { + qCCritical(LOG_VariableController()) + << tr("Can't desynchronize variable %1: variable identifier not found") + .arg(variable->name()); + return; + } + + // Gets synchronization group + auto groupIt = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId); + if (groupIt == impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) { + qCCritical(LOG_VariableController()) + << tr("Can't desynchronize variable %1: unknown synchronization group") + .arg(variable->name()); + return; + } + + auto variableId = variableIt->second; + + // Removes variable from synchronization group + auto synchronizationGroup = groupIt->second; + synchronizationGroup->removeVariableId(variableId); + + // Removes link between variable and synchronization group + impl->m_VariableIdGroupIdMap.erase(variableId); +} void VariableController::onRequestDataLoading(QVector > variables, const SqpRange &range, const SqpRange &oldRange, diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index 3d2892f..ad413f1 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -56,6 +56,9 @@ signals: void requestDataLoading(QVector > variable, const SqpRange &range, const SqpRange &oldRange, bool synchronise); + /// Signal emitted when the variable is about to be removed from the graph + void variableAboutToBeRemoved(std::shared_ptr var); + /// Signal emitted when the variable has been added to the graph void variableAdded(std::shared_ptr var); protected: diff --git a/gui/include/Visualization/VisualizationZoneWidget.h b/gui/include/Visualization/VisualizationZoneWidget.h index 6518706..00389af 100644 --- a/gui/include/Visualization/VisualizationZoneWidget.h +++ b/gui/include/Visualization/VisualizationZoneWidget.h @@ -50,6 +50,8 @@ private: private slots: void onVariableAdded(std::shared_ptr variable); + /// Slot called when a variable is about to be removed from a graph contained in the zone + void onVariableAboutToBeRemoved(std::shared_ptr variable); }; #endif // SCIQLOP_VISUALIZATIONZONEWIDGET_H diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index b7ae3c0..c277fda 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -138,6 +138,8 @@ void VisualizationGraphWidget::removeVariable(std::shared_ptr variable // - is no longer referenced in the map auto variableIt = impl->m_VariableToPlotMultiMap.find(variable); if (variableIt != impl->m_VariableToPlotMultiMap.cend()) { + emit variableAboutToBeRemoved(variable); + auto &plottablesMap = variableIt->second; for (auto plottableIt = plottablesMap.cbegin(), plottableEnd = plottablesMap.cend(); diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index cb254e2..88c96f4 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -177,6 +177,8 @@ VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptr variable Qt::QueuedConnection, Q_ARG(std::shared_ptr, variable), Q_ARG(QUuid, impl->m_SynchronisationGroupId)); } + +void VisualizationZoneWidget::onVariableAboutToBeRemoved(std::shared_ptr variable) +{ + QMetaObject::invokeMethod(&sqpApp->variableController(), "desynchronize", Qt::QueuedConnection, + Q_ARG(std::shared_ptr, variable), + Q_ARG(QUuid, impl->m_SynchronisationGroupId)); +}