diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index cee73b7..7a7735c 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -19,7 +19,7 @@ class VisualizationGraphWidget : public QWidget, public IVisualizationWidget { Q_OBJECT public: - explicit VisualizationGraphWidget(QWidget *parent = 0); + explicit VisualizationGraphWidget(const QString name = {}, QWidget *parent = 0); virtual ~VisualizationGraphWidget(); void addVariable(std::shared_ptr variable); diff --git a/gui/include/Visualization/VisualizationTabWidget.h b/gui/include/Visualization/VisualizationTabWidget.h index 8ba996e..e955860 100644 --- a/gui/include/Visualization/VisualizationTabWidget.h +++ b/gui/include/Visualization/VisualizationTabWidget.h @@ -3,8 +3,11 @@ #include "Visualization/IVisualizationWidget.h" +#include + #include +class Variable; class VisualizationZoneWidget; namespace Ui { @@ -15,14 +18,19 @@ class VisualizationTabWidget : public QWidget, public IVisualizationWidget { Q_OBJECT public: - explicit VisualizationTabWidget(QWidget *parent = 0); + explicit VisualizationTabWidget(const QString &name = {}, QWidget *parent = 0); virtual ~VisualizationTabWidget(); /// Add a zone widget void addZone(VisualizationZoneWidget *zoneWidget); - /// Create a zone using a Variable - VisualizationZoneWidget *createZone(); + /** + * Creates a zone using a variable. The variable will be displayed in a new graph of the new + * zone. + * @param variable the variable for which to create the zone + * @return the pointer to the created zone + */ + VisualizationZoneWidget *createZone(std::shared_ptr variable); /// Remove a zone void removeZone(VisualizationZoneWidget *zone); @@ -34,6 +42,9 @@ public: private: Ui::VisualizationTabWidget *ui; + + class VisualizationTabWidgetPrivate; + spimpl::unique_impl_ptr impl; }; #endif // SCIQLOP_VISUALIZATIONTABWIDGET_H diff --git a/gui/include/Visualization/VisualizationZoneWidget.h b/gui/include/Visualization/VisualizationZoneWidget.h index bdb08bf..82f5418 100644 --- a/gui/include/Visualization/VisualizationZoneWidget.h +++ b/gui/include/Visualization/VisualizationZoneWidget.h @@ -3,26 +3,31 @@ #include "Visualization/IVisualizationWidget.h" -class VisualizationGraphWidget; - #include namespace Ui { class VisualizationZoneWidget; } // Ui +class Variable; +class VisualizationGraphWidget; + class VisualizationZoneWidget : public QWidget, public IVisualizationWidget { Q_OBJECT public: - explicit VisualizationZoneWidget(QWidget *parent = 0); + explicit VisualizationZoneWidget(const QString &name = {}, QWidget *parent = 0); virtual ~VisualizationZoneWidget(); /// Add a graph widget void addGraph(VisualizationGraphWidget *graphWidget); - /// Create a graph using a Variable - VisualizationGraphWidget *createGraph(); + /** + * Creates a graph using a variable. The variable will be displayed in the new graph. + * @param variable the variable for which to create the graph + * @return the pointer to the created graph + */ + VisualizationGraphWidget *createGraph(std::shared_ptr variable); /// Remove a graph void removeGraph(VisualizationGraphWidget *graph); diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index cfe0b03..d6f0fcd 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -22,13 +22,17 @@ struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { std::unordered_map, QCPAbstractPlottable *> m_VariableToPlotMap; }; -VisualizationGraphWidget::VisualizationGraphWidget(QWidget *parent) +VisualizationGraphWidget::VisualizationGraphWidget(const QString name, QWidget *parent) : QWidget{parent}, ui{new Ui::VisualizationGraphWidget}, impl{spimpl::make_unique_impl()} { ui->setupUi(this); + // qcpplot title + ui->widget->plotLayout()->insertRow(0); + ui->widget->plotLayout()->addElement(0, 0, new QCPTextElement{ui->widget, name}); + // Set qcpplot properties : // - Drag (on x-axis) and zoom are enabled // - Mouse wheel on qcpplot is intercepted to determine the zoom orientation @@ -65,7 +69,12 @@ void VisualizationGraphWidget::close() QString VisualizationGraphWidget::name() const { - return QStringLiteral("MainView"); + if (auto title = dynamic_cast(ui->widget->plotLayout()->elementAt(0))) { + return title->text(); + } + else { + return QString{}; + } } void VisualizationGraphWidget::onMouseWheel(QWheelEvent *event) noexcept diff --git a/gui/src/Visualization/VisualizationTabWidget.cpp b/gui/src/Visualization/VisualizationTabWidget.cpp index 4061a08..ddc297d 100644 --- a/gui/src/Visualization/VisualizationTabWidget.cpp +++ b/gui/src/Visualization/VisualizationTabWidget.cpp @@ -3,9 +3,34 @@ #include "Visualization/VisualizationZoneWidget.h" +namespace { -VisualizationTabWidget::VisualizationTabWidget(QWidget *parent) - : QWidget{parent}, ui{new Ui::VisualizationTabWidget} +/// Generates a default name for a new zone, according to the number of zones already displayed in +/// the tab +QString defaultZoneName(const QLayout &layout) +{ + auto count = 0; + for (auto i = 0; i < layout.count(); ++i) { + if (dynamic_cast(layout.itemAt(i)->widget())) { + count++; + } + } + + return QObject::tr("Zone %1").arg(count + 1); +} + +} // namespace + +struct VisualizationTabWidget::VisualizationTabWidgetPrivate { + explicit VisualizationTabWidgetPrivate(const QString &name) : m_Name{name} {} + + QString m_Name; +}; + +VisualizationTabWidget::VisualizationTabWidget(const QString &name, QWidget *parent) + : QWidget{parent}, + ui{new Ui::VisualizationTabWidget}, + impl{spimpl::make_unique_impl(name)} { ui->setupUi(this); } @@ -20,11 +45,14 @@ void VisualizationTabWidget::addZone(VisualizationZoneWidget *zoneWidget) this->layout()->addWidget(zoneWidget); } -VisualizationZoneWidget *VisualizationTabWidget::createZone() +VisualizationZoneWidget *VisualizationTabWidget::createZone(std::shared_ptr variable) { - auto zoneWidget = new VisualizationZoneWidget{this}; + auto zoneWidget = new VisualizationZoneWidget{defaultZoneName(*layout()), this}; this->addZone(zoneWidget); + // Creates a new graph into the zone + zoneWidget->createGraph(variable); + return zoneWidget; } @@ -45,5 +73,5 @@ void VisualizationTabWidget::close() QString VisualizationTabWidget::name() const { - return QStringLiteral("MainView"); + return impl->m_Name; } diff --git a/gui/src/Visualization/VisualizationWidget.cpp b/gui/src/Visualization/VisualizationWidget.cpp index 6011c5a..ecf4e06 100644 --- a/gui/src/Visualization/VisualizationWidget.cpp +++ b/gui/src/Visualization/VisualizationWidget.cpp @@ -32,8 +32,9 @@ VisualizationWidget::VisualizationWidget(QWidget *parent) }; auto addTabView = [this, enableMinimumCornerWidgetSize]() { - auto index = ui->tabWidget->addTab(new VisualizationTabWidget(ui->tabWidget), - QString("View %1").arg(ui->tabWidget->count() + 1)); + auto widget = new VisualizationTabWidget{QString{"View %1"}.arg(ui->tabWidget->count() + 1), + ui->tabWidget}; + auto index = ui->tabWidget->addTab(widget, widget->name()); if (ui->tabWidget->count() > 0) { enableMinimumCornerWidgetSize(false); } @@ -54,6 +55,9 @@ VisualizationWidget::VisualizationWidget(QWidget *parent) connect(addTabViewButton, &QToolButton::clicked, addTabView); connect(ui->tabWidget, &QTabWidget::tabCloseRequested, removeTabView); + + // Adds default tab + addTabView(); } VisualizationWidget::~VisualizationWidget() @@ -96,16 +100,7 @@ QString VisualizationWidget::name() const void VisualizationWidget::displayVariable(std::shared_ptr variable) noexcept { if (auto currentTab = dynamic_cast(ui->tabWidget->currentWidget())) { - if (auto newZone = currentTab->createZone()) { - if (auto newGraph = newZone->createGraph()) { - newGraph->addVariable(variable); - } - else { - qCCritical(LOG_VisualizationWidget()) - << tr("Can't display the variable : can't create the graph"); - } - } - else { + if (!currentTab->createZone(variable)) { qCCritical(LOG_VisualizationWidget()) << tr("Can't display the variable : can't create a new zone in the current tab"); } diff --git a/gui/src/Visualization/VisualizationZoneWidget.cpp b/gui/src/Visualization/VisualizationZoneWidget.cpp index ba4aa14..a57c84e 100644 --- a/gui/src/Visualization/VisualizationZoneWidget.cpp +++ b/gui/src/Visualization/VisualizationZoneWidget.cpp @@ -3,10 +3,30 @@ #include "Visualization/VisualizationGraphWidget.h" -VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent) +namespace { + +/// Generates a default name for a new graph, according to the number of graphs already displayed in +/// the zone +QString defaultGraphName(const QLayout &layout) +{ + auto count = 0; + for (auto i = 0; i < layout.count(); ++i) { + if (dynamic_cast(layout.itemAt(i)->widget())) { + count++; + } + } + + return QObject::tr("Graph %1").arg(count + 1); +} + +} // namespace + +VisualizationZoneWidget::VisualizationZoneWidget(const QString &name, QWidget *parent) : QWidget{parent}, ui{new Ui::VisualizationZoneWidget} { ui->setupUi(this); + + ui->zoneNameLabel->setText(name); } VisualizationZoneWidget::~VisualizationZoneWidget() @@ -19,11 +39,14 @@ void VisualizationZoneWidget::addGraph(VisualizationGraphWidget *graphWidget) ui->visualizationZoneFrame->layout()->addWidget(graphWidget); } -VisualizationGraphWidget *VisualizationZoneWidget::createGraph() +VisualizationGraphWidget *VisualizationZoneWidget::createGraph(std::shared_ptr variable) { - auto graphWidget = new VisualizationGraphWidget{this}; + auto graphWidget = new VisualizationGraphWidget{ + defaultGraphName(*ui->visualizationZoneFrame->layout()), this}; this->addGraph(graphWidget); + graphWidget->addVariable(variable); + return graphWidget; } @@ -44,5 +67,5 @@ void VisualizationZoneWidget::close() QString VisualizationZoneWidget::name() const { - return QStringLiteral("MainView"); + return ui->zoneNameLabel->text(); } diff --git a/gui/ui/Visualization/VisualizationWidget.ui b/gui/ui/Visualization/VisualizationWidget.ui index 6e84bbb..1547c1e 100644 --- a/gui/ui/Visualization/VisualizationWidget.ui +++ b/gui/ui/Visualization/VisualizationWidget.ui @@ -17,25 +17,12 @@ - 0 + -1 - - - View 1 - - - - - VisualizationTabWidget - QWidget -
Visualization/VisualizationTabWidget.h
- 1 -
-
diff --git a/gui/ui/Visualization/VisualizationZoneWidget.ui b/gui/ui/Visualization/VisualizationZoneWidget.ui index fc42eb5..1c2920e 100644 --- a/gui/ui/Visualization/VisualizationZoneWidget.ui +++ b/gui/ui/Visualization/VisualizationZoneWidget.ui @@ -14,23 +14,49 @@ Form - - 3 - - - 0 - - - 0 - - - 0 - - - 0 - + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + color: rgb(127, 127, 127); + + + + TextLabel + + + + + + + + + 0 + 0 + + QFrame::Box diff --git a/gui/vera-exclusions/exclusions.txt b/gui/vera-exclusions/exclusions.txt index 0bcc8be..72b8768 100644 --- a/gui/vera-exclusions/exclusions.txt +++ b/gui/vera-exclusions/exclusions.txt @@ -8,4 +8,6 @@ SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp # Ignore false positive relative to unnamed namespace DataSourceTreeWidgetItem\.cpp:\d+:.*IPSIS_F13.* +VisualizationTabWidget\.cpp:\d+:.*IPSIS_F13.* +VisualizationZoneWidget\.cpp:\d+:.*IPSIS_F13.*