##// END OF EJS Templates
Adaptation to last version of catalogue controller
trabillard -
r1196:b6390f556418
parent child
Show More
@@ -1,74 +1,75
1 #ifndef SCIQLOP_CATALOGUECONTROLLER_H
1 #ifndef SCIQLOP_CATALOGUECONTROLLER_H
2 #define SCIQLOP_CATALOGUECONTROLLER_H
2 #define SCIQLOP_CATALOGUECONTROLLER_H
3
3
4 #include "CoreGlobal.h"
4 #include "CoreGlobal.h"
5
5
6 #include <Data/SqpRange.h>
6 #include <Data/SqpRange.h>
7
7
8 #include <QLoggingCategory>
8 #include <QLoggingCategory>
9 #include <QObject>
9 #include <QObject>
10 #include <QUuid>
10 #include <QUuid>
11
11
12 #include <Common/spimpl.h>
12 #include <Common/spimpl.h>
13
13
14 #include <memory>
14 #include <memory>
15
15
16 class DBCatalogue;
16 class DBCatalogue;
17 class DBEvent;
17 class DBEvent;
18
18
19 Q_DECLARE_LOGGING_CATEGORY(LOG_CatalogueController)
19 Q_DECLARE_LOGGING_CATEGORY(LOG_CatalogueController)
20
20
21 class DataSourceItem;
21 class DataSourceItem;
22 class Variable;
22 class Variable;
23
23
24 /**
24 /**
25 * @brief The CatalogueController class aims to handle catalogues and event using the CatalogueAPI
25 * @brief The CatalogueController class aims to handle catalogues and event using the CatalogueAPI
26 * library.
26 * library.
27 */
27 */
28 class SCIQLOP_CORE_EXPORT CatalogueController : public QObject {
28 class SCIQLOP_CORE_EXPORT CatalogueController : public QObject {
29 Q_OBJECT
29 Q_OBJECT
30 public:
30 public:
31 explicit CatalogueController(QObject *parent = 0);
31 explicit CatalogueController(QObject *parent = 0);
32 virtual ~CatalogueController();
32 virtual ~CatalogueController();
33
33
34 // DB
34 // DB
35 QStringList getRepositories() const;
35 QStringList getRepositories() const;
36 void addDB(const QString &dbPath);
36 void addDB(const QString &dbPath);
37 void saveDB(const QString &destinationPath, const QString &repository);
37 void saveDB(const QString &destinationPath, const QString &repository);
38
38
39 // Event
39 // Event
40 /// retrieveEvents with empty repository retrieve them from the default repository
40 /// retrieveEvents with empty repository retrieve them from the default repository
41 std::list<std::shared_ptr<DBEvent> > retrieveEvents(const QString &repository) const;
41 std::list<std::shared_ptr<DBEvent> > retrieveEvents(const QString &repository) const;
42 std::list<std::shared_ptr<DBEvent> > retrieveAllEvents() const;
42 std::list<std::shared_ptr<DBEvent> > retrieveAllEvents() const;
43 std::list<std::shared_ptr<DBEvent> >
43 std::list<std::shared_ptr<DBEvent> >
44 retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const;
44 retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const;
45 void addEvent(std::shared_ptr<DBEvent> event);
45 void addEvent(std::shared_ptr<DBEvent> event);
46 void updateEvent(std::shared_ptr<DBEvent> event);
46 void updateEvent(std::shared_ptr<DBEvent> event);
47 void removeEvent(std::shared_ptr<DBEvent> event);
47 void removeEvent(std::shared_ptr<DBEvent> event);
48 // void trashEvent(std::shared_ptr<DBEvent> event);
48 // void trashEvent(std::shared_ptr<DBEvent> event);
49 // void restore(QUuid eventId);
49 // void restore(QUuid eventId);
50 void saveEvent(std::shared_ptr<DBEvent> event);
50 void saveEvent(std::shared_ptr<DBEvent> event);
51
51
52 // Catalogue
52 // Catalogue
53 // bool createCatalogue(const QString &name, QVector<QUuid> eventList);
53 // bool createCatalogue(const QString &name, QVector<QUuid> eventList);
54 /// retrieveEvents with empty repository retrieve them from the default repository
54 /// retrieveEvents with empty repository retrieve them from the default repository
55 std::list<std::shared_ptr<DBCatalogue> > retrieveCatalogues(const QString &repository) const;
55 std::list<std::shared_ptr<DBCatalogue> > retrieveCatalogues(const QString &repository
56 = QString()) const;
56 void updateCatalogue(std::shared_ptr<DBCatalogue> catalogue);
57 void updateCatalogue(std::shared_ptr<DBCatalogue> catalogue);
57 void removeCatalogue(std::shared_ptr<DBCatalogue> catalogue);
58 void removeCatalogue(std::shared_ptr<DBCatalogue> catalogue);
58 void saveCatalogue(std::shared_ptr<DBCatalogue> catalogue);
59 void saveCatalogue(std::shared_ptr<DBCatalogue> catalogue);
59
60
60 void saveAll();
61 void saveAll();
61
62
62 public slots:
63 public slots:
63 /// Manage init/end of the controller
64 /// Manage init/end of the controller
64 void initialize();
65 void initialize();
65 void finalize();
66 void finalize();
66
67
67 private:
68 private:
68 void waitForFinish();
69 void waitForFinish();
69
70
70 class CatalogueControllerPrivate;
71 class CatalogueControllerPrivate;
71 spimpl::unique_impl_ptr<CatalogueControllerPrivate> impl;
72 spimpl::unique_impl_ptr<CatalogueControllerPrivate> impl;
72 };
73 };
73
74
74 #endif // SCIQLOP_CATALOGUECONTROLLER_H
75 #endif // SCIQLOP_CATALOGUECONTROLLER_H
@@ -1,287 +1,296
1 #include <Catalogue/CatalogueController.h>
1 #include <Catalogue/CatalogueController.h>
2
2
3 #include <Variable/Variable.h>
3 #include <Variable/Variable.h>
4
4
5 #include <CatalogueDao.h>
5 #include <CatalogueDao.h>
6
6
7 #include <ComparaisonPredicate.h>
7 #include <ComparaisonPredicate.h>
8 #include <CompoundPredicate.h>
8 #include <CompoundPredicate.h>
9 #include <DBCatalogue.h>
9 #include <DBCatalogue.h>
10 #include <DBEvent.h>
10 #include <DBEvent.h>
11 #include <DBEventProduct.h>
11 #include <DBEventProduct.h>
12 #include <DBTag.h>
12 #include <DBTag.h>
13 #include <IRequestPredicate.h>
13 #include <IRequestPredicate.h>
14
14
15 #include <QMutex>
15 #include <QMutex>
16 #include <QThread>
16 #include <QThread>
17
17
18 #include <QDir>
18 #include <QDir>
19 #include <QStandardPaths>
19 #include <QStandardPaths>
20
20
21 Q_LOGGING_CATEGORY(LOG_CatalogueController, "CatalogueController")
21 Q_LOGGING_CATEGORY(LOG_CatalogueController, "CatalogueController")
22
22
23 namespace {
23 namespace {
24
24
25 static QString REPOSITORY_WORK_SUFFIX = QString{"work"};
25 static QString REPOSITORY_WORK_SUFFIX = QString{"work"};
26 static QString REPOSITORY_TRASH_SUFFIX = QString{"trash"};
26 static QString REPOSITORY_TRASH_SUFFIX = QString{"trash"};
27 }
27 }
28
28
29 class CatalogueController::CatalogueControllerPrivate {
29 class CatalogueController::CatalogueControllerPrivate {
30
30
31 public:
31 public:
32 explicit CatalogueControllerPrivate(CatalogueController *parent) : m_Q{parent} {}
32 explicit CatalogueControllerPrivate(CatalogueController *parent) : m_Q{parent} {}
33
33
34 QMutex m_WorkingMutex;
34 QMutex m_WorkingMutex;
35 CatalogueDao m_CatalogueDao;
35 CatalogueDao m_CatalogueDao;
36
36
37 QStringList m_RepositoryList;
37 QStringList m_RepositoryList;
38 CatalogueController *m_Q;
38 CatalogueController *m_Q;
39
39
40 void copyDBtoDB(const QString &dbFrom, const QString &dbTo);
40 void copyDBtoDB(const QString &dbFrom, const QString &dbTo);
41 QString toWorkRepository(QString repository);
41 QString toWorkRepository(QString repository);
42 QString toSyncRepository(QString repository);
42 QString toSyncRepository(QString repository);
43 };
43 };
44
44
45 CatalogueController::CatalogueController(QObject *parent)
45 CatalogueController::CatalogueController(QObject *parent)
46 : impl{spimpl::make_unique_impl<CatalogueControllerPrivate>(this)}
46 : impl{spimpl::make_unique_impl<CatalogueControllerPrivate>(this)}
47 {
47 {
48 qCDebug(LOG_CatalogueController()) << tr("CatalogueController construction")
48 qCDebug(LOG_CatalogueController()) << tr("CatalogueController construction")
49 << QThread::currentThread();
49 << QThread::currentThread();
50 }
50 }
51
51
52 CatalogueController::~CatalogueController()
52 CatalogueController::~CatalogueController()
53 {
53 {
54 qCDebug(LOG_CatalogueController()) << tr("CatalogueController destruction")
54 qCDebug(LOG_CatalogueController()) << tr("CatalogueController destruction")
55 << QThread::currentThread();
55 << QThread::currentThread();
56 this->waitForFinish();
56 this->waitForFinish();
57 }
57 }
58
58
59 QStringList CatalogueController::getRepositories() const
59 QStringList CatalogueController::getRepositories() const
60 {
60 {
61 return impl->m_RepositoryList;
61 return impl->m_RepositoryList;
62 }
62 }
63
63
64 void CatalogueController::addDB(const QString &dbPath)
64 void CatalogueController::addDB(const QString &dbPath)
65 {
65 {
66 QDir dbDir(dbPath);
66 QDir dbDir(dbPath);
67 if (dbDir.exists()) {
67 if (dbDir.exists()) {
68 auto dirName = dbDir.dirName();
68 auto dirName = dbDir.dirName();
69
69
70 if (std::find(impl->m_RepositoryList.cbegin(), impl->m_RepositoryList.cend(), dirName)
70 if (std::find(impl->m_RepositoryList.cbegin(), impl->m_RepositoryList.cend(), dirName)
71 != impl->m_RepositoryList.cend()) {
71 != impl->m_RepositoryList.cend()) {
72 qCCritical(LOG_CatalogueController())
72 qCCritical(LOG_CatalogueController())
73 << tr("Impossible to addDB that is already loaded");
73 << tr("Impossible to addDB that is already loaded");
74 }
74 }
75
75
76 if (!impl->m_CatalogueDao.addDB(dbPath, dirName)) {
76 if (!impl->m_CatalogueDao.addDB(dbPath, dirName)) {
77 qCCritical(LOG_CatalogueController())
77 qCCritical(LOG_CatalogueController())
78 << tr("Impossible to addDB %1 from %2 ").arg(dirName, dbPath);
78 << tr("Impossible to addDB %1 from %2 ").arg(dirName, dbPath);
79 }
79 }
80 else {
80 else {
81 impl->m_RepositoryList << dirName;
81 impl->m_RepositoryList << dirName;
82 impl->copyDBtoDB(dirName, impl->toWorkRepository(dirName));
82 impl->copyDBtoDB(dirName, impl->toWorkRepository(dirName));
83 }
83 }
84 }
84 }
85 else {
85 else {
86 qCCritical(LOG_CatalogueController()) << tr("Impossible to addDB that not exists: ")
86 qCCritical(LOG_CatalogueController()) << tr("Impossible to addDB that not exists: ")
87 << dbPath;
87 << dbPath;
88 }
88 }
89 }
89 }
90
90
91 void CatalogueController::saveDB(const QString &destinationPath, const QString &repository)
91 void CatalogueController::saveDB(const QString &destinationPath, const QString &repository)
92 {
92 {
93 if (!impl->m_CatalogueDao.saveDB(destinationPath, repository)) {
93 if (!impl->m_CatalogueDao.saveDB(destinationPath, repository)) {
94 qCCritical(LOG_CatalogueController())
94 qCCritical(LOG_CatalogueController())
95 << tr("Impossible to saveDB %1 from %2 ").arg(repository, destinationPath);
95 << tr("Impossible to saveDB %1 from %2 ").arg(repository, destinationPath);
96 }
96 }
97 }
97 }
98
98
99 std::list<std::shared_ptr<DBEvent> >
99 std::list<std::shared_ptr<DBEvent> >
100 CatalogueController::retrieveEvents(const QString &repository) const
100 CatalogueController::retrieveEvents(const QString &repository) const
101 {
101 {
102 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
102 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
103
103
104 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
104 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
105 auto events = impl->m_CatalogueDao.getEvents(impl->toWorkRepository(dbDireName));
105 auto events = impl->m_CatalogueDao.getEvents(impl->toWorkRepository(dbDireName));
106 for (auto event : events) {
106 for (auto event : events) {
107 eventsShared.push_back(std::make_shared<DBEvent>(event));
107 eventsShared.push_back(std::make_shared<DBEvent>(event));
108 }
108 }
109 return eventsShared;
109 return eventsShared;
110 }
110 }
111
111
112 std::list<std::shared_ptr<DBEvent> > CatalogueController::retrieveAllEvents() const
112 std::list<std::shared_ptr<DBEvent> > CatalogueController::retrieveAllEvents() const
113 {
113 {
114 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
114 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
115 for (auto repository : impl->m_RepositoryList) {
115 for (auto repository : impl->m_RepositoryList) {
116 eventsShared.splice(eventsShared.end(), retrieveEvents(repository));
116 eventsShared.splice(eventsShared.end(), retrieveEvents(repository));
117 }
117 }
118
118
119 return eventsShared;
119 return eventsShared;
120 }
120 }
121
121
122 std::list<std::shared_ptr<DBEvent> >
122 std::list<std::shared_ptr<DBEvent> >
123 CatalogueController::retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const
123 CatalogueController::retrieveEventsFromCatalogue(std::shared_ptr<DBCatalogue> catalogue) const
124 {
124 {
125 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
125 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
126 auto events = impl->m_CatalogueDao.getCatalogueEvents(*catalogue);
126 auto events = impl->m_CatalogueDao.getCatalogueEvents(*catalogue);
127 for (auto event : events) {
127 for (auto event : events) {
128 eventsShared.push_back(std::make_shared<DBEvent>(event));
128 eventsShared.push_back(std::make_shared<DBEvent>(event));
129 }
129 }
130 return eventsShared;
130 return eventsShared;
131 }
131 }
132
132
133 void CatalogueController::updateEvent(std::shared_ptr<DBEvent> event)
133 void CatalogueController::updateEvent(std::shared_ptr<DBEvent> event)
134 {
134 {
135 event->setRepository(impl->toSyncRepository(event->getRepository()));
135 event->setRepository(impl->toSyncRepository(event->getRepository()));
136
136
137 impl->m_CatalogueDao.updateEvent(*event);
137 impl->m_CatalogueDao.updateEvent(*event);
138 }
138 }
139
139
140 void CatalogueController::removeEvent(std::shared_ptr<DBEvent> event)
140 void CatalogueController::removeEvent(std::shared_ptr<DBEvent> event)
141 {
141 {
142 // Remove it from both repository and repository_work
142 // Remove it from both repository and repository_work
143 event->setRepository(impl->toWorkRepository(event->getRepository()));
143 event->setRepository(impl->toWorkRepository(event->getRepository()));
144 impl->m_CatalogueDao.removeEvent(*event);
144 impl->m_CatalogueDao.removeEvent(*event);
145 event->setRepository(impl->toSyncRepository(event->getRepository()));
145 event->setRepository(impl->toSyncRepository(event->getRepository()));
146 impl->m_CatalogueDao.removeEvent(*event);
146 impl->m_CatalogueDao.removeEvent(*event);
147 }
147 }
148
148
149 void CatalogueController::addEvent(std::shared_ptr<DBEvent> event)
149 void CatalogueController::addEvent(std::shared_ptr<DBEvent> event)
150 {
150 {
151 event->setRepository(impl->toSyncRepository(event->getRepository()));
151 event->setRepository(impl->toWorkRepository(event->getRepository()));
152
152
153 impl->m_CatalogueDao.addEvent(*event);
153 impl->m_CatalogueDao.addEvent(*event);
154
154
155 // Call update is necessary at the creation of add Event if it has some tags or some event
155 // Call update is necessary at the creation of add Event if it has some tags or some event
156 // products
156 // products
157 if (!event->getEventProducts().empty() || !event->getTags().empty()) {
157 if (!event->getEventProducts().empty() || !event->getTags().empty()) {
158 impl->m_CatalogueDao.updateEvent(*event);
158 impl->m_CatalogueDao.updateEvent(*event);
159 }
159 }
160 }
160 }
161
161
162 void CatalogueController::saveEvent(std::shared_ptr<DBEvent> event)
162 void CatalogueController::saveEvent(std::shared_ptr<DBEvent> event)
163 {
163 {
164 impl->m_CatalogueDao.moveEvent(*event, impl->toSyncRepository(event->getRepository()), true);
164 impl->m_CatalogueDao.moveEvent(*event, impl->toSyncRepository(event->getRepository()), true);
165 }
165 }
166
166
167 std::list<std::shared_ptr<DBCatalogue> >
167 std::list<std::shared_ptr<DBCatalogue> >
168 CatalogueController::retrieveCatalogues(const QString &repository) const
168 CatalogueController::retrieveCatalogues(const QString &repository) const
169 {
169 {
170 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
170 QString dbDireName = repository.isEmpty() ? REPOSITORY_DEFAULT : repository;
171
171
172 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
172 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
173 auto catalogues = impl->m_CatalogueDao.getCatalogues(impl->toWorkRepository(dbDireName));
173 auto catalogues = impl->m_CatalogueDao.getCatalogues(impl->toWorkRepository(dbDireName));
174 for (auto catalogue : catalogues) {
174 for (auto catalogue : catalogues) {
175 cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
175 cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
176 }
176 }
177 return cataloguesShared;
177 return cataloguesShared;
178 }
178 }
179
179
180 void CatalogueController::updateCatalogue(std::shared_ptr<DBCatalogue> catalogue)
180 void CatalogueController::updateCatalogue(std::shared_ptr<DBCatalogue> catalogue)
181 {
181 {
182 catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
182 catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
183
183
184 impl->m_CatalogueDao.updateCatalogue(*catalogue);
184 impl->m_CatalogueDao.updateCatalogue(*catalogue);
185 }
185 }
186
186
187 void CatalogueController::removeCatalogue(std::shared_ptr<DBCatalogue> catalogue)
187 void CatalogueController::removeCatalogue(std::shared_ptr<DBCatalogue> catalogue)
188 {
188 {
189 // Remove it from both repository and repository_work
189 // Remove it from both repository and repository_work
190 catalogue->setRepository(impl->toWorkRepository(catalogue->getRepository()));
190 catalogue->setRepository(impl->toWorkRepository(catalogue->getRepository()));
191 impl->m_CatalogueDao.removeCatalogue(*catalogue);
191 impl->m_CatalogueDao.removeCatalogue(*catalogue);
192 catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
192 catalogue->setRepository(impl->toSyncRepository(catalogue->getRepository()));
193 impl->m_CatalogueDao.removeCatalogue(*catalogue);
193 impl->m_CatalogueDao.removeCatalogue(*catalogue);
194 }
194 }
195
195
196 void CatalogueController::saveCatalogue(std::shared_ptr<DBCatalogue> catalogue)
196 void CatalogueController::saveCatalogue(std::shared_ptr<DBCatalogue> catalogue)
197 {
197 {
198 impl->m_CatalogueDao.moveCatalogue(*catalogue,
198 impl->m_CatalogueDao.moveCatalogue(*catalogue,
199 impl->toSyncRepository(catalogue->getRepository()), true);
199 impl->toSyncRepository(catalogue->getRepository()), true);
200 }
200 }
201
201
202 void CatalogueController::saveAll()
202 void CatalogueController::saveAll()
203 {
203 {
204 for (auto repository : impl->m_RepositoryList) {
204 for (auto repository : impl->m_RepositoryList) {
205 // Save Event
205 // Save Event
206 auto events = this->retrieveEvents(repository);
206 auto events = this->retrieveEvents(repository);
207 for (auto event : events) {
207 for (auto event : events) {
208 this->saveEvent(event);
208 this->saveEvent(event);
209 }
209 }
210
210
211 // Save Catalogue
211 // Save Catalogue
212 auto catalogues = this->retrieveCatalogues(repository);
212 auto catalogues = this->retrieveCatalogues(repository);
213 for (auto catalogue : catalogues) {
213 for (auto catalogue : catalogues) {
214 this->saveCatalogue(catalogue);
214 this->saveCatalogue(catalogue);
215 }
215 }
216 }
216 }
217 }
217 }
218
218
219 void CatalogueController::initialize()
219 void CatalogueController::initialize()
220 {
220 {
221 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
221 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init")
222 << QThread::currentThread();
222 << QThread::currentThread();
223 impl->m_WorkingMutex.lock();
223 impl->m_WorkingMutex.lock();
224 impl->m_CatalogueDao.initialize();
224 impl->m_CatalogueDao.initialize();
225 auto defaultRepositoryLocation
225 auto defaultRepositoryLocation
226 = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
226 = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
227
227
228 QDir defaultRepositoryLocationDir;
228 QDir defaultRepositoryLocationDir;
229 if (defaultRepositoryLocationDir.mkpath(defaultRepositoryLocation)) {
229 if (defaultRepositoryLocationDir.mkpath(defaultRepositoryLocation)) {
230 defaultRepositoryLocationDir.cd(defaultRepositoryLocation);
230 defaultRepositoryLocationDir.cd(defaultRepositoryLocation);
231 auto defaultRepository = defaultRepositoryLocationDir.absoluteFilePath(REPOSITORY_DEFAULT);
231 auto defaultRepository = defaultRepositoryLocationDir.absoluteFilePath(REPOSITORY_DEFAULT);
232 qCInfo(LOG_CatalogueController()) << tr("Persistant data loading from: ")
232 qCInfo(LOG_CatalogueController()) << tr("Persistant data loading from: ")
233 << defaultRepository;
233 << defaultRepository;
234 this->addDB(defaultRepository);
234 this->addDB(defaultRepository);
235 }
235 }
236 else {
236 else {
237 qCWarning(LOG_CatalogueController())
237 qCWarning(LOG_CatalogueController())
238 << tr("Cannot load the persistent default repository from ")
238 << tr("Cannot load the persistent default repository from ")
239 << defaultRepositoryLocation;
239 << defaultRepositoryLocation;
240 }
240 }
241
241
242 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init END");
242 qCDebug(LOG_CatalogueController()) << tr("CatalogueController init END");
243 }
243 }
244
244
245 void CatalogueController::finalize()
245 void CatalogueController::finalize()
246 {
246 {
247 impl->m_WorkingMutex.unlock();
247 impl->m_WorkingMutex.unlock();
248 }
248 }
249
249
250 void CatalogueController::waitForFinish()
250 void CatalogueController::waitForFinish()
251 {
251 {
252 QMutexLocker locker{&impl->m_WorkingMutex};
252 QMutexLocker locker{&impl->m_WorkingMutex};
253 }
253 }
254
254
255 void CatalogueController::CatalogueControllerPrivate::copyDBtoDB(const QString &dbFrom,
255 void CatalogueController::CatalogueControllerPrivate::copyDBtoDB(const QString &dbFrom,
256 const QString &dbTo)
256 const QString &dbTo)
257 {
257 {
258 auto catalogues = m_Q->retrieveCatalogues(dbFrom);
258 auto cataloguesShared = std::list<std::shared_ptr<DBCatalogue> >{};
259 auto events = m_Q->retrieveEvents(dbFrom);
259 auto catalogues = m_CatalogueDao.getCatalogues(dbFrom);
260
261 for (auto catalogue : catalogues) {
260 for (auto catalogue : catalogues) {
262 m_CatalogueDao.copyCatalogue(*catalogue, dbTo, true);
261 cataloguesShared.push_back(std::make_shared<DBCatalogue>(catalogue));
263 }
262 }
264
263
264 auto eventsShared = std::list<std::shared_ptr<DBEvent> >{};
265 auto events = m_CatalogueDao.getEvents(dbFrom);
265 for (auto event : events) {
266 for (auto event : events) {
267 eventsShared.push_back(std::make_shared<DBEvent>(event));
268 }
269
270 for (auto catalogue : cataloguesShared) {
271 m_CatalogueDao.copyCatalogue(*catalogue, dbTo, true);
272 }
273
274 for (auto event : eventsShared) {
266 m_CatalogueDao.copyEvent(*event, dbTo, true);
275 m_CatalogueDao.copyEvent(*event, dbTo, true);
267 }
276 }
268 }
277 }
269
278
270 QString CatalogueController::CatalogueControllerPrivate::toWorkRepository(QString repository)
279 QString CatalogueController::CatalogueControllerPrivate::toWorkRepository(QString repository)
271 {
280 {
272 auto syncRepository = toSyncRepository(repository);
281 auto syncRepository = toSyncRepository(repository);
273
282
274 return QString("%1_%2").arg(syncRepository, REPOSITORY_WORK_SUFFIX);
283 return QString("%1_%2").arg(syncRepository, REPOSITORY_WORK_SUFFIX);
275 }
284 }
276
285
277 QString CatalogueController::CatalogueControllerPrivate::toSyncRepository(QString repository)
286 QString CatalogueController::CatalogueControllerPrivate::toSyncRepository(QString repository)
278 {
287 {
279 auto syncRepository = repository;
288 auto syncRepository = repository;
280 if (repository.endsWith(REPOSITORY_WORK_SUFFIX)) {
289 if (repository.endsWith(REPOSITORY_WORK_SUFFIX)) {
281 syncRepository.remove(REPOSITORY_WORK_SUFFIX);
290 syncRepository.remove(REPOSITORY_WORK_SUFFIX);
282 }
291 }
283 else if (repository.endsWith(REPOSITORY_TRASH_SUFFIX)) {
292 else if (repository.endsWith(REPOSITORY_TRASH_SUFFIX)) {
284 syncRepository.remove(REPOSITORY_TRASH_SUFFIX);
293 syncRepository.remove(REPOSITORY_TRASH_SUFFIX);
285 }
294 }
286 return syncRepository;
295 return syncRepository;
287 }
296 }
@@ -1,107 +1,107
1 #include "Catalogue/CatalogueActionManager.h"
1 #include "Catalogue/CatalogueActionManager.h"
2
2
3 #include <Actions/ActionsGuiController.h>
3 #include <Actions/ActionsGuiController.h>
4 #include <Catalogue/CatalogueController.h>
4 #include <Catalogue/CatalogueController.h>
5 #include <SqpApplication.h>
5 #include <SqpApplication.h>
6 #include <Variable/Variable.h>
6 #include <Variable/Variable.h>
7 #include <Visualization/VisualizationGraphWidget.h>
7 #include <Visualization/VisualizationGraphWidget.h>
8 #include <Visualization/VisualizationSelectionZoneItem.h>
8 #include <Visualization/VisualizationSelectionZoneItem.h>
9
9
10 #include <Catalogue/CreateEventDialog.h>
10 #include <Catalogue/CreateEventDialog.h>
11
11
12 #include <DBCatalogue.h>
12 #include <DBCatalogue.h>
13 #include <DBEvent.h>
13 #include <DBEvent.h>
14 #include <DBEventProduct.h>
14 #include <DBEventProduct.h>
15
15
16 #include <QBoxLayout>
16 #include <QBoxLayout>
17 #include <QComboBox>
17 #include <QComboBox>
18 #include <QDialog>
18 #include <QDialog>
19 #include <QDialogButtonBox>
19 #include <QDialogButtonBox>
20 #include <QLineEdit>
20 #include <QLineEdit>
21 #include <memory>
21 #include <memory>
22
22
23 struct CatalogueActionManager::CatalogueActionManagerPrivate {
23 struct CatalogueActionManager::CatalogueActionManagerPrivate {
24 void createEventFromZones(const QString &eventName,
24 void createEventFromZones(const QString &eventName,
25 const QVector<VisualizationSelectionZoneItem *> &zones,
25 const QVector<VisualizationSelectionZoneItem *> &zones,
26 const std::shared_ptr<DBCatalogue> &catalogue = nullptr)
26 const std::shared_ptr<DBCatalogue> &catalogue = nullptr)
27 {
27 {
28 auto event = std::make_shared<DBEvent>();
28 auto event = std::make_shared<DBEvent>();
29 event->setName(eventName);
29 event->setName(eventName);
30
30
31 std::list<DBEventProduct> productList;
31 std::list<DBEventProduct> productList;
32 for (auto zone : zones) {
32 for (auto zone : zones) {
33 auto graph = zone->parentGraphWidget();
33 auto graph = zone->parentGraphWidget();
34 for (auto var : graph->variables()) {
34 for (auto var : graph->variables()) {
35 auto eventProduct = std::make_shared<DBEventProduct>();
35 auto eventProduct = std::make_shared<DBEventProduct>();
36 eventProduct->setEvent(*event);
36 eventProduct->setEvent(*event);
37
37
38 auto zoneRange = zone->range();
38 auto zoneRange = zone->range();
39 eventProduct->setTStart(zoneRange.m_TStart);
39 eventProduct->setTStart(zoneRange.m_TStart);
40 eventProduct->setTEnd(zoneRange.m_TEnd);
40 eventProduct->setTEnd(zoneRange.m_TEnd);
41
41
42 eventProduct->setProductId(var->metadata().value("id", "TODO").toString()); // todo
42 eventProduct->setProductId(var->metadata().value("id", "TODO").toString()); // todo
43
43
44 productList.push_back(*eventProduct);
44 productList.push_back(*eventProduct);
45 }
45 }
46 }
46 }
47
47
48 event->setEventProducts(productList);
48 event->setEventProducts(productList);
49
49
50 // TODO
50 sqpApp->catalogueController().addEvent(event);
51
51 if (catalogue) {
52 if (catalogue) {
53 // TODO
52 // catalogue->addEvent(event);
54 // catalogue->addEvent(event);
53 }
55 }
54 else {
55 }
56 }
56 }
57 };
57 };
58
58
59 CatalogueActionManager::CatalogueActionManager()
59 CatalogueActionManager::CatalogueActionManager()
60 : impl{spimpl::make_unique_impl<CatalogueActionManagerPrivate>()}
60 : impl{spimpl::make_unique_impl<CatalogueActionManagerPrivate>()}
61 {
61 {
62 }
62 }
63
63
64 void CatalogueActionManager::installSelectionZoneActions()
64 void CatalogueActionManager::installSelectionZoneActions()
65 {
65 {
66 auto &actionController = sqpApp->actionsGuiController();
66 auto &actionController = sqpApp->actionsGuiController();
67
67
68 auto createEventEnableFuntion = [](auto zones) {
68 auto createEventEnableFuntion = [](auto zones) {
69 QSet<VisualizationGraphWidget *> usedGraphs;
69 QSet<VisualizationGraphWidget *> usedGraphs;
70 for (auto zone : zones) {
70 for (auto zone : zones) {
71 auto graph = zone->parentGraphWidget();
71 auto graph = zone->parentGraphWidget();
72 if (!usedGraphs.contains(graph)) {
72 if (!usedGraphs.contains(graph)) {
73 usedGraphs.insert(graph);
73 usedGraphs.insert(graph);
74 }
74 }
75 else {
75 else {
76 return false;
76 return false;
77 }
77 }
78 }
78 }
79
79
80 return true;
80 return true;
81 };
81 };
82
82
83 auto createEventAction = actionController.addSectionZoneAction(
83 auto createEventAction = actionController.addSectionZoneAction(
84 {QObject::tr("Catalogues")}, QObject::tr("New Event..."), [this](auto zones) {
84 {QObject::tr("Catalogues")}, QObject::tr("New Event..."), [this](auto zones) {
85 CreateEventDialog dialog;
85 CreateEventDialog dialog;
86 dialog.hideCatalogueChoice();
86 dialog.hideCatalogueChoice();
87 if (dialog.exec() == QDialog::Accepted) {
87 if (dialog.exec() == QDialog::Accepted) {
88 impl->createEventFromZones(dialog.eventName(), zones);
88 impl->createEventFromZones(dialog.eventName(), zones);
89 }
89 }
90 });
90 });
91 createEventAction->setEnableFunction(createEventEnableFuntion);
91 createEventAction->setEnableFunction(createEventEnableFuntion);
92
92
93 auto createEventInCatalogueAction = actionController.addSectionZoneAction(
93 auto createEventInCatalogueAction = actionController.addSectionZoneAction(
94 {QObject::tr("Catalogues")}, QObject::tr("New Event in Catalogue..."), [this](auto zones) {
94 {QObject::tr("Catalogues")}, QObject::tr("New Event in Catalogue..."), [this](auto zones) {
95 CreateEventDialog dialog;
95 CreateEventDialog dialog;
96 if (dialog.exec() == QDialog::Accepted) {
96 if (dialog.exec() == QDialog::Accepted) {
97 auto selectedCatalogue = dialog.selectedCatalogue();
97 auto selectedCatalogue = dialog.selectedCatalogue();
98 if (!selectedCatalogue) {
98 if (!selectedCatalogue) {
99 selectedCatalogue = std::make_shared<DBCatalogue>();
99 selectedCatalogue = std::make_shared<DBCatalogue>();
100 selectedCatalogue->setName(dialog.catalogueName());
100 selectedCatalogue->setName(dialog.catalogueName());
101 }
101 }
102
102
103 impl->createEventFromZones(dialog.eventName(), zones, selectedCatalogue);
103 impl->createEventFromZones(dialog.eventName(), zones, selectedCatalogue);
104 }
104 }
105 });
105 });
106 createEventInCatalogueAction->setEnableFunction(createEventEnableFuntion);
106 createEventInCatalogueAction->setEnableFunction(createEventEnableFuntion);
107 }
107 }
@@ -1,89 +1,95
1 #include "Catalogue/CatalogueExplorer.h"
1 #include "Catalogue/CatalogueExplorer.h"
2 #include "ui_CatalogueExplorer.h"
2 #include "ui_CatalogueExplorer.h"
3
3
4 #include <Catalogue/CatalogueActionManager.h>
4 #include <Catalogue/CatalogueActionManager.h>
5 #include <Catalogue/CatalogueController.h>
6 #include <SqpApplication.h>
5 #include <Visualization/VisualizationWidget.h>
7 #include <Visualization/VisualizationWidget.h>
6
8
7 #include <DBCatalogue.h>
9 #include <DBCatalogue.h>
8 #include <DBEvent.h>
10 #include <DBEvent.h>
9
11
10 struct CatalogueExplorer::CatalogueExplorerPrivate {
12 struct CatalogueExplorer::CatalogueExplorerPrivate {
11 CatalogueActionManager m_ActionManager;
13 CatalogueActionManager m_ActionManager;
12 };
14 };
13
15
14 CatalogueExplorer::CatalogueExplorer(QWidget *parent)
16 CatalogueExplorer::CatalogueExplorer(QWidget *parent)
15 : QDialog(parent, Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint),
17 : QDialog(parent, Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint),
16 ui(new Ui::CatalogueExplorer),
18 ui(new Ui::CatalogueExplorer),
17 impl{spimpl::make_unique_impl<CatalogueExplorerPrivate>()}
19 impl{spimpl::make_unique_impl<CatalogueExplorerPrivate>()}
18 {
20 {
19 ui->setupUi(this);
21 ui->setupUi(this);
20
22
21 impl->m_ActionManager.installSelectionZoneActions();
23 impl->m_ActionManager.installSelectionZoneActions();
22
24
23 connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSelected, [this](auto catalogues) {
25 connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSelected, [this](auto catalogues) {
24 if (catalogues.count() == 1) {
26 if (catalogues.count() == 1) {
25 ui->inspector->setCatalogue(catalogues.first());
27 ui->inspector->setCatalogue(catalogues.first());
26 }
28 }
27 else {
29 else {
28 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
30 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
29 }
31 }
30
32
31 ui->events->populateWithCatalogues(catalogues);
33 ui->events->populateWithCatalogues(catalogues);
32 });
34 });
33
35
34 connect(ui->catalogues, &CatalogueSideBarWidget::databaseSelected, [this](auto databases) {
36 connect(ui->catalogues, &CatalogueSideBarWidget::databaseSelected, [this](auto databases) {
35 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
37 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
36 });
38 });
37
39
38 connect(ui->catalogues, &CatalogueSideBarWidget::trashSelected,
40 connect(ui->catalogues, &CatalogueSideBarWidget::trashSelected,
39 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
41 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
40
42
41 connect(ui->catalogues, &CatalogueSideBarWidget::allEventsSelected, [this]() {
43 connect(ui->catalogues, &CatalogueSideBarWidget::allEventsSelected, [this]() {
42 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
44 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
43 ui->events->populateWithAllEvents();
45 ui->events->populateWithAllEvents();
44 });
46 });
45
47
46 connect(ui->catalogues, &CatalogueSideBarWidget::selectionCleared,
48 connect(ui->catalogues, &CatalogueSideBarWidget::selectionCleared,
47 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
49 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
48
50
49 connect(ui->events, &CatalogueEventsWidget::eventsSelected, [this](auto events) {
51 connect(ui->events, &CatalogueEventsWidget::eventsSelected, [this](auto events) {
50 if (events.count() == 1) {
52 if (events.count() == 1) {
51 ui->inspector->setEvent(events.first());
53 ui->inspector->setEvent(events.first());
52 }
54 }
53 else {
55 else {
54 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
56 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
55 }
57 }
56 });
58 });
57
59
58 connect(ui->events, &CatalogueEventsWidget::eventProductsSelected, [this](auto eventProducts) {
60 connect(ui->events, &CatalogueEventsWidget::eventProductsSelected, [this](auto eventProducts) {
59 if (eventProducts.count() == 1) {
61 if (eventProducts.count() == 1) {
60 ui->inspector->setEventProduct(eventProducts.first().first,
62 ui->inspector->setEventProduct(eventProducts.first().first,
61 eventProducts.first().second);
63 eventProducts.first().second);
62 }
64 }
63 else {
65 else {
64 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
66 ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty);
65 }
67 }
66 });
68 });
67
69
68 connect(ui->events, &CatalogueEventsWidget::selectionCleared,
70 connect(ui->events, &CatalogueEventsWidget::selectionCleared,
69 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
71 [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); });
70
72
71 connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated,
73 connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated, [this](auto catalogue) {
72 [this](auto catalogue) { ui->catalogues->setCatalogueChanges(catalogue, true); });
74 sqpApp->catalogueController().updateCatalogue(catalogue);
75 ui->catalogues->setCatalogueChanges(catalogue, true);
76 });
73
77
74 connect(ui->inspector, &CatalogueInspectorWidget::eventUpdated,
78 connect(ui->inspector, &CatalogueInspectorWidget::eventUpdated, [this](auto event) {
75 [this](auto event) { ui->events->setEventChanges(event, true); });
79 sqpApp->catalogueController().updateEvent(event);
80 ui->events->setEventChanges(event, true);
81 });
76
82
77 connect(ui->inspector, &CatalogueInspectorWidget::eventProductUpdated,
83 connect(ui->inspector, &CatalogueInspectorWidget::eventProductUpdated,
78 [this](auto event, auto eventProduct) { ui->events->setEventChanges(event, true); });
84 [this](auto event, auto eventProduct) { ui->events->setEventChanges(event, true); });
79 }
85 }
80
86
81 CatalogueExplorer::~CatalogueExplorer()
87 CatalogueExplorer::~CatalogueExplorer()
82 {
88 {
83 delete ui;
89 delete ui;
84 }
90 }
85
91
86 void CatalogueExplorer::setVisualizationWidget(VisualizationWidget *visualization)
92 void CatalogueExplorer::setVisualizationWidget(VisualizationWidget *visualization)
87 {
93 {
88 ui->events->setVisualizationWidget(visualization);
94 ui->events->setVisualizationWidget(visualization);
89 }
95 }
@@ -1,247 +1,250
1 #include "Catalogue/CatalogueSideBarWidget.h"
1 #include "Catalogue/CatalogueSideBarWidget.h"
2 #include "ui_CatalogueSideBarWidget.h"
2 #include "ui_CatalogueSideBarWidget.h"
3 #include <SqpApplication.h>
3 #include <SqpApplication.h>
4
4
5 #include <Catalogue/CatalogueController.h>
5 #include <Catalogue/CatalogueController.h>
6 #include <Catalogue/CatalogueTreeWidgetItem.h>
6 #include <Catalogue/CatalogueTreeWidgetItem.h>
7 #include <CatalogueDao.h>
7 #include <CatalogueDao.h>
8 #include <ComparaisonPredicate.h>
8 #include <ComparaisonPredicate.h>
9 #include <DBCatalogue.h>
9 #include <DBCatalogue.h>
10
10
11 #include <QMenu>
11 #include <QMenu>
12
12
13 Q_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget, "CatalogueSideBarWidget")
13 Q_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget, "CatalogueSideBarWidget")
14
14
15
15
16 constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType;
16 constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType;
17 constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1;
17 constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1;
18 constexpr auto CATALOGUE_ITEM_TYPE = QTreeWidgetItem::UserType + 2;
18 constexpr auto CATALOGUE_ITEM_TYPE = QTreeWidgetItem::UserType + 2;
19 constexpr auto DATABASE_ITEM_TYPE = QTreeWidgetItem::UserType + 3;
19 constexpr auto DATABASE_ITEM_TYPE = QTreeWidgetItem::UserType + 3;
20
20
21
21
22 struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate {
22 struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate {
23
23
24 void configureTreeWidget(QTreeWidget *treeWidget);
24 void configureTreeWidget(QTreeWidget *treeWidget);
25 QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget);
25 QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget);
26 QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget);
26 QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget);
27 void addCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
27 void addCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
28 QTreeWidgetItem *parentDatabaseItem);
28 QTreeWidgetItem *parentDatabaseItem);
29
29
30 CatalogueTreeWidgetItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
30 CatalogueTreeWidgetItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
31 QTreeWidget *treeWidget) const;
31 QTreeWidget *treeWidget) const;
32 };
32 };
33
33
34 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
34 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
35 : QWidget(parent),
35 : QWidget(parent),
36 ui(new Ui::CatalogueSideBarWidget),
36 ui(new Ui::CatalogueSideBarWidget),
37 impl{spimpl::make_unique_impl<CatalogueSideBarWidgetPrivate>()}
37 impl{spimpl::make_unique_impl<CatalogueSideBarWidgetPrivate>()}
38 {
38 {
39 ui->setupUi(this);
39 ui->setupUi(this);
40 impl->configureTreeWidget(ui->treeWidget);
40 impl->configureTreeWidget(ui->treeWidget);
41
41
42 ui->treeWidget->setColumnCount(2);
42 ui->treeWidget->setColumnCount(2);
43 ui->treeWidget->header()->setStretchLastSection(false);
43 ui->treeWidget->header()->setStretchLastSection(false);
44 ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
44 ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
45 ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);
45 ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);
46
46
47 auto emitSelection = [this]() {
47 auto emitSelection = [this]() {
48
48
49 auto selectedItems = ui->treeWidget->selectedItems();
49 auto selectedItems = ui->treeWidget->selectedItems();
50 if (selectedItems.isEmpty()) {
50 if (selectedItems.isEmpty()) {
51 emit this->selectionCleared();
51 emit this->selectionCleared();
52 }
52 }
53 else {
53 else {
54 QVector<std::shared_ptr<DBCatalogue> > catalogues;
54 QVector<std::shared_ptr<DBCatalogue> > catalogues;
55 QStringList databases;
55 QStringList databases;
56 int selectionType = selectedItems.first()->type();
56 int selectionType = selectedItems.first()->type();
57
57
58 for (auto item : ui->treeWidget->selectedItems()) {
58 for (auto item : ui->treeWidget->selectedItems()) {
59 if (item->type() == selectionType) {
59 if (item->type() == selectionType) {
60 switch (selectionType) {
60 switch (selectionType) {
61 case CATALOGUE_ITEM_TYPE:
61 case CATALOGUE_ITEM_TYPE:
62 catalogues.append(
62 catalogues.append(
63 static_cast<CatalogueTreeWidgetItem *>(item)->catalogue());
63 static_cast<CatalogueTreeWidgetItem *>(item)->catalogue());
64 break;
64 break;
65 case DATABASE_ITEM_TYPE:
65 case DATABASE_ITEM_TYPE:
66 selectionType = DATABASE_ITEM_TYPE;
66 selectionType = DATABASE_ITEM_TYPE;
67 databases.append(item->text(0));
67 databases.append(item->text(0));
68 case ALL_EVENT_ITEM_TYPE: // fallthrough
68 case ALL_EVENT_ITEM_TYPE: // fallthrough
69 case TRASH_ITEM_TYPE: // fallthrough
69 case TRASH_ITEM_TYPE: // fallthrough
70 default:
70 default:
71 break;
71 break;
72 }
72 }
73 }
73 }
74 else {
74 else {
75 // Incoherent multi selection
75 // Incoherent multi selection
76 selectionType = -1;
76 selectionType = -1;
77 break;
77 break;
78 }
78 }
79 }
79 }
80
80
81 switch (selectionType) {
81 switch (selectionType) {
82 case CATALOGUE_ITEM_TYPE:
82 case CATALOGUE_ITEM_TYPE:
83 emit this->catalogueSelected(catalogues);
83 emit this->catalogueSelected(catalogues);
84 break;
84 break;
85 case DATABASE_ITEM_TYPE:
85 case DATABASE_ITEM_TYPE:
86 emit this->databaseSelected(databases);
86 emit this->databaseSelected(databases);
87 break;
87 break;
88 case ALL_EVENT_ITEM_TYPE:
88 case ALL_EVENT_ITEM_TYPE:
89 emit this->allEventsSelected();
89 emit this->allEventsSelected();
90 break;
90 break;
91 case TRASH_ITEM_TYPE:
91 case TRASH_ITEM_TYPE:
92 emit this->trashSelected();
92 emit this->trashSelected();
93 break;
93 break;
94 default:
94 default:
95 emit this->selectionCleared();
95 emit this->selectionCleared();
96 break;
96 break;
97 }
97 }
98 }
98 }
99
99
100
100
101 };
101 };
102
102
103 connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection);
103 connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection);
104 connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection);
104 connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection);
105 connect(ui->treeWidget, &QTreeWidget::itemChanged,
105 connect(ui->treeWidget, &QTreeWidget::itemChanged,
106 [emitSelection, this](auto item, auto column) {
106 [emitSelection, this](auto item, auto column) {
107 auto selectedItems = ui->treeWidget->selectedItems();
107 auto selectedItems = ui->treeWidget->selectedItems();
108 qDebug() << "ITEM CHANGED" << column;
108 qDebug() << "ITEM CHANGED" << column;
109 if (selectedItems.contains(item) && column == 0) {
109 if (selectedItems.contains(item) && column == 0) {
110 emitSelection();
110 emitSelection();
111 }
111 }
112 });
112 });
113
113
114 ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
114 ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
115 connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
115 connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
116 &CatalogueSideBarWidget::onContextMenuRequested);
116 &CatalogueSideBarWidget::onContextMenuRequested);
117 }
117 }
118
118
119 CatalogueSideBarWidget::~CatalogueSideBarWidget()
119 CatalogueSideBarWidget::~CatalogueSideBarWidget()
120 {
120 {
121 delete ui;
121 delete ui;
122 }
122 }
123
123
124 void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr<DBCatalogue> &catalogue,
124 void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr<DBCatalogue> &catalogue,
125 bool hasChanges)
125 bool hasChanges)
126 {
126 {
127 if (auto catalogueItem = impl->getCatalogueItem(catalogue, ui->treeWidget)) {
127 if (auto catalogueItem = impl->getCatalogueItem(catalogue, ui->treeWidget)) {
128 catalogueItem->setHasChanges(hasChanges);
128 catalogueItem->setHasChanges(hasChanges);
129 catalogueItem->refresh();
129 catalogueItem->refresh();
130 }
130 }
131 }
131 }
132
132
133 void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos)
133 void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos)
134 {
134 {
135 QMenu menu{this};
135 QMenu menu{this};
136
136
137 auto currentItem = ui->treeWidget->currentItem();
137 auto currentItem = ui->treeWidget->currentItem();
138 switch (currentItem->type()) {
138 switch (currentItem->type()) {
139 case CATALOGUE_ITEM_TYPE:
139 case CATALOGUE_ITEM_TYPE:
140 menu.addAction("Rename",
140 menu.addAction("Rename",
141 [this, currentItem]() { ui->treeWidget->editItem(currentItem); });
141 [this, currentItem]() { ui->treeWidget->editItem(currentItem); });
142 break;
142 break;
143 case DATABASE_ITEM_TYPE:
143 case DATABASE_ITEM_TYPE:
144 break;
144 break;
145 case ALL_EVENT_ITEM_TYPE:
145 case ALL_EVENT_ITEM_TYPE:
146 break;
146 break;
147 case TRASH_ITEM_TYPE:
147 case TRASH_ITEM_TYPE:
148 menu.addAction("Empty Trash", []() {
148 menu.addAction("Empty Trash", []() {
149 // TODO
149 // TODO
150 });
150 });
151 break;
151 break;
152 default:
152 default:
153 break;
153 break;
154 }
154 }
155
155
156 if (!menu.isEmpty()) {
156 if (!menu.isEmpty()) {
157 menu.exec(ui->treeWidget->mapToGlobal(pos));
157 menu.exec(ui->treeWidget->mapToGlobal(pos));
158 }
158 }
159 }
159 }
160
160
161 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget(
161 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget(
162 QTreeWidget *treeWidget)
162 QTreeWidget *treeWidget)
163 {
163 {
164 auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE};
164 auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE};
165 allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png"));
165 allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png"));
166 treeWidget->addTopLevelItem(allEventsItem);
166 treeWidget->addTopLevelItem(allEventsItem);
167
167
168 auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE};
168 auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE};
169 trashItem->setIcon(0, QIcon(":/icones/trash.png"));
169 trashItem->setIcon(0, QIcon(":/icones/trash.png"));
170 treeWidget->addTopLevelItem(trashItem);
170 treeWidget->addTopLevelItem(trashItem);
171
171
172 auto separator = new QFrame{treeWidget};
172 auto separator = new QFrame{treeWidget};
173 separator->setFrameShape(QFrame::HLine);
173 separator->setFrameShape(QFrame::HLine);
174 auto separatorItem = new QTreeWidgetItem{};
174 auto separatorItem = new QTreeWidgetItem{};
175 separatorItem->setFlags(Qt::NoItemFlags);
175 separatorItem->setFlags(Qt::NoItemFlags);
176 treeWidget->addTopLevelItem(separatorItem);
176 treeWidget->addTopLevelItem(separatorItem);
177 treeWidget->setItemWidget(separatorItem, 0, separator);
177 treeWidget->setItemWidget(separatorItem, 0, separator);
178
178
179 auto db = addDatabaseItem("Default", treeWidget);
179 auto repositories = sqpApp->catalogueController().getRepositories();
180 for (auto dbname : repositories) {
181 auto db = addDatabaseItem(dbname, treeWidget);
180
182
181 auto catalogues = sqpApp->catalogueController().retrieveCatalogues("Default");
183 auto catalogues = sqpApp->catalogueController().retrieveCatalogues(dbname);
182 for (auto catalogue : catalogues) {
184 for (auto catalogue : catalogues) {
183 addCatalogueItem(catalogue, db);
185 addCatalogueItem(catalogue, db);
184 }
186 }
187 }
185
188
186 treeWidget->expandAll();
189 treeWidget->expandAll();
187 }
190 }
188
191
189 QTreeWidgetItem *
192 QTreeWidgetItem *
190 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name,
193 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name,
191 QTreeWidget *treeWidget)
194 QTreeWidget *treeWidget)
192 {
195 {
193 auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE};
196 auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE};
194 databaseItem->setIcon(0, QIcon{":/icones/database.png"});
197 databaseItem->setIcon(0, QIcon{":/icones/database.png"});
195 treeWidget->addTopLevelItem(databaseItem);
198 treeWidget->addTopLevelItem(databaseItem);
196
199
197 return databaseItem;
200 return databaseItem;
198 }
201 }
199
202
200 QTreeWidgetItem *
203 QTreeWidgetItem *
201 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getDatabaseItem(const QString &name,
204 CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getDatabaseItem(const QString &name,
202 QTreeWidget *treeWidget)
205 QTreeWidget *treeWidget)
203 {
206 {
204 for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) {
207 for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) {
205 auto item = treeWidget->topLevelItem(i);
208 auto item = treeWidget->topLevelItem(i);
206 if (item->type() == DATABASE_ITEM_TYPE && item->text(0) == name) {
209 if (item->type() == DATABASE_ITEM_TYPE && item->text(0) == name) {
207 return item;
210 return item;
208 }
211 }
209 }
212 }
210
213
211 return nullptr;
214 return nullptr;
212 }
215 }
213
216
214 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem(
217 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem(
215 const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidgetItem *parentDatabaseItem)
218 const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidgetItem *parentDatabaseItem)
216 {
219 {
217 auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE};
220 auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE};
218 catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"});
221 catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"});
219 parentDatabaseItem->addChild(catalogueItem);
222 parentDatabaseItem->addChild(catalogueItem);
220 }
223 }
221
224
222 CatalogueTreeWidgetItem *CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getCatalogueItem(
225 CatalogueTreeWidgetItem *CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getCatalogueItem(
223 const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidget *treeWidget) const
226 const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidget *treeWidget) const
224 {
227 {
225 for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) {
228 for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) {
226 auto item = treeWidget->topLevelItem(i);
229 auto item = treeWidget->topLevelItem(i);
227 if (item->type() == DATABASE_ITEM_TYPE) {
230 if (item->type() == DATABASE_ITEM_TYPE) {
228 for (auto j = 0; j < item->childCount(); ++j) {
231 for (auto j = 0; j < item->childCount(); ++j) {
229 auto childItem = item->child(j);
232 auto childItem = item->child(j);
230 if (childItem->type() == CATALOGUE_ITEM_TYPE) {
233 if (childItem->type() == CATALOGUE_ITEM_TYPE) {
231 auto catalogueItem = static_cast<CatalogueTreeWidgetItem *>(childItem);
234 auto catalogueItem = static_cast<CatalogueTreeWidgetItem *>(childItem);
232 if (catalogueItem->catalogue() == catalogue) {
235 if (catalogueItem->catalogue() == catalogue) {
233 return catalogueItem;
236 return catalogueItem;
234 }
237 }
235 }
238 }
236 else {
239 else {
237 qCWarning(LOG_CatalogueSideBarWidget()) << "getCatalogueItem: Invalid tree "
240 qCWarning(LOG_CatalogueSideBarWidget()) << "getCatalogueItem: Invalid tree "
238 "structure. A database item should "
241 "structure. A database item should "
239 "only contain catalogues.";
242 "only contain catalogues.";
240 Q_ASSERT(false);
243 Q_ASSERT(false);
241 }
244 }
242 }
245 }
243 }
246 }
244 }
247 }
245
248
246 return nullptr;
249 return nullptr;
247 }
250 }
@@ -1,87 +1,91
1 #include "Catalogue/CatalogueTreeWidgetItem.h"
1 #include "Catalogue/CatalogueTreeWidgetItem.h"
2 #include <Catalogue/CatalogueExplorerHelper.h>
2 #include <Catalogue/CatalogueExplorerHelper.h>
3
3
4 #include <Catalogue/CatalogueController.h>
5 #include <SqpApplication.h>
6
4 #include <memory>
7 #include <memory>
5
8
6 #include <DBCatalogue.h>
9 #include <DBCatalogue.h>
7
10
8 /// Column in the tree widget where the apply and cancel buttons must appear
11 /// Column in the tree widget where the apply and cancel buttons must appear
9 const auto APPLY_CANCEL_BUTTONS_COLUMN = 1;
12 const auto APPLY_CANCEL_BUTTONS_COLUMN = 1;
10
13
11 struct CatalogueTreeWidgetItem::CatalogueTreeWidgetItemPrivate {
14 struct CatalogueTreeWidgetItem::CatalogueTreeWidgetItemPrivate {
12
15
13 std::shared_ptr<DBCatalogue> m_Catalogue;
16 std::shared_ptr<DBCatalogue> m_Catalogue;
14
17
15 CatalogueTreeWidgetItemPrivate(std::shared_ptr<DBCatalogue> catalogue) : m_Catalogue(catalogue)
18 CatalogueTreeWidgetItemPrivate(std::shared_ptr<DBCatalogue> catalogue) : m_Catalogue(catalogue)
16 {
19 {
17 }
20 }
18 };
21 };
19
22
20
23
21 CatalogueTreeWidgetItem::CatalogueTreeWidgetItem(std::shared_ptr<DBCatalogue> catalogue, int type)
24 CatalogueTreeWidgetItem::CatalogueTreeWidgetItem(std::shared_ptr<DBCatalogue> catalogue, int type)
22 : QTreeWidgetItem(type),
25 : QTreeWidgetItem(type),
23 impl{spimpl::make_unique_impl<CatalogueTreeWidgetItemPrivate>(catalogue)}
26 impl{spimpl::make_unique_impl<CatalogueTreeWidgetItemPrivate>(catalogue)}
24 {
27 {
25 setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
28 setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
26 }
29 }
27
30
28 QVariant CatalogueTreeWidgetItem::data(int column, int role) const
31 QVariant CatalogueTreeWidgetItem::data(int column, int role) const
29 {
32 {
30 if (column == 0) {
33 if (column == 0) {
31 switch (role) {
34 switch (role) {
32 case Qt::EditRole: // fallthrough
35 case Qt::EditRole: // fallthrough
33 case Qt::DisplayRole:
36 case Qt::DisplayRole:
34 return impl->m_Catalogue->getName();
37 return impl->m_Catalogue->getName();
35 default:
38 default:
36 break;
39 break;
37 }
40 }
38 }
41 }
39
42
40 return QTreeWidgetItem::data(column, role);
43 return QTreeWidgetItem::data(column, role);
41 }
44 }
42
45
43 void CatalogueTreeWidgetItem::setData(int column, int role, const QVariant &value)
46 void CatalogueTreeWidgetItem::setData(int column, int role, const QVariant &value)
44 {
47 {
45 if (role == Qt::EditRole && column == 0) {
48 if (role == Qt::EditRole && column == 0) {
46 auto newName = value.toString();
49 auto newName = value.toString();
47 if (newName != impl->m_Catalogue->getName()) {
50 if (newName != impl->m_Catalogue->getName()) {
48 setText(0, newName);
51 setText(0, newName);
49 impl->m_Catalogue->setName(newName);
52 impl->m_Catalogue->setName(newName);
53 sqpApp->catalogueController().updateCatalogue(impl->m_Catalogue);
50 setHasChanges(true);
54 setHasChanges(true);
51 }
55 }
52 }
56 }
53 else {
57 else {
54 QTreeWidgetItem::setData(column, role, value);
58 QTreeWidgetItem::setData(column, role, value);
55 }
59 }
56 }
60 }
57
61
58 std::shared_ptr<DBCatalogue> CatalogueTreeWidgetItem::catalogue() const
62 std::shared_ptr<DBCatalogue> CatalogueTreeWidgetItem::catalogue() const
59 {
63 {
60 return impl->m_Catalogue;
64 return impl->m_Catalogue;
61 }
65 }
62
66
63 void CatalogueTreeWidgetItem::setHasChanges(bool value)
67 void CatalogueTreeWidgetItem::setHasChanges(bool value)
64 {
68 {
65 if (value) {
69 if (value) {
66 if (!hasChanges()) {
70 if (!hasChanges()) {
67 auto widget = CatalogueExplorerHelper::buildValidationWidget(
71 auto widget = CatalogueExplorerHelper::buildValidationWidget(
68 treeWidget(), [this]() { setHasChanges(false); },
72 treeWidget(), [this]() { setHasChanges(false); },
69 [this]() { setHasChanges(false); });
73 [this]() { setHasChanges(false); });
70 treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, widget);
74 treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, widget);
71 }
75 }
72 }
76 }
73 else {
77 else {
74 // Note: the widget is destroyed
78 // Note: the widget is destroyed
75 treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, nullptr);
79 treeWidget()->setItemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN, nullptr);
76 }
80 }
77 }
81 }
78
82
79 bool CatalogueTreeWidgetItem::hasChanges()
83 bool CatalogueTreeWidgetItem::hasChanges()
80 {
84 {
81 return treeWidget()->itemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN) != nullptr;
85 return treeWidget()->itemWidget(this, APPLY_CANCEL_BUTTONS_COLUMN) != nullptr;
82 }
86 }
83
87
84 void CatalogueTreeWidgetItem::refresh()
88 void CatalogueTreeWidgetItem::refresh()
85 {
89 {
86 emitDataChanged();
90 emitDataChanged();
87 }
91 }
@@ -1,59 +1,59
1 #include "Catalogue/CreateEventDialog.h"
1 #include "Catalogue/CreateEventDialog.h"
2 #include "ui_CreateEventDialog.h"
2 #include "ui_CreateEventDialog.h"
3
3
4 #include <Catalogue/CatalogueController.h>
4 #include <Catalogue/CatalogueController.h>
5 #include <SqpApplication.h>
5 #include <SqpApplication.h>
6
6
7 #include <DBCatalogue.h>
7 #include <DBCatalogue.h>
8
8
9 struct CreateEventDialog::CreateEventDialogPrivate {
9 struct CreateEventDialog::CreateEventDialogPrivate {
10 QVector<std::shared_ptr<DBCatalogue> > m_DisplayedCatalogues;
10 QVector<std::shared_ptr<DBCatalogue> > m_DisplayedCatalogues;
11 };
11 };
12
12
13 CreateEventDialog::CreateEventDialog(QWidget *parent)
13 CreateEventDialog::CreateEventDialog(QWidget *parent)
14 : QDialog(parent),
14 : QDialog(parent),
15 ui(new Ui::CreateEventDialog),
15 ui(new Ui::CreateEventDialog),
16 impl{spimpl::make_unique_impl<CreateEventDialogPrivate>()}
16 impl{spimpl::make_unique_impl<CreateEventDialogPrivate>()}
17 {
17 {
18 ui->setupUi(this);
18 ui->setupUi(this);
19
19
20 connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
20 connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
21 connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
21 connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
22
22
23 auto catalogues = sqpApp->catalogueController().getCatalogues("Default");
23 auto catalogues = sqpApp->catalogueController().retrieveCatalogues();
24 for (auto cat : catalogues) {
24 for (auto cat : catalogues) {
25 ui->cbCatalogue->addItem(cat->getName());
25 ui->cbCatalogue->addItem(cat->getName());
26 impl->m_DisplayedCatalogues << cat;
26 impl->m_DisplayedCatalogues << cat;
27 }
27 }
28 }
28 }
29
29
30 CreateEventDialog::~CreateEventDialog()
30 CreateEventDialog::~CreateEventDialog()
31 {
31 {
32 delete ui;
32 delete ui;
33 }
33 }
34
34
35 void CreateEventDialog::hideCatalogueChoice()
35 void CreateEventDialog::hideCatalogueChoice()
36 {
36 {
37 ui->cbCatalogue->hide();
37 ui->cbCatalogue->hide();
38 ui->lblCatalogue->hide();
38 ui->lblCatalogue->hide();
39 }
39 }
40
40
41 QString CreateEventDialog::eventName() const
41 QString CreateEventDialog::eventName() const
42 {
42 {
43 return ui->leEvent->text();
43 return ui->leEvent->text();
44 }
44 }
45
45
46 std::shared_ptr<DBCatalogue> CreateEventDialog::selectedCatalogue() const
46 std::shared_ptr<DBCatalogue> CreateEventDialog::selectedCatalogue() const
47 {
47 {
48 auto catalogue = impl->m_DisplayedCatalogues.value(ui->cbCatalogue->currentIndex());
48 auto catalogue = impl->m_DisplayedCatalogues.value(ui->cbCatalogue->currentIndex());
49 if (!catalogue || catalogue->getName() != catalogueName()) {
49 if (!catalogue || catalogue->getName() != catalogueName()) {
50 return nullptr;
50 return nullptr;
51 }
51 }
52
52
53 return catalogue;
53 return catalogue;
54 }
54 }
55
55
56 QString CreateEventDialog::catalogueName() const
56 QString CreateEventDialog::catalogueName() const
57 {
57 {
58 return ui->cbCatalogue->currentText();
58 return ui->cbCatalogue->currentText();
59 }
59 }
General Comments 4
Under Review
author

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

