From a582bf0b199a6a697c1bbee76b54669547375a12 2017-10-25 09:10:43 From: Thibaud Rabillard Date: 2017-10-25 09:10:43 Subject: [PATCH] Manage drag&drop of empty graphs --- diff --git a/gui/include/Visualization/VisualizationTabWidget.h b/gui/include/Visualization/VisualizationTabWidget.h index e743b81..49a1769 100644 --- a/gui/include/Visualization/VisualizationTabWidget.h +++ b/gui/include/Visualization/VisualizationTabWidget.h @@ -47,6 +47,13 @@ public: */ VisualizationZoneWidget *createZone(const QList>& variables, int index); + /** + * Creates a zone which is empty (no variables). The zone is inserted at the specified index. + * @param index The index where the zone should be inserted in the layout + * @return the pointer to the created zone + */ + VisualizationZoneWidget *createEmptyZone(int index); + // IVisualizationWidget interface void accept(IVisualizationWidgetVisitor *visitor) override; bool canDrop(const Variable &variable) const override; diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 31df3ea..2f4176f 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -5,6 +5,8 @@ #include "Visualization/VisualizationZoneWidget.h" #include "Visualization/VisualizationGraphWidget.h" +#include "Variable/VariableController.h" + #include "SqpApplication.h" #include "DragDropHelper.h" @@ -90,8 +92,7 @@ VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr > &variables, int index) { - auto zoneWidget = new VisualizationZoneWidget{defaultZoneName(*ui->dragDropContainer->layout()), this}; - this->insertZone(index, zoneWidget); + auto zoneWidget = createEmptyZone(index); // Creates a new graph into the zone zoneWidget->createGraph(variables, index); @@ -99,6 +100,14 @@ VisualizationZoneWidget *VisualizationTabWidget::createZone(const QListdragDropContainer->layout()), this}; + this->insertZone(index, zoneWidget); + + return zoneWidget; +} + void VisualizationTabWidget::accept(IVisualizationWidgetVisitor *visitor) { if (visitor) { @@ -157,19 +166,39 @@ void VisualizationTabWidget::dropMimeData(int index, const QMimeData *mimeData) Q_ASSERT(parentDragDropContainer); auto nbGraph = parentDragDropContainer->countDragWidget(); - if (nbGraph == 1) + + const auto& variables = graphWidget->variables(); + + if (!variables.isEmpty()) { - //This is the only graph in the previous zone, close the zone - graphWidget->parentZoneWidget()->close(); + if (nbGraph == 1) + { + //This is the only graph in the previous zone, close the zone + graphWidget->parentZoneWidget()->close(); + } + else + { + //Close the graph + graphWidget->close(); + } + + createZone(variables, index); } else { - //Close the graph - graphWidget->close(); - } + //The graph is empty, create an empty zone and move the graph inside - const auto& variables = graphWidget->variables(); - createZone(variables, index); + auto parentZoneWidget = graphWidget->parentZoneWidget(); + + parentDragDropContainer->layout()->removeWidget(graphWidget); + + auto zoneWidget = createEmptyZone(index); + zoneWidget->addGraph(graphWidget); + + //Close the old zone if it was the only graph inside + if (nbGraph == 1) + parentZoneWidget->close(); + } } else if (mimeData->hasFormat(DragDropHelper::MIME_TYPE_ZONE)) { diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index f300c06..b1634a7 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -226,7 +226,7 @@ VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptrcount() > 0) { // Case of a new graph in a existant zone if (auto visualizationGraphWidget - = dynamic_cast(layout->itemAt(0)->widget())) { + = dynamic_cast(layout->itemAt(0)->widget())) { range = visualizationGraphWidget->graphRange(); } } @@ -243,7 +243,7 @@ VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptrdataSeries()) { dataSeries->lockRead(); auto valuesBounds - = dataSeries->valuesBounds(variable->range().m_TStart, variable->range().m_TEnd); + = dataSeries->valuesBounds(variable->range().m_TStart, variable->range().m_TEnd); auto end = dataSeries->cend(); if (valuesBounds.first != end && valuesBounds.second != end) { auto rangeValue = [](const auto &value) { return std::isnan(value) ? 0. : value; }; @@ -360,35 +360,47 @@ void VisualizationZoneWidget::dropMimeData(int index, const QMimeData *mimeData) const auto& variables = graphWidget->variables(); - if (!variables.empty()) + if (parentDragDropContainer != ui->dragDropContainer && !variables.isEmpty()) { - if (parentDragDropContainer != ui->dragDropContainer) - { - //The drop didn't occur in the same zone + //The drop didn't occur in the same zone - auto previousParentZoneWidget = graphWidget->parentZoneWidget(); - auto nbGraph = parentDragDropContainer->countDragWidget(); - if (nbGraph == 1) - { - //This is the only graph in the previous zone, close the zone - previousParentZoneWidget->close(); - } - else - { - //Close the graph - graphWidget->close(); - } - - //Creates the new graph in the zone - createGraph(variables, index); + auto previousParentZoneWidget = graphWidget->parentZoneWidget(); + auto nbGraph = parentDragDropContainer->countDragWidget(); + if (nbGraph == 1) + { + //This is the only graph in the previous zone, close the zone + previousParentZoneWidget->close(); } else { - //The drop occurred in the same zone - //Simple move of the graph, no variable operation associated - parentDragDropContainer->layout()->removeWidget(graphWidget); - ui->dragDropContainer->insertDragWidget(index, graphWidget); + //Close the graph + graphWidget->close(); } + + //Creates the new graph in the zone + createGraph(variables, index); + } + else + { + //The drop occurred in the same zone or the graph is empty + //Simple move of the graph, no variable operation associated + parentDragDropContainer->layout()->removeWidget(graphWidget); + + if (variables.isEmpty() && parentDragDropContainer != ui->dragDropContainer) + { + // The graph is empty and dropped in a different zone. + // Take the range of the first graph in the zone (if existing). + auto layout = ui->dragDropContainer->layout(); + if (layout->count() > 0) + { + if (auto visualizationGraphWidget = qobject_cast(layout->itemAt(0)->widget())) + { + graphWidget->setGraphRange(visualizationGraphWidget->graphRange()); + } + } + } + + ui->dragDropContainer->insertDragWidget(index, graphWidget); } } }