##// END OF EJS Templates
Implements test execute() method...
Implements test execute() method For each iteration of the test, this method generates available operations according to states of the variables, and execute an operation that has been chosen randomly.

File last commit:

r1164:b6390f556418
r1174:0c07405da56c
Show More
CatalogueSideBarWidget.cpp
250 lines | 9.3 KiB | text/x-c | CppLexer
/ gui / src / Catalogue / CatalogueSideBarWidget.cpp
Sub widget classes
r1095 #include "Catalogue/CatalogueSideBarWidget.h"
#include "ui_CatalogueSideBarWidget.h"
Display catalogues and events with CatalogueAPI
r1129 #include <SqpApplication.h>
#include <Catalogue/CatalogueController.h>
#include <Catalogue/CatalogueTreeWidgetItem.h>
#include <CatalogueDao.h>
#include <ComparaisonPredicate.h>
#include <DBCatalogue.h>
Basic context menu on a catalogue item
r1141 #include <QMenu>
Edition of catalogues from the inspector
r1147 Q_LOGGING_CATEGORY(LOG_CatalogueSideBarWidget, "CatalogueSideBarWidget")
Sub widget classes
r1095
Basic interactions
r1103 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;
Catalog side bar
r1098
struct CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate {
Display catalogues and events with CatalogueAPI
r1129
Catalog side bar
r1098 void configureTreeWidget(QTreeWidget *treeWidget);
Methods to add some catalogue items
r1102 QTreeWidgetItem *addDatabaseItem(const QString &name, QTreeWidget *treeWidget);
Methods to facilitate add/remove operations
r1134 QTreeWidgetItem *getDatabaseItem(const QString &name, QTreeWidget *treeWidget);
Adaptation to the shared pointers of catalogue controller
r1143 void addCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
QTreeWidgetItem *parentDatabaseItem);
Edition of catalogues from the inspector
r1147
CatalogueTreeWidgetItem *getCatalogueItem(const std::shared_ptr<DBCatalogue> &catalogue,
QTreeWidget *treeWidget) const;
Catalog side bar
r1098 };
Sub widget classes
r1095 CatalogueSideBarWidget::CatalogueSideBarWidget(QWidget *parent)
Catalog side bar
r1098 : QWidget(parent),
ui(new Ui::CatalogueSideBarWidget),
impl{spimpl::make_unique_impl<CatalogueSideBarWidgetPrivate>()}
Sub widget classes
r1095 {
ui->setupUi(this);
Catalog side bar
r1098 impl->configureTreeWidget(ui->treeWidget);
Basic interactions
r1103
Display of the save & cancel button next to a catalogue
r1142 ui->treeWidget->setColumnCount(2);
ui->treeWidget->header()->setStretchLastSection(false);
ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);
Multi selection of catalogues
r1132 auto emitSelection = [this]() {
auto selectedItems = ui->treeWidget->selectedItems();
if (selectedItems.isEmpty()) {
emit this->selectionCleared();
}
else {
Adaptation to the shared pointers of catalogue controller
r1143 QVector<std::shared_ptr<DBCatalogue> > catalogues;
Multi selection of catalogues
r1132 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;
}
Basic interactions
r1103 }
Multi selection of catalogues
r1132
Skeleton to fill the inspector with the selection
r1105 };
connect(ui->treeWidget, &QTreeWidget::itemClicked, emitSelection);
connect(ui->treeWidget, &QTreeWidget::currentItemChanged, emitSelection);
Edition of catalogues from the inspector
r1147 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();
}
});
Basic context menu on a catalogue item
r1141
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this,
&CatalogueSideBarWidget::onContextMenuRequested);
Sub widget classes
r1095 }
CatalogueSideBarWidget::~CatalogueSideBarWidget()
{
delete ui;
}
Catalog side bar
r1098
Edition of catalogues from the inspector
r1147 void CatalogueSideBarWidget::setCatalogueChanges(const std::shared_ptr<DBCatalogue> &catalogue,
bool hasChanges)
{
if (auto catalogueItem = impl->getCatalogueItem(catalogue, ui->treeWidget)) {
catalogueItem->setHasChanges(hasChanges);
catalogueItem->refresh();
}
}
Basic context menu on a catalogue item
r1141 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));
}
}
Catalog side bar
r1098 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::configureTreeWidget(
QTreeWidget *treeWidget)
{
Drag d'un event sur le TimeWidget
r1133 auto allEventsItem = new QTreeWidgetItem{{"All Events"}, ALL_EVENT_ITEM_TYPE};
Catalog side bar
r1098 allEventsItem->setIcon(0, QIcon(":/icones/allEvents.png"));
treeWidget->addTopLevelItem(allEventsItem);
Drag d'un event sur le TimeWidget
r1133 auto trashItem = new QTreeWidgetItem{{"Trash"}, TRASH_ITEM_TYPE};
Catalog side bar
r1098 trashItem->setIcon(0, QIcon(":/icones/trash.png"));
treeWidget->addTopLevelItem(trashItem);
Drag d'un event sur le TimeWidget
r1133 auto separator = new QFrame{treeWidget};
Catalog side bar
r1098 separator->setFrameShape(QFrame::HLine);
Drag d'un event sur le TimeWidget
r1133 auto separatorItem = new QTreeWidgetItem{};
Catalog side bar
r1098 separatorItem->setFlags(Qt::NoItemFlags);
treeWidget->addTopLevelItem(separatorItem);
treeWidget->setItemWidget(separatorItem, 0, separator);
Methods to add some catalogue items
r1102
Adaptation to last version of catalogue controller
r1164 auto repositories = sqpApp->catalogueController().getRepositories();
for (auto dbname : repositories) {
auto db = addDatabaseItem(dbname, treeWidget);
Methods to add some catalogue items
r1102
Adaptation to last version of catalogue controller
r1164 auto catalogues = sqpApp->catalogueController().retrieveCatalogues(dbname);
for (auto catalogue : catalogues) {
addCatalogueItem(catalogue, db);
}
Display catalogues and events with CatalogueAPI
r1129 }
Methods to add some catalogue items
r1102
treeWidget->expandAll();
}
QTreeWidgetItem *
CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addDatabaseItem(const QString &name,
QTreeWidget *treeWidget)
{
Drag d'un event sur le TimeWidget
r1133 auto databaseItem = new QTreeWidgetItem{{name}, DATABASE_ITEM_TYPE};
databaseItem->setIcon(0, QIcon{":/icones/database.png"});
Methods to add some catalogue items
r1102 treeWidget->addTopLevelItem(databaseItem);
return databaseItem;
}
Methods to facilitate add/remove operations
r1134 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;
}
Methods to add some catalogue items
r1102 void CatalogueSideBarWidget::CatalogueSideBarWidgetPrivate::addCatalogueItem(
Adaptation to the shared pointers of catalogue controller
r1143 const std::shared_ptr<DBCatalogue> &catalogue, QTreeWidgetItem *parentDatabaseItem)
Methods to add some catalogue items
r1102 {
Drag d'un event sur le TimeWidget
r1133 auto catalogueItem = new CatalogueTreeWidgetItem{catalogue, CATALOGUE_ITEM_TYPE};
catalogueItem->setIcon(0, QIcon{":/icones/catalogue.png"});
Methods to add some catalogue items
r1102 parentDatabaseItem->addChild(catalogueItem);
Catalog side bar
r1098 }
Edition of catalogues from the inspector
r1147
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;
}