diff --git a/app/src/MainWindow.cpp b/app/src/MainWindow.cpp index 0831198..c96666f 100644 --- a/app/src/MainWindow.cpp +++ b/app/src/MainWindow.cpp @@ -22,6 +22,7 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include #include #include #include @@ -60,7 +61,8 @@ public: : m_LastOpenLeftInspectorSize{}, m_LastOpenRightInspectorSize{}, m_GeneralSettingsWidget{new SqpSettingsGeneralWidget{mainWindow}}, - m_SettingsDialog{new SqpSettingsDialog{mainWindow}} + m_SettingsDialog{new SqpSettingsDialog{mainWindow}}, + m_CatalogExplorer{new CatalogueExplorer{mainWindow}} { } @@ -70,6 +72,8 @@ public: SqpSettingsGeneralWidget *m_GeneralSettingsWidget; /// Settings dialog. MainWindow has the ownership SqpSettingsDialog *m_SettingsDialog; + /// Catalogue dialog. MainWindow has the ownership + CatalogueExplorer *m_CatalogExplorer; }; MainWindow::MainWindow(QWidget *parent) @@ -189,6 +193,7 @@ MainWindow::MainWindow(QWidget *parent) auto timeWidget = new TimeWidget{}; mainToolBar->addWidget(timeWidget); + // Interaction modes auto actionPointerMode = new QAction{QIcon(":/icones/pointer.png"), "Move", this}; actionPointerMode->setCheckable(true); actionPointerMode->setChecked(sqpApp->plotsInteractionMode() @@ -234,6 +239,7 @@ MainWindow::MainWindow(QWidget *parent) mainToolBar->addAction(actionZonesMode); mainToolBar->addSeparator(); + // Cursors auto btnCursor = new QToolButton{this}; btnCursor->setIcon(QIcon(":/icones/cursor.png")); btnCursor->setText("Cursor"); @@ -288,6 +294,11 @@ MainWindow::MainWindow(QWidget *parent) cursorModeActionGroup->addAction(horizontalCursorAction); cursorModeActionGroup->addAction(crossCursorAction); + // Catalog + mainToolBar->addSeparator(); + mainToolBar->addAction(QIcon(":/icones/catalogue.png"), "Catalogues", + [this]() { impl->m_CatalogExplorer->show(); }); + // //////// // // Settings // // //////// // diff --git a/app/ui/MainWindow.ui b/app/ui/MainWindow.ui index 79fbee1..61ed24e 100644 --- a/app/ui/MainWindow.ui +++ b/app/ui/MainWindow.ui @@ -132,7 +132,7 @@ 0 0 800 - 28 + 21 diff --git a/gui/include/Catalogue/CatalogueEventsWidget.h b/gui/include/Catalogue/CatalogueEventsWidget.h new file mode 100644 index 0000000..deae927 --- /dev/null +++ b/gui/include/Catalogue/CatalogueEventsWidget.h @@ -0,0 +1,31 @@ +#ifndef SCIQLOP_CATALOGUEEVENTSWIDGET_H +#define SCIQLOP_CATALOGUEEVENTSWIDGET_H + +#include +#include + +namespace Ui { +class CatalogueEventsWidget; +} + +class CatalogueEventsWidget : public QWidget { + Q_OBJECT + +signals: + void eventSelected(const QString &event); + +public: + explicit CatalogueEventsWidget(QWidget *parent = 0); + virtual ~CatalogueEventsWidget(); + +public slots: + void populateWithCatalogue(const QString &catalogue); + +private: + Ui::CatalogueEventsWidget *ui; + + class CatalogueEventsWidgetPrivate; + spimpl::unique_impl_ptr impl; +}; + +#endif // SCIQLOP_CATALOGUEEVENTSWIDGET_H diff --git a/gui/include/Catalogue/CatalogueExplorer.h b/gui/include/Catalogue/CatalogueExplorer.h new file mode 100644 index 0000000..0e433f2 --- /dev/null +++ b/gui/include/Catalogue/CatalogueExplorer.h @@ -0,0 +1,21 @@ +#ifndef SCIQLOP_CATALOGUEEXPLORER_H +#define SCIQLOP_CATALOGUEEXPLORER_H + +#include + +namespace Ui { +class CatalogueExplorer; +} + +class CatalogueExplorer : public QDialog { + Q_OBJECT + +public: + explicit CatalogueExplorer(QWidget *parent = 0); + virtual ~CatalogueExplorer(); + +private: + Ui::CatalogueExplorer *ui; +}; + +#endif // SCIQLOP_CATALOGUEEXPLORER_H diff --git a/gui/include/Catalogue/CatalogueInspectorWidget.h b/gui/include/Catalogue/CatalogueInspectorWidget.h new file mode 100644 index 0000000..b78fd55 --- /dev/null +++ b/gui/include/Catalogue/CatalogueInspectorWidget.h @@ -0,0 +1,32 @@ +#ifndef SCIQLOP_CATALOGUEINSPECTORWIDGET_H +#define SCIQLOP_CATALOGUEINSPECTORWIDGET_H + +#include + +namespace Ui { +class CatalogueInspectorWidget; +} + +class CatalogueInspectorWidget : public QWidget { + Q_OBJECT + +public: + explicit CatalogueInspectorWidget(QWidget *parent = 0); + virtual ~CatalogueInspectorWidget(); + + /// Enum matching the pages inside the stacked widget + enum class Page { Empty, CatalogueProperties, EventProperties }; + + Page currentPage() const; + + void setEvent(const QString &event); + void setCatalogue(const QString &catalogue); + +public slots: + void showPage(Page page); + +private: + Ui::CatalogueInspectorWidget *ui; +}; + +#endif // SCIQLOP_CATALOGUEINSPECTORWIDGET_H diff --git a/gui/include/Catalogue/CatalogueSideBarWidget.h b/gui/include/Catalogue/CatalogueSideBarWidget.h new file mode 100644 index 0000000..b9855dd --- /dev/null +++ b/gui/include/Catalogue/CatalogueSideBarWidget.h @@ -0,0 +1,31 @@ +#ifndef SCIQLOP_CATALOGUESIDEBARWIDGET_H +#define SCIQLOP_CATALOGUESIDEBARWIDGET_H + +#include +#include +#include + +namespace Ui { +class CatalogueSideBarWidget; +} + +class CatalogueSideBarWidget : public QWidget { + Q_OBJECT + +signals: + void catalogueSelected(const QString &catalogue); + void allEventsSelected(); + void trashSelected(); + +public: + explicit CatalogueSideBarWidget(QWidget *parent = 0); + virtual ~CatalogueSideBarWidget(); + +private: + Ui::CatalogueSideBarWidget *ui; + + class CatalogueSideBarWidgetPrivate; + spimpl::unique_impl_ptr impl; +}; + +#endif // SCIQLOP_CATALOGUESIDEBARWIDGET_H diff --git a/gui/meson.build b/gui/meson.build index 6e63bb2..55e755d 100644 --- a/gui/meson.build +++ b/gui/meson.build @@ -19,7 +19,11 @@ gui_moc_headers = [ 'include/Visualization/VisualizationDragWidget.h', 'include/Visualization/ColorScaleEditor.h', 'include/Actions/SelectionZoneAction.h', - 'include/Visualization/VisualizationMultiZoneSelectionDialog.h' + 'include/Visualization/VisualizationMultiZoneSelectionDialog.h', + 'include/Catalogue/CatalogueExplorer.h', + 'include/Catalogue/CatalogueEventsWidget.h', + 'include/Catalogue/CatalogueSideBarWidget.h', + 'include/Catalogue/CatalogueInspectorWidget.h' ] gui_ui_files = [ @@ -36,7 +40,11 @@ gui_ui_files = [ 'ui/Visualization/VisualizationWidget.ui', 'ui/Visualization/VisualizationZoneWidget.ui', 'ui/Visualization/ColorScaleEditor.ui', - 'ui/Visualization/VisualizationMultiZoneSelectionDialog.ui' + 'ui/Visualization/VisualizationMultiZoneSelectionDialog.ui', + 'ui/Catalogue/CatalogueExplorer.ui', + 'ui/Catalogue/CatalogueEventsWidget.ui', + 'ui/Catalogue/CatalogueSideBarWidget.ui', + 'ui/Catalogue/CatalogueInspectorWidget.ui' ] gui_qresources = ['resources/sqpguiresources.qrc'] @@ -91,7 +99,11 @@ gui_sources = [ 'src/Actions/SelectionZoneAction.cpp', 'src/Actions/ActionsGuiController.cpp', 'src/Visualization/VisualizationActionManager.cpp', - 'src/Visualization/VisualizationMultiZoneSelectionDialog.cpp' + 'src/Visualization/VisualizationMultiZoneSelectionDialog.cpp', + 'src/Catalogue/CatalogueExplorer.cpp', + 'src/Catalogue/CatalogueEventsWidget.cpp', + 'src/Catalogue/CatalogueSideBarWidget.cpp', + 'src/Catalogue/CatalogueInspectorWidget.cpp' ] gui_inc = include_directories(['include']) diff --git a/gui/resources/icones/add.png b/gui/resources/icones/add.png new file mode 100644 index 0000000000000000000000000000000000000000..80f19899046ea04c581bc61d2dfc602e61a940fd GIT binary patch literal 1956 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 DCO)%M literal 0 Hc$@4nJ za0`PlBg3pY5)2GXoSrU@Ar*7p-Z0DxVH9zD_&Lsnb2Fp#!9#Jvo0+CRP>MNT%-Q6@ z0c|!g+hm+bTceADmoqr0!!XaSc%N!7m{|+%H$p2tEbMk-W z<3G30oX_9M|K^kQ?E?qdbl$8fi(@p_yTNuZ_dwCPs%JAkb8L&KVzhD7eaEo9@jCMc z=9)9_7Ejo#`#|%9!QM_Iwg)UbrpLJmsxxn3$Xj9_cqA#|XXuKcACja^25vHhj}d0B3q09KIbjy=1x0snm6KH4nJ za0`PlBg3pY5)2H?y`C=9S}!0}`6?jD61uVrj%lsTU1d}w~j(4)|hd_XIFP-cB~tKpkYv4e#VO#km|XV)|j37vg- zo`zr!^Zc3j{{Nmbd)1=uME`e!J&pNi?*H#BiPpaMbc6bF4z~lcr~cO;IU6FaQ#}6* zf7uGbKlL}Xqs|Mz-59Vc(VtK7jMW>_wX#)ZvOczNB#T%+^Hry=HotywA5V3ggyYS` z^%-BES>0Hkcs@XBMHNuv-W`133U6Hg&Jot2&il4>@zL68uRd>BzFu%m@cRwn+w!(< zIPP^V;>`o2C09#WqD|}-yo+RGnBw#{+*Dk*OlilNN9}tTO?_fzu_e*}6wqyZN5kyvfvRTE|!In%#c#ddcH^YIVuA@%tOf zZEqaUfADBdy2a(7qu1A7{prpu#h4zHpLBi4x$f0$3mzIYJlM9fP}ZcuCiI_(L4!@~ z%3n^*Coa2c#j*1$_^&>&Q%m2Zp(fOdUBY1>kHU`J2PrqZc@*-O&SzqqV9w03?u%6h zL#6g!J}HNPT>II06zW@(6PZuk7h}Ed$lQ_m?s@~`kpzZ=XF&>hRv-8oS)a&Ic;=6k zL4yU*w3#49sjq?$FeJ^K#U$lS6}EjWIx23L{K@+5lSLphXOW%IgC)|=>x~F%$@+rCs#Jve{fvm=TTyr Q3(Tzyp00i_>zopr0MDAang9R* literal 0 Hc$@jI+CM_TAFlknkh%ZIr0aF(qqd^^iO2K$Ej%=Kbm-)(7~q@Vq*LHL32 z2dg{LtHmAb8{Z!=4>RxRIp+Of(!={D6Y>pW{2>Z-`hH;$OA5$Z zJZtCeL%-MF*jB*bmea4QY$u@vcI&b8tCO}LpENOE^mXdRzoBn7y_h20ChxV?Dl=;4 zycokj4y&$)UOu&E;xEe|wXon^9U#B8`^+8NMm$ad3WMDb47&nxXdoJZJa*ztFyjsm z2t(Rj{Qz%)z^moU?=rO?_**Q!bRXlp#`7)fbT3Ypi#Yr1X7_&1FVdQ&MBb@0QR?7&;S4c literal 0 Hc$@Xr;B(-4#)cPT5-bDW z1O7rkxTUHWXaSa1+$#|$0Xzd7Mn8y^QY)~DXw12M!vnShzoH*7zw`_6BGwSbkpQ+L z&e0B#D;+~7jj?AX@B{h*(NZh0e9~SFA+vyez-{z{psitKqFX&FkA{e5WMxg;@j=sh zWTF^Zs)3KtcXZITp9n4}tpPgGcWzj83RqQ^rvu1NU;urmhD|qs9cB1CFjOJy_1caM zyY>Q8O7y)tvw`o?cV1L<2>*6CD^5M}TGVl+<3L>raZsUwU~JJwRb9ZmqNCxM#lRov zJ1Oew1{M_=6K6DF!FSyV0@D-JW8J=nx(L9WU^X`4)6_8(pAM?9N4+5E5K8L=w#XA4 z?JW?iinFsqhMOuUXUoQGu(kal>IM!rkgBm=y&&rpC2l2`I(hg2xs+i9llzb-v%`LT zcr*Gf+*F*3K3P=k@#Gq$ds$fQ2OFxKNA5@t6nbN^L%?pV>kkuifT_Tbh2B_953mxs ztP#3H2{Gq3@>I~3?@eBT4@m&;W5Ew2Ra9VsXe;^?8q?&|JRz!S1%69^AzKgdx*J;z1zyX1A+raVhUC4Q>%<(x zHN8k)#o^QonLWT3Ecj8T4oSc@N@fFi#hopN660c=J_O7_^5fPxHOFvGKhhHn!uTFw zBNqHPa5wN&>WB0OVEg^?VKmm(0OHALtW$G<`ABYjBR<>@TuSu->oqMgRA_>+A)rao z5JQJ?4PdRJA%+g?K;{4*QiLHiNr;S!a1FR8Rba`2A3yE_8a$-BmJv@@qiLJ+y9RxYq;j z0H>9WG2C++7)fmgwQE{psL&2$+rVv#h8Q}u!Ps8>Jm7+!ErtU1z~xjAa1p8hYs7<2 z;4+Lq3Dl}%i=n`1tgQjWlhIgbritrCZjBnzDQ_{!lh>{2SHL!vr-DoS#Uy7~4xA$Y ze8C7F!@x=kobxCqsC~d}tfoNNXaT+|^rm9dvs5F!z@o`mWH{p-QvCZ?p*I$rBIYLY zC}D(yT@(>~C~aKtMsf;1QI181Gxh-=`}N^7kfA_(c5BM6lfd+x(W?-vfE&tR)HG4o zkta4Myz1Z!nM%{kc_Zcn`zmC(Y4U0*5G!Ap0vsyCSW{(n0L4YR8sK;V15N(v2mwg; zT?cfb?~J&qg8&u#n1`$rXgeh?`W<+nsK_{E5!MJ?1%F|2A#u-qY&h^!odocIekOIu z88mHYMNLNt(3oF{8tf6Vk~%;DX8WZw1=x$e^TMtcLVg%$2ex-mj;;gS%kXy~S%vK) zmZFouLuGk7z{~{pqwn0HYYz^#bT!$8+)>kZbkKAbc)EPIhKp)sax;v+L;Ad>`=3~>d}nA8HG zHcc~;o+P#8I+)Y|avM6Oo}{{gGe{E65hvfm5&r`%OZgMKL3lU-0000|~Ds literal 0 Hc$@4nJ za0`PlBg3pY5)2H?_dH!3Ln`LHy?Z|2Cs5+p$9zxi4td3iQ(SIEc(%A6J$G(>!a=w4 zHLibb|M4k`Dg9v@we$Upj62U-zTbJ?_W6!< zBUWP+ki9^$l-=w`*sJv`S#_@7X*w6;m3Oyw z+AjTb_I->$_m%Yjg<^Ms%;#C_Fa3Kd_lv=1#a^%IixRW8{(qk>X%Upa^6Sk-?+#eq zQE~g<-VpuDFJ-gr49EXp%GX6Egs&C7u5w7&q~rDhyHfS4Hw#}~UMBq4_W?)2jI6!# z%*PrhACP?1S}s|^w1?pyV}7-rc*@?WRx5_Xe=3`;uUGsoo>F06C16~_e6hOpUvA(f z?NjUzL<(4EF!V9CXB^{=Tc7!W_XAf2$DO6K0;Qhv{W^OqZRfki^XHmhVg1s)>*l)C z%)MWvrp~HU=iYi*CEVL2C~1}?)3OF;)>~PVz8^TaOIp*A+2_G*`;Nc|E_ZvUa2)u_ zlxq_DHaT30L7aQb#gOT*@)jJCd%(S6yMwjw7s(sz-?e0#ys~YW2?k5eJilIDS-DEz zZbg4w==Gv%o_WmIubD1l4%(YDgSo8xR-f0WYyN@_i4T@9xcefCW1rmeA9nZjAG8B` z`!uCOYZZ&#uH>amG7MyWFnPt@6DrA%Bo+A1Gn`yHi&3Vbj?bZJCDQ|22mAMole|rt zEg1d=u^#Ytu-9ii>3PhhRBDIt#og}@Y*VyQ2|mlf{lj6!b(=-PK~L8gSIA#bmF7-m z*u(!~Qg17>Kr{1%m{SZD{1=|uIuvQ9Gq5kv21>G&RC0RgJ>_}8P-4k&^5ik6pVlUJ z07n#%Ne$SMQUV4CS6}=$J2C&-RV-ZLWd!9imkw}t{=~wdl(!VwgxD;oDF1Bi05W? zx+0^>pg6DXkkgen3@=(%Sb8xy`LwsTf*CfvK*mkR3!H(QnHLBzdZxiRBdFZrLGvzV z0dLvAj`Ra?z~0 oi@xQrjXF^D`|=qSuqJOmqix-Svr4nnK-r(c)78&qol`;+0KS6Q!vFvP literal 0 Hc$@icones/drag.png icones/cursor.png icones/pointer.png + icones/catalogue.png + icones/add.png + icones/remove.png + icones/chart.png + icones/allEvents.png + icones/trash.png + icones/database.png diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp new file mode 100644 index 0000000..3fe0065 --- /dev/null +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -0,0 +1,100 @@ +#include "Catalogue/CatalogueEventsWidget.h" +#include "ui_CatalogueEventsWidget.h" + +#include + +struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { + void addEventItem(const QStringList &data, QTableWidget *tableWidget); + + enum class Column { Event, TStart, TEnd, Tags, Product, NbColumn }; + QStringList columnNames() { return QStringList{"Event", "TStart", "TEnd", "Tags", "Product"}; } +}; + + +CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) + : QWidget(parent), + ui(new Ui::CatalogueEventsWidget), + impl{spimpl::make_unique_impl()} +{ + ui->setupUi(this); + + connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) { + if (checked) { + ui->btnChart->setChecked(false); + } + }); + + connect(ui->btnChart, &QToolButton::clicked, [this](auto checked) { + if (checked) { + ui->btnTime->setChecked(false); + } + }); + + connect(ui->tableWidget, &QTableWidget::cellClicked, [this](auto row, auto column) { + auto event = ui->tableWidget->item(row, 0)->text(); + emit this->eventSelected(event); + }); + + connect(ui->tableWidget, &QTableWidget::currentItemChanged, + [this](auto current, auto previous) { + if (current && current->row() >= 0) { + auto event = ui->tableWidget->item(current->row(), 0)->text(); + emit this->eventSelected(event); + } + }); + + connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, [this]() { + auto selection = ui->tableWidget->selectedRanges(); + auto isNotMultiSelection + = selection.isEmpty() || (selection.count() == 1 && selection.first().rowCount() == 1); + ui->btnChart->setEnabled(isNotMultiSelection); + ui->btnTime->setEnabled(isNotMultiSelection); + }); + + Q_ASSERT(impl->columnNames().count() == (int)CatalogueEventsWidgetPrivate::Column::NbColumn); + ui->tableWidget->setColumnCount((int)CatalogueEventsWidgetPrivate::Column::NbColumn); + ui->tableWidget->setHorizontalHeaderLabels(impl->columnNames()); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + ui->tableWidget->horizontalHeader()->setSortIndicatorShown(true); +} + +CatalogueEventsWidget::~CatalogueEventsWidget() +{ + delete ui; +} + +void CatalogueEventsWidget::populateWithCatalogue(const QString &catalogue) +{ + ui->tableWidget->clearContents(); + ui->tableWidget->setRowCount(0); + + // TODO + impl->addEventItem( + {catalogue + " - Event 1", "12/12/2012 12:12", "12/12/2042 12:52", "cloud", "mfi/b_gse42"}, + ui->tableWidget); + impl->addEventItem( + {catalogue + " - Event 2", "12/12/2012 12:10", "12/12/2042 12:42", "Acloud", "mfi/b_gse1"}, + ui->tableWidget); + impl->addEventItem( + {catalogue + " - Event 3", "12/12/2012 12:22", "12/12/2042 12:12", "Gcloud", "mfi/b_gse2"}, + ui->tableWidget); + impl->addEventItem( + {catalogue + " - Event 4", "12/12/2012 12:00", "12/12/2042 12:62", "Bcloud", "mfi/b_gse3"}, + ui->tableWidget); +} + +void CatalogueEventsWidget::CatalogueEventsWidgetPrivate::addEventItem(const QStringList &data, + QTableWidget *tableWidget) +{ + tableWidget->setSortingEnabled(false); + auto row = tableWidget->rowCount(); + tableWidget->setRowCount(row + 1); + + for (auto i = 0; i < (int)Column::NbColumn; ++i) { + auto item = new QTableWidgetItem(data.value(i)); + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + tableWidget->setItem(row, i, item); + } + tableWidget->setSortingEnabled(true); +} diff --git a/gui/src/Catalogue/CatalogueExplorer.cpp b/gui/src/Catalogue/CatalogueExplorer.cpp new file mode 100644 index 0000000..c286298 --- /dev/null +++ b/gui/src/Catalogue/CatalogueExplorer.cpp @@ -0,0 +1,22 @@ +#include "Catalogue/CatalogueExplorer.h" +#include "ui_CatalogueExplorer.h" + +CatalogueExplorer::CatalogueExplorer(QWidget *parent) + : QDialog(parent, Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), + ui(new Ui::CatalogueExplorer) +{ + ui->setupUi(this); + + connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSelected, [this](auto name) { + ui->inspector->setCatalogue(name); + ui->events->populateWithCatalogue(name); + }); + + connect(ui->events, &CatalogueEventsWidget::eventSelected, + [this](auto name) { ui->inspector->setEvent(name); }); +} + +CatalogueExplorer::~CatalogueExplorer() +{ + delete ui; +} diff --git a/gui/src/Catalogue/CatalogueInspectorWidget.cpp b/gui/src/Catalogue/CatalogueInspectorWidget.cpp new file mode 100644 index 0000000..5cb782e --- /dev/null +++ b/gui/src/Catalogue/CatalogueInspectorWidget.cpp @@ -0,0 +1,36 @@ +#include "Catalogue/CatalogueInspectorWidget.h" +#include "ui_CatalogueInspectorWidget.h" + +CatalogueInspectorWidget::CatalogueInspectorWidget(QWidget *parent) + : QWidget(parent), ui(new Ui::CatalogueInspectorWidget) +{ + ui->setupUi(this); + showPage(Page::Empty); +} + +CatalogueInspectorWidget::~CatalogueInspectorWidget() +{ + delete ui; +} + +void CatalogueInspectorWidget::showPage(CatalogueInspectorWidget::Page page) +{ + ui->stackedWidget->setCurrentIndex(static_cast(page)); +} + +CatalogueInspectorWidget::Page CatalogueInspectorWidget::currentPage() const +{ + return static_cast(ui->stackedWidget->currentIndex()); +} + +void CatalogueInspectorWidget::setEvent(const QString &event) +{ + showPage(Page::EventProperties); + ui->leEventName->setText(event); +} + +void CatalogueInspectorWidget::setCatalogue(const QString &catalogue) +{ + showPage(Page::CatalogueProperties); + ui->leCatalogueName->setText(catalogue); +} diff --git a/gui/src/Catalogue/CatalogueSideBarWidget.cpp b/gui/src/Catalogue/CatalogueSideBarWidget.cpp new file mode 100644 index 0000000..f5ade50 --- /dev/null +++ b/gui/src/Catalogue/CatalogueSideBarWidget.cpp @@ -0,0 +1,101 @@ +#include "Catalogue/CatalogueSideBarWidget.h" +#include "ui_CatalogueSideBarWidget.h" + +constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType; +constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1; +constexpr auto CATALOGUE_ITEM_TYPE = QTreeWidgetItem::UserType + 2; +constexpr auto DATABASE_ITEM_TYPE = QTreeWidgetItem::UserType + 3; + + +struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate { + void configureTreeWidget(QTreeWidget *treeWidget); + QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget); + void addCatalogueItem(const QString &name, QTreeWidgetItem *parentDatabaseItem); +}; + +CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) + : QWidget(parent), + ui(new Ui::CatalogueSideBarWidget), + impl{spimpl::make_unique_impl()} +{ + ui->setupUi(this); + impl->configureTreeWidget(ui->treeWidget); + + auto emitSelection = [this](auto item) { + switch (item->type()) { + case CATALOGUE_ITEM_TYPE: + emit this->catalogueSelected(item->text(0)); + break; + case ALL_EVENT_ITEM_TYPE: + emit this->allEventsSelected(); + break; + case TRASH_ITEM_TYPE: + emit this->trashSelected(); + break; + case DATABASE_ITEM_TYPE: + default: + break; + } + }; + + connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection); + connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection); +} + +CatalogueSideBarWidget::~CatalogueSideBarWidget() +{ + delete ui; +} + +void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget( + QTreeWidget *treeWidget) +{ + auto allEventsItem = new QTreeWidgetItem({"All Events"}, ALL_EVENT_ITEM_TYPE); + allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png")); + treeWidget->addTopLevelItem(allEventsItem); + + auto trashItem = new QTreeWidgetItem({"Trash"}, TRASH_ITEM_TYPE); + trashItem->setIcon(0, QIcon(":/icones/trash.png")); + treeWidget->addTopLevelItem(trashItem); + + auto separator = new QFrame(treeWidget); + separator->setFrameShape(QFrame::HLine); + + auto separatorItem = new QTreeWidgetItem(); + separatorItem->setFlags(Qt::NoItemFlags); + treeWidget->addTopLevelItem(separatorItem); + treeWidget->setItemWidget(separatorItem, 0, separator); + + // Test + auto db = addDatabaseItem("Database 1", treeWidget); + addCatalogueItem("Catalogue 1", db); + addCatalogueItem("Catalogue 2", db); + addCatalogueItem("Catalogue 3", db); + addCatalogueItem("Catalogue 4", db); + + auto db2 = addDatabaseItem("Database 2", treeWidget); + addCatalogueItem("Catalogue A", db2); + addCatalogueItem("Catalogue B", db2); + addCatalogueItem("Catalogue C", db2); + + treeWidget->expandAll(); +} + +QTreeWidgetItem * +CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name, + QTreeWidget *treeWidget) +{ + auto databaseItem = new QTreeWidgetItem({name}, DATABASE_ITEM_TYPE); + databaseItem->setIcon(0, QIcon(":/icones/database.png")); + treeWidget->addTopLevelItem(databaseItem); + + return databaseItem; +} + +void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem( + const QString &name, QTreeWidgetItem *parentDatabaseItem) +{ + auto catalogueItem = new QTreeWidgetItem({name}, CATALOGUE_ITEM_TYPE); + catalogueItem->setIcon(0, QIcon(":/icones/catalogue.png")); + parentDatabaseItem->addChild(catalogueItem); +} diff --git a/gui/src/Visualization/VisualizationSelectionZoneItem.cpp b/gui/src/Visualization/VisualizationSelectionZoneItem.cpp index 2e5c5b2..4d06164 100644 --- a/gui/src/Visualization/VisualizationSelectionZoneItem.cpp +++ b/gui/src/Visualization/VisualizationSelectionZoneItem.cpp @@ -142,9 +142,7 @@ VisualizationSelectionZoneItem::VisualizationSelectionZoneItem(QCustomPlot *plot setColor(QColor(DEFAULT_COLOR)); } -VisualizationSelectionZoneItem::~VisualizationSelectionZoneItem() -{ -} +VisualizationSelectionZoneItem::~VisualizationSelectionZoneItem() {} VisualizationGraphWidget *VisualizationSelectionZoneItem::parentGraphWidget() const noexcept { diff --git a/gui/ui/Catalogue/CatalogueEventsWidget.ui b/gui/ui/Catalogue/CatalogueEventsWidget.ui new file mode 100644 index 0000000..171698e --- /dev/null +++ b/gui/ui/Catalogue/CatalogueEventsWidget.ui @@ -0,0 +1,139 @@ + + + CatalogueEventsWidget + + + + 0 + 0 + 566 + 258 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + :/icones/add.png:/icones/add.png + + + true + + + + + + + - + + + + :/icones/remove.png:/icones/remove.png + + + true + + + + + + + Qt::Vertical + + + + + + + T + + + + :/icones/time.png:/icones/time.png + + + true + + + true + + + + + + + G + + + + :/icones/chart.png:/icones/chart.png + + + true + + + true + + + + + + + Qt::Vertical + + + + + + + false + + + + + + + + + true + + + QAbstractItemView::SelectRows + + + false + + + false + + + 25 + + + + + + + + diff --git a/gui/ui/Catalogue/CatalogueExplorer.ui b/gui/ui/Catalogue/CatalogueExplorer.ui new file mode 100644 index 0000000..bb906a5 --- /dev/null +++ b/gui/ui/Catalogue/CatalogueExplorer.ui @@ -0,0 +1,83 @@ + + + CatalogueExplorer + + + + 0 + 0 + 755 + 481 + + + + Catalogue Explorer + + + + + + Qt::Horizontal + + + + + 1 + 0 + + + + + + + 3 + 0 + + + + Qt::Vertical + + + + + 0 + 5 + + + + + + + 0 + 2 + + + + + + + + + + + CatalogueSideBarWidget + QWidget +
Catalogue/CatalogueSideBarWidget.h
+ 1 +
+ + CatalogueEventsWidget + QWidget +
Catalogue/CatalogueEventsWidget.h
+ 1 +
+ + CatalogueInspectorWidget + QWidget +
Catalogue/CatalogueInspectorWidget.h
+ 1 +
+
+ + +
diff --git a/gui/ui/Catalogue/CatalogueInspectorWidget.ui b/gui/ui/Catalogue/CatalogueInspectorWidget.ui new file mode 100644 index 0000000..909c3e8 --- /dev/null +++ b/gui/ui/Catalogue/CatalogueInspectorWidget.ui @@ -0,0 +1,214 @@ + + + CatalogueInspectorWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::Box + + + QFrame::Sunken + + + 1 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + + + + + + Name + + + + + + + + + + Author + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 10 + 75 + true + + + + Catalogue Properties + + + + + + + + + + + + + + TStart + + + + + + + Tags + + + + + + + Product + + + + + + + + + + Tend + + + + + + + + + + Mission + + + + + + + + + + Name + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 10 + 75 + true + + + + Event Properties + + + + + + + + + + + + + + + diff --git a/gui/ui/Catalogue/CatalogueSideBarWidget.ui b/gui/ui/Catalogue/CatalogueSideBarWidget.ui new file mode 100644 index 0000000..ca3e22d --- /dev/null +++ b/gui/ui/Catalogue/CatalogueSideBarWidget.ui @@ -0,0 +1,90 @@ + + + CatalogueSideBarWidget + + + + 0 + 0 + 330 + 523 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + :/icones/add.png:/icones/add.png + + + true + + + + + + + - + + + + :/icones/remove.png:/icones/remove.png + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + false + + + + 1 + + + + + + + + +