From 4dfca649988fc168197257b1ac7cdb5cdf777ea1 2018-01-11 14:31:36 From: Thibaud Rabillard Date: 2018-01-11 14:31:36 Subject: [PATCH] Merge branch 'feature/CataloguePart7' into develop --- diff --git a/gui/include/Actions/ActionsGuiController.h b/gui/include/Actions/ActionsGuiController.h index 7dab26c..16a2cf9 100644 --- a/gui/include/Actions/ActionsGuiController.h +++ b/gui/include/Actions/ActionsGuiController.h @@ -19,6 +19,14 @@ public: QVector > selectionZoneActions() const; + void removeAction(const std::shared_ptr &action); + + /// Sets a flag to say that the specified menu can be filtered, usually via a FilteringAction + void addFilterForMenu(const QStringList &menuPath); + + /// Returns true if the menu can be filtered + bool isMenuFiltered(const QStringList &menuPath) const; + private: class ActionsGuiControllerPrivate; spimpl::unique_impl_ptr impl; diff --git a/gui/include/Actions/FilteringAction.h b/gui/include/Actions/FilteringAction.h new file mode 100644 index 0000000..05eec06 --- /dev/null +++ b/gui/include/Actions/FilteringAction.h @@ -0,0 +1,19 @@ +#ifndef SCIQLOP_FILTERINGACTION_H +#define SCIQLOP_FILTERINGACTION_H + +#include +#include + +/// A LineEdit inside an action which is able to filter other actions +class FilteringAction : public QWidgetAction { +public: + FilteringAction(QWidget *parent); + + void addActionToFilter(QAction *action); + +private: + class FilteringActionPrivate; + spimpl::unique_impl_ptr impl; +}; + +#endif // SCIQLOP_FILTERINGACTION_H diff --git a/gui/include/Actions/SelectionZoneAction.h b/gui/include/Actions/SelectionZoneAction.h index 93f6b4b..22793a8 100644 --- a/gui/include/Actions/SelectionZoneAction.h +++ b/gui/include/Actions/SelectionZoneAction.h @@ -60,6 +60,13 @@ public: /// The path in the sub menus, if any QStringList subMenuList() const noexcept; + /// Sets if filtering the action is allowed via a FilteringAction + void setAllowedFiltering(bool value); + + /// Returns true if filtering the action is allowed via a FilteringAction. By default it is + /// allowed. + bool isFilteringAllowed() const; + public slots: /// Executes the action void execute(const QVector &item); 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/include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h b/gui/include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h index 4aa26d0..d072aea 100644 --- a/gui/include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h +++ b/gui/include/Catalogue/CatalogueTreeItems/CatalogueTreeItem.h @@ -19,6 +19,7 @@ public: /// Returns the catalogue represented by the item std::shared_ptr catalogue() const; + void replaceCatalogue(const std::shared_ptr &catalogue); private: class CatalogueTreeItemPrivate; diff --git a/gui/include/Catalogue/CreateEventDialog.h b/gui/include/Catalogue/CreateEventDialog.h deleted file mode 100644 index 9e85fa4..0000000 --- a/gui/include/Catalogue/CreateEventDialog.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef SCIQLOP_CREATEEVENTDIALOG_H -#define SCIQLOP_CREATEEVENTDIALOG_H - -#include -#include -#include - -namespace Ui { -class CreateEventDialog; -} - -class DBCatalogue; - -class CreateEventDialog : public QDialog { - Q_OBJECT - -public: - explicit CreateEventDialog(const QVector > &catalogues, - QWidget *parent = 0); - virtual ~CreateEventDialog(); - - void hideCatalogueChoice(); - - QString eventName() const; - - std::shared_ptr selectedCatalogue() const; - QString catalogueName() const; - -private: - Ui::CreateEventDialog *ui; - - class CreateEventDialogPrivate; - spimpl::unique_impl_ptr impl; -}; - -#endif // SCIQLOP_CREATEEVENTDIALOG_H diff --git a/gui/meson.build b/gui/meson.build index 1a81c55..0fc02dc 100644 --- a/gui/meson.build +++ b/gui/meson.build @@ -28,8 +28,8 @@ gui_moc_headers = [ 'include/Catalogue/CatalogueSideBarWidget.h', 'include/Catalogue/CatalogueInspectorWidget.h', 'include/Catalogue/CatalogueEventsModel.h', - 'include/Catalogue/CreateEventDialog.h', - 'include/Catalogue/CatalogueTreeModel.h' + 'include/Catalogue/CatalogueTreeModel.h', + 'include/Actions/FilteringAction.h' ] gui_ui_files = [ @@ -50,8 +50,7 @@ gui_ui_files = [ 'ui/Catalogue/CatalogueExplorer.ui', 'ui/Catalogue/CatalogueEventsWidget.ui', 'ui/Catalogue/CatalogueSideBarWidget.ui', - 'ui/Catalogue/CatalogueInspectorWidget.ui', - 'ui/Catalogue/CreateEventDialog.ui' + 'ui/Catalogue/CatalogueInspectorWidget.ui' ] gui_qresources = ['resources/sqpguiresources.qrc'] @@ -114,6 +113,7 @@ gui_sources = [ 'src/Visualization/VisualizationSelectionZoneManager.cpp', 'src/Actions/SelectionZoneAction.cpp', 'src/Actions/ActionsGuiController.cpp', + 'src/Actions/FilteringAction.cpp', 'src/Visualization/VisualizationActionManager.cpp', 'src/Visualization/VisualizationMultiZoneSelectionDialog.cpp', 'src/Catalogue/CatalogueExplorer.cpp', @@ -126,7 +126,6 @@ gui_sources = [ 'src/Catalogue/CatalogueEventsModel.cpp', 'src/Catalogue/CatalogueExplorerHelper.cpp', 'src/Catalogue/CatalogueActionManager.cpp', - 'src/Catalogue/CreateEventDialog.cpp', 'src/Catalogue/CatalogueTreeModel.cpp' ] diff --git a/gui/src/Actions/ActionsGuiController.cpp b/gui/src/Actions/ActionsGuiController.cpp index b69e6c3..1f9c465 100644 --- a/gui/src/Actions/ActionsGuiController.cpp +++ b/gui/src/Actions/ActionsGuiController.cpp @@ -3,6 +3,7 @@ struct ActionsGuiController::ActionsGuiControllerPrivate { QVector > m_SelectionZoneActions; + QSet m_FilteredMenu; }; ActionsGuiController::ActionsGuiController() @@ -34,3 +35,18 @@ QVector > ActionsGuiController::selectionZo { return impl->m_SelectionZoneActions; } + +void ActionsGuiController::removeAction(const std::shared_ptr &action) +{ + impl->m_SelectionZoneActions.removeAll(action); +} + +void ActionsGuiController::addFilterForMenu(const QStringList &menuPath) +{ + impl->m_FilteredMenu.insert(menuPath); +} + +bool ActionsGuiController::isMenuFiltered(const QStringList &menuPath) const +{ + return impl->m_FilteredMenu.contains(menuPath); +} diff --git a/gui/src/Actions/FilteringAction.cpp b/gui/src/Actions/FilteringAction.cpp new file mode 100644 index 0000000..e28b567 --- /dev/null +++ b/gui/src/Actions/FilteringAction.cpp @@ -0,0 +1,27 @@ +#include "Actions/FilteringAction.h" + +#include + +struct FilteringAction::FilteringActionPrivate { + QLineEdit *m_FilterLineEdit; + QVector m_FilteredActions; +}; + +FilteringAction::FilteringAction(QWidget *parent) + : QWidgetAction(parent), impl{spimpl::make_unique_impl()} +{ + impl->m_FilterLineEdit = new QLineEdit(parent); + setDefaultWidget(impl->m_FilterLineEdit); + + connect(impl->m_FilterLineEdit, &QLineEdit::textEdited, [this](auto text) { + for (auto action : impl->m_FilteredActions) { + auto match = action->text().contains(text, Qt::CaseInsensitive); + action->setVisible(match); + } + }); +} + +void FilteringAction::addActionToFilter(QAction *action) +{ + impl->m_FilteredActions << action; +} diff --git a/gui/src/Actions/SelectionZoneAction.cpp b/gui/src/Actions/SelectionZoneAction.cpp index 0fcae06..da183b7 100644 --- a/gui/src/Actions/SelectionZoneAction.cpp +++ b/gui/src/Actions/SelectionZoneAction.cpp @@ -15,6 +15,7 @@ struct SelectionZoneAction::SelectionZoneActionPrivate { QKeySequence m_DisplayedShortcut; SelectionZoneAction::ExecuteFunction m_Fun; SelectionZoneAction::EnableFunction m_EnableFun = [](auto zones) { return true; }; + bool m_FilteringAllowed = true; }; SelectionZoneAction::SelectionZoneAction(const QString &name, ExecuteFunction fun) @@ -55,6 +56,16 @@ QStringList SelectionZoneAction::subMenuList() const noexcept return impl->m_SubMenuList; } +void SelectionZoneAction::setAllowedFiltering(bool value) +{ + impl->m_FilteringAllowed = value; +} + +bool SelectionZoneAction::isFilteringAllowed() const +{ + return impl->m_FilteringAllowed; +} + void SelectionZoneAction::execute(const QVector &item) { impl->m_Fun(item); diff --git a/gui/src/Catalogue/CatalogueActionManager.cpp b/gui/src/Catalogue/CatalogueActionManager.cpp index f1b865f..10f3c8b 100644 --- a/gui/src/Catalogue/CatalogueActionManager.cpp +++ b/gui/src/Catalogue/CatalogueActionManager.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -25,9 +24,16 @@ #include #include +const auto CATALOGUE_MENU_NAME = QObject::tr("Catalogues"); +const auto CATALOGUE_CREATE_EVENT_MENU_NAME = QObject::tr("New Event..."); + +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) @@ -80,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) @@ -91,55 +123,52 @@ 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(); + 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(impl->createEventEnableFuntion()); + createEventAction->setAllowedFiltering(false); + + auto createEventInNewCatalogueAction = actionController.addSectionZoneAction( + {CATALOGUE_MENU_NAME, CATALOGUE_CREATE_EVENT_MENU_NAME}, QObject::tr("In New Catalogue"), + [this](auto zones) { + + auto newCatalogue = std::make_shared(); + newCatalogue->setName(DEFAULT_CATALOGUE_NAME); + sqpApp->catalogueController().addCatalogue(newCatalogue); + impl->m_CatalogueExplorer->sideBarWidget().addCatalogue(newCatalogue, + REPOSITORY_DEFAULT); + + impl->createEventFromZones(DEFAULT_EVENT_NAME, zones, newCatalogue); + }); + createEventInNewCatalogueAction->setEnableFunction(impl->createEventEnableFuntion()); + createEventInNewCatalogueAction->setAllowedFiltering(false); - for (auto var : variables) { - auto datasourceId = var->metadata().value(DataSourceItem::ID_DATA_KEY).toString(); - if (!usedDatasource.contains(datasourceId)) { - usedDatasource.insert(datasourceId); - } - else { - return false; - } - } - } + refreshCreateInCatalogueAction(); - return true; - }; + actionController.addFilterForMenu({CATALOGUE_MENU_NAME, CATALOGUE_CREATE_EVENT_MENU_NAME}); +} - auto createEventAction = actionController.addSectionZoneAction( - {QObject::tr("Catalogues")}, QObject::tr("New Event..."), [this](auto zones) { - CreateEventDialog dialog( - impl->m_CatalogueExplorer->sideBarWidget().getCatalogues(REPOSITORY_DEFAULT)); - dialog.hideCatalogueChoice(); - if (dialog.exec() == QDialog::Accepted) { - impl->createEventFromZones(dialog.eventName(), zones); - } - }); - createEventAction->setEnableFunction(createEventEnableFuntion); - - auto createEventInCatalogueAction = actionController.addSectionZoneAction( - {QObject::tr("Catalogues")}, QObject::tr("New Event in Catalogue..."), [this](auto zones) { - CreateEventDialog dialog( - impl->m_CatalogueExplorer->sideBarWidget().getCatalogues(REPOSITORY_DEFAULT)); - if (dialog.exec() == QDialog::Accepted) { - auto selectedCatalogue = dialog.selectedCatalogue(); - if (!selectedCatalogue) { - selectedCatalogue = std::make_shared(); - selectedCatalogue->setName(dialog.catalogueName()); - sqpApp->catalogueController().addCatalogue(selectedCatalogue); - impl->m_CatalogueExplorer->sideBarWidget().addCatalogue(selectedCatalogue, - REPOSITORY_DEFAULT); - } +void CatalogueActionManager::refreshCreateInCatalogueAction() +{ + auto &actionController = sqpApp->actionsGuiController(); - impl->createEventFromZones(dialog.eventName(), zones, selectedCatalogue); - } - }); - createEventInCatalogueAction->setEnableFunction(createEventEnableFuntion); + 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).append("\""), [this, catalogue](auto zones) { + impl->createEventFromZones(DEFAULT_EVENT_NAME, zones, catalogue); + }); + createEventInCatalogueAction->setEnableFunction(impl->createEventEnableFuntion()); + impl->m_CreateInCatalogueActions << createEventInCatalogueAction; + } } diff --git a/gui/src/Catalogue/CatalogueEventsWidget.cpp b/gui/src/Catalogue/CatalogueEventsWidget.cpp index b0c94ea..46c553d 100644 --- a/gui/src/Catalogue/CatalogueEventsWidget.cpp +++ b/gui/src/Catalogue/CatalogueEventsWidget.cpp @@ -17,10 +17,12 @@ #include #include +#include #include #include #include #include +#include #include Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget") @@ -28,6 +30,8 @@ Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget") /// Percentage added to the range of a event when it is displayed const auto EVENT_RANGE_MARGE = 30; // in % +const QString NEW_ZONE_TEXT = QStringLiteral("New Zone"); + struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { CatalogueEventsModel *m_Model = nullptr; @@ -80,72 +84,46 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { } QStringList selectZone(QWidget *parent, const QStringList &selectedZones, - bool allowMultiSelection, const QPoint &location) + bool allowMultiSelection, bool addNewZoneOption, const QPoint &location) { auto availableZones = getAvailableVisualizationZoneList(); - if (availableZones.isEmpty()) { + if (!addNewZoneOption && availableZones.isEmpty()) { return QStringList{}; } - QDialog d(parent, Qt::Tool); - d.setWindowTitle("Choose a zone"); - auto layout = new QVBoxLayout{&d}; - layout->setContentsMargins(0, 0, 0, 0); - auto listWidget = new QListWidget{&d}; - layout->addWidget(listWidget); + QActionGroup actionGroup{parent}; + actionGroup.setExclusive(!allowMultiSelection); - QSet checkedItems; - for (auto zone : availableZones) { - auto item = new QListWidgetItem{zone}; - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable); - if (selectedZones.contains(zone)) { - item->setCheckState(Qt::Checked); - checkedItems << item; - } - else { - item->setCheckState(Qt::Unchecked); - } + QVector zoneActions; + + QMenu selectionMenu{parent}; - listWidget->addItem(item); + if (addNewZoneOption) { + availableZones.prepend(NEW_ZONE_TEXT); } - auto buttonBox = new QDialogButtonBox{QDialogButtonBox::Ok, &d}; - layout->addWidget(buttonBox); - - QObject::connect(buttonBox, &QDialogButtonBox::accepted, &d, &QDialog::accept); - QObject::connect(buttonBox, &QDialogButtonBox::rejected, &d, &QDialog::reject); - - QObject::connect(listWidget, &QListWidget::itemChanged, - [&checkedItems, allowMultiSelection, listWidget](auto item) { - if (item->checkState() == Qt::Checked) { - if (!allowMultiSelection) { - for (auto checkedItem : checkedItems) { - listWidget->blockSignals(true); - checkedItem->setCheckState(Qt::Unchecked); - listWidget->blockSignals(false); - } - - checkedItems.clear(); - } - checkedItems << item; - } - else { - checkedItems.remove(item); - } - }); + selectionMenu.addSeparator(); + for (auto zone : availableZones) { + auto zoneAction = selectionMenu.addAction(zone); + zoneAction->setCheckable(true); + zoneAction->setChecked(selectedZones.contains(zone)); + actionGroup.addAction(zoneAction); + zoneActions << zoneAction; + } + + auto resultAction = selectionMenu.exec(QCursor::pos()); QStringList result; - d.setMinimumWidth(120); - d.resize(d.minimumSizeHint()); - d.move(location); - if (d.exec() == QDialog::Accepted) { - for (auto item : checkedItems) { - result += item->text(); - } + if (resultAction == nullptr) { + result = selectedZones; } else { - result = selectedZones; + for (auto zoneAction : zoneActions) { + if (zoneAction->isChecked()) { + result << zoneAction->text(); + } + } } return result; @@ -252,8 +230,9 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { return; } + auto isNewZone = m_ZoneForGraphMode == NEW_ZONE_TEXT; auto zone = tab->getZoneWithName(m_ZoneForGraphMode); - if (!zone) { + if (!isNewZone && !zone) { qCWarning(LOG_CatalogueEventsWidget()) << "updateGraphMode: zone not found"; return; } @@ -270,7 +249,15 @@ struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate { m_CustomGraphs.clear(); // Closes the remaining graphs inside the zone - zone->closeAllGraphs(); + if (zone) { + zone->closeAllGraphs(); + } + + // Creates the zone if needed + if (isNewZone) { + zone = tab->createEmptyZone(0); + m_ZoneForGraphMode = zone->name(); + } // Calculates the range of each graph which will be created auto graphRange = getGraphRanges(event); @@ -357,7 +344,7 @@ CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) if (checked) { ui->btnChart->setChecked(false); impl->m_ZonesForTimeMode - = impl->selectZone(this, impl->m_ZonesForTimeMode, true, + = impl->selectZone(this, impl->m_ZonesForTimeMode, true, false, this->mapToGlobal(ui->btnTime->frameGeometry().center())); impl->updateForTimeMode(ui->treeView); @@ -367,8 +354,9 @@ CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent) connect(ui->btnChart, &QToolButton::clicked, [this](auto checked) { if (checked) { ui->btnTime->setChecked(false); + impl->m_ZoneForGraphMode - = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false, + = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false, true, this->mapToGlobal(ui->btnChart->frameGeometry().center())) .value(0); 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 ee7a3d2..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); @@ -133,6 +136,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) connect(impl->m_TreeModel, &CatalogueTreeModel::itemDropped, [this](auto index, auto mimeData, auto action) { auto item = impl->m_TreeModel->item(index); + if (item && item->type() == CATALOGUE_ITEM_TYPE) { auto catalogue = static_cast(item)->catalogue(); this->setCatalogueChanges(catalogue, true); @@ -144,9 +148,12 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) mimeData->data(MIME_TYPE_SOURCE_CATALOGUE_LIST)); for (auto catalogue : sourceCatalogues) { if (auto catalogueItem = impl->getCatalogueItem(catalogue)) { + catalogueItem->replaceCatalogue(catalogue); this->setCatalogueChanges(catalogue, true); } } + + this->emitSelection(); } }); @@ -178,6 +185,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) impl->m_TreeModel->indexOf(catalogueToItem.second->parent())); } emitSelection(); + emit catalogueListChanged(); } } }); @@ -188,6 +196,7 @@ CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) this->emitSelection(); } impl->setHasChanges(true, index, this); + emit this->catalogueListChanged(); }); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); @@ -205,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, diff --git a/gui/src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp b/gui/src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp index a5bec27..4fb59dd 100644 --- a/gui/src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp +++ b/gui/src/Catalogue/CatalogueTreeItems/CatalogueTreeItem.cpp @@ -124,3 +124,8 @@ std::shared_ptr CatalogueTreeItem::catalogue() const { return impl->m_Catalogue; } + +void CatalogueTreeItem::replaceCatalogue(const std::shared_ptr &catalogue) +{ + impl->m_Catalogue = catalogue; +} diff --git a/gui/src/Catalogue/CreateEventDialog.cpp b/gui/src/Catalogue/CreateEventDialog.cpp deleted file mode 100644 index 2dd6249..0000000 --- a/gui/src/Catalogue/CreateEventDialog.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "Catalogue/CreateEventDialog.h" -#include "ui_CreateEventDialog.h" - -#include -#include - -#include - -struct CreateEventDialog::CreateEventDialogPrivate { - QVector > m_DisplayedCatalogues; -}; - -CreateEventDialog::CreateEventDialog(const QVector > &catalogues, - QWidget *parent) - : QDialog(parent), - ui(new Ui::CreateEventDialog), - impl{spimpl::make_unique_impl()} -{ - ui->setupUi(this); - - connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - - impl->m_DisplayedCatalogues = catalogues; - for (auto cat : impl->m_DisplayedCatalogues) { - ui->cbCatalogue->addItem(cat->getName()); - } -} - -CreateEventDialog::~CreateEventDialog() -{ - delete ui; -} - -void CreateEventDialog::hideCatalogueChoice() -{ - ui->cbCatalogue->hide(); - ui->lblCatalogue->hide(); -} - -QString CreateEventDialog::eventName() const -{ - return ui->leEvent->text(); -} - -std::shared_ptr CreateEventDialog::selectedCatalogue() const -{ - auto catalogue = impl->m_DisplayedCatalogues.value(ui->cbCatalogue->currentIndex()); - if (!catalogue || catalogue->getName() != catalogueName()) { - return nullptr; - } - - return catalogue; -} - -QString CreateEventDialog::catalogueName() const -{ - return ui->cbCatalogue->currentText(); -} diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index cb5d4f4..c77b9a6 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -12,6 +12,7 @@ #include "ui_VisualizationGraphWidget.h" #include +#include #include #include #include @@ -245,7 +246,7 @@ VisualizationGraphWidget::VisualizationGraphWidget(const QString &name, QWidget &VisualizationGraphWidget::onMouseDoubleClick); connect(ui->widget->xAxis, static_cast( &QCPAxis::rangeChanged), - this, &VisualizationGraphWidget::onRangeChanged, Qt::DirectConnection); + this, &VisualizationGraphWidget::onRangeChanged, Qt::DirectConnection); // Activates menu when right clicking on the graph ui->widget->setContextMenuPolicy(Qt::CustomContextMenu); @@ -633,6 +634,10 @@ void VisualizationGraphWidget::closeEvent(QCloseEvent *event) { Q_UNUSED(event); + for (auto i : impl->m_SelectionZones) { + parentVisualizationWidget()->selectionZoneManager().setSelected(i, false); + } + // Prevents that all variables will be removed from graph when it will be closed for (auto &variableEntry : impl->m_VariableToPlotMultiMap) { emit variableAboutToBeRemoved(variableEntry.first); @@ -703,32 +708,51 @@ void VisualizationGraphWidget::onGraphMenuRequested(const QPoint &pos) noexcept QHash subMenus; QHash subMenusEnabled; + QHash filteredMenu; for (auto zoneAction : zoneActions) { auto isEnabled = zoneAction->isEnabled(selectedItems); auto menu = &graphMenu; + QString menuPath; for (auto subMenuName : zoneAction->subMenuList()) { - if (!subMenus.contains(subMenuName)) { + menuPath += '/'; + menuPath += subMenuName; + + if (!subMenus.contains(menuPath)) { menu = menu->addMenu(subMenuName); - subMenus[subMenuName] = menu; - subMenusEnabled[subMenuName] = isEnabled; + subMenus[menuPath] = menu; + subMenusEnabled[menuPath] = isEnabled; } else { - menu = subMenus.value(subMenuName); + menu = subMenus.value(menuPath); if (isEnabled) { // The sub menu is enabled if at least one of its actions is enabled - subMenusEnabled[subMenuName] = true; + subMenusEnabled[menuPath] = true; } } } + FilteringAction *filterAction = nullptr; + if (sqpApp->actionsGuiController().isMenuFiltered(zoneAction->subMenuList())) { + filterAction = filteredMenu.value(menuPath); + if (!filterAction) { + filterAction = new FilteringAction{this}; + filteredMenu[menuPath] = filterAction; + menu->addAction(filterAction); + } + } + auto action = menu->addAction(zoneAction->name()); action->setEnabled(isEnabled); action->setShortcut(zoneAction->displayedShortcut()); QObject::connect(action, &QAction::triggered, [zoneAction, selectedItems]() { zoneAction->execute(selectedItems); }); + + if (filterAction && zoneAction->isFilteringAllowed()) { + filterAction->addActionToFilter(action); + } } for (auto it = subMenus.cbegin(); it != subMenus.cend(); ++it) { diff --git a/gui/ui/Catalogue/CreateEventDialog.ui b/gui/ui/Catalogue/CreateEventDialog.ui deleted file mode 100644 index b5352fe..0000000 --- a/gui/ui/Catalogue/CreateEventDialog.ui +++ /dev/null @@ -1,55 +0,0 @@ - - - CreateEventDialog - - - - 0 - 0 - 324 - 93 - - - - New Event - - - - - - Event Name - - - - - - - - - - Catalogue - - - - - - - true - - - QComboBox::NoInsert - - - - - - - QDialogButtonBox::Ok - - - - - - - -