From 07b2554d77348645da0009ef6053612a4270323e 2018-01-11 11:17:21 From: Thibaud Rabillard Date: 2018-01-11 11:17:21 Subject: [PATCH] Refresh catalogue menu when the catalogue list changed --- diff --git a/gui/include/Actions/ActionsGuiController.h b/gui/include/Actions/ActionsGuiController.h index 7dab26c..ccb2da5 100644 --- a/gui/include/Actions/ActionsGuiController.h +++ b/gui/include/Actions/ActionsGuiController.h @@ -19,6 +19,8 @@ public: QVector > selectionZoneActions() const; + void removeAction(const std::shared_ptr &action); + private: class ActionsGuiControllerPrivate; spimpl::unique_impl_ptr impl; diff --git a/gui/include/Catalogue/CatalogueActionManager.h b/gui/include/Catalogue/CatalogueActionManager.h index 07172db..75afa31 100644 --- a/gui/include/Catalogue/CatalogueActionManager.h +++ b/gui/include/Catalogue/CatalogueActionManager.h @@ -10,6 +10,7 @@ public: CatalogueActionManager(CatalogueExplorer *catalogueExplorer); void installSelectionZoneActions(); + void refreshCreateInCatalogueAction(); private: class CatalogueActionManagerPrivate; diff --git a/gui/include/Catalogue/CatalogueSideBarWidget.h b/gui/include/Catalogue/CatalogueSideBarWidget.h index 6259021..73acaf5 100644 --- a/gui/include/Catalogue/CatalogueSideBarWidget.h +++ b/gui/include/Catalogue/CatalogueSideBarWidget.h @@ -25,6 +25,7 @@ signals: void trashSelected(); void selectionCleared(); void catalogueSaved(const std::shared_ptr &catalogue); + void catalogueListChanged(); public: explicit CatalogueSideBarWidget(QWidget *parent = 0); diff --git a/gui/src/Actions/ActionsGuiController.cpp b/gui/src/Actions/ActionsGuiController.cpp index b69e6c3..8b9ec9e 100644 --- a/gui/src/Actions/ActionsGuiController.cpp +++ b/gui/src/Actions/ActionsGuiController.cpp @@ -34,3 +34,8 @@ QVector > ActionsGuiController::selectionZo { return impl->m_SelectionZoneActions; } + +void ActionsGuiController::removeAction(const std::shared_ptr &action) +{ + impl->m_SelectionZoneActions.removeAll(action); +} diff --git a/gui/src/Catalogue/CatalogueActionManager.cpp b/gui/src/Catalogue/CatalogueActionManager.cpp index 652bebd..e9ddd63 100644 --- a/gui/src/Catalogue/CatalogueActionManager.cpp +++ b/gui/src/Catalogue/CatalogueActionManager.cpp @@ -25,14 +25,15 @@ #include const auto CATALOGUE_MENU_NAME = QObject::tr("Catalogues"); -const auto CATALOGUE_CREATE_EVENT_MENU_NAME = QObject::tr("New Event"); +const auto CATALOGUE_CREATE_EVENT_MENU_NAME = QObject::tr("New Event..."); -const auto DEFAULT_EVENT_NAME = QObject::tr("New Event"); -const auto DEFAULT_CATALOGUE_NAME = QObject::tr("New Catalogue"); +const auto DEFAULT_EVENT_NAME = QObject::tr("Event"); +const auto DEFAULT_CATALOGUE_NAME = QObject::tr("Catalogue"); struct CatalogueActionManager::CatalogueActionManagerPrivate { CatalogueExplorer *m_CatalogueExplorer = nullptr; + QVector > m_CreateInCatalogueActions; CatalogueActionManagerPrivate(CatalogueExplorer *catalogueExplorer) : m_CatalogueExplorer(catalogueExplorer) @@ -85,6 +86,32 @@ struct CatalogueActionManager::CatalogueActionManagerPrivate { m_CatalogueExplorer->eventsWidget().setEventChanges(event, true); } } + + SelectionZoneAction::EnableFunction createEventEnableFuntion() const + { + return [](auto zones) { + + // Checks that all variables in the zones doesn't refer to the same product + QSet usedDatasource; + for (auto zone : zones) { + auto graph = zone->parentGraphWidget(); + auto variables = graph->variables(); + + for (auto var : variables) { + auto datasourceId + = var->metadata().value(DataSourceItem::ID_DATA_KEY).toString(); + if (!usedDatasource.contains(datasourceId)) { + usedDatasource.insert(datasourceId); + } + else { + return false; + } + } + } + + return true; + }; + } }; CatalogueActionManager::CatalogueActionManager(CatalogueExplorer *catalogueExplorer) @@ -96,33 +123,10 @@ void CatalogueActionManager::installSelectionZoneActions() { auto &actionController = sqpApp->actionsGuiController(); - auto createEventEnableFuntion = [](auto zones) { - - // Checks that all variables in the zones doesn't refer to the same product - QSet usedDatasource; - for (auto zone : zones) { - auto graph = zone->parentGraphWidget(); - auto variables = graph->variables(); - - for (auto var : variables) { - auto datasourceId = var->metadata().value(DataSourceItem::ID_DATA_KEY).toString(); - if (!usedDatasource.contains(datasourceId)) { - usedDatasource.insert(datasourceId); - } - else { - return false; - } - } - } - - return true; - }; - - auto createEventAction = actionController.addSectionZoneAction( {CATALOGUE_MENU_NAME, CATALOGUE_CREATE_EVENT_MENU_NAME}, QObject::tr("Without Catalogue"), [this](auto zones) { impl->createEventFromZones(DEFAULT_EVENT_NAME, zones); }); - createEventAction->setEnableFunction(createEventEnableFuntion); + createEventAction->setEnableFunction(impl->createEventEnableFuntion()); auto createEventInNewCatalogueAction = actionController.addSectionZoneAction( {CATALOGUE_MENU_NAME, CATALOGUE_CREATE_EVENT_MENU_NAME}, QObject::tr("In New Catalogue"), @@ -136,18 +140,32 @@ void CatalogueActionManager::installSelectionZoneActions() impl->createEventFromZones(DEFAULT_EVENT_NAME, zones, newCatalogue); }); - createEventInNewCatalogueAction->setEnableFunction(createEventEnableFuntion); + createEventInNewCatalogueAction->setEnableFunction(impl->createEventEnableFuntion()); + + + refreshCreateInCatalogueAction(); +} + +void CatalogueActionManager::refreshCreateInCatalogueAction() +{ + auto &actionController = sqpApp->actionsGuiController(); + for (auto action : impl->m_CreateInCatalogueActions) { + actionController.removeAction(action); + } + impl->m_CreateInCatalogueActions.clear(); auto allCatalogues = impl->m_CatalogueExplorer->sideBarWidget().getCatalogues(REPOSITORY_DEFAULT); + for (auto catalogue : allCatalogues) { auto catalogueName = catalogue->getName(); auto createEventInCatalogueAction = actionController.addSectionZoneAction( {CATALOGUE_MENU_NAME, CATALOGUE_CREATE_EVENT_MENU_NAME}, - QObject::tr("In ").append(catalogueName), [this, catalogue](auto zones) { + QObject::tr("In \"").append(catalogueName).append("\""), [this, catalogue](auto zones) { impl->createEventFromZones(DEFAULT_EVENT_NAME, zones, catalogue); }); - createEventInCatalogueAction->setEnableFunction(createEventEnableFuntion); + createEventInCatalogueAction->setEnableFunction(impl->createEventEnableFuntion()); + impl->m_CreateInCatalogueActions << createEventInCatalogueAction; } } diff --git a/gui/src/Catalogue/CatalogueExplorer.cpp b/gui/src/Catalogue/CatalogueExplorer.cpp index 0065e6c..414e6ca 100644 --- a/gui/src/Catalogue/CatalogueExplorer.cpp +++ b/gui/src/Catalogue/CatalogueExplorer.cpp @@ -79,6 +79,9 @@ CatalogueExplorer::CatalogueExplorer(QWidget *parent) connect(ui->catalogues, &CatalogueSideBarWidget::catalogueSaved, ui->events, &CatalogueEventsWidget::refresh); + connect(ui->catalogues, &CatalogueSideBarWidget::catalogueListChanged, + [this]() { impl->m_ActionManager.refreshCreateInCatalogueAction(); }); + // Updates the inspectot when something is selected in the events connect(ui->events, &CatalogueEventsWidget::eventsSelected, [this](auto events) { if (events.count() == 1) { @@ -126,6 +129,7 @@ CatalogueExplorer::CatalogueExplorer(QWidget *parent) connect(ui->inspector, &CatalogueInspectorWidget::catalogueUpdated, [this](auto catalogue) { sqpApp->catalogueController().updateCatalogue(catalogue); ui->catalogues->setCatalogueChanges(catalogue, true); + impl->m_ActionManager.refreshCreateInCatalogueAction(); }); connect(ui->inspector, &CatalogueInspectorWidget::eventUpdated, [this](auto event) { diff --git a/gui/src/Catalogue/CatalogueSideBarWidget.cpp b/gui/src/Catalogue/CatalogueSideBarWidget.cpp index 79b96bf..8a2312d 100644 --- a/gui/src/Catalogue/CatalogueSideBarWidget.cpp +++ b/gui/src/Catalogue/CatalogueSideBarWidget.cpp @@ -25,6 +25,8 @@ constexpr auto TRASH_ITEM_TYPE = CatalogueAbstractTreeItem::DEFAULT_TYPE + 2; constexpr auto CATALOGUE_ITEM_TYPE = CatalogueAbstractTreeItem::DEFAULT_TYPE + 3; constexpr auto DATABASE_ITEM_TYPE = CatalogueAbstractTreeItem::DEFAULT_TYPE + 4; +const auto DEFAULT_CATALOGUE_NAME = QObject::tr("Catalogue"); + struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate { @@ -108,6 +110,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) ui->treeView->setModel(impl->m_TreeModel); impl->configureTreeWidget(ui->treeView); + emit catalogueListChanged(); ui->treeView->header()->setStretchLastSection(false); ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); @@ -121,7 +124,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) connect(ui->btnAdd, &QToolButton::clicked, [this]() { auto catalogue = std::make_shared(); - catalogue->setName(QString("Cat")); + catalogue->setName(DEFAULT_CATALOGUE_NAME); sqpApp->catalogueController().addCatalogue(catalogue); auto item = this->addCatalogue(catalogue, REPOSITORY_DEFAULT); this->setCatalogueChanges(catalogue, true); @@ -182,6 +185,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) impl->m_TreeModel->indexOf(catalogueToItem.second->parent())); } emitSelection(); + emit catalogueListChanged(); } } }); @@ -192,6 +196,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) this->emitSelection(); } impl->setHasChanges(true, index, this); + emit this->catalogueListChanged(); }); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); @@ -209,7 +214,12 @@ CatalogueSideBarWidget::addCatalogue(const std::shared_ptr &catalog const QString &repository) { auto repositoryItem = impl->getDatabaseItem(repository); - return impl->addCatalogueItem(catalogue, impl->m_TreeModel->indexOf(repositoryItem)); + auto catalogueItem + = impl->addCatalogueItem(catalogue, impl->m_TreeModel->indexOf(repositoryItem)); + + emit catalogueListChanged(); + + return catalogueItem; } void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr &catalogue,