##// 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:

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