Changed commits:
  * 1 added
  * 0 removed

Changed files:
  * M app/src/Main.cpp
  * M core/include/Catalogue/CatalogueController.h
  * M core/src/Catalogue/CatalogueController.cpp
  * M core/src/Plugin/PluginManager.cpp
  * M core/tests/Data/TestDataSeriesUtils.cpp
  * M gui/include/Catalogue/CatalogueEventsModel.h
  * M gui/include/Catalogue/CatalogueEventsWidget.h
  * M gui/include/Catalogue/CatalogueTreeWidgetItem.h
  * M gui/meson.build
  * M gui/src/Catalogue/CatalogueEventsModel.cpp
  * M gui/src/Catalogue/CatalogueEventsWidget.cpp
  * M gui/src/Catalogue/CatalogueExplorer.cpp
  * M gui/src/Catalogue/CatalogueSideBarWidget.cpp
  * M gui/src/Catalogue/CatalogueTreeWidgetItem.cpp
  * M gui/src/Visualization/VisualizationActionManager.cpp
  * M gui/src/Visualization/VisualizationGraphWidget.cpp
  * M gui/src/Visualization/VisualizationSelectionZoneItem.cpp
  * M plugins/amda/tests/TestAmdaResultParser.cpp
  * R cmake/FindCatalogueAPI.cmake
  * R core/include/Common/MimeTypesDef.h
  * R core/include/Data/DataSeriesUtils.h
  * R core/include/Data/OptionalAxis.h
  * R core/include/Data/SpectrogramSeries.h
  * R core/include/Data/Unit.h
  * R core/include/DataSource/DataSourceItemMergeHelper.h
  * R core/include/Variable/VariableCacheStrategyFactory.h
  * R core/include/Variable/VariableSingleThresholdCacheStrategy.h
  * R core/src/Common/MimeTypesDef.cpp
  * R core/src/Data/DataSeriesUtils.cpp
  * R core/src/Data/OptionalAxis.cpp
  * R core/src/Data/SpectrogramSeries.cpp
  * R core/src/DataSource/DataSourceItemMergeHelper.cpp
  * R core/tests-resources/TestDataSeriesUtils/TestThresholds.txt
  * R core/tests/Data/DataSeriesBuilders.cpp
  * R core/tests/Data/DataSeriesBuilders.h
  * R core/tests/Data/DataSeriesTestsUtils.cpp
  * R core/tests/Data/DataSeriesTestsUtils.h
  * R core/tests/Data/TestOptionalAxis.cpp
  * R core/tests/Data/TestScalarSeries.cpp
  * R core/tests/Data/TestSpectrogramSeries.cpp
  * R core/tests/Data/TestVectorSeries.cpp
  * R core/tests/DataSource/DataSourceItemBuilder.cpp
  * R core/tests/DataSource/DataSourceItemBuilder.h
  * R core/tests/DataSource/TestDataSourceItem.cpp
  * R core/tests/Variable/TestVariableSync.cpp
  * R extern/CatalogueAPI.cmake
  * R gui/include/Actions/ActionsGuiController.h
  * R gui/include/Actions/SelectionZoneAction.h
  * R gui/include/Catalogue/CatalogueExplorer.h
  * R gui/include/Catalogue/CatalogueInspectorWidget.h
  * R gui/include/Catalogue/CatalogueSideBarWidget.h
  * R gui/include/Common/VisualizationDef.h
  * R gui/include/DataSource/DataSourceTreeWidget.h
  * R gui/include/DragAndDrop/DragDropGuiController.h
  * R gui/include/DragAndDrop/DragDropScroller.h
  * R gui/include/DragAndDrop/DragDropTabSwitcher.h
  * R gui/include/Variable/VariableInspectorTableView.h
  * R gui/include/Visualization/AxisRenderingUtils.h
  * R gui/include/Visualization/ColorScaleEditor.h
  * R gui/include/Visualization/MacScrollBarStyle.h
  * R gui/include/Visualization/PlottablesRenderingUtils.h
  * R gui/include/Visualization/QCPColorMapIterator.h
  * R gui/include/Visualization/SqpColorScale.h
  * R gui/include/Visualization/VisualizationActionManager.h
  * R gui/include/Visualization/VisualizationCursorItem.h
  * R gui/include/Visualization/VisualizationDragDropContainer.h
  * R gui/include/Visualization/VisualizationDragWidget.h
  * R gui/include/Visualization/VisualizationMultiZoneSelectionDialog.h
  * R gui/include/Visualization/VisualizationSelectionZoneItem.h
  * R gui/include/Visualization/VisualizationSelectionZoneManager.h
  * R gui/resources/icones/add.png
  * R gui/resources/icones/allEvents.png
  * R gui/resources/icones/catalogue.png
  * R gui/resources/icones/chart.png
  * R gui/resources/icones/cursor.png
  * R gui/resources/icones/database.png
  * R gui/resources/icones/discard.png
  * R gui/resources/icones/drag.png
  * R gui/resources/icones/pointer.png
  * R gui/resources/icones/rectangle.png
  * R gui/resources/icones/remove.png
  * R gui/resources/icones/save.png
  * R gui/resources/icones/time.png
  * R gui/resources/icones/trash.png
  * R gui/resources/icones/zoom.png
  * R gui/src/Actions/ActionsGuiController.cpp
  * R gui/src/Actions/SelectionZoneAction.cpp
  * R gui/src/Catalogue/CatalogueInspectorWidget.cpp
  * R gui/src/Common/VisualizationDef.cpp
  * R gui/src/DataSource/DataSourceTreeWidget.cpp
  * R gui/src/DragAndDrop/DragDropGuiController.cpp
  * R gui/src/DragAndDrop/DragDropScroller.cpp
  * R gui/src/DragAndDrop/DragDropTabSwitcher.cpp
  * R gui/src/Variable/VariableInspectorTableView.cpp
  * R gui/src/Visualization/AxisRenderingUtils.cpp
  * R gui/src/Visualization/ColorScaleEditor.cpp
  * R gui/src/Visualization/MacScrollBarStyle.cpp
  * R gui/src/Visualization/PlottablesRenderingUtils.cpp
  * R gui/src/Visualization/QCPColorMapIterator.cpp
  * R gui/src/Visualization/SqpColorScale.cpp
  * R gui/src/Visualization/VisualizationCursorItem.cpp
  * R gui/src/Visualization/VisualizationDragDropContainer.cpp
  * R gui/src/Visualization/VisualizationDragWidget.cpp
  * R gui/src/Visualization/VisualizationMultiZoneSelectionDialog.cpp
  * R gui/src/Visualization/VisualizationSelectionZoneManager.cpp
  * R gui/ui/Catalogue/CatalogueEventsWidget.ui
  * R gui/ui/Catalogue/CatalogueExplorer.ui
  * R gui/ui/Catalogue/CatalogueInspectorWidget.ui
  * R gui/ui/Catalogue/CatalogueSideBarWidget.ui
  * R gui/ui/Visualization/ColorScaleEditor.ui
  * R gui/ui/Visualization/VisualizationMultiZoneSelectionDialog.ui
  * R plugins/amda/include/AmdaResultParserDefs.h
  * R plugins/amda/include/AmdaResultParserHelper.h
  * R plugins/amda/include/AmdaServer.h
  * R plugins/amda/resources/samples/AmdaSampleV3.json
  * R plugins/amda/src/AmdaResultParserDefs.cpp
  * R plugins/amda/src/AmdaResultParserHelper.cpp
  * R plugins/amda/src/AmdaServer.cpp
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/FileNotFound.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/NaNValue.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/NaNX.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/NoUnit.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/TooManyValues.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/ValidScalar1.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/ValidVector1.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/WrongDate.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/WrongUnit.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/amdaV2/WrongValue.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/InvalidSpectrogramWrongBands.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogram1.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogram2.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogram3.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogramDataHoles.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogramDataHoles2.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogramFillValues.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/spectro/ValidSpectrogramNaNValues.txt
  * R plugins/amda/vera-exclusions/exclusions.txt
  * R plugins/mockplugin/include/MockDefs.h
  * R plugins/mockplugin/src/MockDefs.cpp
  * R subprojects/CatalogueAPI.wrap
  * R subprojects/QxOrm.wrap
  * R .gitignore
  * R CMakeLists.txt
  * R app/src/MainWindow.cpp
  * R app/ui/MainWindow.ui
  * R cmake/sciqlop_applications.cmake
  * R cmake/sciqlop_package_qt.cmake
  * R core/CMakeLists.txt
  * R core/cmake/Findsciqlop-core.cmake
  * R core/include/Common/SortUtils.h
  * R core/include/Data/ArrayData.h
  * R core/include/Data/DataSeries.h
  * R core/include/Data/DataSeriesIterator.h
  * R core/include/Data/IDataSeries.h
  * R core/include/Data/VariableRequest.h
  * R core/include/DataSource/DataSourceController.h
  * R core/include/DataSource/DataSourceItem.h
  * R core/include/DataSource/DataSourceItemAction.h
  * R core/include/Plugin/PluginManager.h
  * R core/include/Time/TimeController.h
  * R core/include/Variable/Variable.h
  * R core/include/Variable/VariableCacheStrategy.h
  * R core/include/Variable/VariableController.h
  * R core/include/Variable/VariableModel.h
  * R core/meson.build
  * R core/src/Data/DataSeriesIterator.cpp
  * R core/src/Data/VectorSeries.cpp
  * R core/src/DataSource/DataSourceController.cpp
  * R core/src/DataSource/DataSourceItem.cpp
  * R core/src/DataSource/DataSourceItemAction.cpp
  * R core/src/Time/TimeController.cpp
  * R core/src/Variable/Variable.cpp
  * R core/src/Variable/VariableAcquisitionWorker.cpp
  * R core/src/Variable/VariableController.cpp
  * R core/src/Variable/VariableModel.cpp
  * R core/tests/Data/TestTwoDimArrayData.cpp
  * R core/tests/Variable/TestVariable.cpp
  * R core/tests/meson.build
  * R gui/CMakeLists.txt
  * R gui/cmake/Findsciqlop-gui.cmake
  * R gui/include/DataSource/DataSourceWidget.h
  * R gui/include/SqpApplication.h
  * R gui/include/TimeWidget/TimeWidget.h
  * R gui/include/Visualization/VisualizationGraphHelper.h
  * R gui/include/Visualization/VisualizationGraphRenderingDelegate.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/resources/sqpguiresources.qrc
  * R gui/src/DataSource/DataSourceTreeWidgetItem.cpp
  * R gui/src/DataSource/DataSourceWidget.cpp
  * R gui/src/SqpApplication.cpp
  * R gui/src/TimeWidget/TimeWidget.cpp
  * R gui/src/Variable/VariableInspectorWidget.cpp
  * R gui/src/Visualization/VisualizationGraphHelper.cpp
  * R gui/src/Visualization/VisualizationGraphRenderingDelegate.cpp
  * R gui/src/Visualization/VisualizationTabWidget.cpp
  * R gui/src/Visualization/VisualizationWidget.cpp
  * R gui/src/Visualization/VisualizationZoneWidget.cpp
  * R gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp
  * R gui/src/Visualization/operations/RescaleAxeOperation.cpp
  * R gui/ui/DataSource/DataSourceWidget.ui
  * R gui/ui/TimeWidget/TimeWidget.ui
  * R gui/ui/Variable/VariableInspectorWidget.ui
  * R gui/ui/Visualization/VisualizationTabWidget.ui
  * R gui/ui/Visualization/VisualizationZoneWidget.ui
  * R gui/vera-exclusions/exclusions.txt
  * R meson.build
  * R plugins/amda/CMakeLists.txt
  * R plugins/amda/cmake/Findsciqlop-amda.cmake
  * R plugins/amda/include/AmdaDefs.h
  * R plugins/amda/include/AmdaPlugin.h
  * R plugins/amda/include/AmdaProvider.h
  * R plugins/amda/include/AmdaResultParser.h
  * R plugins/amda/meson.build
  * R plugins/amda/resources/amdaresources.qrc
  * R plugins/amda/src/AmdaDefs.cpp
  * R plugins/amda/src/AmdaPlugin.cpp
  * R plugins/amda/src/AmdaProvider.cpp
  * R plugins/amda/src/AmdaResultParser.cpp
  * R plugins/amda/tests/TestAmdaAcquisition.cpp
  * R plugins/mockplugin/cmake/Findsciqlop-mockplugin.cmake
  * R plugins/mockplugin/include/CosinusProvider.h
  * R plugins/mockplugin/meson.build
  * R plugins/mockplugin/src/CosinusProvider.cpp
  * R plugins/mockplugin/src/MockPlugin.cpp
  * R plugins/mockplugin/tests/TestCosinusAcquisition.cpp
  * R core/src/Variable/VariableCacheStrategy.cpp
  * R core/tests/Data/TestDataSeries.cpp
Approved

Status change > Approved

You need to be logged in to leave comments. Login now