##// END OF EJS Templates
Closed
Pull request !141 Created on Thu, 08 Jun 2017 10:17:28, by
- Merge pull request #140 from SCIQLOP-Initialisation feature/VisualizationWidget
- Widget of the tab widget are now of type VisualizationTabWidget
- Merge branch 'feature/PluginTreeItem' into develop
- Adds vera exclusions
- Loads SciQlop plugins
Pull request versions not available.
ver Time Author Commit Description
17 commits hidden, click expand to show them.
@@ -64,8 +64,8 MainWindow::MainWindow(QWidget *parent) : QMainWindow{parent}, m_Ui{new Ui::Main
64 mainToolBar->addAction("A1");
64 mainToolBar->addAction("A1");
65
65
66 // Widgets / controllers connections
66 // Widgets / controllers connections
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem &)),
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem *)),
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem &)));
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem *)));
69
69
70 /* QLopGUI::registerMenuBar(menuBar());
70 /* QLopGUI::registerMenuBar(menuBar());
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
@@ -49,7 +49,7 public slots:
49
49
50 signals:
50 signals:
51 /// Signal emitted when a structure has been set for a data source
51 /// Signal emitted when a structure has been set for a data source
52 void dataSourceItemSet(DataSourceItem &dataSourceItem);
52 void dataSourceItemSet(DataSourceItem *dataSourceItem);
53
53
54 private:
54 private:
55 void waitForFinish();
55 void waitForFinish();
@@ -49,7 +49,7 void DataSourceController::setDataSourceItem(
49 // Retrieves the data source item to emit the signal with it
49 // Retrieves the data source item to emit the signal with it
50 auto it = impl->m_DataSourceItems.find(dataSourceUid);
50 auto it = impl->m_DataSourceItems.find(dataSourceUid);
51 if (it != impl->m_DataSourceItems.end()) {
51 if (it != impl->m_DataSourceItems.end()) {
52 emit dataSourceItemSet(*it->second);
52 emit dataSourceItemSet(it->second.get());
53 }
53 }
54 }
54 }
55 else {
55 else {
@@ -26,7 +26,7 void TestDataSourceController::testSetDataSourceItem()
26 DataSourceController dataSourceController{};
26 DataSourceController dataSourceController{};
27
27
28 // Spy to test controllers' signals
28 // Spy to test controllers' signals
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(const DataSourceItem &))};
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(DataSourceItem *))};
30
30
31 // Create a data source item
31 // Create a data source item
32 auto source1Name = QStringLiteral("Source1");
32 auto source1Name = QStringLiteral("Source1");
@@ -21,9 +21,9 public slots:
21 /**
21 /**
22 * Adds a data source. An item associated to the data source is created and then added to the
22 * Adds a data source. An item associated to the data source is created and then added to the
23 * representation tree
23 * representation tree
24 * @param dataSource the data source to add
24 * @param dataSource the data source to add. The pointer has to be not null
25 */
25 */
26 void addDataSource(DataSourceItem &dataSource) noexcept;
26 void addDataSource(DataSourceItem *dataSource) noexcept;
27
27
28 private:
28 private:
29 class DataSourceWidgetPrivate;
29 class DataSourceWidgetPrivate;
@@ -20,6 +20,13 QIcon itemIcon(const DataSourceItem *dataSource)
20 // No action
20 // No action
21 break;
21 break;
22 }
22 }
23
24 qCWarning(LOG_DataSourceTreeWidgetItem())
25 << QObject::tr("Can't set data source icon : unknown data source type");
26 }
27 else {
28 qCWarning(LOG_DataSourceTreeWidgetItem())
29 << QObject::tr("Can't set data source icon : the data source is null");
23 }
30 }
24
31
25 // Default cases
32 // Default cases
@@ -53,9 +53,11 DataSourceWidget::DataSourceWidget(QWidget *parent)
53 {
53 {
54 }
54 }
55
55
56 void DataSourceWidget::addDataSource(DataSourceItem &dataSource) noexcept
56 void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept
57 {
57 {
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
59 // takes the ownership of the item
59 // takes the ownership of the item
60 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(&dataSource));
60 if (dataSource) {
61 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(dataSource));
62 }
61 }
63 }
@@ -193,13 +193,13
193 <customwidget>
193 <customwidget>
194 <class>VisualizationWidget</class>
194 <class>VisualizationWidget</class>
195 <extends>QWidget</extends>
195 <extends>QWidget</extends>
196 <header location="global">visualization/VisualizationWidget.h</header>
196 <header location="global">Visualization/VisualizationWidget.h</header>
197 <container>1</container>
197 <container>1</container>
198 </customwidget>
198 </customwidget>
199 <customwidget>
199 <customwidget>
200 <class>SqpSidePane</class>
200 <class>SqpSidePane</class>
201 <extends>QWidget</extends>
201 <extends>QWidget</extends>
202 <header location="global">sidepane/SqpSidePane.h</header>
202 <header location="global">SidePane/SqpSidePane.h</header>
203 <container>1</container>
203 <container>1</container>
204 </customwidget>
204 </customwidget>
205 <customwidget>
205 <customwidget>
1 NO CONTENT: file renamed from gui/include/sidepane/SqpSidePane.h to gui/include/SidePane/SqpSidePane.h
NO CONTENT: file renamed from gui/include/sidepane/SqpSidePane.h to gui/include/SidePane/SqpSidePane.h
1 NO CONTENT: file renamed from gui/include/visualization/VisualizationGraphWidget.h to gui/include/Visualization/VisualizationGraphWidget.h
NO CONTENT: file renamed from gui/include/visualization/VisualizationGraphWidget.h to gui/include/Visualization/VisualizationGraphWidget.h
1 NO CONTENT: file renamed from gui/include/visualization/VisualizationTabWidget.h to gui/include/Visualization/VisualizationTabWidget.h
NO CONTENT: file renamed from gui/include/visualization/VisualizationTabWidget.h to gui/include/Visualization/VisualizationTabWidget.h
1 NO CONTENT: file renamed from gui/include/visualization/VisualizationWidget.h to gui/include/Visualization/VisualizationWidget.h
NO CONTENT: file renamed from gui/include/visualization/VisualizationWidget.h to gui/include/Visualization/VisualizationWidget.h
1 NO CONTENT: file renamed from gui/include/visualization/VisualizationZoneWidget.h to gui/include/Visualization/VisualizationZoneWidget.h
NO CONTENT: file renamed from gui/include/visualization/VisualizationZoneWidget.h to gui/include/Visualization/VisualizationZoneWidget.h
1 NO CONTENT: file renamed from gui/include/visualization/qcustomplot.h to gui/include/Visualization/qcustomplot.h
NO CONTENT: file renamed from gui/include/visualization/qcustomplot.h to gui/include/Visualization/qcustomplot.h
@@ -1,4 +1,4
1 #include "sidepane/SqpSidePane.h"
1 #include "SidePane/SqpSidePane.h"
2 #include "ui_SqpSidePane.h"
2 #include "ui_SqpSidePane.h"
3
3
4 #include <QAction>
4 #include <QAction>
@@ -1,4 +1,4
1 #include "visualization/VisualizationGraphWidget.h"
1 #include "Visualization/VisualizationGraphWidget.h"
2 #include "ui_VisualizationGraphWidget.h"
2 #include "ui_VisualizationGraphWidget.h"
3
3
4 VisualizationGraphWidget::VisualizationGraphWidget(QWidget *parent)
4 VisualizationGraphWidget::VisualizationGraphWidget(QWidget *parent)
@@ -1,4 +1,4
1 #include "visualization/VisualizationTabWidget.h"
1 #include "Visualization/VisualizationTabWidget.h"
2 #include "ui_VisualizationTabWidget.h"
2 #include "ui_VisualizationTabWidget.h"
3
3
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
@@ -1,6 +1,6
1 #include "visualization/VisualizationWidget.h"
1 #include "Visualization/VisualizationWidget.h"
2 #include "Visualization/VisualizationTabWidget.h"
2 #include "ui_VisualizationWidget.h"
3 #include "ui_VisualizationWidget.h"
3 #include "visualization/VisualizationTabWidget.h"
4
4
5 #include <QDebug>
5 #include <QDebug>
6 #include <QToolButton>
6 #include <QToolButton>
@@ -1,4 +1,4
1 #include "visualization/VisualizationZoneWidget.h"
1 #include "Visualization/VisualizationZoneWidget.h"
2 #include "ui_VisualizationZoneWidget.h"
2 #include "ui_VisualizationZoneWidget.h"
3
3
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
@@ -23,7 +23,7
23 ** Version: 2.0.0-beta **
23 ** Version: 2.0.0-beta **
24 ****************************************************************************/
24 ****************************************************************************/
25
25
26 #include "visualization/qcustomplot.h"
26 #include "Visualization/qcustomplot.h"
27
27
28
28
29 /* including file 'src/vector2d.cpp', size 7340 */
29 /* including file 'src/vector2d.cpp', size 7340 */
@@ -32,7 +32,7
32 <customwidget>
32 <customwidget>
33 <class>VisualizationTabWidget</class>
33 <class>VisualizationTabWidget</class>
34 <extends>QWidget</extends>
34 <extends>QWidget</extends>
35 <header location="global">visualization/VisualizationTabWidget.h</header>
35 <header location="global">Visualization/VisualizationTabWidget.h</header>
36 <container>1</container>
36 <container>1</container>
37 </customwidget>
37 </customwidget>
38 </customwidgets>
38 </customwidgets>
@@ -45,7 +45,7
45 #include <QAction>
45 #include <QAction>
46 #include <QToolBar>
46 #include <QToolBar>
47 #include <memory.h>
47 #include <memory.h>
48 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_Ui(new Ui::MainWindow)
48 MainWindow::MainWindow(QWidget *parent) : QMainWindow{parent}, m_Ui{new Ui::MainWindow}
49 {
49 {
50 m_Ui->setupUi(this);
50 m_Ui->setupUi(this);
51
51
@@ -22,7 +22,7 static const QString SQPSIDEPANESTYLESHEET
22 " }";
22 " }";
23 }
23 }
24
24
25 SqpSidePane::SqpSidePane(QWidget *parent) : QWidget(parent), ui(new Ui::SqpSidePane)
25 SqpSidePane::SqpSidePane(QWidget *parent) : QWidget{parent}, ui{new Ui::SqpSidePane}
26 {
26 {
27 QVBoxLayout *sidePaneLayout = new QVBoxLayout(this);
27 QVBoxLayout *sidePaneLayout = new QVBoxLayout(this);
28 sidePaneLayout->setContentsMargins(0, 0, 0, 0);
28 sidePaneLayout->setContentsMargins(0, 0, 0, 0);
@@ -2,7 +2,7
2 #include "ui_VisualizationTabWidget.h"
2 #include "ui_VisualizationTabWidget.h"
3
3
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationTabWidget)
5 : QWidget{parent}, ui{new Ui::VisualizationTabWidget}
6 {
6 {
7 ui->setupUi(this);
7 ui->setupUi(this);
8 }
8 }
@@ -10,12 +10,12
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
11
11
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
13 : QWidget(parent), ui(new Ui::VisualizationWidget)
13 : QWidget{parent}, ui{new Ui::VisualizationWidget}
14 {
14 {
15 ui->setupUi(this);
15 ui->setupUi(this);
16
16
17 auto *addTabViewButton = new QToolButton(ui->tabWidget);
17 auto addTabViewButton = new QToolButton{ui->tabWidget};
18 addTabViewButton->setText("Add View");
18 addTabViewButton->setText(tr("Add View"));
19 addTabViewButton->setCursor(Qt::ArrowCursor);
19 addTabViewButton->setCursor(Qt::ArrowCursor);
20 addTabViewButton->setAutoRaise(true);
20 addTabViewButton->setAutoRaise(true);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
@@ -2,7 +2,7
2 #include "ui_VisualizationZoneWidget.h"
2 #include "ui_VisualizationZoneWidget.h"
3
3
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationZoneWidget)
5 : QWidget{parent}, ui{new Ui::VisualizationZoneWidget}
6 {
6 {
7 ui->setupUi(this);
7 ui->setupUi(this);
8 }
8 }
@@ -20,6 +20,13 QIcon itemIcon(const DataSourceItem *dataSource)
20 // No action
20 // No action
21 break;
21 break;
22 }
22 }
23
24 qCWarning(LOG_DataSourceTreeWidgetItem())
25 << QObject::tr("Can't set data source icon : unknown data source type");
26 }
27 else {
28 qCWarning(LOG_DataSourceTreeWidgetItem())
29 << QObject::tr("Can't set data source icon : the data source is null");
23 }
30 }
24
31
25 // Default cases
32 // Default cases
@@ -64,8 +64,8 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_Ui(new Ui::Main
64 mainToolBar->addAction("A1");
64 mainToolBar->addAction("A1");
65
65
66 // Widgets / controllers connections
66 // Widgets / controllers connections
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem &)),
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem *)),
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem &)));
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem *)));
69
69
70 /* QLopGUI::registerMenuBar(menuBar());
70 /* QLopGUI::registerMenuBar(menuBar());
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
@@ -49,7 +49,7 public slots:
49
49
50 signals:
50 signals:
51 /// Signal emitted when a structure has been set for a data source
51 /// Signal emitted when a structure has been set for a data source
52 void dataSourceItemSet(DataSourceItem &dataSourceItem);
52 void dataSourceItemSet(DataSourceItem *dataSourceItem);
53
53
54 private:
54 private:
55 void waitForFinish();
55 void waitForFinish();
@@ -49,7 +49,7 void DataSourceController::setDataSourceItem(
49 // Retrieves the data source item to emit the signal with it
49 // Retrieves the data source item to emit the signal with it
50 auto it = impl->m_DataSourceItems.find(dataSourceUid);
50 auto it = impl->m_DataSourceItems.find(dataSourceUid);
51 if (it != impl->m_DataSourceItems.end()) {
51 if (it != impl->m_DataSourceItems.end()) {
52 emit dataSourceItemSet(*it->second);
52 emit dataSourceItemSet(it->second.get());
53 }
53 }
54 }
54 }
55 else {
55 else {
@@ -26,7 +26,7 void TestDataSourceController::testSetDataSourceItem()
26 DataSourceController dataSourceController{};
26 DataSourceController dataSourceController{};
27
27
28 // Spy to test controllers' signals
28 // Spy to test controllers' signals
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(const DataSourceItem &))};
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(DataSourceItem *))};
30
30
31 // Create a data source item
31 // Create a data source item
32 auto source1Name = QStringLiteral("Source1");
32 auto source1Name = QStringLiteral("Source1");
@@ -21,9 +21,9 public slots:
21 /**
21 /**
22 * Adds a data source. An item associated to the data source is created and then added to the
22 * Adds a data source. An item associated to the data source is created and then added to the
23 * representation tree
23 * representation tree
24 * @param dataSource the data source to add
24 * @param dataSource the data source to add. The pointer has to be not null
25 */
25 */
26 void addDataSource(DataSourceItem &dataSource) noexcept;
26 void addDataSource(DataSourceItem *dataSource) noexcept;
27
27
28 private:
28 private:
29 class DataSourceWidgetPrivate;
29 class DataSourceWidgetPrivate;
@@ -53,9 +53,11 DataSourceWidget::DataSourceWidget(QWidget *parent)
53 {
53 {
54 }
54 }
55
55
56 void DataSourceWidget::addDataSource(DataSourceItem &dataSource) noexcept
56 void DataSourceWidget::addDataSource(DataSourceItem *dataSource) noexcept
57 {
57 {
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
59 // takes the ownership of the item
59 // takes the ownership of the item
60 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(&dataSource));
60 if (dataSource) {
61 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(dataSource));
62 }
61 }
63 }
@@ -45,7 +45,7
45 #include <QAction>
45 #include <QAction>
46 #include <QToolBar>
46 #include <QToolBar>
47 #include <memory.h>
47 #include <memory.h>
48 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_Ui(new Ui::MainWindow)
48 MainWindow::MainWindow(QWidget *parent) : QMainWindow{parent}, m_Ui{new Ui::MainWindow}
49 {
49 {
50 m_Ui->setupUi(this);
50 m_Ui->setupUi(this);
51
51
@@ -22,7 +22,7 static const QString SQPSIDEPANESTYLESHEET
22 " }";
22 " }";
23 }
23 }
24
24
25 SqpSidePane::SqpSidePane(QWidget *parent) : QWidget(parent), ui(new Ui::SqpSidePane)
25 SqpSidePane::SqpSidePane(QWidget *parent) : QWidget{parent}, ui{new Ui::SqpSidePane}
26 {
26 {
27 QVBoxLayout *sidePaneLayout = new QVBoxLayout(this);
27 QVBoxLayout *sidePaneLayout = new QVBoxLayout(this);
28 sidePaneLayout->setContentsMargins(0, 0, 0, 0);
28 sidePaneLayout->setContentsMargins(0, 0, 0, 0);
@@ -2,7 +2,7
2 #include "ui_VisualizationTabWidget.h"
2 #include "ui_VisualizationTabWidget.h"
3
3
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
4 VisualizationTabWidget::VisualizationTabWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationTabWidget)
5 : QWidget{parent}, ui{new Ui::VisualizationTabWidget}
6 {
6 {
7 ui->setupUi(this);
7 ui->setupUi(this);
8 }
8 }
@@ -10,12 +10,12
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
11
11
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
13 : QWidget(parent), ui(new Ui::VisualizationWidget)
13 : QWidget{parent}, ui{new Ui::VisualizationWidget}
14 {
14 {
15 ui->setupUi(this);
15 ui->setupUi(this);
16
16
17 auto *addTabViewButton = new QToolButton(ui->tabWidget);
17 auto addTabViewButton = new QToolButton{ui->tabWidget};
18 addTabViewButton->setText("Add View");
18 addTabViewButton->setText(tr("Add View"));
19 addTabViewButton->setCursor(Qt::ArrowCursor);
19 addTabViewButton->setCursor(Qt::ArrowCursor);
20 addTabViewButton->setAutoRaise(true);
20 addTabViewButton->setAutoRaise(true);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
@@ -2,7 +2,7
2 #include "ui_VisualizationZoneWidget.h"
2 #include "ui_VisualizationZoneWidget.h"
3
3
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
4 VisualizationZoneWidget::VisualizationZoneWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationZoneWidget)
5 : QWidget{parent}, ui{new Ui::VisualizationZoneWidget}
6 {
6 {
7 ui->setupUi(this);
7 ui->setupUi(this);
8 }
8 }
@@ -1,8 +1,11
1 #ifndef SCIQLOP_VISUALIZATIONWIDGET_H
1 #ifndef SCIQLOP_VISUALIZATIONWIDGET_H
2 #define SCIQLOP_VISUALIZATIONWIDGET_H
2 #define SCIQLOP_VISUALIZATIONWIDGET_H
3
3
4 #include <QLoggingCategory>
4 #include <QWidget>
5 #include <QWidget>
5
6
7 Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationWidget)
8
6 namespace Ui {
9 namespace Ui {
7 class VisualizationWidget;
10 class VisualizationWidget;
8 } // namespace Ui
11 } // namespace Ui
@@ -1,10 +1,40
1 #include "visualization/VisualizationWidget.h"
1 #include "visualization/VisualizationWidget.h"
2 #include "ui_VisualizationWidget.h"
2 #include "ui_VisualizationWidget.h"
3 #include "visualization/VisualizationTabWidget.h"
4
5 #include <QDebug>
6 #include <QToolButton>
7
8 #include "iostream"
9
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
3
11
4 VisualizationWidget::VisualizationWidget(QWidget *parent)
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationWidget)
13 : QWidget(parent), ui(new Ui::VisualizationWidget)
6 {
14 {
7 ui->setupUi(this);
15 ui->setupUi(this);
16
17 auto *addTabViewButton = new QToolButton(ui->tabWidget);
18 addTabViewButton->setText("Add View");
19 addTabViewButton->setCursor(Qt::ArrowCursor);
20 addTabViewButton->setAutoRaise(true);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
22
23 auto addTabView = [&](bool checked) {
24 auto index = ui->tabWidget->addTab(new VisualizationTabWidget(ui->tabWidget),
25 QString("View %1").arg(ui->tabWidget->count() + 1));
26 qCInfo(LOG_VisualizationWidget()) << tr("add the tab of index %1").arg(index);
27 };
28
29 auto removeTabView = [&](int index) {
30 ui->tabWidget->removeTab(index);
31 qCInfo(LOG_VisualizationWidget()) << tr("remove the tab of index %1").arg(index);
32 };
33
34 ui->tabWidget->setTabsClosable(true);
35
36 connect(addTabViewButton, &QToolButton::clicked, addTabView);
37 connect(ui->tabWidget, &QTabWidget::tabCloseRequested, removeTabView);
8 }
38 }
9
39
10 VisualizationWidget::~VisualizationWidget()
40 VisualizationWidget::~VisualizationWidget()
@@ -19,20 +19,23
19 <property name="currentIndex">
19 <property name="currentIndex">
20 <number>0</number>
20 <number>0</number>
21 </property>
21 </property>
22 <widget class="QWidget" name="firstView">
22 <widget class="VisualizationTabWidget" name="firstView">
23 <attribute name="title">
23 <attribute name="title">
24 <string>View 1</string>
24 <string>View 1</string>
25 </attribute>
25 </attribute>
26 </widget>
26 </widget>
27 <widget class="QWidget" name="secondView">
28 <attribute name="title">
29 <string>+</string>
30 </attribute>
31 </widget>
32 </widget>
27 </widget>
33 </item>
28 </item>
34 </layout>
29 </layout>
35 </widget>
30 </widget>
31 <customwidgets>
32 <customwidget>
33 <class>VisualizationTabWidget</class>
34 <extends>QWidget</extends>
35 <header location="global">visualization/VisualizationTabWidget.h</header>
36 <container>1</container>
37 </customwidget>
38 </customwidgets>
36 <resources/>
39 <resources/>
37 <connections/>
40 <connections/>
38 </ui>
41 </ui>
@@ -1,8 +1,11
1 #ifndef SCIQLOP_VISUALIZATIONWIDGET_H
1 #ifndef SCIQLOP_VISUALIZATIONWIDGET_H
2 #define SCIQLOP_VISUALIZATIONWIDGET_H
2 #define SCIQLOP_VISUALIZATIONWIDGET_H
3
3
4 #include <QLoggingCategory>
4 #include <QWidget>
5 #include <QWidget>
5
6
7 Q_DECLARE_LOGGING_CATEGORY(LOG_VisualizationWidget)
8
6 namespace Ui {
9 namespace Ui {
7 class VisualizationWidget;
10 class VisualizationWidget;
8 } // namespace Ui
11 } // namespace Ui
@@ -1,10 +1,40
1 #include "visualization/VisualizationWidget.h"
1 #include "visualization/VisualizationWidget.h"
2 #include "ui_VisualizationWidget.h"
2 #include "ui_VisualizationWidget.h"
3 #include "visualization/VisualizationTabWidget.h"
4
5 #include <QDebug>
6 #include <QToolButton>
7
8 #include "iostream"
9
10 Q_LOGGING_CATEGORY(LOG_VisualizationWidget, "VisualizationWidget")
3
11
4 VisualizationWidget::VisualizationWidget(QWidget *parent)
12 VisualizationWidget::VisualizationWidget(QWidget *parent)
5 : QWidget(parent), ui(new Ui::VisualizationWidget)
13 : QWidget(parent), ui(new Ui::VisualizationWidget)
6 {
14 {
7 ui->setupUi(this);
15 ui->setupUi(this);
16
17 auto *addTabViewButton = new QToolButton(ui->tabWidget);
18 addTabViewButton->setText("Add View");
19 addTabViewButton->setCursor(Qt::ArrowCursor);
20 addTabViewButton->setAutoRaise(true);
21 ui->tabWidget->setCornerWidget(addTabViewButton, Qt::TopRightCorner);
22
23 auto addTabView = [&](bool checked) {
24 auto index = ui->tabWidget->addTab(new VisualizationTabWidget(ui->tabWidget),
25 QString("View %1").arg(ui->tabWidget->count() + 1));
26 qCInfo(LOG_VisualizationWidget()) << tr("add the tab of index %1").arg(index);
27 };
28
29 auto removeTabView = [&](int index) {
30 ui->tabWidget->removeTab(index);
31 qCInfo(LOG_VisualizationWidget()) << tr("remove the tab of index %1").arg(index);
32 };
33
34 ui->tabWidget->setTabsClosable(true);
35
36 connect(addTabViewButton, &QToolButton::clicked, addTabView);
37 connect(ui->tabWidget, &QTabWidget::tabCloseRequested, removeTabView);
8 }
38 }
9
39
10 VisualizationWidget::~VisualizationWidget()
40 VisualizationWidget::~VisualizationWidget()
@@ -19,20 +19,23
19 <property name="currentIndex">
19 <property name="currentIndex">
20 <number>0</number>
20 <number>0</number>
21 </property>
21 </property>
22 <widget class="QWidget" name="firstView">
22 <widget class="VisualizationTabWidget" name="firstView">
23 <attribute name="title">
23 <attribute name="title">
24 <string>View 1</string>
24 <string>View 1</string>
25 </attribute>
25 </attribute>
26 </widget>
26 </widget>
27 <widget class="QWidget" name="secondView">
28 <attribute name="title">
29 <string>+</string>
30 </attribute>
31 </widget>
32 </widget>
27 </widget>
33 </item>
28 </item>
34 </layout>
29 </layout>
35 </widget>
30 </widget>
31 <customwidgets>
32 <customwidget>
33 <class>VisualizationTabWidget</class>
34 <extends>QWidget</extends>
35 <header location="global">visualization/VisualizationTabWidget.h</header>
36 <container>1</container>
37 </customwidget>
38 </customwidgets>
36 <resources/>
39 <resources/>
37 <connections/>
40 <connections/>
38 </ui>
41 </ui>
@@ -0,0 +1,32
1 #ifndef SCIQLOP_DATASOURCETREEWIDGETITEM_H
2 #define SCIQLOP_DATASOURCETREEWIDGETITEM_H
3
4 #include <Common/spimpl.h>
5
6 #include <QLoggingCategory>
7 #include <QTreeWidgetItem>
8
9 Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem)
10
11 class DataSourceItem;
12
13 /**
14 * @brief The DataSourceTreeWidgetItem is the graphical representation of a data source item. It is
15 * intended to be displayed in a QTreeWidget.
16 * @sa DataSourceItem
17 */
18 class DataSourceTreeWidgetItem : public QTreeWidgetItem {
19 public:
20 explicit DataSourceTreeWidgetItem(const DataSourceItem *data, int type = Type);
21 explicit DataSourceTreeWidgetItem(QTreeWidget *parent, const DataSourceItem *data,
22 int type = Type);
23
24 virtual QVariant data(int column, int role) const override;
25 virtual void setData(int column, int role, const QVariant &value) override;
26
27 private:
28 class DataSourceTreeWidgetItemPrivate;
29 spimpl::unique_impl_ptr<DataSourceTreeWidgetItemPrivate> impl;
30 };
31
32 #endif // SCIQLOP_DATASOURCETREEWIDGETITEM_H
@@ -0,0 +1,33
1 #ifndef SCIQLOP_DATASOURCEWIDGET_H
2 #define SCIQLOP_DATASOURCEWIDGET_H
3
4 #include <Common/spimpl.h>
5
6 #include <QWidget>
7
8 class DataSourceItem;
9
10 /**
11 * @brief The DataSourceWidget handles the graphical representation (as a tree) of the data sources
12 * attached to SciQlop.
13 */
14 class DataSourceWidget : public QWidget {
15 Q_OBJECT
16
17 public:
18 explicit DataSourceWidget(QWidget *parent = 0);
19
20 public slots:
21 /**
22 * Adds a data source. An item associated to the data source is created and then added to the
23 * representation tree
24 * @param dataSource the data source to add
25 */
26 void addDataSource(DataSourceItem &dataSource) noexcept;
27
28 private:
29 class DataSourceWidgetPrivate;
30 spimpl::unique_impl_ptr<DataSourceWidgetPrivate> impl;
31 };
32
33 #endif // SCIQLOP_DATASOURCEWIDGET_H
@@ -0,0 +1,68
1 #include <DataSource/DataSourceItem.h>
2 #include <DataSource/DataSourceTreeWidgetItem.h>
3
4 #include <SqpApplication.h>
5
6 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
7
8 namespace {
9
10 QIcon itemIcon(const DataSourceItem *dataSource)
11 {
12 if (dataSource) {
13 auto dataSourceType = dataSource->type();
14 switch (dataSourceType) {
15 case DataSourceItemType::NODE:
16 return sqpApp->style()->standardIcon(QStyle::SP_DirIcon);
17 case DataSourceItemType::PRODUCT:
18 return sqpApp->style()->standardIcon(QStyle::SP_FileIcon);
19 default:
20 // No action
21 break;
22 }
23 }
24
25 // Default cases
26 return QIcon{};
27 }
28
29 } // namespace
30
31 struct DataSourceTreeWidgetItem::DataSourceTreeWidgetItemPrivate {
32 explicit DataSourceTreeWidgetItemPrivate(const DataSourceItem *data) : m_Data{data} {}
33
34 /// Model used to retrieve data source information
35 const DataSourceItem *m_Data;
36 };
37
38 DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(const DataSourceItem *data, int type)
39 : DataSourceTreeWidgetItem{nullptr, data, type}
40 {
41 }
42
43 DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(QTreeWidget *parent, const DataSourceItem *data,
44 int type)
45 : QTreeWidgetItem{parent, type},
46 impl{spimpl::make_unique_impl<DataSourceTreeWidgetItemPrivate>(data)}
47 {
48 // Sets the icon depending on the data source
49 setIcon(0, itemIcon(impl->m_Data));
50 }
51
52 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
53 {
54 if (role == Qt::DisplayRole) {
55 return (impl->m_Data) ? impl->m_Data->data(column) : QVariant{};
56 }
57 else {
58 return QTreeWidgetItem::data(column, role);
59 }
60 }
61
62 void DataSourceTreeWidgetItem::setData(int column, int role, const QVariant &value)
63 {
64 // Data can't be changed by edition
65 if (role != Qt::EditRole) {
66 QTreeWidgetItem::setData(column, role, value);
67 }
68 }
@@ -0,0 +1,61
1 #include <DataSource/DataSourceWidget.h>
2
3 #include <ui_DataSourceWidget.h>
4
5 #include <DataSource/DataSourceItem.h>
6 #include <DataSource/DataSourceTreeWidgetItem.h>
7
8 namespace {
9
10 /// Number of columns displayed in the tree
11 const auto TREE_NB_COLUMNS = 1;
12
13 /// Header labels for the tree
14 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
15
16 /**
17 * Creates the item associated to a data source
18 * @param dataSource the data source for which to create the item
19 * @return the new item
20 */
21 DataSourceTreeWidgetItem *createTreeWidgetItem(DataSourceItem *dataSource)
22 {
23 // Creates item for the data source
24 auto item = new DataSourceTreeWidgetItem{dataSource};
25
26 // Generates items for the children of the data source
27 for (auto i = 0; i < dataSource->childCount(); ++i) {
28 item->addChild(createTreeWidgetItem(dataSource->child(i)));
29 }
30
31 return item;
32 }
33
34 } // namespace
35
36 class DataSourceWidget::DataSourceWidgetPrivate {
37 public:
38 explicit DataSourceWidgetPrivate(DataSourceWidget &widget)
39 : m_Ui{std::make_unique<Ui::DataSourceWidget>()}
40 {
41 m_Ui->setupUi(&widget);
42
43 // Set tree properties
44 m_Ui->treeWidget->setColumnCount(TREE_NB_COLUMNS);
45 m_Ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS);
46 }
47
48 std::unique_ptr<Ui::DataSourceWidget> m_Ui;
49 };
50
51 DataSourceWidget::DataSourceWidget(QWidget *parent)
52 : QWidget{parent}, impl{spimpl::make_unique_impl<DataSourceWidgetPrivate>(*this)}
53 {
54 }
55
56 void DataSourceWidget::addDataSource(DataSourceItem &dataSource) noexcept
57 {
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
59 // takes the ownership of the item
60 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(&dataSource));
61 }
@@ -0,0 +1,24
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>DataSourceWidget</class>
4 <widget class="QWidget" name="DataSourceWidget">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>300</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Data sources</string>
15 </property>
16 <layout class="QGridLayout" name="gridLayout">
17 <item row="0" column="0">
18 <widget class="QTreeWidget" name="treeWidget"/>
19 </item>
20 </layout>
21 </widget>
22 <resources/>
23 <connections/>
24 </ui>
@@ -25,6 +25,16
25 #include <SqpApplication.h>
25 #include <SqpApplication.h>
26 #include <qglobal.h>
26 #include <qglobal.h>
27
27
28 #include <Plugin/PluginManager.h>
29 #include <QDir>
30
31 namespace {
32
33 /// Name of the directory containing the plugins
34 const auto PLUGIN_DIRECTORY_NAME = QStringLiteral("plugins");
35
36 } // namespace
37
28 int main(int argc, char *argv[])
38 int main(int argc, char *argv[])
29 {
39 {
30 SqpApplication a{argc, argv};
40 SqpApplication a{argc, argv};
@@ -34,5 +44,16 int main(int argc, char *argv[])
34 MainWindow w;
44 MainWindow w;
35 w.show();
45 w.show();
36
46
47 // Loads plugins
48 auto pluginDir = QDir{sqpApp->applicationDirPath()};
49 pluginDir.mkdir(PLUGIN_DIRECTORY_NAME);
50 pluginDir.cd(PLUGIN_DIRECTORY_NAME);
51
52 qCDebug(LOG_PluginManager())
53 << QObject::tr("Plugin directory: %1").arg(pluginDir.absolutePath());
54
55 PluginManager pluginManager{};
56 pluginManager.loadPlugins(pluginDir);
57
37 return a.exec();
58 return a.exec();
38 }
59 }
@@ -21,6 +21,11
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #include "MainWindow.h"
22 #include "MainWindow.h"
23 #include "ui_MainWindow.h"
23 #include "ui_MainWindow.h"
24
25 #include <DataSource/DataSourceController.h>
26 #include <DataSource/DataSourceWidget.h>
27 #include <SqpApplication.h>
28
24 #include <QAction>
29 #include <QAction>
25 #include <QDate>
30 #include <QDate>
26 #include <QDateTime>
31 #include <QDateTime>
@@ -57,6 +62,11 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_Ui(new Ui::Main
57 this->menuBar()->addAction("File");
62 this->menuBar()->addAction("File");
58 auto mainToolBar = this->addToolBar("MainToolBar");
63 auto mainToolBar = this->addToolBar("MainToolBar");
59 mainToolBar->addAction("A1");
64 mainToolBar->addAction("A1");
65
66 // Widgets / controllers connections
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem &)),
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem &)));
69
60 /* QLopGUI::registerMenuBar(menuBar());
70 /* QLopGUI::registerMenuBar(menuBar());
61 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
62 this->m_progressWidget = new QWidget();
72 this->m_progressWidget = new QWidget();
@@ -85,7 +85,7
85 <number>0</number>
85 <number>0</number>
86 </property>
86 </property>
87 <item>
87 <item>
88 <widget class="QWidget" name="dateSourceWidget" native="true"/>
88 <widget class="DataSourceWidget" name="dataSourceWidget" native="true"/>
89 </item>
89 </item>
90 <item>
90 <item>
91 <widget class="QWidget" name="dateTimeWidget" native="true"/>
91 <widget class="QWidget" name="dateTimeWidget" native="true"/>
@@ -202,6 +202,12
202 <header location="global">sidepane/SqpSidePane.h</header>
202 <header location="global">sidepane/SqpSidePane.h</header>
203 <container>1</container>
203 <container>1</container>
204 </customwidget>
204 </customwidget>
205 <customwidget>
206 <class>DataSourceWidget</class>
207 <extends>QWidget</extends>
208 <header location="global">DataSource/DataSourceWidget.h</header>
209 <container>1</container>
210 </customwidget>
205 </customwidgets>
211 </customwidgets>
206 <resources/>
212 <resources/>
207 <connections/>
213 <connections/>
@@ -49,7 +49,7 public slots:
49
49
50 signals:
50 signals:
51 /// Signal emitted when a structure has been set for a data source
51 /// Signal emitted when a structure has been set for a data source
52 void dataSourceItemSet(const DataSourceItem &dataSourceItem);
52 void dataSourceItemSet(DataSourceItem &dataSourceItem);
53
53
54 private:
54 private:
55 void waitForFinish();
55 void waitForFinish();
@@ -7,6 +7,11
7 #include <QVector>
7 #include <QVector>
8
8
9 /**
9 /**
10 * Possible types of an item
11 */
12 enum class DataSourceItemType { NODE, PRODUCT };
13
14 /**
10 * @brief The DataSourceItem class aims to represent a structure element of a data source.
15 * @brief The DataSourceItem class aims to represent a structure element of a data source.
11 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
16 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
12 * containing other DataSourceItem objects (children).
17 * containing other DataSourceItem objects (children).
@@ -14,7 +19,7
14 */
19 */
15 class DataSourceItem {
20 class DataSourceItem {
16 public:
21 public:
17 explicit DataSourceItem(QVector<QVariant> data = {});
22 explicit DataSourceItem(DataSourceItemType type, QVector<QVariant> data = {});
18
23
19 /**
24 /**
20 * Adds a child to the item. The item takes ownership of the child.
25 * Adds a child to the item. The item takes ownership of the child.
@@ -44,6 +49,8 public:
44 */
49 */
45 DataSourceItem *parentItem() const noexcept;
50 DataSourceItem *parentItem() const noexcept;
46
51
52 DataSourceItemType type() const noexcept;
53
47 private:
54 private:
48 class DataSourceItemPrivate;
55 class DataSourceItemPrivate;
49 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
56 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
@@ -3,18 +3,19
3 #include <QVector>
3 #include <QVector>
4
4
5 struct DataSourceItem::DataSourceItemPrivate {
5 struct DataSourceItem::DataSourceItemPrivate {
6 explicit DataSourceItemPrivate(QVector<QVariant> data)
6 explicit DataSourceItemPrivate(DataSourceItemType type, QVector<QVariant> data)
7 : m_Parent{nullptr}, m_Children{}, m_Data{std::move(data)}
7 : m_Parent{nullptr}, m_Children{}, m_Type{type}, m_Data{std::move(data)}
8 {
8 {
9 }
9 }
10
10
11 DataSourceItem *m_Parent;
11 DataSourceItem *m_Parent;
12 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
12 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
13 DataSourceItemType m_Type;
13 QVector<QVariant> m_Data;
14 QVector<QVariant> m_Data;
14 };
15 };
15
16
16 DataSourceItem::DataSourceItem(QVector<QVariant> data)
17 DataSourceItem::DataSourceItem(DataSourceItemType type, QVector<QVariant> data)
17 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(data)}
18 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(type, std::move(data))}
18 {
19 {
19 }
20 }
20
21
@@ -48,3 +49,8 DataSourceItem *DataSourceItem::parentItem() const noexcept
48 {
49 {
49 return impl->m_Parent;
50 return impl->m_Parent;
50 }
51 }
52
53 DataSourceItemType DataSourceItem::type() const noexcept
54 {
55 return impl->m_Type;
56 }
@@ -31,7 +31,8 void TestDataSourceController::testSetDataSourceItem()
31 // Create a data source item
31 // Create a data source item
32 auto source1Name = QStringLiteral("Source1");
32 auto source1Name = QStringLiteral("Source1");
33 auto source1Values = QVector<QVariant>{source1Name};
33 auto source1Values = QVector<QVariant>{source1Name};
34 auto source1Item = std::make_unique<DataSourceItem>(std::move(source1Values));
34 auto source1Item
35 = std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT, std::move(source1Values));
35
36
36 // Add data source item to the controller and check that a signal has been emitted after setting
37 // Add data source item to the controller and check that a signal has been emitted after setting
37 // data source item in the controller
38 // data source item in the controller
@@ -41,7 +42,8 void TestDataSourceController::testSetDataSourceItem()
41
42
42 // Try to a data source item with an unregistered uid and check that no signal has been emitted
43 // Try to a data source item with an unregistered uid and check that no signal has been emitted
43 auto unregisteredUid = QUuid::createUuid();
44 auto unregisteredUid = QUuid::createUuid();
44 dataSourceController.setDataSourceItem(unregisteredUid, std::make_unique<DataSourceItem>());
45 dataSourceController.setDataSourceItem(
46 unregisteredUid, std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT));
45 QCOMPARE(signalSpy.count(), 1);
47 QCOMPARE(signalSpy.count(), 1);
46 }
48 }
47
49
@@ -1,3 +1,6
1 # On ignore toutes les règles vera++ pour le fichier spimpl
1 # On ignore toutes les règles vera++ pour le fichier spimpl
2 Common/spimpl\.h:\d+:.*
2 Common/spimpl\.h:\d+:.*
3
3
4 # Ignore false positive relative to two class definitions in a same file
5 DataSourceItem\.h:\d+:.*IPSIS_S01.*
6
@@ -6,3 +6,7
6 # Ignore false positive relative to 'noexcept' keyword
6 # Ignore false positive relative to 'noexcept' keyword
7 .*IPSIS_S04_VARIABLE.*found: noexcept
7 .*IPSIS_S04_VARIABLE.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
9
10 # Ignore false positive relative to 'override' keyword
11 .*IPSIS_S04_VARIABLE.*found: override
12 .*IPSIS_S06.*found: override
@@ -1,8 +1,11
1 # Ignore false positive relative to App macro
2 \.h:\d+:.IPSIS_S04.*found: ui
1 \.h:\d+:.IPSIS_S04.*found: ui
3 qcustomplot\.h:\d+:.IPSIS
2 qcustomplot\.h:\d+:.IPSIS
4 qcustomplot\.cpp:\d+:.IPSIS
3 qcustomplot\.cpp:\d+:.IPSIS
4
5 # Ignore false positive relative to App macro
5 SqpApplication\.h:\d+:.IPSIS_S03.*found: sqpApp
6 SqpApplication\.h:\d+:.IPSIS_S03.*found: sqpApp
6 SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp
7 SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp
7
8
9 # Ignore false positive relative to unnamed namespace
10 DataSourceTreeWidgetItem\.cpp:\d+:.*IPSIS_F13.*
8
11
@@ -1,3 +1,6
1 # On ignore toutes les règles vera++ pour le fichier spimpl
1 # On ignore toutes les règles vera++ pour le fichier spimpl
2 Common/spimpl\.h:\d+:.*
2 Common/spimpl\.h:\d+:.*
3
3
4 # Ignore false positive relative to two class definitions in a same file
5 DataSourceItem\.h:\d+:.*IPSIS_S01.*
6
@@ -6,3 +6,7
6 # Ignore false positive relative to 'noexcept' keyword
6 # Ignore false positive relative to 'noexcept' keyword
7 .*IPSIS_S04_VARIABLE.*found: noexcept
7 .*IPSIS_S04_VARIABLE.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
9
10 # Ignore false positive relative to 'override' keyword
11 .*IPSIS_S04_VARIABLE.*found: override
12 .*IPSIS_S06.*found: override
@@ -1,8 +1,11
1 # Ignore false positive relative to App macro
2 \.h:\d+:.IPSIS_S04.*found: ui
1 \.h:\d+:.IPSIS_S04.*found: ui
3 qcustomplot\.h:\d+:.IPSIS
2 qcustomplot\.h:\d+:.IPSIS
4 qcustomplot\.cpp:\d+:.IPSIS
3 qcustomplot\.cpp:\d+:.IPSIS
4
5 # Ignore false positive relative to App macro
5 SqpApplication\.h:\d+:.IPSIS_S03.*found: sqpApp
6 SqpApplication\.h:\d+:.IPSIS_S03.*found: sqpApp
6 SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp
7 SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp
7
8
9 # Ignore false positive relative to unnamed namespace
10 DataSourceTreeWidgetItem\.cpp:\d+:.*IPSIS_F13.*
8
11
@@ -25,6 +25,16
25 #include <SqpApplication.h>
25 #include <SqpApplication.h>
26 #include <qglobal.h>
26 #include <qglobal.h>
27
27
28 #include <Plugin/PluginManager.h>
29 #include <QDir>
30
31 namespace {
32
33 /// Name of the directory containing the plugins
34 const auto PLUGIN_DIRECTORY_NAME = QStringLiteral("plugins");
35
36 } // namespace
37
28 int main(int argc, char *argv[])
38 int main(int argc, char *argv[])
29 {
39 {
30 SqpApplication a{argc, argv};
40 SqpApplication a{argc, argv};
@@ -34,5 +44,16 int main(int argc, char *argv[])
34 MainWindow w;
44 MainWindow w;
35 w.show();
45 w.show();
36
46
47 // Loads plugins
48 auto pluginDir = QDir{sqpApp->applicationDirPath()};
49 pluginDir.mkdir(PLUGIN_DIRECTORY_NAME);
50 pluginDir.cd(PLUGIN_DIRECTORY_NAME);
51
52 qCDebug(LOG_PluginManager())
53 << QObject::tr("Plugin directory: %1").arg(pluginDir.absolutePath());
54
55 PluginManager pluginManager{};
56 pluginManager.loadPlugins(pluginDir);
57
37 return a.exec();
58 return a.exec();
38 }
59 }
@@ -21,6 +21,11
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #include "MainWindow.h"
22 #include "MainWindow.h"
23 #include "ui_MainWindow.h"
23 #include "ui_MainWindow.h"
24
25 #include <DataSource/DataSourceController.h>
26 #include <DataSource/DataSourceWidget.h>
27 #include <SqpApplication.h>
28
24 #include <QAction>
29 #include <QAction>
25 #include <QDate>
30 #include <QDate>
26 #include <QDateTime>
31 #include <QDateTime>
@@ -57,6 +62,11 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_Ui(new Ui::Main
57 this->menuBar()->addAction("File");
62 this->menuBar()->addAction("File");
58 auto mainToolBar = this->addToolBar("MainToolBar");
63 auto mainToolBar = this->addToolBar("MainToolBar");
59 mainToolBar->addAction("A1");
64 mainToolBar->addAction("A1");
65
66 // Widgets / controllers connections
67 connect(&sqpApp->dataSourceController(), SIGNAL(dataSourceItemSet(DataSourceItem &)),
68 m_Ui->dataSourceWidget, SLOT(addDataSource(DataSourceItem &)));
69
60 /* QLopGUI::registerMenuBar(menuBar());
70 /* QLopGUI::registerMenuBar(menuBar());
61 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
71 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
62 this->m_progressWidget = new QWidget();
72 this->m_progressWidget = new QWidget();
@@ -49,7 +49,7 public slots:
49
49
50 signals:
50 signals:
51 /// Signal emitted when a structure has been set for a data source
51 /// Signal emitted when a structure has been set for a data source
52 void dataSourceItemSet(const DataSourceItem &dataSourceItem);
52 void dataSourceItemSet(DataSourceItem &dataSourceItem);
53
53
54 private:
54 private:
55 void waitForFinish();
55 void waitForFinish();
@@ -17,6 +17,14 class DataSourceWidget : public QWidget {
17 public:
17 public:
18 explicit DataSourceWidget(QWidget *parent = 0);
18 explicit DataSourceWidget(QWidget *parent = 0);
19
19
20 public slots:
21 /**
22 * Adds a data source. An item associated to the data source is created and then added to the
23 * representation tree
24 * @param dataSource the data source to add
25 */
26 void addDataSource(DataSourceItem &dataSource) noexcept;
27
20 private:
28 private:
21 class DataSourceWidgetPrivate;
29 class DataSourceWidgetPrivate;
22 spimpl::unique_impl_ptr<DataSourceWidgetPrivate> impl;
30 spimpl::unique_impl_ptr<DataSourceWidgetPrivate> impl;
@@ -13,6 +13,24 const auto TREE_NB_COLUMNS = 1;
13 /// Header labels for the tree
13 /// Header labels for the tree
14 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
14 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
15
15
16 /**
17 * Creates the item associated to a data source
18 * @param dataSource the data source for which to create the item
19 * @return the new item
20 */
21 DataSourceTreeWidgetItem *createTreeWidgetItem(DataSourceItem *dataSource)
22 {
23 // Creates item for the data source
24 auto item = new DataSourceTreeWidgetItem{dataSource};
25
26 // Generates items for the children of the data source
27 for (auto i = 0; i < dataSource->childCount(); ++i) {
28 item->addChild(createTreeWidgetItem(dataSource->child(i)));
29 }
30
31 return item;
32 }
33
16 } // namespace
34 } // namespace
17
35
18 class DataSourceWidget::DataSourceWidgetPrivate {
36 class DataSourceWidget::DataSourceWidgetPrivate {
@@ -34,3 +52,10 DataSourceWidget::DataSourceWidget(QWidget *parent)
34 : QWidget{parent}, impl{spimpl::make_unique_impl<DataSourceWidgetPrivate>(*this)}
52 : QWidget{parent}, impl{spimpl::make_unique_impl<DataSourceWidgetPrivate>(*this)}
35 {
53 {
36 }
54 }
55
56 void DataSourceWidget::addDataSource(DataSourceItem &dataSource) noexcept
57 {
58 // Creates the item associated to the source and adds it to the tree widget. The tree widget
59 // takes the ownership of the item
60 impl->m_Ui->treeWidget->addTopLevelItem(createTreeWidgetItem(&dataSource));
61 }
@@ -0,0 +1,25
1 #ifndef SCIQLOP_DATASOURCEWIDGET_H
2 #define SCIQLOP_DATASOURCEWIDGET_H
3
4 #include <Common/spimpl.h>
5
6 #include <QWidget>
7
8 class DataSourceItem;
9
10 /**
11 * @brief The DataSourceWidget handles the graphical representation (as a tree) of the data sources
12 * attached to SciQlop.
13 */
14 class DataSourceWidget : public QWidget {
15 Q_OBJECT
16
17 public:
18 explicit DataSourceWidget(QWidget *parent = 0);
19
20 private:
21 class DataSourceWidgetPrivate;
22 spimpl::unique_impl_ptr<DataSourceWidgetPrivate> impl;
23 };
24
25 #endif // SCIQLOP_DATASOURCEWIDGET_H
@@ -0,0 +1,36
1 #include <DataSource/DataSourceWidget.h>
2
3 #include <ui_DataSourceWidget.h>
4
5 #include <DataSource/DataSourceItem.h>
6 #include <DataSource/DataSourceTreeWidgetItem.h>
7
8 namespace {
9
10 /// Number of columns displayed in the tree
11 const auto TREE_NB_COLUMNS = 1;
12
13 /// Header labels for the tree
14 const auto TREE_HEADER_LABELS = QStringList{QObject::tr("Name")};
15
16 } // namespace
17
18 class DataSourceWidget::DataSourceWidgetPrivate {
19 public:
20 explicit DataSourceWidgetPrivate(DataSourceWidget &widget)
21 : m_Ui{std::make_unique<Ui::DataSourceWidget>()}
22 {
23 m_Ui->setupUi(&widget);
24
25 // Set tree properties
26 m_Ui->treeWidget->setColumnCount(TREE_NB_COLUMNS);
27 m_Ui->treeWidget->setHeaderLabels(TREE_HEADER_LABELS);
28 }
29
30 std::unique_ptr<Ui::DataSourceWidget> m_Ui;
31 };
32
33 DataSourceWidget::DataSourceWidget(QWidget *parent)
34 : QWidget{parent}, impl{spimpl::make_unique_impl<DataSourceWidgetPrivate>(*this)}
35 {
36 }
@@ -0,0 +1,24
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>DataSourceWidget</class>
4 <widget class="QWidget" name="DataSourceWidget">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>300</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Data sources</string>
15 </property>
16 <layout class="QGridLayout" name="gridLayout">
17 <item row="0" column="0">
18 <widget class="QTreeWidget" name="treeWidget"/>
19 </item>
20 </layout>
21 </widget>
22 <resources/>
23 <connections/>
24 </ui>
@@ -85,7 +85,7
85 <number>0</number>
85 <number>0</number>
86 </property>
86 </property>
87 <item>
87 <item>
88 <widget class="QWidget" name="dateSourceWidget" native="true"/>
88 <widget class="DataSourceWidget" name="dataSourceWidget" native="true"/>
89 </item>
89 </item>
90 <item>
90 <item>
91 <widget class="QWidget" name="dateTimeWidget" native="true"/>
91 <widget class="QWidget" name="dateTimeWidget" native="true"/>
@@ -202,6 +202,12
202 <header location="global">sidepane/SqpSidePane.h</header>
202 <header location="global">sidepane/SqpSidePane.h</header>
203 <container>1</container>
203 <container>1</container>
204 </customwidget>
204 </customwidget>
205 <customwidget>
206 <class>DataSourceWidget</class>
207 <extends>QWidget</extends>
208 <header location="global">DataSource/DataSourceWidget.h</header>
209 <container>1</container>
210 </customwidget>
205 </customwidgets>
211 </customwidgets>
206 <resources/>
212 <resources/>
207 <connections/>
213 <connections/>
@@ -1,8 +1,33
1 #include <DataSource/DataSourceItem.h>
1 #include <DataSource/DataSourceItem.h>
2 #include <DataSource/DataSourceTreeWidgetItem.h>
2 #include <DataSource/DataSourceTreeWidgetItem.h>
3
3
4 #include <SqpApplication.h>
5
4 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
6 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
5
7
8 namespace {
9
10 QIcon itemIcon(const DataSourceItem *dataSource)
11 {
12 if (dataSource) {
13 auto dataSourceType = dataSource->type();
14 switch (dataSourceType) {
15 case DataSourceItemType::NODE:
16 return sqpApp->style()->standardIcon(QStyle::SP_DirIcon);
17 case DataSourceItemType::PRODUCT:
18 return sqpApp->style()->standardIcon(QStyle::SP_FileIcon);
19 default:
20 // No action
21 break;
22 }
23 }
24
25 // Default cases
26 return QIcon{};
27 }
28
29 } // namespace
30
6 struct DataSourceTreeWidgetItem::DataSourceTreeWidgetItemPrivate {
31 struct DataSourceTreeWidgetItem::DataSourceTreeWidgetItemPrivate {
7 explicit DataSourceTreeWidgetItemPrivate(const DataSourceItem *data) : m_Data{data} {}
32 explicit DataSourceTreeWidgetItemPrivate(const DataSourceItem *data) : m_Data{data} {}
8
33
@@ -20,6 +45,8 DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(QTreeWidget *parent, const Da
20 : QTreeWidgetItem{parent, type},
45 : QTreeWidgetItem{parent, type},
21 impl{spimpl::make_unique_impl<DataSourceTreeWidgetItemPrivate>(data)}
46 impl{spimpl::make_unique_impl<DataSourceTreeWidgetItemPrivate>(data)}
22 {
47 {
48 // Sets the icon depending on the data source
49 setIcon(0, itemIcon(impl->m_Data));
23 }
50 }
24
51
25 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
52 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
@@ -0,0 +1,32
1 #ifndef SCIQLOP_DATASOURCETREEWIDGETITEM_H
2 #define SCIQLOP_DATASOURCETREEWIDGETITEM_H
3
4 #include <Common/spimpl.h>
5
6 #include <QLoggingCategory>
7 #include <QTreeWidgetItem>
8
9 Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem)
10
11 class DataSourceItem;
12
13 /**
14 * @brief The DataSourceTreeWidgetItem is the graphical representation of a data source item. It is
15 * intended to be displayed in a QTreeWidget.
16 * @sa DataSourceItem
17 */
18 class DataSourceTreeWidgetItem : public QTreeWidgetItem {
19 public:
20 explicit DataSourceTreeWidgetItem(const DataSourceItem *data, int type = Type);
21 explicit DataSourceTreeWidgetItem(QTreeWidget *parent, const DataSourceItem *data,
22 int type = Type);
23
24 virtual QVariant data(int column, int role) const override;
25 virtual void setData(int column, int role, const QVariant &value) override;
26
27 private:
28 class DataSourceTreeWidgetItemPrivate;
29 spimpl::unique_impl_ptr<DataSourceTreeWidgetItemPrivate> impl;
30 };
31
32 #endif // SCIQLOP_DATASOURCETREEWIDGETITEM_H
@@ -0,0 +1,41
1 #include <DataSource/DataSourceItem.h>
2 #include <DataSource/DataSourceTreeWidgetItem.h>
3
4 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
5
6 struct DataSourceTreeWidgetItem::DataSourceTreeWidgetItemPrivate {
7 explicit DataSourceTreeWidgetItemPrivate(const DataSourceItem *data) : m_Data{data} {}
8
9 /// Model used to retrieve data source information
10 const DataSourceItem *m_Data;
11 };
12
13 DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(const DataSourceItem *data, int type)
14 : DataSourceTreeWidgetItem{nullptr, data, type}
15 {
16 }
17
18 DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(QTreeWidget *parent, const DataSourceItem *data,
19 int type)
20 : QTreeWidgetItem{parent, type},
21 impl{spimpl::make_unique_impl<DataSourceTreeWidgetItemPrivate>(data)}
22 {
23 }
24
25 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
26 {
27 if (role == Qt::DisplayRole) {
28 return (impl->m_Data) ? impl->m_Data->data(column) : QVariant{};
29 }
30 else {
31 return QTreeWidgetItem::data(column, role);
32 }
33 }
34
35 void DataSourceTreeWidgetItem::setData(int column, int role, const QVariant &value)
36 {
37 // Data can't be changed by edition
38 if (role != Qt::EditRole) {
39 QTreeWidgetItem::setData(column, role, value);
40 }
41 }
@@ -7,6 +7,11
7 #include <QVector>
7 #include <QVector>
8
8
9 /**
9 /**
10 * Possible types of an item
11 */
12 enum class DataSourceItemType { NODE, PRODUCT };
13
14 /**
10 * @brief The DataSourceItem class aims to represent a structure element of a data source.
15 * @brief The DataSourceItem class aims to represent a structure element of a data source.
11 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
16 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
12 * containing other DataSourceItem objects (children).
17 * containing other DataSourceItem objects (children).
@@ -14,7 +19,7
14 */
19 */
15 class DataSourceItem {
20 class DataSourceItem {
16 public:
21 public:
17 explicit DataSourceItem(QVector<QVariant> data = {});
22 explicit DataSourceItem(DataSourceItemType type, QVector<QVariant> data = {});
18
23
19 /**
24 /**
20 * Adds a child to the item. The item takes ownership of the child.
25 * Adds a child to the item. The item takes ownership of the child.
@@ -44,6 +49,8 public:
44 */
49 */
45 DataSourceItem *parentItem() const noexcept;
50 DataSourceItem *parentItem() const noexcept;
46
51
52 DataSourceItemType type() const noexcept;
53
47 private:
54 private:
48 class DataSourceItemPrivate;
55 class DataSourceItemPrivate;
49 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
56 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
@@ -3,18 +3,19
3 #include <QVector>
3 #include <QVector>
4
4
5 struct DataSourceItem::DataSourceItemPrivate {
5 struct DataSourceItem::DataSourceItemPrivate {
6 explicit DataSourceItemPrivate(QVector<QVariant> data)
6 explicit DataSourceItemPrivate(DataSourceItemType type, QVector<QVariant> data)
7 : m_Parent{nullptr}, m_Children{}, m_Data{std::move(data)}
7 : m_Parent{nullptr}, m_Children{}, m_Type{type}, m_Data{std::move(data)}
8 {
8 {
9 }
9 }
10
10
11 DataSourceItem *m_Parent;
11 DataSourceItem *m_Parent;
12 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
12 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
13 DataSourceItemType m_Type;
13 QVector<QVariant> m_Data;
14 QVector<QVariant> m_Data;
14 };
15 };
15
16
16 DataSourceItem::DataSourceItem(QVector<QVariant> data)
17 DataSourceItem::DataSourceItem(DataSourceItemType type, QVector<QVariant> data)
17 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(data)}
18 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(type, std::move(data))}
18 {
19 {
19 }
20 }
20
21
@@ -48,3 +49,8 DataSourceItem *DataSourceItem::parentItem() const noexcept
48 {
49 {
49 return impl->m_Parent;
50 return impl->m_Parent;
50 }
51 }
52
53 DataSourceItemType DataSourceItem::type() const noexcept
54 {
55 return impl->m_Type;
56 }
@@ -31,7 +31,8 void TestDataSourceController::testSetDataSourceItem()
31 // Create a data source item
31 // Create a data source item
32 auto source1Name = QStringLiteral("Source1");
32 auto source1Name = QStringLiteral("Source1");
33 auto source1Values = QVector<QVariant>{source1Name};
33 auto source1Values = QVector<QVariant>{source1Name};
34 auto source1Item = std::make_unique<DataSourceItem>(std::move(source1Values));
34 auto source1Item
35 = std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT, std::move(source1Values));
35
36
36 // Add data source item to the controller and check that a signal has been emitted after setting
37 // Add data source item to the controller and check that a signal has been emitted after setting
37 // data source item in the controller
38 // data source item in the controller
@@ -41,7 +42,8 void TestDataSourceController::testSetDataSourceItem()
41
42
42 // Try to a data source item with an unregistered uid and check that no signal has been emitted
43 // Try to a data source item with an unregistered uid and check that no signal has been emitted
43 auto unregisteredUid = QUuid::createUuid();
44 auto unregisteredUid = QUuid::createUuid();
44 dataSourceController.setDataSourceItem(unregisteredUid, std::make_unique<DataSourceItem>());
45 dataSourceController.setDataSourceItem(
46 unregisteredUid, std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT));
45 QCOMPARE(signalSpy.count(), 1);
47 QCOMPARE(signalSpy.count(), 1);
46 }
48 }
47
49
General Comments 3
there is 1 general comment from older versions, show it
Under Review
author

