CatalogueSideBarWidget.cpp
250 lines
| 9.3 KiB
| text/x-c
|
CppLexer
r1130 | #include "Catalogue/CatalogueSideBarWidget.h" | |||
#include "ui_CatalogueSideBarWidget.h" | ||||
r1162 | #include <SqpApplication.h> | |||
#include <Catalogue/CatalogueController.h> | ||||
#include <Catalogue/CatalogueTreeWidgetItem.h> | ||||
#include <CatalogueDao.h> | ||||
#include <ComparaisonPredicate.h> | ||||
#include <DBCatalogue.h> | ||||
r1174 | #include <QMenu> | |||
r1180 | Q_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget, "CatalogueSideBarWidget") | |||
r1130 | ||||
r1138 | 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; | ||||
r1133 | ||||
struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate { | ||||
r1162 | ||||
r1133 | void configureTreeWidget(QTreeWidget *treeWidget); | |||
r1137 | QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget); | |||
r1167 | QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget); | |||
r1176 | void addCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue, | |||
QTreeWidgetItem *parentDatabaseItem); | ||||
r1180 | ||||
CatalogueTreeWidgetItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue, | ||||
QTreeWidget *treeWidget) const; | ||||
r1133 | }; | |||
r1130 | CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent) | |||
r1133 | : QWidget(parent), | |||
ui(new Ui::CatalogueSideBarWidget), | ||||
impl{spimpl::make_unique_impl<CatalogueSideBarWidgetPrivate>()} | ||||
r1130 | { | |||
ui->setupUi(this); | ||||
r1133 | impl->configureTreeWidget(ui->treeWidget); | |||
r1138 | ||||
r1175 | ui->treeWidget->setColumnCount(2); | |||
ui->treeWidget->header()->setStretchLastSection(false); | ||||
ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents); | ||||
ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch); | ||||
r1165 | auto emitSelection = [this]() { | |||
auto selectedItems = ui->treeWidget->selectedItems(); | ||||
if (selectedItems.isEmpty()) { | ||||
emit this->selectionCleared(); | ||||
} | ||||
else { | ||||
r1176 | QVector<std::shared_ptr<DBCatalogue> > catalogues; | |||
r1165 | 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<CatalogueTreeWidgetItem *>(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; | ||||
} | ||||
r1138 | } | |||
r1165 | ||||
r1140 | }; | |||
connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection); | ||||
connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection); | ||||
r1180 | connect(ui->treeWidget, &QTreeWidget::itemChanged, | |||
[emitSelection, this](auto item, auto column) { | ||||
auto selectedItems = ui->treeWidget->selectedItems(); | ||||
qDebug() << "ITEM CHANGED" << column; | ||||
if (selectedItems.contains(item) && column == 0) { | ||||
emitSelection(); | ||||
} | ||||
}); | ||||
r1174 | ||||
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); | ||||
connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, | ||||
&CatalogueSideBarWidget::onContextMenuRequested); | ||||
r1130 | } | |||
CatalogueSideBarWidget::~CatalogueSideBarWidget() | ||||
{ | ||||
delete ui; | ||||
} | ||||
r1133 | ||||
r1180 | void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr<DBCatalogue> &catalogue, | |||
bool hasChanges) | ||||
{ | ||||
if (auto catalogueItem = impl->getCatalogueItem(catalogue, ui->treeWidget)) { | ||||
catalogueItem->setHasChanges(hasChanges); | ||||
catalogueItem->refresh(); | ||||
} | ||||
} | ||||
r1174 | 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)); | ||||
} | ||||
} | ||||
r1133 | void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget( | |||
QTreeWidget *treeWidget) | ||||
{ | ||||
r1166 | auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE}; | |||
r1133 | allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png")); | |||
treeWidget->addTopLevelItem(allEventsItem); | ||||
r1166 | auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE}; | |||
r1133 | trashItem->setIcon(0, QIcon(":/icones/trash.png")); | |||
treeWidget->addTopLevelItem(trashItem); | ||||
r1166 | auto separator = new QFrame{treeWidget}; | |||
r1133 | separator->setFrameShape(QFrame::HLine); | |||
r1166 | auto separatorItem = new QTreeWidgetItem{}; | |||
r1133 | separatorItem->setFlags(Qt::NoItemFlags); | |||
treeWidget->addTopLevelItem(separatorItem); | ||||
treeWidget->setItemWidget(separatorItem, 0, separator); | ||||
r1137 | ||||
r1196 | auto repositories = sqpApp->catalogueController().getRepositories(); | |||
for (auto dbname : repositories) { | ||||
auto db = addDatabaseItem(dbname, treeWidget); | ||||
r1137 | ||||
r1196 | auto catalogues = sqpApp->catalogueController().retrieveCatalogues(dbname); | |||
for (auto catalogue : catalogues) { | ||||
addCatalogueItem(catalogue, db); | ||||
} | ||||
r1162 | } | |||
r1137 | ||||
treeWidget->expandAll(); | ||||
} | ||||
QTreeWidgetItem * | ||||
CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name, | ||||
QTreeWidget *treeWidget) | ||||
{ | ||||
r1166 | auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE}; | |||
databaseItem->setIcon(0, QIcon{":/icones/database.png"}); | ||||
r1137 | treeWidget->addTopLevelItem(databaseItem); | |||
return databaseItem; | ||||
} | ||||
r1167 | 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; | ||||
} | ||||
r1137 | void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem( | |||
r1176 | const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidgetItem *parentDatabaseItem) | |||
r1137 | { | |||
r1166 | auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE}; | |||
catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"}); | ||||
r1137 | parentDatabaseItem->addChild(catalogueItem); | |||
r1133 | } | |||
r1180 | ||||
CatalogueTreeWidgetItem *CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::getCatalogueItem( | ||||
const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidget *treeWidget) const | ||||
{ | ||||
for (auto i = 0; i < treeWidget->topLevelItemCount(); ++i) { | ||||
auto item = treeWidget->topLevelItem(i); | ||||
if (item->type() == DATABASE_ITEM_TYPE) { | ||||
for (auto j = 0; j < item->childCount(); ++j) { | ||||
auto childItem = item->child(j); | ||||
if (childItem->type() == CATALOGUE_ITEM_TYPE) { | ||||
auto catalogueItem = static_cast<CatalogueTreeWidgetItem *>(childItem); | ||||
if (catalogueItem->catalogue() == catalogue) { | ||||
return catalogueItem; | ||||
} | ||||
} | ||||
else { | ||||
qCWarning(LOG_CatalogueSideBarWidget()) << "getCatalogueItem: Invalid tree " | ||||
"structure. A database item should " | ||||
"only contain catalogues."; | ||||
Q_ASSERT(false); | ||||
} | ||||
} | ||||
} | ||||
} | ||||
return nullptr; | ||||
} | ||||