#include "Catalogue/CatalogueSideBarWidget.h" #include "ui_CatalogueSideBarWidget.h" #include #include #include #include #include #include #include constexpr auto ALL_EVENT_ITEM_TYPE = QTreeWidgetItem::UserType; constexpr auto TRASH_ITEM_TYPE = QTreeWidgetItem::UserType + 1; constexpr auto CATALOGUE_ITEM_TYPE = QTreeWidgetItem::UserType + 2; constexpr auto DATABASE_ITEM_TYPE = QTreeWidgetItem::UserType + 3; struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate { void configureTreeWidget(QTreeWidget *treeWidget); QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget); QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget); void addCatalogueItem(const std::shared_ptr &catalogue, QTreeWidgetItem *parentDatabaseItem); }; CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) : QWidget(parent), ui(new Ui::CatalogueSideBarWidget), impl{spimpl::make_unique_impl()} { ui->setupUi(this); impl->configureTreeWidget(ui->treeWidget); ui->treeWidget->setColumnCount(2); ui->treeWidget->header()->setStretchLastSection(false); ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch); auto emitSelection = [this]() { auto selectedItems = ui->treeWidget->selectedItems(); if (selectedItems.isEmpty()) { emit this->selectionCleared(); } else { QVector > catalogues; QStringList databases; int selectionType = selectedItems.first()->type(); for (auto item : ui->treeWidget->selectedItems()) { if (item->type() == selectionType) { switch (selectionType) { case CATALOGUE_ITEM_TYPE: catalogues.append( static_cast(item)->catalogue()); break; case DATABASE_ITEM_TYPE: selectionType = DATABASE_ITEM_TYPE; databases.append(item->text(0)); case ALL_EVENT_ITEM_TYPE: // fallthrough case TRASH_ITEM_TYPE: // fallthrough default: break; } } else { // Incoherent multi selection selectionType = -1; break; } } switch (selectionType) { case CATALOGUE_ITEM_TYPE: emit this->catalogueSelected(catalogues); break; case DATABASE_ITEM_TYPE: emit this->databaseSelected(databases); break; case ALL_EVENT_ITEM_TYPE: emit this->allEventsSelected(); break; case TRASH_ITEM_TYPE: emit this->trashSelected(); break; default: emit this->selectionCleared(); break; } } }; connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection); connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, &CatalogueSideBarWidget::onContextMenuRequested); } CatalogueSideBarWidget::~CatalogueSideBarWidget() { delete ui; } void CatalogueSideBarWidget::onContextMenuRequested(const QPoint &pos) { QMenu menu{this}; auto currentItem = ui->treeWidget->currentItem(); switch (currentItem->type()) { case CATALOGUE_ITEM_TYPE: menu.addAction("Rename", [this, currentItem]() { ui->treeWidget->editItem(currentItem); }); break; case DATABASE_ITEM_TYPE: break; case ALL_EVENT_ITEM_TYPE: break; case TRASH_ITEM_TYPE: menu.addAction("Empty Trash", []() { // TODO }); break; default: break; } if (!menu.isEmpty()) { menu.exec(ui->treeWidget->mapToGlobal(pos)); } } void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget( QTreeWidget *treeWidget) { auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE}; allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png")); treeWidget->addTopLevelItem(allEventsItem); auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE}; trashItem->setIcon(0, QIcon(":/icones/trash.png")); treeWidget->addTopLevelItem(trashItem); auto separator = new QFrame{treeWidget}; separator->setFrameShape(QFrame::HLine); auto separatorItem = new QTreeWidgetItem{}; separatorItem->setFlags(Qt::NoItemFlags); treeWidget->addTopLevelItem(separatorItem); treeWidget->setItemWidget(separatorItem, 0, separator); auto db = addDatabaseItem("Default", treeWidget); auto catalogues = sqpApp->catalogueController().getCatalogues("Default"); for (auto catalogue : catalogues) { addCatalogueItem(catalogue, db); } treeWidget->expandAll(); } QTreeWidgetItem * CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name, QTreeWidget *treeWidget) { auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE}; databaseItem->setIcon(0, QIcon{":/icones/database.png"}); treeWidget->addTopLevelItem(databaseItem); return databaseItem; } QTreeWidgetItem * CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getDatabaseItem(const QString &name, QTreeWidget *treeWidget) { for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) { auto item = treeWidget->topLevelItem(i); if (item->type() == DATABASE_ITEM_TYPE && item->text(0) == name) { return item; } } return nullptr; } void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem( const std::shared_ptr &catalogue, QTreeWidgetItem *parentDatabaseItem) { auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE}; catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"}); parentDatabaseItem->addChild(catalogueItem); }