diff --git a/gui/include/Catalogue/CatalogueEventsModel.h b/gui/include/Catalogue/CatalogueEventsModel.h index 1b44d79..bc0bd70 100644 --- a/gui/include/Catalogue/CatalogueEventsModel.h +++ b/gui/include/Catalogue/CatalogueEventsModel.h @@ -5,18 +5,22 @@ #include class DBEvent; +class DBEventProduct; class CatalogueEventsModel : public QAbstractItemModel { public: CatalogueEventsModel(QObject *parent = nullptr); void setEvents(const QVector > &events); - std::shared_ptr getEvent(int row) const; - - void addEvent(const std::shared_ptr &event); void removeEvent(const std::shared_ptr &event); + enum class ItemType { Root, Event, EventProduct }; + ItemType itemTypeOf(const QModelIndex &index) const; + std::shared_ptr getEvent(const QModelIndex &index) const; + std::shared_ptr getParentEvent(const QModelIndex &index) const; + std::shared_ptr getEventProduct(const QModelIndex &index) const; + void refreshEvent(const std::shared_ptr &event); // Model @@ -35,8 +39,8 @@ public: QMimeData *mimeData(const QModelIndexList &indexes) const override; private: - class CatalogueEventsTableModelPrivate; - spimpl::unique_impl_ptr impl; + class CatalogueEventsModelPrivate; + spimpl::unique_impl_ptr impl; }; #endif // SCIQLOP_CATALOGUEEVENTSMODEL_H diff --git a/gui/include/Catalogue/CatalogueEventsWidget.h b/gui/include/Catalogue/CatalogueEventsWidget.h index 8060bab..e7ce270 100644 --- a/gui/include/Catalogue/CatalogueEventsWidget.h +++ b/gui/include/Catalogue/CatalogueEventsWidget.h @@ -7,6 +7,7 @@ class DBCatalogue; class DBEvent; +class DBEventProduct; class VisualizationWidget; namespace Ui { @@ -20,6 +21,10 @@ class CatalogueEventsWidget : public QWidget { signals: void eventsSelected(const QVector > &event); + void eventProductsSelected( + const QVector, std::shared_ptr > > + &eventproducts); + void selectionCleared(); public: explicit CatalogueEventsWidget(QWidget *parent = 0); diff --git a/gui/include/Catalogue/CatalogueInspectorWidget.h b/gui/include/Catalogue/CatalogueInspectorWidget.h index 24d27e1..51c42b9 100644 --- a/gui/include/Catalogue/CatalogueInspectorWidget.h +++ b/gui/include/Catalogue/CatalogueInspectorWidget.h @@ -11,6 +11,7 @@ class CatalogueInspectorWidget; class DBCatalogue; class DBEvent; +class DBEventProduct; class CatalogueInspectorWidget : public QWidget { Q_OBJECT @@ -18,6 +19,8 @@ class CatalogueInspectorWidget : public QWidget { signals: void catalogueUpdated(const std::shared_ptr &catalogue); void eventUpdated(const std::shared_ptr &event); + void eventProductUpdated(const std::shared_ptr &event, + const std::shared_ptr &eventProduct); public: explicit CatalogueInspectorWidget(QWidget *parent = 0); @@ -29,6 +32,8 @@ public: Page currentPage() const; void setEvent(const std::shared_ptr &event); + void setEventProduct(const std::shared_ptr &event, + const std::shared_ptr &eventProduct); void setCatalogue(const std::shared_ptr &catalogue); public slots: diff --git a/gui/src/Catalogue/CatalogueEventsModel.cpp b/gui/src/Catalogue/CatalogueEventsModel.cpp index 173f4e8..b41608d 100644 --- a/gui/src/Catalogue/CatalogueEventsModel.cpp +++ b/gui/src/Catalogue/CatalogueEventsModel.cpp @@ -18,7 +18,7 @@ const auto EVENT_ITEM_TYPE = 1; const auto EVENT_PRODUCT_ITEM_TYPE = 2; -struct CatalogueEventsModel::CatalogueEventsTableModelPrivate { +struct CatalogueEventsModel::CatalogueEventsModelPrivate { QVector > m_Events; std::unordered_map > > m_EventProducts; @@ -92,32 +92,10 @@ struct CatalogueEventsModel::CatalogueEventsTableModelPrivate { Q_ASSERT(false); return QStringLiteral("Unknown Data"); } - - enum class ItemType { Root, Event, EventProduct }; - ItemType indexItemType(const QModelIndex &index) const - { - - if (!index.isValid()) { - return ItemType::Root; - } - else if (index.internalPointer() == nullptr) { - return ItemType::Event; - } - else { - return ItemType::EventProduct; - } - } - - std::shared_ptr getEventProduct(const QModelIndex &index) - { - auto event = static_cast(index.internalPointer()); - return m_EventProducts.at(event).value(index.row()); - } }; CatalogueEventsModel::CatalogueEventsModel(QObject *parent) - : QAbstractItemModel(parent), - impl{spimpl::make_unique_impl()} + : QAbstractItemModel(parent), impl{spimpl::make_unique_impl()} { } @@ -126,6 +104,7 @@ void CatalogueEventsModel::setEvents(const QVector > &e beginResetModel(); impl->m_Events = events; + impl->m_EventProducts.clear(); for (auto event : events) { impl->parseEventProduct(event); } @@ -133,9 +112,36 @@ void CatalogueEventsModel::setEvents(const QVector > &e endResetModel(); } -std::shared_ptr CatalogueEventsModel::getEvent(int row) const +std::shared_ptr CatalogueEventsModel::getEvent(const QModelIndex &index) const +{ + if (itemTypeOf(index) == CatalogueEventsModel::ItemType::Event) { + return impl->m_Events.value(index.row()); + } + else { + return nullptr; + } +} + +std::shared_ptr CatalogueEventsModel::getParentEvent(const QModelIndex &index) const { - return impl->m_Events.value(row); + if (itemTypeOf(index) == CatalogueEventsModel::ItemType::EventProduct) { + return getEvent(index.parent()); + } + else { + return nullptr; + } +} + +std::shared_ptr +CatalogueEventsModel::getEventProduct(const QModelIndex &index) const +{ + if (itemTypeOf(index) == CatalogueEventsModel::ItemType::EventProduct) { + auto event = static_cast(index.internalPointer()); + return impl->m_EventProducts.at(event).value(index.row()); + } + else { + return nullptr; + } } void CatalogueEventsModel::addEvent(const std::shared_ptr &event) @@ -159,9 +165,14 @@ void CatalogueEventsModel::removeEvent(const std::shared_ptr &event) void CatalogueEventsModel::refreshEvent(const std::shared_ptr &event) { - auto eventIndex = impl->m_Events.indexOf(event); - if (eventIndex >= 0) { - emit dataChanged(index(eventIndex, 0), index(eventIndex, columnCount())); + auto i = impl->m_Events.indexOf(event); + if (i >= 0) { + auto eventIndex = index(i, 0); + auto colCount = columnCount(); + emit dataChanged(eventIndex, index(i, colCount)); + + auto childCount = rowCount(eventIndex); + emit dataChanged(index(0, 0, eventIndex), index(childCount, colCount, eventIndex)); } } @@ -171,14 +182,14 @@ QModelIndex CatalogueEventsModel::index(int row, int column, const QModelIndex & return QModelIndex(); } - switch (impl->indexItemType(parent)) { - case CatalogueEventsTableModelPrivate::ItemType::Root: + switch (itemTypeOf(parent)) { + case CatalogueEventsModel::ItemType::Root: return createIndex(row, column); - case CatalogueEventsTableModelPrivate::ItemType::Event: { - auto event = getEvent(parent.row()); + case CatalogueEventsModel::ItemType::Event: { + auto event = getEvent(parent); return createIndex(row, column, event.get()); } - case CatalogueEventsTableModelPrivate::ItemType::EventProduct: + case CatalogueEventsModel::ItemType::EventProduct: break; default: break; @@ -189,8 +200,8 @@ QModelIndex CatalogueEventsModel::index(int row, int column, const QModelIndex & QModelIndex CatalogueEventsModel::parent(const QModelIndex &index) const { - switch (impl->indexItemType(index)) { - case CatalogueEventsTableModelPrivate::ItemType::EventProduct: { + switch (itemTypeOf(index)) { + case CatalogueEventsModel::ItemType::EventProduct: { auto parentEvent = static_cast(index.internalPointer()); auto it = std::find_if(impl->m_Events.cbegin(), impl->m_Events.cend(), @@ -203,9 +214,9 @@ QModelIndex CatalogueEventsModel::parent(const QModelIndex &index) const return QModelIndex(); } } - case CatalogueEventsTableModelPrivate::ItemType::Root: + case CatalogueEventsModel::ItemType::Root: break; - case CatalogueEventsTableModelPrivate::ItemType::Event: + case CatalogueEventsModel::ItemType::Event: break; default: break; @@ -220,14 +231,14 @@ int CatalogueEventsModel::rowCount(const QModelIndex &parent) const return 0; } - switch (impl->indexItemType(parent)) { - case CatalogueEventsTableModelPrivate::ItemType::Root: + switch (itemTypeOf(parent)) { + case CatalogueEventsModel::ItemType::Root: return impl->m_Events.count(); - case CatalogueEventsTableModelPrivate::ItemType::Event: { - auto event = getEvent(parent.row()); + case CatalogueEventsModel::ItemType::Event: { + auto event = getEvent(parent); return impl->m_EventProducts[event.get()].count(); } - case CatalogueEventsTableModelPrivate::ItemType::EventProduct: + case CatalogueEventsModel::ItemType::EventProduct: break; default: break; @@ -238,7 +249,7 @@ int CatalogueEventsModel::rowCount(const QModelIndex &parent) const int CatalogueEventsModel::columnCount(const QModelIndex &parent) const { - return static_cast(CatalogueEventsTableModelPrivate::Column::NbColumn); + return static_cast(CatalogueEventsModelPrivate::Column::NbColumn); } Qt::ItemFlags CatalogueEventsModel::flags(const QModelIndex &index) const @@ -250,17 +261,17 @@ QVariant CatalogueEventsModel::data(const QModelIndex &index, int role) const { if (index.isValid()) { - auto type = impl->indexItemType(index); - if (type == CatalogueEventsTableModelPrivate::ItemType::Event) { - auto event = getEvent(index.row()); + auto type = itemTypeOf(index); + if (type == CatalogueEventsModel::ItemType::Event) { + auto event = getEvent(index); switch (role) { case Qt::DisplayRole: return impl->eventData(index.column(), event); break; } } - else if (type == CatalogueEventsTableModelPrivate::ItemType::EventProduct) { - auto product = impl->getEventProduct(index); + else if (type == CatalogueEventsModel::ItemType::EventProduct) { + auto product = getEventProduct(index); switch (role) { case Qt::DisplayRole: return impl->eventProductData(index.column(), product); @@ -315,7 +326,7 @@ QMimeData *CatalogueEventsModel::mimeData(const QModelIndexList &indexes) const SqpRange firstTimeRange; for (const auto &index : indexes) { if (index.column() == 0) { // only the first column - auto event = getEvent(index.row()); + auto event = getEvent(index); if (eventList.isEmpty()) { // Gets the range of the first variable // firstTimeRange.m_TStart = event->getTStart(); @@ -338,3 +349,16 @@ QMimeData *CatalogueEventsModel::mimeData(const QModelIndexList &indexes) const return mimeData; } + +CatalogueEventsModel::ItemType CatalogueEventsModel::itemTypeOf(const QModelIndex &index) const +{ + if (!index.isValid()) { + return ItemType::Root; + } + else if (index.internalPointer() == nullptr) { + return ItemType::Event; + } + else { + return ItemType::EventProduct; + } +} diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp index d0165b8..a55c568 100644 --- a/gui/src/Catalogue/CatalogueEventsWidget.cpp +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -136,7 +136,7 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { auto selectedRows = treeView->selectionModel()->selectedRows(); if (selectedRows.count() == 1) { - auto event = m_Model->getEvent(selectedRows.first().row()); + auto event = m_Model->getEvent(selectedRows.first()); if (m_VisualizationWidget) { if (auto tab = m_VisualizationWidget->currentTabWidget()) { @@ -170,7 +170,7 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { auto selectedRows = treeView->selectionModel()->selectedRows(); if (selectedRows.count() == 1) { - auto event = m_Model->getEvent(selectedRows.first().row()); + auto event = m_Model->getEvent(selectedRows.first()); if (m_VisualizationWidget) { if (auto tab = m_VisualizationWidget->currentTabWidget()) { if (auto zone = tab->getZoneWithName(m_ZoneForGraphMode)) { @@ -233,11 +233,29 @@ CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) auto emitSelection = [this]() { QVector > events; + QVector, std::shared_ptr > > eventProducts; + for (auto rowIndex : ui->treeView->selectionModel()->selectedRows()) { - events << impl->m_Model->getEvent(rowIndex.row()); + + auto itemType = impl->m_Model->itemTypeOf(rowIndex); + if (itemType == CatalogueEventsModel::ItemType::Event) { + events << impl->m_Model->getEvent(rowIndex); + } + else if (itemType == CatalogueEventsModel::ItemType::EventProduct) { + eventProducts << qMakePair(impl->m_Model->getParentEvent(rowIndex), + impl->m_Model->getEventProduct(rowIndex)); + } } - emit this->eventsSelected(events); + if (!events.isEmpty() && eventProducts.isEmpty()) { + emit this->eventsSelected(events); + } + else if (events.isEmpty() && !eventProducts.isEmpty()) { + emit this->eventProductsSelected(eventProducts); + } + else { + emit this->selectionCleared(); + } }; connect(ui->treeView, &QTreeView::clicked, emitSelection); diff --git a/gui/src/Catalogue/CatalogueExplorer.cpp b/gui/src/Catalogue/CatalogueExplorer.cpp index d985406..b0d99d7 100644 --- a/gui/src/Catalogue/CatalogueExplorer.cpp +++ b/gui/src/Catalogue/CatalogueExplorer.cpp @@ -49,11 +49,27 @@ CatalogueExplorer::CatalogueExplorer(QWidget *parent) } }); + connect(ui->events, &CatalogueEventsWidget::eventProductsSelected, [this](auto eventProducts) { + if (eventProducts.count() == 1) { + ui->inspector->setEventProduct(eventProducts.first().first, + eventProducts.first().second); + } + else { + ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); + } + }); + + connect(ui->events, &CatalogueEventsWidget::selectionCleared, + [this]() { ui->inspector->showPage(CatalogueInspectorWidget::Page::Empty); }); + connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated, [this](auto catalogue) { ui->catalogues->setCatalogueChanges(catalogue, true); }); connect(ui->inspector, &CatalogueInspectorWidget::eventUpdated, [this](auto event) { ui->events->setEventChanges(event, true); }); + + connect(ui->inspector, &CatalogueInspectorWidget::eventProductUpdated, + [this](auto event, auto eventProduct) { ui->events->setEventChanges(event, true); }); } CatalogueExplorer::~CatalogueExplorer() diff --git a/gui/src/Catalogue/CatalogueInspectorWidget.cpp b/gui/src/Catalogue/CatalogueInspectorWidget.cpp index acf229a..b448acc 100644 --- a/gui/src/Catalogue/CatalogueInspectorWidget.cpp +++ b/gui/src/Catalogue/CatalogueInspectorWidget.cpp @@ -4,11 +4,13 @@ #include #include #include +#include #include struct CatalogueInspectorWidget::CatalogueInspectorWidgetPrivate { std::shared_ptr m_DisplayedCatalogue = nullptr; std::shared_ptr m_DisplayedEvent = nullptr; + std::shared_ptr m_DisplayedEventProduct = nullptr; void connectCatalogueUpdateSignals(CatalogueInspectorWidget *inspector, Ui::CatalogueInspectorWidget *ui); @@ -61,18 +63,11 @@ void CatalogueInspectorWidget::CatalogueInspectorWidgetPrivate::connectEventUpda } }); - connect(ui->leEventMission, &QLineEdit::editingFinished, [ui, inspector, this]() { - // if (ui->leEventMission->text() != m_DisplayedEvent->getMission()) { - // m_DisplayedEvent->setMission(ui->leEventMission->text()); - // emit inspector->eventUpdated(m_DisplayedEvent); - // } - }); - connect(ui->leEventProduct, &QLineEdit::editingFinished, [ui, inspector, this]() { - // if (ui->leEventProduct->text() != m_DisplayedEvent->getProduct()) { - // m_DisplayedEvent->setProduct(ui->leEventProduct->text()); - // emit inspector->eventUpdated(m_DisplayedEvent); - // } + if (ui->leEventProduct->text() != m_DisplayedEventProduct->getProductId()) { + m_DisplayedEventProduct->setProductId(ui->leEventProduct->text()); + emit inspector->eventProductUpdated(m_DisplayedEvent, m_DisplayedEventProduct); + } }); connect(ui->leEventTags, &QLineEdit::editingFinished, [ui, inspector, this]() { @@ -80,19 +75,19 @@ void CatalogueInspectorWidget::CatalogueInspectorWidgetPrivate::connectEventUpda }); connect(ui->dateTimeEventTStart, &QDateTimeEdit::editingFinished, [ui, inspector, this]() { - // auto time = DateUtils::secondsSinceEpoch(ui->dateTimeEventTStart->dateTime()); - // if (time != m_DisplayedEvent->getTStart()) { - // m_DisplayedEvent->setTStart(time); - // emit inspector->eventUpdated(m_DisplayedEvent); - // } + auto time = DateUtils::secondsSinceEpoch(ui->dateTimeEventTStart->dateTime()); + if (time != m_DisplayedEventProduct->getTStart()) { + m_DisplayedEventProduct->setTStart(time); + emit inspector->eventProductUpdated(m_DisplayedEvent, m_DisplayedEventProduct); + } }); connect(ui->dateTimeEventTEnd, &QDateTimeEdit::editingFinished, [ui, inspector, this]() { - // auto time = DateUtils::secondsSinceEpoch(ui->dateTimeEventTEnd->dateTime()); - // if (time != m_DisplayedEvent->getTEnd()) { - // m_DisplayedEvent->setTEnd(time); - // emit inspector->eventUpdated(m_DisplayedEvent); - // } + auto time = DateUtils::secondsSinceEpoch(ui->dateTimeEventTEnd->dateTime()); + if (time != m_DisplayedEventProduct->getTEnd()) { + m_DisplayedEventProduct->setTEnd(time); + emit inspector->eventProductUpdated(m_DisplayedEvent, m_DisplayedEventProduct); + } }); } @@ -113,9 +108,11 @@ void CatalogueInspectorWidget::setEvent(const std::shared_ptr &event) blockSignals(true); showPage(Page::EventProperties); + ui->leEventName->setEnabled(true); ui->leEventName->setText(event->getName()); - // ui->leEventMission->setText(event->getMission()); - // ui->leEventProduct->setText(event->getProduct()); + ui->leEventProduct->setEnabled(false); + ui->leEventProduct->setText( + QString::number(event->getEventProducts().size()).append(" product(s)")); QString tagList; auto tags = event->getTags(); @@ -124,14 +121,43 @@ void CatalogueInspectorWidget::setEvent(const std::shared_ptr &event) tagList += ' '; } + ui->leEventTags->setEnabled(true); ui->leEventTags->setText(tagList); + ui->dateTimeEventTStart->setEnabled(false); + ui->dateTimeEventTEnd->setEnabled(false); + // ui->dateTimeEventTStart->setDateTime(DateUtils::dateTime(event->getTStart())); // ui->dateTimeEventTEnd->setDateTime(DateUtils::dateTime(event->getTEnd())); blockSignals(false); } +void CatalogueInspectorWidget::setEventProduct(const std::shared_ptr &event, + const std::shared_ptr &eventProduct) +{ + impl->m_DisplayedEventProduct = eventProduct; + + blockSignals(true); + + showPage(Page::EventProperties); + ui->leEventName->setEnabled(false); + ui->leEventName->setText(event->getName()); + ui->leEventProduct->setEnabled(true); + ui->leEventProduct->setText(eventProduct->getProductId()); + + ui->leEventTags->setEnabled(false); + ui->leEventTags->clear(); + + ui->dateTimeEventTStart->setEnabled(true); + ui->dateTimeEventTEnd->setEnabled(true); + + ui->dateTimeEventTStart->setDateTime(DateUtils::dateTime(eventProduct->getTStart())); + ui->dateTimeEventTEnd->setDateTime(DateUtils::dateTime(eventProduct->getTEnd())); + + blockSignals(false); +} + void CatalogueInspectorWidget::setCatalogue(const std::shared_ptr &catalogue) { impl->m_DisplayedCatalogue = catalogue; diff --git a/gui/ui/Catalogue/CatalogueEventsWidget.ui b/gui/ui/Catalogue/CatalogueEventsWidget.ui index 5fa3a9b..af26468 100644 --- a/gui/ui/Catalogue/CatalogueEventsWidget.ui +++ b/gui/ui/Catalogue/CatalogueEventsWidget.ui @@ -121,6 +121,9 @@ QAbstractItemView::DragDrop + + QAbstractItemView::ExtendedSelection + QAbstractItemView::SelectRows diff --git a/gui/ui/Catalogue/CatalogueInspectorWidget.ui b/gui/ui/Catalogue/CatalogueInspectorWidget.ui index db7f624..67c792d 100644 --- a/gui/ui/Catalogue/CatalogueInspectorWidget.ui +++ b/gui/ui/Catalogue/CatalogueInspectorWidget.ui @@ -53,7 +53,7 @@ - 1 + 2 @@ -113,98 +113,95 @@ - - - - Qt::UTC + + + + Product - + TStart - - + + - Tags + Name - - + + + + + 10 + 75 + true + + - Product + Event Properties - - - - - - - Tend + + + + Qt::Vertical - + + + 20 + 40 + + + - + + + + Qt::UTC - - + + + + + - Mission + Tend - - - - - - - Name + + + + Qt::UTC - - - - - - - Qt::Vertical - - - - 20 - 40 - + + + + Tags - + - - - - - 10 - 75 - true - - - - Event Properties + + + + Qt::Horizontal