diff --git a/gui/include/Catalogue/CatalogueEventsModel.h b/gui/include/Catalogue/CatalogueEventsModel.h index e51ee47..6251ac4 100644 --- a/gui/include/Catalogue/CatalogueEventsModel.h +++ b/gui/include/Catalogue/CatalogueEventsModel.h @@ -34,7 +34,7 @@ public: std::shared_ptr getEventProduct(const QModelIndex &index) const; /// Refresh the data for the specified event - void refreshEvent(const std::shared_ptr &event); + void refreshEvent(const std::shared_ptr &event, bool refreshEventProducts = false); /// Returns a QModelIndex which represent the specified event QModelIndex indexOf(const std::shared_ptr &event) const; diff --git a/gui/include/Catalogue/CatalogueEventsWidget.h b/gui/include/Catalogue/CatalogueEventsWidget.h index bfa9371..0dee481 100644 --- a/gui/include/Catalogue/CatalogueEventsWidget.h +++ b/gui/include/Catalogue/CatalogueEventsWidget.h @@ -50,6 +50,9 @@ private: class CatalogueEventsWidgetPrivate; spimpl::unique_impl_ptr impl; + +private slots: + void emitSelection(); }; #endif // SCIQLOP_CATALOGUEEVENTSWIDGET_H diff --git a/gui/src/Catalogue/CatalogueEventsModel.cpp b/gui/src/Catalogue/CatalogueEventsModel.cpp index 655f356..9a79328 100644 --- a/gui/src/Catalogue/CatalogueEventsModel.cpp +++ b/gui/src/Catalogue/CatalogueEventsModel.cpp @@ -202,11 +202,35 @@ QVector > CatalogueEventsModel::events() const return impl->m_Events; } -void CatalogueEventsModel::refreshEvent(const std::shared_ptr &event) +void CatalogueEventsModel::refreshEvent(const std::shared_ptr &event, + bool refreshEventProducts) { auto eventIndex = indexOf(event); if (eventIndex.isValid()) { + if (refreshEventProducts) { + // Reparse the associated event products + + auto nbEventProducts = impl->nbEventProducts(event); + auto newNbOfEventProducts = event->getEventProducts().size(); + if (newNbOfEventProducts < nbEventProducts) { + beginRemoveRows(eventIndex, newNbOfEventProducts, nbEventProducts - 1); + impl->m_EventProducts.erase(event.get()); + impl->parseEventProduct(event); + endRemoveRows(); + } + else if (newNbOfEventProducts > nbEventProducts) { + beginInsertRows(eventIndex, nbEventProducts, newNbOfEventProducts - 1); + impl->m_EventProducts.erase(event.get()); + impl->parseEventProduct(event); + endInsertRows(); + } + else { // newNbOfEventProducts == nbEventProducts + impl->m_EventProducts.erase(event.get()); + impl->parseEventProduct(event); + } + } + // Refreshes the event line auto colCount = columnCount(); emit dataChanged(eventIndex, index(eventIndex.row(), colCount)); diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp index b6cf9fd..0493aa5 100644 --- a/gui/src/Catalogue/CatalogueEventsWidget.cpp +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -280,24 +280,9 @@ CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) } }); - auto emitSelection = [this]() { - QVector > events; - QVector, std::shared_ptr > > eventProducts; - impl->getSelectedItems(ui->treeView, events, eventProducts); - - 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); - connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, emitSelection); + connect(ui->treeView, &QTreeView::clicked, this, &CatalogueEventsWidget::emitSelection); + connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, + &CatalogueEventsWidget::emitSelection); ui->btnRemove->setEnabled(false); // Disabled by default when nothing is selected connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() { @@ -374,7 +359,8 @@ void CatalogueEventsWidget::setEventChanges(const std::shared_ptr &even [this, event]() { sqpApp->catalogueController().discardEvent(event); setEventChanges(event, false); - impl->m_Model->refreshEvent(event); + impl->m_Model->refreshEvent(event, true); + emitSelection(); }); ui->treeView->setIndexWidget(validationIndex, widget); } @@ -455,3 +441,20 @@ void CatalogueEventsWidget::refresh() populateWithCatalogues(impl->m_DisplayedCatalogues); } } + +void CatalogueEventsWidget::emitSelection() +{ + QVector > events; + QVector, std::shared_ptr > > eventProducts; + impl->getSelectedItems(ui->treeView, events, eventProducts); + + if (!events.isEmpty() && eventProducts.isEmpty()) { + emit eventsSelected(events); + } + else if (events.isEmpty() && !eventProducts.isEmpty()) { + emit eventProductsSelected(eventProducts); + } + else { + emit selectionCleared(); + } +}