##// END OF EJS Templates
Some progress on new Catalogue GUI, can display most of items, still lack edition and link to SciQLop...
jeandet -
r1408:45ab63a4480c
parent child
Show More
@@ -0,0 +1,27
1 #ifndef BROWSER_H
2 #define BROWSER_H
3
4 #include <QWidget>
5 #include <Catalogue/CatalogueController.h>
6
7 namespace Ui {
8 class Browser;
9 }
10
11 class Browser : public QWidget
12 {
13 Q_OBJECT
14
15 public:
16 explicit Browser(QWidget *parent = nullptr);
17 ~Browser();
18 private slots:
19 void repositorySelected(const QString& repo);
20 void catalogueSelected(const CatalogueController::Catalogue_ptr& catalogue);
21 void eventSelected(const CatalogueController::Event_ptr& event);
22 void productSelected(const CatalogueController::Product_t& product, const CatalogueController::Event_ptr& event);
23 private:
24 Ui::Browser *ui;
25 };
26
27 #endif // BROWSER_H
@@ -0,0 +1,37
1 #ifndef EVENTEDITOR_H
2 #define EVENTEDITOR_H
3
4 #include <QWidget>
5 #include <Catalogue/CatalogueController.h>
6
7 namespace Ui {
8 class EventEditor;
9 }
10
11 class EventEditor : public QWidget
12 {
13 Q_OBJECT
14 enum class mode{
15 editable = true,
16 readonly = false
17 };
18
19 public:
20 explicit EventEditor(QWidget *parent = nullptr);
21 ~EventEditor();
22
23 public slots:
24 void setEvent(const CatalogueController::Event_ptr& event);
25 void setProduct(const CatalogueController::Product_t& product, const CatalogueController::Event_ptr& event);
26
27 private:
28 void _setEventName(const CatalogueController::Event_ptr& event, mode is_editable=mode::editable);
29 void _setTags(const CatalogueController::Event_ptr& event,mode is_editable=mode::editable);
30 void _setProducts(const CatalogueController::Event_ptr& event,mode is_editable=mode::editable);
31 void _setProducts(const CatalogueController::Product_t& product,mode is_editable=mode::editable);
32 void _setDates(double startDate, double stopDate, mode is_editable=mode::editable);
33 void _setDates(std::optional<double> startDate, std::optional<double> stopDate, mode is_editable=mode::editable);
34 Ui::EventEditor *ui;
35 };
36
37 #endif // EVENTEDITOR_H
@@ -0,0 +1,50
1 #include "Catalogue2/browser.h"
2 #include "ui_browser.h"
3 #include <SqpApplication.h>
4
5 Browser::Browser(QWidget* parent) : QWidget(parent), ui(new Ui::Browser)
6 {
7 ui->setupUi(this);
8 connect(ui->repositories, &RepositoriesTreeView::repositorySelected, this,
9 &Browser::repositorySelected);
10 connect(ui->repositories, &RepositoriesTreeView::catalogueSelected, this,
11 &Browser::catalogueSelected);
12 connect(ui->events, &EventsTreeView::eventSelected, this, &Browser::eventSelected);
13 connect(ui->events, &EventsTreeView::productSelected, this, &Browser::productSelected);
14 }
15
16 Browser::~Browser()
17 {
18 delete ui;
19 }
20
21 void Browser::repositorySelected(const QString& repo)
22 {
23 this->ui->Infos->setCurrentIndex(0);
24 this->ui->events->setEvents(sqpApp->catalogueController().events(repo));
25 // TODO add a statistic API
26 this->ui->catalogues_count->setText(
27 QString::number(sqpApp->catalogueController().catalogues(repo).size()));
28 this->ui->rep_events_count->setText(
29 QString::number(sqpApp->catalogueController().events(repo).size()));
30 }
31
32 void Browser::catalogueSelected(const CatalogueController::Catalogue_ptr& catalogue)
33 {
34 this->ui->Infos->setCurrentIndex(1);
35 this->ui->events->setEvents(sqpApp->catalogueController().events(catalogue));
36 this->ui->cat_events_count->setText(
37 QString::number(sqpApp->catalogueController().events(catalogue).size()));
38 }
39
40 void Browser::eventSelected(const CatalogueController::Event_ptr& event)
41 {
42 this->ui->Infos->setCurrentIndex(2);
43 this->ui->Event->setEvent(event);
44 }
45
46 void Browser::productSelected(const CatalogueController::Product_t& product, const CatalogueController::Event_ptr& event)
47 {
48 this->ui->Infos->setCurrentIndex(2);
49 this->ui->Event->setProduct(product,event);
50 }
@@ -0,0 +1,74
1 #include "Catalogue2/eventeditor.h"
2 #include "ui_eventeditor.h"
3 #include <Common/DateUtils.h>
4 #include <Common/StringUtils.h>
5
6 EventEditor::EventEditor(QWidget* parent) : QWidget(parent), ui(new Ui::EventEditor)
7 {
8 ui->setupUi(this);
9 }
10
11 EventEditor::~EventEditor()
12 {
13 delete ui;
14 }
15
16 void EventEditor::setEvent(const CatalogueController::Event_ptr& event)
17 {
18 _setEventName(event, mode::editable);
19 _setTags(event, mode::readonly);
20 _setProducts(event, mode::readonly);
21 _setDates(event->startTime(), event->stopTime(), mode::readonly);
22 }
23
24 void EventEditor::setProduct(
25 const CatalogueController::Product_t& product, const CatalogueController::Event_ptr& event)
26 {
27 _setEventName(event, mode::readonly);
28 _setTags(event, mode::readonly);
29 _setDates(product.startTime, product.stopTime, mode::editable);
30 _setProducts(product, mode::readonly);
31 }
32
33 void EventEditor::_setEventName(const CatalogueController::Event_ptr& event, mode is_editable)
34 {
35 this->ui->EventName->setText(QString::fromStdString(event->name));
36 this->ui->EventName->setEnabled(bool(is_editable));
37 }
38
39 void EventEditor::_setTags(const CatalogueController::Event_ptr& event, mode is_editable)
40 {
41 this->ui->Tags->setText(StringUtils::join(event->tags, ", "));
42 this->ui->Tags->setEnabled(bool(is_editable));
43 }
44
45 void EventEditor::_setProducts(const CatalogueController::Event_ptr& event, mode is_editable)
46 {
47 QStringList products;
48 this->ui->Products->setText(StringUtils::join(event->products, ", ",
49 [](const auto& product) { return QString::fromStdString(product.name); }));
50 this->ui->Products->setEnabled(bool(is_editable));
51 }
52
53 void EventEditor::_setProducts(const CatalogueController::Product_t& product, mode is_editable)
54 {
55 this->ui->Products->setText(QString::fromStdString(product.name));
56 this->ui->Products->setEnabled(bool(is_editable));
57 }
58
59 void EventEditor::_setDates(double startDate, double stopDate, mode is_editable)
60 {
61 this->ui->StartTime->setDateTime(DateUtils::dateTime(startDate));
62 this->ui->StopTime->setDateTime(DateUtils::dateTime(stopDate));
63 this->ui->StartTime->setEnabled(bool(is_editable));
64 this->ui->StopTime->setEnabled(bool(is_editable));
65 }
66
67 void EventEditor::_setDates(
68 std::optional<double> startDate, std::optional<double> stopDate, mode is_editable)
69 {
70 if (startDate && stopDate)
71 _setDates(*startDate, *stopDate, is_editable);
72 else
73 _setDates(0., 0., is_editable);
74 }
@@ -0,0 +1,70
1 #include <QMainWindow>
2 #include <QObject>
3 #include <QScreen>
4 #include <QString>
5 #include <QWheelEvent>
6 #include <QtTest>
7
8
9 #include <Common/cpp_utils.h>
10 #include <SqpApplication.h>
11
12 #include <GUITestUtils.h>
13 #include <TestProviders.h>
14
15 #include <Catalogue/CatalogueController.h>
16 #include <Catalogue2/browser.h>
17
18
19 class A_CatalogueBrowser : public QObject
20 {
21 Q_OBJECT
22 public:
23 explicit A_CatalogueBrowser(QObject* parent = Q_NULLPTR) : QObject(parent) {}
24
25 private slots:
26 };
27
28 // QT_BEGIN_NAMESPACE
29 // QTEST_ADD_GPU_BLACKLIST_SUPPORT_DEFS
30 // QT_END_NAMESPACE
31 // int main(int argc, char* argv[])
32 //{
33 // SqpApplication app { argc, argv };
34 // app.setAttribute(Qt::AA_Use96Dpi, true);
35 // QTEST_DISABLE_KEYPAD_NAVIGATION;
36 // QTEST_ADD_GPU_BLACKLIST_SUPPORT;
37 // An_EventList tc;
38 // QTEST_SET_MAIN_SOURCE_PATH;
39 // return QTest::qExec(&tc, argc, argv);
40 //}
41
42 #include "main.moc"
43
44
45 int main(int argc, char* argv[])
46 {
47 Q_INIT_RESOURCE(sqpguiresources);
48 QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
49
50 SqpApplication a { argc, argv };
51 Browser w;
52 sqpApp->catalogueController().add("test");
53 sqpApp->catalogueController().add("stuff");
54 sqpApp->catalogueController().add("default");
55 sqpApp->catalogueController().add("new catalogue", "default");
56 auto catalogue = sqpApp->catalogueController().add("new catalogue2", "default");
57 for (auto _ : std::array<char, 1000>())
58 {
59 static int i = 0;
60 auto event = CatalogueController::make_event_ptr();
61 event->name = std::string("Event ") + std::to_string(i++);
62 event->tags = {"tag1", "tag2"};
63 event->products = { CatalogueController::Event_t::Product_t { "Product1", 10., 11. },
64 CatalogueController::Event_t::Product_t { "Product2", 11., 12. },
65 CatalogueController::Event_t::Product_t { "Product3", 10.2, 11. } };
66 catalogue->add(event);
67 }
68 w.show();
69 return a.exec();
70 }
@@ -0,0 +1,218
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>Browser</class>
4 <widget class="QWidget" name="Browser">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>708</width>
10 <height>461</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Catalogues Browser</string>
15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout_4">
17 <item>
18 <widget class="QSplitter" name="splitter">
19 <property name="orientation">
20 <enum>Qt::Horizontal</enum>
21 </property>
22 <widget class="RepositoriesTreeView" name="repositories">
23 <property name="sizePolicy">
24 <sizepolicy hsizetype="Maximum" vsizetype="Expanding">
25 <horstretch>1</horstretch>
26 <verstretch>0</verstretch>
27 </sizepolicy>
28 </property>
29 <property name="rootIsDecorated">
30 <bool>true</bool>
31 </property>
32 <property name="animated">
33 <bool>true</bool>
34 </property>
35 <property name="headerHidden">
36 <bool>true</bool>
37 </property>
38 <attribute name="headerStretchLastSection">
39 <bool>false</bool>
40 </attribute>
41 </widget>
42 <widget class="QWidget" name="rightPane" native="true">
43 <property name="sizePolicy">
44 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
45 <horstretch>3</horstretch>
46 <verstretch>0</verstretch>
47 </sizepolicy>
48 </property>
49 <layout class="QVBoxLayout" name="verticalLayout">
50 <item>
51 <widget class="EventsTreeView" name="events">
52 <property name="sizePolicy">
53 <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
54 <horstretch>0</horstretch>
55 <verstretch>0</verstretch>
56 </sizepolicy>
57 </property>
58 </widget>
59 </item>
60 <item>
61 <widget class="QStackedWidget" name="Infos">
62 <property name="sizePolicy">
63 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
64 <horstretch>0</horstretch>
65 <verstretch>0</verstretch>
66 </sizepolicy>
67 </property>
68 <property name="currentIndex">
69 <number>2</number>
70 </property>
71 <widget class="QWidget" name="Repository">
72 <property name="sizePolicy">
73 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
74 <horstretch>0</horstretch>
75 <verstretch>0</verstretch>
76 </sizepolicy>
77 </property>
78 <layout class="QVBoxLayout" name="verticalLayout_2">
79 <item>
80 <widget class="QGroupBox" name="groupBox">
81 <property name="sizePolicy">
82 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
83 <horstretch>0</horstretch>
84 <verstretch>0</verstretch>
85 </sizepolicy>
86 </property>
87 <property name="title">
88 <string>Repository information</string>
89 </property>
90 <layout class="QGridLayout" name="gridLayout">
91 <item row="0" column="1">
92 <layout class="QFormLayout" name="formLayout">
93 <item row="0" column="0">
94 <widget class="QLabel" name="label">
95 <property name="text">
96 <string>Catalogues</string>
97 </property>
98 </widget>
99 </item>
100 <item row="0" column="1">
101 <widget class="QLabel" name="catalogues_count">
102 <property name="text">
103 <string/>
104 </property>
105 </widget>
106 </item>
107 <item row="1" column="0">
108 <widget class="QLabel" name="label_3">
109 <property name="text">
110 <string>Events</string>
111 </property>
112 </widget>
113 </item>
114 <item row="1" column="1">
115 <widget class="QLabel" name="rep_events_count">
116 <property name="text">
117 <string/>
118 </property>
119 </widget>
120 </item>
121 </layout>
122 </item>
123 </layout>
124 </widget>
125 </item>
126 </layout>
127 </widget>
128 <widget class="QWidget" name="Catalogue">
129 <property name="sizePolicy">
130 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
131 <horstretch>0</horstretch>
132 <verstretch>0</verstretch>
133 </sizepolicy>
134 </property>
135 <layout class="QGridLayout" name="gridLayout_2">
136 <item row="0" column="0">
137 <widget class="QGroupBox" name="groupBox_2">
138 <property name="sizePolicy">
139 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
140 <horstretch>0</horstretch>
141 <verstretch>0</verstretch>
142 </sizepolicy>
143 </property>
144 <property name="title">
145 <string>Catalogue</string>
146 </property>
147 <layout class="QGridLayout" name="gridLayout_3">
148 <item row="0" column="0">
149 <layout class="QFormLayout" name="formLayout_2">
150 <item row="0" column="0">
151 <widget class="QLabel" name="label_2">
152 <property name="text">
153 <string>Name</string>
154 </property>
155 </widget>
156 </item>
157 <item row="0" column="1">
158 <widget class="QLineEdit" name="lineEdit"/>
159 </item>
160 <item row="1" column="0">
161 <widget class="QLabel" name="label_4">
162 <property name="text">
163 <string>Events</string>
164 </property>
165 </widget>
166 </item>
167 <item row="1" column="1">
168 <widget class="QLabel" name="cat_events_count">
169 <property name="text">
170 <string/>
171 </property>
172 </widget>
173 </item>
174 </layout>
175 </item>
176 </layout>
177 </widget>
178 </item>
179 </layout>
180 </widget>
181 <widget class="EventEditor" name="Event">
182 <property name="sizePolicy">
183 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
184 <horstretch>0</horstretch>
185 <verstretch>0</verstretch>
186 </sizepolicy>
187 </property>
188 <layout class="QGridLayout" name="gridLayout_4"/>
189 </widget>
190 </widget>
191 </item>
192 </layout>
193 </widget>
194 </widget>
195 </item>
196 </layout>
197 </widget>
198 <customwidgets>
199 <customwidget>
200 <class>RepositoriesTreeView</class>
201 <extends>QTreeView</extends>
202 <header location="global">Catalogue2/repositoriestreeview.h</header>
203 </customwidget>
204 <customwidget>
205 <class>EventsTreeView</class>
206 <extends>QTreeView</extends>
207 <header location="global">Catalogue2/eventstreeview.h</header>
208 </customwidget>
209 <customwidget>
210 <class>EventEditor</class>
211 <extends>QWidget</extends>
212 <header location="global">Catalogue2/eventeditor.h</header>
213 <container>1</container>
214 </customwidget>
215 </customwidgets>
216 <resources/>
217 <connections/>
218 </ui>
@@ -0,0 +1,96
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>EventEditor</class>
4 <widget class="QWidget" name="EventEditor">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>465</width>
10 <height>227</height>
11 </rect>
12 </property>
13 <property name="sizePolicy">
14 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
15 <horstretch>0</horstretch>
16 <verstretch>0</verstretch>
17 </sizepolicy>
18 </property>
19 <property name="windowTitle">
20 <string>Form</string>
21 </property>
22 <layout class="QVBoxLayout" name="verticalLayout">
23 <item>
24 <widget class="QGroupBox" name="groupBox_3">
25 <property name="sizePolicy">
26 <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
27 <horstretch>0</horstretch>
28 <verstretch>0</verstretch>
29 </sizepolicy>
30 </property>
31 <property name="title">
32 <string>Event</string>
33 </property>
34 <layout class="QVBoxLayout" name="verticalLayout_3">
35 <item>
36 <layout class="QFormLayout" name="formLayout_3">
37 <item row="0" column="0">
38 <widget class="QLabel" name="label_5">
39 <property name="text">
40 <string>Name</string>
41 </property>
42 </widget>
43 </item>
44 <item row="1" column="0">
45 <widget class="QLabel" name="label_6">
46 <property name="text">
47 <string>Tags</string>
48 </property>
49 </widget>
50 </item>
51 <item row="2" column="0">
52 <widget class="QLabel" name="label_7">
53 <property name="text">
54 <string>Product(s)</string>
55 </property>
56 </widget>
57 </item>
58 <item row="3" column="0">
59 <widget class="QLabel" name="label_8">
60 <property name="text">
61 <string>Start time</string>
62 </property>
63 </widget>
64 </item>
65 <item row="4" column="0">
66 <widget class="QLabel" name="label_9">
67 <property name="text">
68 <string>Stop time</string>
69 </property>
70 </widget>
71 </item>
72 <item row="3" column="1">
73 <widget class="QDateTimeEdit" name="StartTime"/>
74 </item>
75 <item row="4" column="1">
76 <widget class="QDateTimeEdit" name="StopTime"/>
77 </item>
78 <item row="0" column="1">
79 <widget class="QLineEdit" name="EventName"/>
80 </item>
81 <item row="1" column="1">
82 <widget class="QLineEdit" name="Tags"/>
83 </item>
84 <item row="2" column="1">
85 <widget class="QLineEdit" name="Products"/>
86 </item>
87 </layout>
88 </item>
89 </layout>
90 </widget>
91 </item>
92 </layout>
93 </widget>
94 <resources/>
95 <connections/>
96 </ui>
@@ -1,1 +1,1
1 Subproject commit 548ec6a0c922e626003babc8b21a3953b777eae2
1 Subproject commit 6b6bb3a15bf899d16716aa0f6d20f1122d67a0a5
@@ -1,188 +1,194
1 FILE (GLOB_RECURSE gui_SRCS
1 FILE (GLOB_RECURSE gui_SRCS
2
2
3 include/DataSource/DataSourceWidget.h
3 include/DataSource/DataSourceWidget.h
4 include/DataSource/DataSourceTreeWidget.h
4 include/DataSource/DataSourceTreeWidget.h
5 include/DataSource/DataSourceTreeWidgetItem.h
5 include/DataSource/DataSourceTreeWidgetItem.h
6 include/DataSource/DataSourceTreeWidgetHelper.h
6 include/DataSource/DataSourceTreeWidgetHelper.h
7 include/SqpApplication.h
7 include/SqpApplication.h
8 include/Common/ColorUtils.h
8 include/Common/ColorUtils.h
9 include/Common/VisualizationDef.h
9 include/Common/VisualizationDef.h
10 include/SidePane/SqpSidePane.h
10 include/SidePane/SqpSidePane.h
11 include/Catalogue2/eventsmodel.h
11 include/Catalogue2/eventsmodel.h
12 include/Catalogue2/eventstreeview.h
12 include/Catalogue2/eventstreeview.h
13 include/Catalogue2/repositoriestreeview.h
13 include/Catalogue2/repositoriestreeview.h
14 include/Catalogue2/repositoriesmodel.h
14 include/Catalogue2/repositoriesmodel.h
15 include/Catalogue2/browser.h
16 include/Catalogue2/eventeditor.h
15 # include/Catalogue/CatalogueActionManager.h
17 # include/Catalogue/CatalogueActionManager.h
16 # include/Catalogue/CatalogueTreeModel.h
18 # include/Catalogue/CatalogueTreeModel.h
17 # include/Catalogue/CatalogueExplorer.h
19 # include/Catalogue/CatalogueExplorer.h
18 # include/Catalogue/CatalogueSideBarWidget.h
20 # include/Catalogue/CatalogueSideBarWidget.h
19 # include/Catalogue/CatalogueInspectorWidget.h
21 # include/Catalogue/CatalogueInspectorWidget.h
20 # include/Catalogue/CatalogueTreeItems/CatalogueTextTreeItem.h
22 # include/Catalogue/CatalogueTreeItems/CatalogueTextTreeItem.h
21 # include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h
23 # include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h
22 # include/Catalogue/CatalogueTreeItems/CatalogueAbstractTreeItem.h
24 # include/Catalogue/CatalogueTreeItems/CatalogueAbstractTreeItem.h
23 # include/Catalogue/CatalogueEventsModel.h
25 # include/Catalogue/CatalogueEventsModel.h
24 # include/Catalogue/CatalogueEventsWidget.h
26 # include/Catalogue/CatalogueEventsWidget.h
25 # include/Catalogue/CatalogueExplorerHelper.h
27 # include/Catalogue/CatalogueExplorerHelper.h
26 include/Visualization/VisualizationGraphHelper.h
28 include/Visualization/VisualizationGraphHelper.h
27 include/Visualization/VisualizationTabWidget.h
29 include/Visualization/VisualizationTabWidget.h
28 include/Visualization/VisualizationDefs.h
30 include/Visualization/VisualizationDefs.h
29 include/Visualization/QCustomPlotSynchronizer.h
31 include/Visualization/QCustomPlotSynchronizer.h
30 include/Visualization/QCPColorMapIterator.h
32 include/Visualization/QCPColorMapIterator.h
31 include/Visualization/operations/GenerateVariableMenuOperation.h
33 include/Visualization/operations/GenerateVariableMenuOperation.h
32 include/Visualization/operations/RemoveVariableOperation.h
34 include/Visualization/operations/RemoveVariableOperation.h
33 include/Visualization/operations/FindVariableOperation.h
35 include/Visualization/operations/FindVariableOperation.h
34 include/Visualization/operations/MenuBuilder.h
36 include/Visualization/operations/MenuBuilder.h
35 include/Visualization/operations/RescaleAxeOperation.h
37 include/Visualization/operations/RescaleAxeOperation.h
36 include/Visualization/PlottablesRenderingUtils.h
38 include/Visualization/PlottablesRenderingUtils.h
37 include/Visualization/IVisualizationWidgetVisitor.h
39 include/Visualization/IVisualizationWidgetVisitor.h
38 include/Visualization/VisualizationGraphWidget.h
40 include/Visualization/VisualizationGraphWidget.h
39 include/Visualization/IVisualizationWidget.h
41 include/Visualization/IVisualizationWidget.h
40 include/Visualization/IVariableContainer.h
42 include/Visualization/IVariableContainer.h
41 include/Visualization/SqpColorScale.h
43 include/Visualization/SqpColorScale.h
42 include/Visualization/VisualizationWidget.h
44 include/Visualization/VisualizationWidget.h
43 include/Visualization/VisualizationZoneWidget.h
45 include/Visualization/VisualizationZoneWidget.h
44 include/Visualization/VisualizationMultiZoneSelectionDialog.h
46 include/Visualization/VisualizationMultiZoneSelectionDialog.h
45 include/Visualization/VisualizationGraphRenderingDelegate.h
47 include/Visualization/VisualizationGraphRenderingDelegate.h
46 include/Visualization/AxisRenderingUtils.h
48 include/Visualization/AxisRenderingUtils.h
47 include/Visualization/VisualizationSelectionZoneItem.h
49 include/Visualization/VisualizationSelectionZoneItem.h
48 include/Visualization/VisualizationDragWidget.h
50 include/Visualization/VisualizationDragWidget.h
49 include/Visualization/VisualizationActionManager.h
51 include/Visualization/VisualizationActionManager.h
50 include/Visualization/IGraphSynchronizer.h
52 include/Visualization/IGraphSynchronizer.h
51 include/Visualization/ColorScaleEditor.h
53 include/Visualization/ColorScaleEditor.h
52 include/Visualization/MacScrollBarStyle.h
54 include/Visualization/MacScrollBarStyle.h
53 include/Visualization/VisualizationSelectionZoneManager.h
55 include/Visualization/VisualizationSelectionZoneManager.h
54 include/Visualization/qcustomplot.h
56 include/Visualization/qcustomplot.h
55 include/Visualization/VisualizationDragDropContainer.h
57 include/Visualization/VisualizationDragDropContainer.h
56 include/Visualization/VisualizationCursorItem.h
58 include/Visualization/VisualizationCursorItem.h
57 include/Settings/SqpSettingsDialog.h
59 include/Settings/SqpSettingsDialog.h
58 include/Settings/SqpSettingsGeneralWidget.h
60 include/Settings/SqpSettingsGeneralWidget.h
59 include/Variable/VariableMenuHeaderWidget.h
61 include/Variable/VariableMenuHeaderWidget.h
60 include/Variable/VariableInspectorTableView.h
62 include/Variable/VariableInspectorTableView.h
61 include/Variable/VariableInspectorWidget.h
63 include/Variable/VariableInspectorWidget.h
62 include/Variable/RenameVariableDialog.h
64 include/Variable/RenameVariableDialog.h
63 include/TimeWidget/TimeWidget.h
65 include/TimeWidget/TimeWidget.h
64 include/DragAndDrop/DragDropScroller.h
66 include/DragAndDrop/DragDropScroller.h
65 include/DragAndDrop/DragDropTabSwitcher.h
67 include/DragAndDrop/DragDropTabSwitcher.h
66 include/DragAndDrop/DragDropGuiController.h
68 include/DragAndDrop/DragDropGuiController.h
67 include/Actions/FilteringAction.h
69 include/Actions/FilteringAction.h
68 include/Actions/ActionsGuiController.h
70 include/Actions/ActionsGuiController.h
69 include/Actions/SelectionZoneAction.h
71 include/Actions/SelectionZoneAction.h
70
72
71
73
72
74
73
75
74 src/DataSource/DataSourceTreeWidgetItem.cpp
76 src/DataSource/DataSourceTreeWidgetItem.cpp
75 src/DataSource/DataSourceWidget.cpp
77 src/DataSource/DataSourceWidget.cpp
76 src/DataSource/DataSourceTreeWidget.cpp
78 src/DataSource/DataSourceTreeWidget.cpp
77 src/DataSource/DataSourceTreeWidgetHelper.cpp
79 src/DataSource/DataSourceTreeWidgetHelper.cpp
78 src/Common/ColorUtils.cpp
80 src/Common/ColorUtils.cpp
79 src/Common/VisualizationDef.cpp
81 src/Common/VisualizationDef.cpp
80 src/SidePane/SqpSidePane.cpp
82 src/SidePane/SqpSidePane.cpp
81 src/Catalogue2/eventsmodel.cpp
83 src/Catalogue2/eventsmodel.cpp
82 src/Catalogue2/eventstreeview.cpp
84 src/Catalogue2/eventstreeview.cpp
83 src/Catalogue2/repositoriestreeview.cpp
85 src/Catalogue2/repositoriestreeview.cpp
84 src/Catalogue2/repositoriesmodel.cpp
86 src/Catalogue2/repositoriesmodel.cpp
87 src/Catalogue2/browser.cpp
88 src/Catalogue2/eventeditor.cpp
85 #src/Catalogue/CatalogueEventsWidget.cpp
89 #src/Catalogue/CatalogueEventsWidget.cpp
86 #src/Catalogue/CatalogueSideBarWidget.cpp
90 #src/Catalogue/CatalogueSideBarWidget.cpp
87 #src/Catalogue/CatalogueTreeItems/CatalogueAbstractTreeItem.cpp
91 #src/Catalogue/CatalogueTreeItems/CatalogueAbstractTreeItem.cpp
88 #src/Catalogue/CatalogueTreeItems/CatalogueTextTreeItem.cpp
92 #src/Catalogue/CatalogueTreeItems/CatalogueTextTreeItem.cpp
89 #src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp
93 #src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp
90 #src/Catalogue/CatalogueExplorerHelper.cpp
94 #src/Catalogue/CatalogueExplorerHelper.cpp
91 #src/Catalogue/CatalogueExplorer.cpp
95 #src/Catalogue/CatalogueExplorer.cpp
92 #src/Catalogue/CatalogueTreeModel.cpp
96 #src/Catalogue/CatalogueTreeModel.cpp
93 #src/Catalogue/CatalogueInspectorWidget.cpp
97 #src/Catalogue/CatalogueInspectorWidget.cpp
94 #src/Catalogue/CatalogueEventsModel.cpp
98 #src/Catalogue/CatalogueEventsModel.cpp
95 #src/Catalogue/CatalogueActionManager.cpp
99 #src/Catalogue/CatalogueActionManager.cpp
96 src/Visualization/VisualizationDragDropContainer.cpp
100 src/Visualization/VisualizationDragDropContainer.cpp
97 src/Visualization/VisualizationTabWidget.cpp
101 src/Visualization/VisualizationTabWidget.cpp
98 src/Visualization/VisualizationWidget.cpp
102 src/Visualization/VisualizationWidget.cpp
99 src/Visualization/MacScrollBarStyle.cpp
103 src/Visualization/MacScrollBarStyle.cpp
100 src/Visualization/VisualizationCursorItem.cpp
104 src/Visualization/VisualizationCursorItem.cpp
101 src/Visualization/operations/MenuBuilder.cpp
105 src/Visualization/operations/MenuBuilder.cpp
102 src/Visualization/operations/RemoveVariableOperation.cpp
106 src/Visualization/operations/RemoveVariableOperation.cpp
103 src/Visualization/operations/FindVariableOperation.cpp
107 src/Visualization/operations/FindVariableOperation.cpp
104 src/Visualization/operations/GenerateVariableMenuOperation.cpp
108 src/Visualization/operations/GenerateVariableMenuOperation.cpp
105 src/Visualization/operations/RescaleAxeOperation.cpp
109 src/Visualization/operations/RescaleAxeOperation.cpp
106 src/Visualization/AxisRenderingUtils.cpp
110 src/Visualization/AxisRenderingUtils.cpp
107 src/Visualization/PlottablesRenderingUtils.cpp
111 src/Visualization/PlottablesRenderingUtils.cpp
108 src/Visualization/VisualizationGraphRenderingDelegate.cpp
112 src/Visualization/VisualizationGraphRenderingDelegate.cpp
109 src/Visualization/VisualizationSelectionZoneManager.cpp
113 src/Visualization/VisualizationSelectionZoneManager.cpp
110 src/Visualization/QCPColorMapIterator.cpp
114 src/Visualization/QCPColorMapIterator.cpp
111 src/Visualization/ColorScaleEditor.cpp
115 src/Visualization/ColorScaleEditor.cpp
112 src/Visualization/VisualizationGraphHelper.cpp
116 src/Visualization/VisualizationGraphHelper.cpp
113 src/Visualization/VisualizationGraphWidget.cpp
117 src/Visualization/VisualizationGraphWidget.cpp
114 src/Visualization/VisualizationDragWidget.cpp
118 src/Visualization/VisualizationDragWidget.cpp
115 src/Visualization/VisualizationZoneWidget.cpp
119 src/Visualization/VisualizationZoneWidget.cpp
116 src/Visualization/VisualizationActionManager.cpp
120 src/Visualization/VisualizationActionManager.cpp
117 src/Visualization/VisualizationSelectionZoneItem.cpp
121 src/Visualization/VisualizationSelectionZoneItem.cpp
118 src/Visualization/QCustomPlotSynchronizer.cpp
122 src/Visualization/QCustomPlotSynchronizer.cpp
119 src/Visualization/qcustomplot.cpp
123 src/Visualization/qcustomplot.cpp
120 src/Visualization/VisualizationMultiZoneSelectionDialog.cpp
124 src/Visualization/VisualizationMultiZoneSelectionDialog.cpp
121 src/Visualization/SqpColorScale.cpp
125 src/Visualization/SqpColorScale.cpp
122 src/Settings/SqpSettingsGeneralWidget.cpp
126 src/Settings/SqpSettingsGeneralWidget.cpp
123 src/Settings/SqpSettingsDialog.cpp
127 src/Settings/SqpSettingsDialog.cpp
124 src/SqpApplication.cpp
128 src/SqpApplication.cpp
125 src/Variable/VariableInspectorWidget.cpp
129 src/Variable/VariableInspectorWidget.cpp
126 src/Variable/VariableMenuHeaderWidget.cpp
130 src/Variable/VariableMenuHeaderWidget.cpp
127 src/Variable/RenameVariableDialog.cpp
131 src/Variable/RenameVariableDialog.cpp
128 src/Variable/VariableInspectorTableView.cpp
132 src/Variable/VariableInspectorTableView.cpp
129 src/TimeWidget/TimeWidget.cpp
133 src/TimeWidget/TimeWidget.cpp
130 src/DragAndDrop/DragDropScroller.cpp
134 src/DragAndDrop/DragDropScroller.cpp
131 src/DragAndDrop/DragDropTabSwitcher.cpp
135 src/DragAndDrop/DragDropTabSwitcher.cpp
132 src/DragAndDrop/DragDropGuiController.cpp
136 src/DragAndDrop/DragDropGuiController.cpp
133 src/Actions/ActionsGuiController.cpp
137 src/Actions/ActionsGuiController.cpp
134 src/Actions/SelectionZoneAction.cpp
138 src/Actions/SelectionZoneAction.cpp
135 src/Actions/FilteringAction.cpp
139 src/Actions/FilteringAction.cpp
136
140
137 ./resources/sqpguiresources.qrc
141 ./resources/sqpguiresources.qrc
138 )
142 )
139
143
140
144
141 QT5_WRAP_UI(
145 QT5_WRAP_UI(
142 UiGenerated_SRCS
146 UiGenerated_SRCS
143 ui/DataSource/DataSourceWidget.ui
147 ui/DataSource/DataSourceWidget.ui
144 ui/Settings/SqpSettingsDialog.ui
148 ui/Settings/SqpSettingsDialog.ui
145 ui/Settings/SqpSettingsGeneralWidget.ui
149 ui/Settings/SqpSettingsGeneralWidget.ui
146 ui/SidePane/SqpSidePane.ui
150 ui/SidePane/SqpSidePane.ui
147 ui/TimeWidget/TimeWidget.ui
151 ui/TimeWidget/TimeWidget.ui
148 ui/Variable/RenameVariableDialog.ui
152 ui/Variable/RenameVariableDialog.ui
149 ui/Variable/VariableInspectorWidget.ui
153 ui/Variable/VariableInspectorWidget.ui
150 ui/Variable/VariableMenuHeaderWidget.ui
154 ui/Variable/VariableMenuHeaderWidget.ui
151 ui/Visualization/ColorScaleEditor.ui
155 ui/Visualization/ColorScaleEditor.ui
152 ui/Visualization/VisualizationGraphWidget.ui
156 ui/Visualization/VisualizationGraphWidget.ui
153 ui/Visualization/VisualizationTabWidget.ui
157 ui/Visualization/VisualizationTabWidget.ui
154 ui/Visualization/VisualizationWidget.ui
158 ui/Visualization/VisualizationWidget.ui
155 ui/Visualization/VisualizationZoneWidget.ui
159 ui/Visualization/VisualizationZoneWidget.ui
156 ui/Visualization/VisualizationMultiZoneSelectionDialog.ui
160 ui/Visualization/VisualizationMultiZoneSelectionDialog.ui
161 ui/Catalogue2/browser.ui
162 ui/Catalogue2/eventeditor.ui
157 #ui/Catalogue/CatalogueEventsWidget.ui
163 #ui/Catalogue/CatalogueEventsWidget.ui
158 #ui/Catalogue/CatalogueExplorer.ui
164 #ui/Catalogue/CatalogueExplorer.ui
159 #ui/Catalogue/CatalogueInspectorWidget.ui
165 #ui/Catalogue/CatalogueInspectorWidget.ui
160 #ui/Catalogue/CatalogueSideBarWidget.ui
166 #ui/Catalogue/CatalogueSideBarWidget.ui
161 )
167 )
162
168
163 add_library(sciqlopgui ${gui_SRCS} ${UiGenerated_SRCS})
169 add_library(sciqlopgui ${gui_SRCS} ${UiGenerated_SRCS})
164 SET_TARGET_PROPERTIES(sciqlopgui PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
170 SET_TARGET_PROPERTIES(sciqlopgui PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
165
171
166 target_include_directories(sciqlopgui PUBLIC
172 target_include_directories(sciqlopgui PUBLIC
167 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
173 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
168 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/Visualization>
174 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/Visualization>
169 $<INSTALL_INTERFACE:include/SciQLOP>
175 $<INSTALL_INTERFACE:include/SciQLOP>
170 )
176 )
171
177
172 target_link_libraries(sciqlopgui PUBLIC
178 target_link_libraries(sciqlopgui PUBLIC
173 Qt5::Widgets
179 Qt5::Widgets
174 Qt5::PrintSupport
180 Qt5::PrintSupport
175 Qt5::Svg
181 Qt5::Svg
176 sciqlopcore
182 sciqlopcore
177 )
183 )
178
184
179 install(TARGETS sciqlopgui EXPORT SciQLOPGuiConfig
185 install(TARGETS sciqlopgui EXPORT SciQLOPGuiConfig
180 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
186 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
181 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
187 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
182 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
188 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
183
189
184 install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SciQLOP)
190 install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SciQLOP)
185 install(EXPORT SciQLOPGuiConfig DESTINATION share/SciQLOPGui/cmake)
191 install(EXPORT SciQLOPGuiConfig DESTINATION share/SciQLOPGui/cmake)
186 export(TARGETS sciqlopgui FILE SciQLOPGuiConfig.cmake)
192 export(TARGETS sciqlopgui FILE SciQLOPGuiConfig.cmake)
187
193
188 subdirs(tests)
194 subdirs(tests)
@@ -1,87 +1,206
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #ifndef EVENTSMODEL_H
17 #ifndef EVENTSMODEL_H
18 #define EVENTSMODEL_H
18 #define EVENTSMODEL_H
19 #include <Catalogue/CatalogueController.h>
19 #include <Catalogue/CatalogueController.h>
20 #include <QAbstractItemModel>
20 #include <QAbstractItemModel>
21 #include <QIcon>
21 #include <array>
22 #include <array>
22
23
23 class EventsModel : public QAbstractItemModel
24 class EventsModel : public QAbstractItemModel
24 {
25 {
25 Q_OBJECT
26 Q_OBJECT
26 std::vector<CatalogueController::Event_ptr> _events;
27
28 enum class ItemType
29 {
30 None,
31 Event,
32 Product
33 };
34
27
35 enum class Columns
28 enum class Columns
36 {
29 {
37 Name = 0,
30 Name = 0,
38 TStart = 1,
31 TStart = 1,
39 TEnd = 2,
32 TEnd = 2,
40 Tags = 3,
33 Tags = 3,
41 Product = 4,
34 Product = 4,
42 Validation = 5,
35 Validation = 5,
43 NbColumn = 6
36 NbColumn = 6
44 };
37 };
45
38
46 const std::array<QString, static_cast<int>(Columns::NbColumn)> ColumnsNames
39 const std::array<QString, static_cast<int>(Columns::NbColumn)> ColumnsNames
47 = { "Name", "Start time", "Stop time", "Tags", "Product(s)", "" };
40 = { "Name", "Start time", "Stop time", "Tags", "Product(s)", "" };
48
41
49
42
50 public:
43 public:
44 enum class ItemType
45 {
46 None,
47 Event,
48 Product
49 };
50
51 struct EventsModelItem
52 {
53 ItemType type;
54 std::variant<CatalogueController::Event_ptr, CatalogueController::Product_t> item;
55 EventsModelItem() : type { ItemType::None } {}
56 EventsModelItem(const CatalogueController::Event_ptr& event)
57 : type { ItemType::Event }, item { event }, parent { nullptr }, icon {}
58 {
59 std::transform(std::cbegin(event->products), std::cend(event->products),
60 std::back_inserter(children),
61 [this](auto& product) { return std::make_unique<EventsModelItem>(product, this); });
62 }
63
64 EventsModelItem(const CatalogueController::Product_t& product, EventsModelItem* parent)
65 : type { ItemType::Product }, item { product }, parent { parent }, icon {}
66 {
67 }
68 CatalogueController::Event_ptr event() const
69 {
70 return std::get<CatalogueController::Event_ptr>(item);
71 }
72 CatalogueController::Product_t product() const
73 {
74 return std::get<CatalogueController::Product_t>(item);
75 }
76 QVariant data(int col, int role) const
77 {
78 if(role==Qt::DisplayRole)
79 {
80 switch (type)
81 {
82 case ItemType::Product :
83 return data(product(),col);
84 case ItemType::Event:
85 return data(event(),col);
86 default:
87 break;
88 }
89 }
90 return QVariant{};
91 }
92 QVariant data(const CatalogueController::Event_ptr& event, int col) const
93 {
94 switch (static_cast<Columns>(col))
95 {
96 case EventsModel::Columns::Name:
97 return QString::fromStdString(event->name);
98 case EventsModel::Columns::TStart:
99 if (auto start = event->startTime())
100 return DateUtils::dateTime(*start).toString(DATETIME_FORMAT_ONE_LINE);
101 else
102 return QVariant {};
103 case EventsModel::Columns::TEnd:
104 if (auto stop = event->stopTime())
105 return DateUtils::dateTime(*stop).toString(DATETIME_FORMAT_ONE_LINE);
106 else
107 return QVariant {};
108 case EventsModel::Columns::Product:
109 {
110 QStringList eventProductList;
111 for (const auto& evtProduct : event->products)
112 {
113 eventProductList << QString::fromStdString(evtProduct.name);
114 }
115 return eventProductList.join(";");
116 }
117 case EventsModel::Columns::Tags:
118 {
119 QString tagList;
120 for (const auto& tag : event->tags)
121 {
122 tagList += QString::fromStdString(tag);
123 tagList += ' ';
124 }
125 return tagList;
126 }
127 default:
128 break;
129 }
130 return QVariant {};
131 }
132
133 QVariant data(const CatalogueController::Product_t& product, int col) const
134 {
135 switch (static_cast<Columns>(col))
136 {
137 case EventsModel::Columns::Name:
138 return QString::fromStdString(product.name);
139 case EventsModel::Columns::TStart:
140 return DateUtils::dateTime(product.startTime).toString(DATETIME_FORMAT_ONE_LINE);
141 case EventsModel::Columns::TEnd:
142 return DateUtils::dateTime(product.stopTime).toString(DATETIME_FORMAT_ONE_LINE);
143 case EventsModel::Columns::Product:
144 return QString::fromStdString(product.name);
145 default:
146 break;
147 }
148 return QVariant {};
149 }
150
151 QString text() const
152 {
153 if (type == ItemType::Event)
154 return QString::fromStdString(event()->name);
155 if (type == ItemType::Product)
156 return QString::fromStdString(product().name);
157 return QString();
158 }
159 std::vector<std::unique_ptr<EventsModelItem>> children;
160 EventsModelItem* parent = nullptr;
161 QIcon icon;
162 };
51 EventsModel(QObject* parent = nullptr);
163 EventsModel(QObject* parent = nullptr);
52
164
165 static inline EventsModelItem* to_item(const QModelIndex& index)
166 {
167 return static_cast<EventsModelItem*>(index.internalPointer());
168 }
53
169
54 ItemType type(const QModelIndex& index) const;
170 ItemType type(const QModelIndex& index) const;
55
171
56 Qt::ItemFlags flags(const QModelIndex& index) const override
172 Qt::ItemFlags flags(const QModelIndex& index) const override
57 {
173 {
58 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
174 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
59 }
175 }
60 QVariant data(int col, const CatalogueController::Event_ptr& event) const;
61 QVariant data(int col, const CatalogueController::Product_t& product) const;
62 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
176 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
63
177
64 QModelIndex index(
178 QModelIndex index(
65 int row, int column, const QModelIndex& parent = QModelIndex()) const override;
179 int row, int column, const QModelIndex& parent = QModelIndex()) const override;
66
180
67 QModelIndex parent(const QModelIndex& index) const override;
181 QModelIndex parent(const QModelIndex& index) const override;
68
182
69 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
183 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
70
184
71 int columnCount(const QModelIndex& parent = QModelIndex()) const override;
185 int columnCount(const QModelIndex& parent = QModelIndex()) const override;
72
186
73 QVariant headerData(
187 QVariant headerData(
74 int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
188 int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
75
189
76 void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
190 void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
77
191
78 public slots:
192 public slots:
79 void setEvents(std::vector<CatalogueController::Event_ptr> events)
193 void setEvents(std::vector<CatalogueController::Event_ptr> events)
80 {
194 {
81 beginResetModel();
195 beginResetModel();
82 std::swap(_events, events);
196 _items.clear();
197 std::transform(std::begin(events), std::end(events), std::back_inserter(_items),
198 [](const auto& event) { return std::make_unique<EventsModelItem>(event); });
83 endResetModel();
199 endResetModel();
84 }
200 }
201
202 private:
203 std::vector<std::unique_ptr<EventsModelItem>> _items;
85 };
204 };
86
205
87 #endif // EVENTSMODEL_H
206 #endif // EVENTSMODEL_H
@@ -1,34 +1,41
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #ifndef EVENTSTREEVIEW_H
17 #ifndef EVENTSTREEVIEW_H
18 #define EVENTSTREEVIEW_H
18 #define EVENTSTREEVIEW_H
19
19
20 #include <Catalogue/CatalogueController.h>
20 #include <Catalogue/CatalogueController.h>
21 #include <QObject>
21 #include <QObject>
22 #include <QTreeView>
22 #include <QTreeView>
23
23
24 class EventsTreeView : public QTreeView
24 class EventsTreeView : public QTreeView
25 {
25 {
26 Q_OBJECT
26 Q_OBJECT
27 public:
27 public:
28 EventsTreeView(QWidget* parent = nullptr);
28 EventsTreeView(QWidget* parent = nullptr);
29
29
30 signals:
31 void eventSelected(const CatalogueController::Event_ptr& event);
32 void productSelected(const CatalogueController::Product_t& product, const CatalogueController::Event_ptr& event);
33
30 public slots:
34 public slots:
31 void setEvents(std::vector<CatalogueController::Event_ptr> events);
35 void setEvents(std::vector<CatalogueController::Event_ptr> events);
36
37 private:
38 void _itemSelected(const QModelIndex& index);
32 };
39 };
33
40
34 #endif // EVENTSTREEVIEW_H
41 #endif // EVENTSTREEVIEW_H
@@ -1,99 +1,100
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #ifndef REPOSITORIESMODEL_H
17 #ifndef REPOSITORIESMODEL_H
18 #define REPOSITORIESMODEL_H
18 #define REPOSITORIESMODEL_H
19 #include <Catalogue/CatalogueController.h>
19 #include <Catalogue/CatalogueController.h>
20 #include <QAbstractItemModel>
20 #include <QAbstractItemModel>
21 #include <QIcon>
21 #include <QIcon>
22 #include <QObject>
22 #include <QObject>
23
23
24 class RepositoriesModel : public QAbstractItemModel
24 class RepositoriesModel : public QAbstractItemModel
25 {
25 {
26 Q_OBJECT
26 Q_OBJECT
27
27
28
28
29
30 public:
29 enum class ItemType
31 enum class ItemType
30 {
32 {
31 None,
33 None,
32 Catalogue,
34 Catalogue,
33 Repository
35 Repository
34 };
36 };
35
37
36 struct RepoModelItem
38 struct RepoModelItem
37 {
39 {
38 ItemType type;
40 ItemType type;
39 std::variant<QString, CatalogueController::Catalogue_ptr> item;
41 std::variant<QString, CatalogueController::Catalogue_ptr> item;
40 RepoModelItem() : type { ItemType::None } {}
42 RepoModelItem() : type { ItemType::None } {}
41 RepoModelItem(const QString& repo);
43 RepoModelItem(const QString& repo);
42 RepoModelItem(const CatalogueController::Catalogue_ptr& catalogue, RepoModelItem* parent)
44 RepoModelItem(const CatalogueController::Catalogue_ptr& catalogue, RepoModelItem* parent)
43 : type { ItemType::Catalogue }
45 : type { ItemType::Catalogue }
44 , item { catalogue }
46 , item { catalogue }
45 , parent { parent }
47 , parent { parent }
46 , icon { ":/icones/catalogue.png" }
48 , icon { ":/icones/catalogue.png" }
47 {
49 {
48 }
50 }
49 QString repository() const { return std::get<QString>(item); }
51 QString repository() const { return std::get<QString>(item); }
50 CatalogueController::Catalogue_ptr catalogue() const
52 CatalogueController::Catalogue_ptr catalogue() const
51 {
53 {
52 return std::get<CatalogueController::Catalogue_ptr>(item);
54 return std::get<CatalogueController::Catalogue_ptr>(item);
53 }
55 }
54 QVariant data(int role) const;
56 QVariant data(int role) const;
55 QString text() const
57 QString text() const
56 {
58 {
57 if (type == ItemType::Catalogue)
59 if (type == ItemType::Catalogue)
58 return QString::fromStdString(catalogue()->name);
60 return QString::fromStdString(catalogue()->name);
59 if (type == ItemType::Repository)
61 if (type == ItemType::Repository)
60 return repository();
62 return repository();
61 return QString();
63 return QString();
62 }
64 }
63 std::vector<std::unique_ptr<RepoModelItem>> children;
65 std::vector<std::unique_ptr<RepoModelItem>> children;
64 RepoModelItem* parent = nullptr;
66 RepoModelItem* parent = nullptr;
65 QIcon icon;
67 QIcon icon;
66 };
68 };
67
69
68 std::vector<std::unique_ptr<RepoModelItem>> _items;
70 std::vector<std::unique_ptr<RepoModelItem>> _items;
69
71
70 inline RepoModelItem* to_item(const QModelIndex& index) const
72 static inline RepoModelItem* to_item(const QModelIndex& index)
71 {
73 {
72 return static_cast<RepoModelItem*>(index.internalPointer());
74 return static_cast<RepoModelItem*>(index.internalPointer());
73 }
75 }
74
76
75 public:
76 RepositoriesModel(QObject* parent = nullptr);
77 RepositoriesModel(QObject* parent = nullptr);
77
78
78 ItemType type(const QModelIndex& index) const;
79 ItemType type(const QModelIndex& index) const;
79
80
80 Qt::ItemFlags flags(const QModelIndex& index) const override
81 Qt::ItemFlags flags(const QModelIndex& index) const override
81 {
82 {
82 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
83 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
83 }
84 }
84
85
85 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
86 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
86
87
87 QModelIndex index(
88 QModelIndex index(
88 int row, int column, const QModelIndex& parent = QModelIndex()) const override;
89 int row, int column, const QModelIndex& parent = QModelIndex()) const override;
89
90
90 QModelIndex parent(const QModelIndex& index) const override;
91 QModelIndex parent(const QModelIndex& index) const override;
91
92
92 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
93 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
93
94
94 int columnCount(const QModelIndex& parent = QModelIndex()) const override { return 1; }
95 int columnCount(const QModelIndex& parent = QModelIndex()) const override { return 1; }
95 public slots:
96 public slots:
96 void refresh();
97 void refresh();
97 };
98 };
98
99
99 #endif // REPOSITORIESMODEL_H
100 #endif // REPOSITORIESMODEL_H
@@ -1,41 +1,52
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #ifndef REPOSITORIESTREEVIEW_H
17 #ifndef REPOSITORIESTREEVIEW_H
18 #define REPOSITORIESTREEVIEW_H
18 #define REPOSITORIESTREEVIEW_H
19
19
20 #include <Catalogue2/repositoriesmodel.h>
20 #include <QObject>
21 #include <QObject>
21 #include <QTreeView>
22 #include <QTreeView>
22 #include <Catalogue2/repositoriesmodel.h>
23
23
24 class RepositoriesTreeView : public QTreeView
24 class RepositoriesTreeView : public QTreeView
25 {
25 {
26 Q_OBJECT
26 Q_OBJECT
27 public:
27 public:
28 RepositoriesTreeView(QWidget* parent = nullptr);
28 RepositoriesTreeView(QWidget* parent = nullptr);
29
29
30 public slots:
30 public slots:
31 void refresh()
31 void refresh() { static_cast<RepositoriesModel*>(model())->refresh(); }
32 {
33 static_cast<RepositoriesModel*>(model())->refresh();
34 }
35
32
36 signals:
33 signals:
37 void repositorySelected(const QString& repository);
34 void repositorySelected(const QString& repository);
35 void catalogueSelected(const CatalogueController::Catalogue_ptr& catalogue);
38
36
37 private:
38 void _itemSelected(const QModelIndex& index)
39 {
40 auto item = RepositoriesModel::to_item(index);
41 if (item->type == RepositoriesModel::ItemType::Repository)
42 {
43 emit repositorySelected(item->repository());
44 }
45 else if (item->type == RepositoriesModel::ItemType::Catalogue)
46 {
47 emit catalogueSelected(item->catalogue());
48 }
49 }
39 };
50 };
40
51
41 #endif // REPOSITORIESTREEVIEW_H
52 #endif // REPOSITORIESTREEVIEW_H
@@ -1,201 +1,105
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #include "Catalogue2/eventsmodel.h"
17 #include "Catalogue2/eventsmodel.h"
18 #include <SqpApplication.h>
18 #include <SqpApplication.h>
19 #include <Common/containers.h>
19
20
20 EventsModel::EventsModel(QObject* parent) : QAbstractItemModel(parent) {}
21 EventsModel::EventsModel(QObject* parent) : QAbstractItemModel(parent) {}
21
22
22 EventsModel::ItemType EventsModel::type(const QModelIndex& index) const
23 EventsModel::ItemType EventsModel::type(const QModelIndex& index) const
23 {
24 {
24 if (!index.isValid())
25 if (EventsModelItem* item = to_item(index))
25 {
26 {
26 return ItemType::None;
27 return item->type;
27 }
28 else if (index.internalPointer() == nullptr)
29 {
30 return ItemType::Event;
31 }
32 else
33 {
34 return ItemType::Product;
35 }
28 }
36 }
29 return ItemType::None;
37
38 QVariant EventsModel::data(int col, const CatalogueController::Event_ptr& event) const
39 {
40 switch (static_cast<Columns>(col))
41 {
42 case EventsModel::Columns::Name:
43 return QString::fromStdString(event->name);
44 case EventsModel::Columns::TStart:
45 if (auto start = event->startTime())
46 return DateUtils::dateTime(*start).toString(DATETIME_FORMAT_ONE_LINE);
47 else
48 return QVariant {};
49 case EventsModel::Columns::TEnd:
50 if (auto stop = event->stopTime())
51 return DateUtils::dateTime(*stop).toString(DATETIME_FORMAT_ONE_LINE);
52 else
53 return QVariant {};
54 case EventsModel::Columns::Product:
55 {
56 QStringList eventProductList;
57 for (const auto& evtProduct : event->products)
58 {
59 eventProductList << QString::fromStdString(evtProduct.name);
60 }
61 return eventProductList.join(";");
62 }
63 case EventsModel::Columns::Tags:
64 {
65 QString tagList;
66 for (const auto& tag : event->tags)
67 {
68 tagList += QString::fromStdString(tag);
69 tagList += ' ';
70 }
71 return tagList;
72 }
73 default:
74 break;
75 }
76 return QVariant {};
77 }
78
79 QVariant EventsModel::data(int col, const CatalogueController::Product_t& product) const
80 {
81 switch (static_cast<Columns>(col))
82 {
83 case EventsModel::Columns::Name:
84 return QString::fromStdString(product.name);
85 case EventsModel::Columns::TStart:
86 return DateUtils::dateTime(product.startTime).toString(DATETIME_FORMAT_ONE_LINE);
87 case EventsModel::Columns::TEnd:
88 return DateUtils::dateTime(product.stopTime).toString(DATETIME_FORMAT_ONE_LINE);
89 case EventsModel::Columns::Product:
90 return QString::fromStdString(product.name);
91 default:
92 break;
93 }
94 return QVariant {};
95 }
30 }
96
31
97 QVariant EventsModel::data(const QModelIndex& index, int role) const
32 QVariant EventsModel::data(const QModelIndex& index, int role) const
98 {
33 {
99 if (_events.size() && index.isValid() && role == Qt::DisplayRole)
34 if (index.isValid())
100 {
35 {
101 switch (type(index))
36 return to_item(index)->data(index.column(),role);
102 {
103 case EventsModel::ItemType::Event:
104 return data(index.column(), _events[index.row()]);
105 case EventsModel::ItemType::Product:
106 {
107 auto event = static_cast<CatalogueController::Event_t*>(index.internalPointer());
108 return data(index.column(), event->products[index.row()]);
109 }
110 default:
111 break;
112 }
113 }
37 }
114 return QVariant {};
38 return QVariant {};
115 }
39 }
116
40
117 QModelIndex EventsModel::index(int row, int column, const QModelIndex& parent) const
41 QModelIndex EventsModel::index(int row, int column, const QModelIndex& parent) const
118 {
42 {
119 if (!hasIndex(row, column, parent))
43 if (!hasIndex(row, column, parent))
120 {
44 {
121 return QModelIndex();
45 return QModelIndex();
122 }
46 }
123
47
124 switch (type(parent))
48 switch (type(parent))
125 {
49 {
126 case EventsModel::ItemType::None:
50 case ItemType::None: // is an event
127 return createIndex(row, column, nullptr);
51 return createIndex(row, column, _items[row].get());
128 case EventsModel::ItemType::Event:
52 case ItemType::Event: // is a product
129 {
53 return createIndex(row, column, to_item(parent)->children[row].get());
130 return createIndex(row, column, _events[parent.row()].get());
54 case ItemType::Product:
131 }
55 QModelIndex();
132 case EventsModel::ItemType::Product:
133 break;
134 default:
135 break;
136 }
56 }
137
57
138 return QModelIndex();
58 return QModelIndex();
139 }
59 }
140
60
141 QModelIndex EventsModel::parent(const QModelIndex& index) const
61 QModelIndex EventsModel::parent(const QModelIndex& index) const
142 {
62 {
143 switch (type(index))
63 auto item = to_item(index);
64 if (item->type == ItemType::Product)
144 {
65 {
145 case EventsModel::ItemType::None:
66 auto repoIndex = SciQLop::containers::index_of(_items, item->parent);
146 break;
67 return createIndex(repoIndex, 0, item->parent);
147 case EventsModel::ItemType::Event:
148 break;
149 case EventsModel::ItemType::Product:
150 {
151 auto parentEvent = static_cast<CatalogueController::Event_t*>(index.internalPointer());
152 auto pos = std::distance(std::cbegin(_events),
153 std::find_if(std::cbegin(_events), std::cend(_events),
154 [parentEvent](auto event) { return event.get() == parentEvent; }));
155 if (pos >= 0 && pos < _events.size())
156 {
157 return createIndex(pos, 0);
158 }
159 }
160 }
68 }
161 return QModelIndex();
69 return QModelIndex();
162 }
70 }
163
71
164 int EventsModel::rowCount(const QModelIndex& parent) const
72 int EventsModel::rowCount(const QModelIndex& parent) const
165 {
73 {
166 if (parent.column() > 0)
74 if (parent.column() > 0)
167 {
75 {
168 return 0;
76 return 0;
169 }
77 }
170
171 switch (type(parent))
78 switch (type(parent))
172 {
79 {
173 case EventsModel::ItemType::None:
80 case ItemType::None:
174 return _events.size();
81 return _items.size();
175 case EventsModel::ItemType::Event:
82 case ItemType::Event:
176 return _events[parent.row()]->products.size();
83 return to_item(parent)->children.size();
177 break;
84 case ItemType::Product:
178 case EventsModel::ItemType::Product:
179 break;
180 default:
181 break;
85 break;
182 }
86 }
183 return 0;
87 return 0;
184 }
88 }
185
89
186 int EventsModel::columnCount(const QModelIndex& parent) const
90 int EventsModel::columnCount(const QModelIndex& parent) const
187 {
91 {
188 return static_cast<int>(EventsModel::Columns::NbColumn);
92 return static_cast<int>(EventsModel::Columns::NbColumn);
189 }
93 }
190
94
191 QVariant EventsModel::headerData(int section, Qt::Orientation orientation, int role) const
95 QVariant EventsModel::headerData(int section, Qt::Orientation orientation, int role) const
192 {
96 {
193 if (orientation == Qt::Horizontal && role == Qt::DisplayRole && section < ColumnsNames.size())
97 if (orientation == Qt::Horizontal && role == Qt::DisplayRole && section < ColumnsNames.size())
194 {
98 {
195 return ColumnsNames[section];
99 return ColumnsNames[section];
196 }
100 }
197
101
198 return QVariant();
102 return QVariant();
199 }
103 }
200
104
201 void EventsModel::sort(int column, Qt::SortOrder order) {}
105 void EventsModel::sort(int column, Qt::SortOrder order) {}
@@ -1,28 +1,45
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #include <Catalogue2/eventsmodel.h>
17 #include <Catalogue2/eventsmodel.h>
18 #include <Catalogue2/eventstreeview.h>
18 #include <Catalogue2/eventstreeview.h>
19
19
20 EventsTreeView::EventsTreeView(QWidget* parent) : QTreeView(parent)
20 EventsTreeView::EventsTreeView(QWidget* parent) : QTreeView(parent)
21 {
21 {
22 this->setModel(new EventsModel());
22 this->setModel(new EventsModel());
23 connect(this->selectionModel(), &QItemSelectionModel::currentChanged, [this](const QModelIndex &current, const QModelIndex &previous){
24 Q_UNUSED(previous);
25 this->_itemSelected(current);
26 });
23 }
27 }
24
28
25 void EventsTreeView::setEvents(std::vector<CatalogueController::Event_ptr> events)
29 void EventsTreeView::setEvents(std::vector<CatalogueController::Event_ptr> events)
26 {
30 {
27 static_cast<EventsModel*>(this->model())->setEvents(events);
31 static_cast<EventsModel*>(this->model())->setEvents(events);
28 }
32 }
33
34 void EventsTreeView::_itemSelected(const QModelIndex &index)
35 {
36 auto item = EventsModel::to_item(index);
37 if (item->type == EventsModel::ItemType::Event)
38 {
39 emit eventSelected(item->event());
40 }
41 else if (item->type == EventsModel::ItemType::Product)
42 {
43 emit productSelected(item->product(), item->parent->event());
44 }
45 }
@@ -1,123 +1,127
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #include <Catalogue2/repositoriesmodel.h>
17 #include <Catalogue2/repositoriesmodel.h>
18 #include <Common/containers.h>
18 #include <Common/containers.h>
19 #include <SqpApplication.h>
19 #include <SqpApplication.h>
20
20
21
21
22 RepositoriesModel::RepositoriesModel(QObject* parent) : QAbstractItemModel(parent)
22 RepositoriesModel::RepositoriesModel(QObject* parent) : QAbstractItemModel(parent)
23 {
23 {
24 refresh();
24 refresh();
25 connect(&(sqpApp->catalogueController()), &CatalogueController::repositoryAdded, this,
26 [this](const QString&) { this->refresh(); });
27 connect(&(sqpApp->catalogueController()), &CatalogueController::catalogueAdded, this,
28 [this](const CatalogueController::Catalogue_ptr&, const QString&) { this->refresh(); });
25 }
29 }
26
30
27 RepositoriesModel::ItemType RepositoriesModel::type(const QModelIndex& index) const
31 RepositoriesModel::ItemType RepositoriesModel::type(const QModelIndex& index) const
28 {
32 {
29 if (RepoModelItem* item = to_item(index))
33 if (RepoModelItem* item = to_item(index))
30 {
34 {
31 return item->type;
35 return item->type;
32 }
36 }
33 return ItemType::None;
37 return ItemType::None;
34 }
38 }
35
39
36 void RepositoriesModel::refresh()
40 void RepositoriesModel::refresh()
37 {
41 {
38 beginResetModel();
42 beginResetModel();
39 _items.clear();
43 _items.clear();
40 _items.push_back(std::make_unique<RepoModelItem>("All"));
44 _items.push_back(std::make_unique<RepoModelItem>("All"));
41 _items.push_back(std::make_unique<RepoModelItem>("Trash"));
45 _items.push_back(std::make_unique<RepoModelItem>("Trash"));
42 auto repo_list = sqpApp->catalogueController().repositories();
46 auto repo_list = sqpApp->catalogueController().repositories();
43 std::transform(std::begin(repo_list), std::end(repo_list), std::back_inserter(_items),
47 std::transform(std::begin(repo_list), std::end(repo_list), std::back_inserter(_items),
44 [](const auto& repo_name) { return std::make_unique<RepoModelItem>(repo_name); });
48 [](const auto& repo_name) { return std::make_unique<RepoModelItem>(repo_name); });
45 endResetModel();
49 endResetModel();
46 }
50 }
47
51
48 QVariant RepositoriesModel::data(const QModelIndex& index, int role) const
52 QVariant RepositoriesModel::data(const QModelIndex& index, int role) const
49 {
53 {
50 if (index.isValid() && index.column() == 0)
54 if (index.isValid() && index.column() == 0)
51 {
55 {
52 return to_item(index)->data(role);
56 return to_item(index)->data(role);
53 }
57 }
54 return QVariant {};
58 return QVariant {};
55 }
59 }
56
60
57 QModelIndex RepositoriesModel::index(int row, int column, const QModelIndex& parent) const
61 QModelIndex RepositoriesModel::index(int row, int column, const QModelIndex& parent) const
58 {
62 {
59 if (!hasIndex(row, column, parent))
63 if (!hasIndex(row, column, parent))
60 {
64 {
61 return QModelIndex();
65 return QModelIndex();
62 }
66 }
63
67
64 switch (type(parent))
68 switch (type(parent))
65 {
69 {
66 case RepositoriesModel::ItemType::None: // is a repo
70 case RepositoriesModel::ItemType::None: // is a repo
67 return createIndex(row, column, _items[row].get());
71 return createIndex(row, column, _items[row].get());
68 case RepositoriesModel::ItemType::Repository: // is a catalogue
72 case RepositoriesModel::ItemType::Repository: // is a catalogue
69 return createIndex(row, column, to_item(parent)->children[row].get());
73 return createIndex(row, column, to_item(parent)->children[row].get());
70 case RepositoriesModel::ItemType::Catalogue:
74 case RepositoriesModel::ItemType::Catalogue:
71 return createIndex(row, column, new RepoModelItem());
75 return createIndex(row, column, new RepoModelItem());
72 }
76 }
73
77
74 return QModelIndex();
78 return QModelIndex();
75 }
79 }
76
80
77 QModelIndex RepositoriesModel::parent(const QModelIndex& index) const
81 QModelIndex RepositoriesModel::parent(const QModelIndex& index) const
78 {
82 {
79 auto item = to_item(index);
83 auto item = to_item(index);
80 if (item->type == ItemType::Catalogue)
84 if (item->type == ItemType::Catalogue)
81 {
85 {
82 auto repoIndex = SciQLop::containers::index_of(_items, item->parent);
86 auto repoIndex = SciQLop::containers::index_of(_items, item->parent);
83 return createIndex(repoIndex, 0, item->parent);
87 return createIndex(repoIndex, 0, item->parent);
84 }
88 }
85 return QModelIndex();
89 return QModelIndex();
86 }
90 }
87
91
88 int RepositoriesModel::rowCount(const QModelIndex& parent) const
92 int RepositoriesModel::rowCount(const QModelIndex& parent) const
89 {
93 {
90 switch (type(parent))
94 switch (type(parent))
91 {
95 {
92 case RepositoriesModel::ItemType::None:
96 case RepositoriesModel::ItemType::None:
93 return _items.size();
97 return _items.size();
94 case RepositoriesModel::ItemType::Repository:
98 case RepositoriesModel::ItemType::Repository:
95 return to_item(parent)->children.size();
99 return to_item(parent)->children.size();
96 case RepositoriesModel::ItemType::Catalogue:
100 case RepositoriesModel::ItemType::Catalogue:
97 break;
101 break;
98 }
102 }
99 return 0;
103 return 0;
100 }
104 }
101
105
102 RepositoriesModel::RepoModelItem::RepoModelItem(const QString& repo)
106 RepositoriesModel::RepoModelItem::RepoModelItem(const QString& repo)
103 : type { ItemType::Repository }, item { repo }, icon { ":/icones/database.png" }
107 : type { ItemType::Repository }, item { repo }, icon { ":/icones/database.png" }
104 {
108 {
105 auto catalogues = sqpApp->catalogueController().catalogues(repo);
109 auto catalogues = sqpApp->catalogueController().catalogues(repo);
106 std::transform(std::begin(catalogues), std::end(catalogues), std::back_inserter(children),
110 std::transform(std::begin(catalogues), std::end(catalogues), std::back_inserter(children),
107 [this](auto& catalogue) { return std::make_unique<RepoModelItem>(catalogue, this); });
111 [this](auto& catalogue) { return std::make_unique<RepoModelItem>(catalogue, this); });
108 }
112 }
109
113
110 QVariant RepositoriesModel::RepoModelItem::data(int role) const
114 QVariant RepositoriesModel::RepoModelItem::data(int role) const
111 {
115 {
112 switch (role)
116 switch (role)
113 {
117 {
114 case Qt::EditRole:
118 case Qt::EditRole:
115 case Qt::DisplayRole:
119 case Qt::DisplayRole:
116 return text();
120 return text();
117 case Qt::DecorationRole:
121 case Qt::DecorationRole:
118 return QVariant { icon };
122 return QVariant { icon };
119 default:
123 default:
120 break;
124 break;
121 }
125 }
122 return QVariant {};
126 return QVariant {};
123 }
127 }
@@ -1,27 +1,31
1 /*
1 /*
2 This file is part of SciQLop.
2 This file is part of SciQLop.
3
3
4 SciQLop is free software: you can redistribute it and/or modify
4 SciQLop is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
7 (at your option) any later version.
8
8
9 SciQLop is distributed in the hope that it will be useful,
9 SciQLop is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
12 GNU General Public License for more details.
13
13
14 You should have received a copy of the GNU General Public License
14 You should have received a copy of the GNU General Public License
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
15 along with SciQLop. If not, see <https://www.gnu.org/licenses/>.
16 */
16 */
17 #include <Catalogue2/repositoriesmodel.h>
17 #include <Catalogue2/repositoriesmodel.h>
18 #include <Catalogue2/repositoriestreeview.h>
18 #include <Catalogue2/repositoriestreeview.h>
19
19
20 RepositoriesTreeView::RepositoriesTreeView(QWidget* parent) : QTreeView(parent)
20 RepositoriesTreeView::RepositoriesTreeView(QWidget* parent) : QTreeView(parent)
21 {
21 {
22 auto m = model();
22 auto m = model();
23 this->setModel(new RepositoriesModel(this));
23 this->setModel(new RepositoriesModel(this));
24 delete m;
24 delete m;
25 connect(this->selectionModel(), &QItemSelectionModel::currentChanged, [this](const QModelIndex &current, const QModelIndex &previous){
26 Q_UNUSED(previous);
27 this->_itemSelected(current);
28 });
25 }
29 }
26
30
27
31
@@ -1,7 +1,8
1 include(sciqlop_tests)
1 include(sciqlop_tests)
2 subdirs(GUITestUtils)
2 subdirs(GUITestUtils)
3 declare_test(simple_graph simple_graph simple_graph/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
3 declare_test(simple_graph simple_graph simple_graph/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
4 declare_test(multiple_sync_graph multiple_sync_graph multiple_sync_graph/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
4 declare_test(multiple_sync_graph multiple_sync_graph multiple_sync_graph/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
5
5
6 declare_manual_test(event_list event_list catalogue/event_list/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
6 declare_manual_test(event_list event_list catalogue/event_list/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
7 declare_manual_test(repository_list repository_list catalogue/repository_list/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
7 declare_manual_test(repository_list repository_list catalogue/repository_list/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
8 declare_manual_test(catalogue_browser catalogue_browser catalogue/browser/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test")
General Comments 0
You need to be logged in to leave comments. Login now