diff --git a/gui/include/Catalogue/CatalogueActionManager.h b/gui/include/Catalogue/CatalogueActionManager.h index 5bd3347..07172db 100644 --- a/gui/include/Catalogue/CatalogueActionManager.h +++ b/gui/include/Catalogue/CatalogueActionManager.h @@ -3,9 +3,11 @@ #include +class CatalogueExplorer; + class CatalogueActionManager { public: - CatalogueActionManager(); + CatalogueActionManager(CatalogueExplorer *catalogueExplorer); void installSelectionZoneActions(); diff --git a/gui/include/Catalogue/CatalogueEventsWidget.h b/gui/include/Catalogue/CatalogueEventsWidget.h index 036b520..4bc224e 100644 --- a/gui/include/Catalogue/CatalogueEventsWidget.h +++ b/gui/include/Catalogue/CatalogueEventsWidget.h @@ -32,11 +32,17 @@ public: void setVisualizationWidget(VisualizationWidget *visualization); + void addEvent(const std::shared_ptr &event); void setEventChanges(const std::shared_ptr &event, bool hasChanges); + QVector > displayedCatalogues() const; + bool isAllEventsDisplayed() const; + bool isEventDisplayed(const std::shared_ptr &event) const; + public slots: void populateWithCatalogues(const QVector > &catalogues); void populateWithAllEvents(); + void refresh(); private: Ui::CatalogueEventsWidget *ui; diff --git a/gui/include/Catalogue/CatalogueExplorer.h b/gui/include/Catalogue/CatalogueExplorer.h index 9baa58f..37d3ad9 100644 --- a/gui/include/Catalogue/CatalogueExplorer.h +++ b/gui/include/Catalogue/CatalogueExplorer.h @@ -8,6 +8,9 @@ namespace Ui { class CatalogueExplorer; } +class CatalogueEventsWidget; +class CatalogueSideBarWidget; + class VisualizationWidget; class CatalogueExplorer : public QDialog { @@ -19,6 +22,9 @@ public: void setVisualizationWidget(VisualizationWidget *visualization); + CatalogueEventsWidget &eventsWidget() const; + CatalogueSideBarWidget &sideBarWidget() const; + private: Ui::CatalogueExplorer *ui; diff --git a/gui/include/Catalogue/CatalogueSideBarWidget.h b/gui/include/Catalogue/CatalogueSideBarWidget.h index 0af2b26..1d578a8 100644 --- a/gui/include/Catalogue/CatalogueSideBarWidget.h +++ b/gui/include/Catalogue/CatalogueSideBarWidget.h @@ -28,8 +28,11 @@ public: explicit CatalogueSideBarWidget(QWidget *parent = 0); virtual ~CatalogueSideBarWidget(); + void addCatalogue(const std::shared_ptr &catalogue, const QString &repository); void setCatalogueChanges(const std::shared_ptr &catalogue, bool hasChanges); + QVector > getCatalogues(const QString &repository) const; + private: Ui::CatalogueSideBarWidget *ui; diff --git a/gui/include/Catalogue/CreateEventDialog.h b/gui/include/Catalogue/CreateEventDialog.h index 4cb4baa..9e85fa4 100644 --- a/gui/include/Catalogue/CreateEventDialog.h +++ b/gui/include/Catalogue/CreateEventDialog.h @@ -15,7 +15,8 @@ class CreateEventDialog : public QDialog { Q_OBJECT public: - explicit CreateEventDialog(QWidget *parent = 0); + explicit CreateEventDialog(const QVector > &catalogues, + QWidget *parent = 0); virtual ~CreateEventDialog(); void hideCatalogueChoice(); diff --git a/gui/src/Catalogue/CatalogueActionManager.cpp b/gui/src/Catalogue/CatalogueActionManager.cpp index 258ac5d..6fd2785 100644 --- a/gui/src/Catalogue/CatalogueActionManager.cpp +++ b/gui/src/Catalogue/CatalogueActionManager.cpp @@ -7,6 +7,9 @@ #include #include +#include +#include +#include #include #include @@ -21,6 +24,14 @@ #include struct CatalogueActionManager::CatalogueActionManagerPrivate { + + CatalogueExplorer *m_CatalogueExplorer = nullptr; + + CatalogueActionManagerPrivate(CatalogueExplorer *catalogueExplorer) + : m_CatalogueExplorer(catalogueExplorer) + { + } + void createEventFromZones(const QString &eventName, const QVector &zones, const std::shared_ptr &catalogue = nullptr) @@ -49,15 +60,25 @@ struct CatalogueActionManager::CatalogueActionManagerPrivate { sqpApp->catalogueController().addEvent(event); + if (catalogue) { // TODO // catalogue->addEvent(event); + m_CatalogueExplorer->sideBarWidget().setCatalogueChanges(catalogue, true); + if (m_CatalogueExplorer->eventsWidget().displayedCatalogues().contains(catalogue)) { + m_CatalogueExplorer->eventsWidget().addEvent(event); + m_CatalogueExplorer->eventsWidget().setEventChanges(event, true); + } + } + else if (m_CatalogueExplorer->eventsWidget().isAllEventsDisplayed()) { + m_CatalogueExplorer->eventsWidget().addEvent(event); + m_CatalogueExplorer->eventsWidget().setEventChanges(event, true); } } }; -CatalogueActionManager::CatalogueActionManager() - : impl{spimpl::make_unique_impl()} +CatalogueActionManager::CatalogueActionManager(CatalogueExplorer *catalogueExplorer) + : impl{spimpl::make_unique_impl(catalogueExplorer)} { } @@ -82,7 +103,8 @@ void CatalogueActionManager::installSelectionZoneActions() auto createEventAction = actionController.addSectionZoneAction( {QObject::tr("Catalogues")}, QObject::tr("New Event..."), [this](auto zones) { - CreateEventDialog dialog; + CreateEventDialog dialog( + impl->m_CatalogueExplorer->sideBarWidget().getCatalogues("Default")); dialog.hideCatalogueChoice(); if (dialog.exec() == QDialog::Accepted) { impl->createEventFromZones(dialog.eventName(), zones); @@ -92,12 +114,16 @@ void CatalogueActionManager::installSelectionZoneActions() auto createEventInCatalogueAction = actionController.addSectionZoneAction( {QObject::tr("Catalogues")}, QObject::tr("New Event in Catalogue..."), [this](auto zones) { - CreateEventDialog dialog; + CreateEventDialog dialog( + impl->m_CatalogueExplorer->sideBarWidget().getCatalogues("Default")); if (dialog.exec() == QDialog::Accepted) { auto selectedCatalogue = dialog.selectedCatalogue(); if (!selectedCatalogue) { selectedCatalogue = std::make_shared(); selectedCatalogue->setName(dialog.catalogueName()); + // sqpApp->catalogueController().addCatalogue(selectedCatalogue); TODO + impl->m_CatalogueExplorer->sideBarWidget().addCatalogue(selectedCatalogue, + "Default"); } impl->createEventFromZones(dialog.eventName(), zones, selectedCatalogue); diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp index 2165e10..c4ad59e 100644 --- a/gui/src/Catalogue/CatalogueEventsWidget.cpp +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -25,6 +25,7 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { CatalogueEventsModel *m_Model = nullptr; QStringList m_ZonesForTimeMode; QString m_ZoneForGraphMode; + QVector > m_DisplayedCatalogues; VisualizationWidget *m_VisualizationWidget = nullptr; @@ -304,6 +305,11 @@ void CatalogueEventsWidget::setVisualizationWidget(VisualizationWidget *visualiz impl->m_VisualizationWidget = visualization; } +void CatalogueEventsWidget::addEvent(const std::shared_ptr &event) +{ + impl->addEvent(event, ui->treeView); +} + void CatalogueEventsWidget::setEventChanges(const std::shared_ptr &event, bool hasChanges) { impl->m_Model->refreshEvent(event); @@ -323,18 +329,35 @@ void CatalogueEventsWidget::setEventChanges(const std::shared_ptr &even [this, event]() { setEventChanges(event, false); }); ui->treeView->setIndexWidget(validationIndex, widget); } + + impl->m_Model->setEventHasChanges(event, hasChanges); } else { - // Note: the widget is destroyed - ui->treeView->setIndexWidget(validationIndex, nullptr); + qCWarning(LOG_CatalogueEventsWidget()) + << "setEventChanges: the event is not displayed in the model."; } +} + +QVector > CatalogueEventsWidget::displayedCatalogues() const +{ + return impl->m_DisplayedCatalogues; +} + +bool CatalogueEventsWidget::isAllEventsDisplayed() const +{ + return impl->m_DisplayedCatalogues.isEmpty(); +} - impl->m_Model->setEventHasChanges(event, hasChanges); +bool CatalogueEventsWidget::isEventDisplayed(const std::shared_ptr &event) const +{ + return impl->m_Model->indexOf(event).isValid(); } void CatalogueEventsWidget::populateWithCatalogues( const QVector > &catalogues) { + impl->m_DisplayedCatalogues = catalogues; + QSet eventIds; QVector > events; @@ -353,6 +376,8 @@ void CatalogueEventsWidget::populateWithCatalogues( void CatalogueEventsWidget::populateWithAllEvents() { + impl->m_DisplayedCatalogues.clear(); + auto allEvents = sqpApp->catalogueController().retrieveAllEvents(); QVector > events; @@ -362,3 +387,13 @@ void CatalogueEventsWidget::populateWithAllEvents() impl->setEvents(events, ui->treeView); } + +void CatalogueEventsWidget::refresh() +{ + if (impl->m_DisplayedCatalogues.isEmpty()) { + populateWithAllEvents(); + } + else { + populateWithCatalogues(impl->m_DisplayedCatalogues); + } +} diff --git a/gui/src/Catalogue/CatalogueExplorer.cpp b/gui/src/Catalogue/CatalogueExplorer.cpp index 7c72e42..2b2107a 100644 --- a/gui/src/Catalogue/CatalogueExplorer.cpp +++ b/gui/src/Catalogue/CatalogueExplorer.cpp @@ -11,12 +11,17 @@ struct CatalogueExplorer::CatalogueExplorerPrivate { CatalogueActionManager m_ActionManager; + + CatalogueExplorerPrivate(CatalogueExplorer *catalogueExplorer) + : m_ActionManager(catalogueExplorer) + { + } }; CatalogueExplorer::CatalogueExplorer(QWidget *parent) : QDialog(parent, Qt::Dialog | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), ui(new Ui::CatalogueExplorer), - impl{spimpl::make_unique_impl()} + impl{spimpl::make_unique_impl(this)} { ui->setupUi(this); @@ -96,3 +101,13 @@ void CatalogueExplorer::setVisualizationWidget(VisualizationWidget *visualizatio { ui->events->setVisualizationWidget(visualization); } + +CatalogueEventsWidget &CatalogueExplorer::eventsWidget() const +{ + return *ui->events; +} + +CatalogueSideBarWidget &CatalogueExplorer::sideBarWidget() const +{ + return *ui->catalogues; +} diff --git a/gui/src/Catalogue/CatalogueSideBarWidget.cpp b/gui/src/Catalogue/CatalogueSideBarWidget.cpp index 66cb1a8..cb1e4fe 100644 --- a/gui/src/Catalogue/CatalogueSideBarWidget.cpp +++ b/gui/src/Catalogue/CatalogueSideBarWidget.cpp @@ -154,6 +154,13 @@ CatalogueSideBarWidget::~CatalogueSideBarWidget() delete ui; } +void CatalogueSideBarWidget::addCatalogue(const std::shared_ptr &catalogue, + const QString &repository) +{ + auto repositoryItem = impl->getDatabaseItem(repository); + impl->addCatalogueItem(catalogue, impl->m_TreeModel->indexOf(repositoryItem)); +} + void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr &catalogue, bool hasChanges) { @@ -164,6 +171,24 @@ void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr > +CatalogueSideBarWidget::getCatalogues(const QString &repository) const +{ + QVector > result; + auto repositoryItem = impl->getDatabaseItem(repository); + for (auto child : repositoryItem->children()) { + if (child->type() == CATALOGUE_ITEM_TYPE) { + auto catalogueItem = static_cast(child); + result << catalogueItem->catalogue(); + } + else { + qCWarning(LOG_CatalogueSideBarWidget()) << "getCatalogues: invalid structure"; + } + } + + return result; +} + void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos) { QMenu menu{this}; diff --git a/gui/src/Catalogue/CreateEventDialog.cpp b/gui/src/Catalogue/CreateEventDialog.cpp index c3e90c9..2dd6249 100644 --- a/gui/src/Catalogue/CreateEventDialog.cpp +++ b/gui/src/Catalogue/CreateEventDialog.cpp @@ -10,7 +10,8 @@ struct CreateEventDialog::CreateEventDialogPrivate { QVector > m_DisplayedCatalogues; }; -CreateEventDialog::CreateEventDialog(QWidget *parent) +CreateEventDialog::CreateEventDialog(const QVector > &catalogues, + QWidget *parent) : QDialog(parent), ui(new Ui::CreateEventDialog), impl{spimpl::make_unique_impl()} @@ -20,10 +21,9 @@ CreateEventDialog::CreateEventDialog(QWidget *parent) connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - auto catalogues = sqpApp->catalogueController().retrieveCatalogues(); - for (auto cat : catalogues) { + impl->m_DisplayedCatalogues = catalogues; + for (auto cat : impl->m_DisplayedCatalogues) { ui->cbCatalogue->addItem(cat->getName()); - impl->m_DisplayedCatalogues << cat; } }