diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index d085059..cefdddf 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -51,6 +51,12 @@ public: SqpRange graphRange() const noexcept; void setGraphRange(const SqpRange &range); + /// Returns the ranges of all the selection zones on the graph + QVector selectionZoneRanges() const; + + /// Adds new selection zones in the graph + void addSelectionZones(const QVector &ranges); + /// Undo the last zoom done with a zoom box void undoZoom(); diff --git a/gui/include/Visualization/VisualizationZoneWidget.h b/gui/include/Visualization/VisualizationZoneWidget.h index a345b4b..c13f26f 100644 --- a/gui/include/Visualization/VisualizationZoneWidget.h +++ b/gui/include/Visualization/VisualizationZoneWidget.h @@ -60,6 +60,9 @@ public: VisualizationGraphWidget *createGraph(const QList > variables, int index); + /// Returns the first graph in the zone or nullptr if there is no graph inside + VisualizationGraphWidget *firstGraph() const; + // IVisualizationWidget interface void accept(IVisualizationWidgetVisitor *visitor) override; bool canDrop(const Variable &variable) const override; diff --git a/gui/src/Visualization/VisualizationDragWidget.cpp b/gui/src/Visualization/VisualizationDragWidget.cpp index af01ae4..39d36a8 100644 --- a/gui/src/Visualization/VisualizationDragWidget.cpp +++ b/gui/src/Visualization/VisualizationDragWidget.cpp @@ -19,7 +19,7 @@ VisualizationDragWidget::VisualizationDragWidget(QWidget *parent) { } -virtual QPixmap VisualizationDragWidget::customDragPixmap(const QPoint &dragPosition) +QPixmap VisualizationDragWidget::customDragPixmap(const QPoint &dragPosition) { Q_UNUSED(dragPosition); return QPixmap(); diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index aa6fdb3..206dcdc 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -335,6 +335,27 @@ void VisualizationGraphWidget::setGraphRange(const SqpRange &range) qCDebug(LOG_VisualizationGraphWidget()) << tr("VisualizationGraphWidget::setGraphRange END"); } +QVector VisualizationGraphWidget::selectionZoneRanges() const +{ + QVector ranges; + for (auto zone : impl->m_SelectionZones) { + ranges << zone->range(); + } + + return ranges; +} + +void VisualizationGraphWidget::addSelectionZones(const QVector &ranges) +{ + for (const auto &range : ranges) { + auto zone = new VisualizationSelectionZoneItem(&plot()); + zone->setRange(range.m_TStart, range.m_TEnd); + impl->m_SelectionZones << zone; + } + + plot().replot(QCustomPlot::rpQueuedReplot); +} + void VisualizationGraphWidget::undoZoom() { auto zoom = impl->m_ZoomStack.pop(); diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 0269164..ff28657 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -255,7 +255,16 @@ void VisualizationTabWidget::VisualizationTabWidgetPrivate::dropGraph( helper.delayedCloseWidget(graphWidget); } - tabWidget->createZone(variables, index); + auto zoneWidget = tabWidget->createZone(variables, index); + auto firstGraph = zoneWidget->firstGraph(); + if (firstGraph) { + firstGraph->addSelectionZones(graphWidget->selectionZoneRanges()); + } + else { + qCWarning(LOG_VisualizationZoneWidget()) + << tr("VisualizationTabWidget::dropGraph, no graph added in the widget."); + Q_ASSERT(false); + } } else { // The graph is empty, create an empty zone and move the graph inside diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index 05ba174..6c93f50 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -72,21 +72,6 @@ struct VisualizationZoneWidget::VisualizationZoneWidgetPrivate { QUuid m_SynchronisationGroupId; std::unique_ptr m_Synchronizer; - // Returns the first graph in the zone or nullptr if there is no graph inside - VisualizationGraphWidget *firstGraph(const VisualizationZoneWidget *zoneWidget) const - { - VisualizationGraphWidget *firstGraph = nullptr; - auto layout = zoneWidget->ui->dragDropContainer->layout(); - if (layout->count() > 0) { - if (auto visualizationGraphWidget - = qobject_cast(layout->itemAt(0)->widget())) { - firstGraph = visualizationGraphWidget; - } - } - - return firstGraph; - } - void dropGraph(int index, VisualizationZoneWidget *zoneWidget); void dropVariables(const QList > &variables, int index, VisualizationZoneWidget *zoneWidget); @@ -286,7 +271,7 @@ VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptrfirstGraph(this)) { + if (auto firstGraph = this->firstGraph()) { // Case of a new graph in a existant zone range = firstGraph->graphRange(); } @@ -318,6 +303,20 @@ VisualizationZoneWidget::createGraph(const QList > var return graphWidget; } +VisualizationGraphWidget *VisualizationZoneWidget::firstGraph() const +{ + VisualizationGraphWidget *firstGraph = nullptr; + auto layout = ui->dragDropContainer->layout(); + if (layout->count() > 0) { + if (auto visualizationGraphWidget + = qobject_cast(layout->itemAt(0)->widget())) { + firstGraph = visualizationGraphWidget; + } + } + + return firstGraph; +} + void VisualizationZoneWidget::accept(IVisualizationWidgetVisitor *visitor) { if (visitor) { @@ -361,7 +360,7 @@ QMimeData *VisualizationZoneWidget::mimeData(const QPoint &position) const auto mimeData = new QMimeData; mimeData->setData(MIME_TYPE_ZONE, QByteArray{}); - if (auto firstGraph = impl->firstGraph(this)) { + if (auto firstGraph = this->firstGraph()) { auto timeRangeData = TimeController::mimeDataForTimeRange(firstGraph->graphRange()); mimeData->setData(MIME_TYPE_TIME_RANGE, timeRangeData); } @@ -547,7 +546,8 @@ void VisualizationZoneWidget::VisualizationZoneWidgetPrivate::dropGraph( } // Creates the new graph in the zone - zoneWidget->createGraph(variables, index); + auto newGraphWidget = zoneWidget->createGraph(variables, index); + newGraphWidget->addSelectionZones(graphWidget->selectionZoneRanges()); } else { // The drop occurred in the same zone or the graph is empty