Pull request updated. Auto status change to "Under Review"

Changed commits:
  * 6 added
  * 3 removed

Changed files:
  * A gui/src/Visualization/VisualizationWidget.cpp
  * A gui/include/SidePane/SqpSidePane.h
  * A gui/include/Visualization/VisualizationGraphWidget.h
  * A gui/include/Visualization/VisualizationTabWidget.h
  * A gui/include/Visualization/VisualizationWidget.h
  * A gui/include/Visualization/VisualizationZoneWidget.h
  * A gui/include/Visualization/qcustomplot.h
  * A gui/src/SidePane/SqpSidePane.cpp
  * A gui/src/Visualization/VisualizationGraphWidget.cpp
  * A gui/src/Visualization/VisualizationTabWidget.cpp
  * A gui/src/Visualization/VisualizationZoneWidget.cpp
  * A gui/src/Visualization/qcustomplot.cpp
  * M gui/include/DataSource/DataSourceWidget.h
  * M gui/src/DataSource/DataSourceTreeWidgetItem.cpp
  * M gui/src/DataSource/DataSourceWidget.cpp
  * M app/src/Main.cpp
  * M app/src/MainWindow.cpp
  * M app/ui/MainWindow.ui
  * M core/include/DataSource/DataSourceController.h
  * M core/src/DataSource/DataSourceController.cpp
  * M core/tests/DataSource/TestDataSourceController.cpp
  * M gui/ui/visualization/VisualizationWidget.ui
  * M gui/vera-exclusions/exclusions.txt
  * M gui/src/visualization/VisualizationWidget.cpp
  * R cmake/sciqlop_package_qt.cmake
  * R core/include/Plugin/PluginManager.h
  * R core/include/Visualization/VisualizationController.h
  * R core/src/Plugin/PluginManager.cpp
  * R core/src/Visualization/VisualizationController.cpp
  * R gui/include/sidepane/SqpSidePane.h
  * R gui/include/visualization/VisualizationGraphWidget.h
  * R gui/include/visualization/VisualizationTabWidget.h
  * R gui/include/visualization/VisualizationWidget.h
  * R gui/include/visualization/VisualizationZoneWidget.h
  * R gui/include/visualization/qcustomplot.h
  * R gui/src/sidepane/SqpSidePane.cpp
  * R gui/src/visualization/VisualizationGraphWidget.cpp
  * R gui/src/visualization/VisualizationTabWidget.cpp
  * R gui/src/visualization/VisualizationZoneWidget.cpp
  * R gui/src/visualization/qcustomplot.cpp
  * R gui/ui/sidepane/SqpSidePane.ui
  * R gui/ui/visualization/VisualizationGraphWidget.ui
  * R gui/ui/visualization/VisualizationTabWidget.ui
  * R gui/ui/visualization/VisualizationZoneWidget.ui
  * R plugin/CMakeLists.txt
  * R plugin/cmake/Findsciqlop-plugin.cmake
  * R plugin/include/Plugin/IPlugin.h
  * R app/CMakeLists.txt
  * R app/include/MainWindow.h
  * R app/vera-exclusions/exclusions.txt
  * R cmake/sciqlop_applications.cmake
  * R core/CMakeLists.txt
  * R core/include/Common/spimpl.h
  * R gui/CMakeLists.txt
  * R gui/include/SqpApplication.h
  * R gui/src/SqpApplication.cpp
  * R app/src/mainwindow.ui
Approved
author

Status change > Approved