diff --git a/core/include/Catalogue/CatalogueController.h b/core/include/Catalogue/CatalogueController.h index 3ac6945..b9b2835 100644 --- a/core/include/Catalogue/CatalogueController.h +++ b/core/include/Catalogue/CatalogueController.h @@ -50,6 +50,7 @@ public: // void trashEvent(std::shared_ptr event); // void restore(QUuid eventId); void saveEvent(std::shared_ptr event); + bool eventHasChanges(std::shared_ptr event) const; // Catalogue // bool createCatalogue(const QString &name, QVector eventList); diff --git a/core/src/Catalogue/CatalogueController.cpp b/core/src/Catalogue/CatalogueController.cpp index cc47646..b2892b7 100644 --- a/core/src/Catalogue/CatalogueController.cpp +++ b/core/src/Catalogue/CatalogueController.cpp @@ -37,6 +37,10 @@ public: QStringList m_RepositoryList; CatalogueController *m_Q; + QSet m_EventKeysWithChanges; + + QString eventUniqueKey(const std::shared_ptr &event) const; + void copyDBtoDB(const QString &dbFrom, const QString &dbTo); QString toWorkRepository(QString repository); QString toSyncRepository(QString repository); @@ -137,6 +141,9 @@ void CatalogueController::updateEvent(std::shared_ptr event) { event->setRepository(impl->toWorkRepository(event->getRepository())); + auto uniqueId = impl->eventUniqueKey(event); + impl->m_EventKeysWithChanges.insert(uniqueId); + impl->m_CatalogueDao.updateEvent(*event); } @@ -180,6 +187,12 @@ void CatalogueController::addEvent(std::shared_ptr event) void CatalogueController::saveEvent(std::shared_ptr event) { impl->saveEvent(event, true); + impl->m_EventKeysWithChanges.remove(impl->eventUniqueKey(event)); +} + +bool CatalogueController::eventHasChanges(std::shared_ptr event) const +{ + return impl->m_EventKeysWithChanges.contains(impl->eventUniqueKey(event)); } std::list > @@ -233,6 +246,7 @@ void CatalogueController::saveAll() } impl->savAllDB(); + impl->m_EventKeysWithChanges.clear(); } QByteArray @@ -306,6 +320,12 @@ void CatalogueController::initialize() qCDebug(LOG_CatalogueController()) << tr("CatalogueController init END"); } +QString CatalogueController::CatalogueControllerPrivate::eventUniqueKey( + const std::shared_ptr &event) const +{ + return event->getUniqId().toString().append(event->getRepository()); +} + void CatalogueController::CatalogueControllerPrivate::copyDBtoDB(const QString &dbFrom, const QString &dbTo) { diff --git a/gui/src/Catalogue/CatalogueEventsModel.cpp b/gui/src/Catalogue/CatalogueEventsModel.cpp index 9c8f46a..655f356 100644 --- a/gui/src/Catalogue/CatalogueEventsModel.cpp +++ b/gui/src/Catalogue/CatalogueEventsModel.cpp @@ -24,7 +24,6 @@ const auto EVENT_PRODUCT_ITEM_TYPE = 2; struct CatalogueEventsModel::CatalogueEventsModelPrivate { QVector > m_Events; std::unordered_map > > m_EventProducts; - std::unordered_set > m_EventsWithChanges; QStringList columnNames() { @@ -35,8 +34,8 @@ struct CatalogueEventsModel::CatalogueEventsModelPrivate { QVariant sortData(int col, const std::shared_ptr &event) const { if (col == (int)CatalogueEventsModel::Column::Validation) { - return m_EventsWithChanges.find(event) != m_EventsWithChanges.cend() ? true - : QVariant(); + auto hasChanges = sqpApp->catalogueController().eventHasChanges(event); + return hasChanges ? true : QVariant(); } return eventData(col, event); @@ -136,7 +135,6 @@ void CatalogueEventsModel::setEvents(const QVector > &e impl->m_Events = events; impl->m_EventProducts.clear(); - impl->m_EventsWithChanges.clear(); for (auto event : events) { impl->parseEventProduct(event); } @@ -195,7 +193,6 @@ void CatalogueEventsModel::removeEvent(const std::shared_ptr &event) beginRemoveRows(QModelIndex(), index, index); impl->m_Events.removeAt(index); impl->m_EventProducts.erase(event.get()); - impl->m_EventsWithChanges.erase(event); endRemoveRows(); } } @@ -232,22 +229,6 @@ QModelIndex CatalogueEventsModel::indexOf(const std::shared_ptr &event) return QModelIndex(); } -void CatalogueEventsModel::setEventHasChanges(const std::shared_ptr &event, - bool hasChanges) -{ - if (hasChanges) { - impl->m_EventsWithChanges.insert(event); - } - else { - impl->m_EventsWithChanges.erase(event); - } -} - -bool CatalogueEventsModel::eventsHasChanges(const std::shared_ptr &event) const -{ - return impl->m_EventsWithChanges.find(event) != impl->m_EventsWithChanges.cend(); -} - QModelIndex CatalogueEventsModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) { diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp index 0a5f9b9..1ebf1ed 100644 --- a/gui/src/Catalogue/CatalogueEventsWidget.cpp +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -29,11 +29,18 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { VisualizationWidget *m_VisualizationWidget = nullptr; - void setEvents(const QVector > &events, QTreeView *treeView) + void setEvents(const QVector > &events, CatalogueEventsWidget *widget) { - treeView->setSortingEnabled(false); + widget->ui->treeView->setSortingEnabled(false); m_Model->setEvents(events); - treeView->setSortingEnabled(true); + widget->ui->treeView->setSortingEnabled(true); + + for (auto event : events) { + if (sqpApp->catalogueController().eventHasChanges(event)) { + auto index = m_Model->indexOf(event); + widget->setEventChanges(event, true); + } + } } void addEvent(const std::shared_ptr &event, QTreeView *treeView) @@ -290,7 +297,7 @@ CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) connect(impl->m_Model, &CatalogueEventsModel::modelSorted, [this]() { auto allEvents = impl->m_Model->events(); for (auto event : allEvents) { - setEventChanges(event, impl->m_Model->eventsHasChanges(event)); + setEventChanges(event, sqpApp->catalogueController().eventHasChanges(event)); } }); @@ -332,8 +339,10 @@ 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); } } else { @@ -375,7 +384,7 @@ void CatalogueEventsWidget::populateWithCatalogues( } } - impl->setEvents(events, ui->treeView); + impl->setEvents(events, this); } void CatalogueEventsWidget::populateWithAllEvents() @@ -389,13 +398,13 @@ void CatalogueEventsWidget::populateWithAllEvents() events << event; } - impl->setEvents(events, ui->treeView); + impl->setEvents(events, this); } void CatalogueEventsWidget::clear() { impl->m_DisplayedCatalogues.clear(); - impl->setEvents({}, ui->treeView); + impl->setEvents({}, this); } void CatalogueEventsWidget::refresh()