##// END OF EJS Templates
unthread the catalogue controller
unthread the catalogue controller

File last commit:

r1266:117ae6bc94b3
r1267:f8134d25db94
Show More
CatalogueEventsWidget.cpp
409 lines | 14.4 KiB | text/x-c | CppLexer
/ gui / src / Catalogue / CatalogueEventsWidget.cpp
Sub widget classes
r1130 #include "Catalogue/CatalogueEventsWidget.h"
#include "ui_CatalogueEventsWidget.h"
Display catalogues and events with CatalogueAPI
r1162 #include <Catalogue/CatalogueController.h>
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 #include <Catalogue/CatalogueEventsModel.h>
"Apply" and "cancel" buttons on an event
r1194 #include <Catalogue/CatalogueExplorerHelper.h>
Display catalogues and events with CatalogueAPI
r1162 #include <CatalogueDao.h>
#include <DBCatalogue.h>
#include <SqpApplication.h>
Retrieves zone names from the visualization
r1169 #include <Visualization/VisualizationTabWidget.h>
#include <Visualization/VisualizationWidget.h>
Time Zone Mode + prepare graph mode
r1171 #include <Visualization/VisualizationZoneWidget.h>
Display catalogues and events with CatalogueAPI
r1162
New tool dialog to select a zone on time and chart modes
r1168 #include <QDialog>
#include <QDialogButtonBox>
#include <QListWidget>
Time Zone Mode + prepare graph mode
r1171 Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget")
Display catalogues and events with CatalogueAPI
r1162
"Apply" and "cancel" buttons on an event
r1194 /// Fixed size of the validation column
const auto VALIDATION_COLUMN_SIZE = 35;
Skeleton to fill the inspector with the selection
r1140
Events
r1136 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 CatalogueEventsModel *m_Model = nullptr;
Time Zone Mode + prepare graph mode
r1171 QStringList m_ZonesForTimeMode;
New tool dialog to select a zone on time and chart modes
r1168 QString m_ZoneForGraphMode;
Updates model after an event has been created through the colored zone
r1262 QVector<std::shared_ptr<DBCatalogue> > m_DisplayedCatalogues;
Methods to facilitate add/remove operations
r1167
Retrieves zone names from the visualization
r1169 VisualizationWidget *m_VisualizationWidget = nullptr;
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 void setEvents(const QVector<std::shared_ptr<DBEvent> > &events, QTreeView *treeView)
Methods to facilitate add/remove operations
r1167 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1167 m_Model->setEvents(events);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1167 }
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 void addEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
Methods to facilitate add/remove operations
r1167 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1167 m_Model->addEvent(event);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1167 }
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 void removeEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
Methods to facilitate add/remove operations
r1167 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1167 m_Model->removeEvent(event);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 treeView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1167 }
Events
r1136
Retrieves zone names from the visualization
r1169 QStringList getAvailableVisualizationZoneList() const
{
if (m_VisualizationWidget) {
if (auto tab = m_VisualizationWidget->currentTabWidget()) {
return tab->availableZoneWidgets();
}
}
return QStringList{};
}
QStringList selectZone(QWidget *parent, const QStringList &selectedZones,
bool allowMultiSelection, const QPoint &location)
New tool dialog to select a zone on time and chart modes
r1168 {
Retrieves zone names from the visualization
r1169 auto availableZones = getAvailableVisualizationZoneList();
if (availableZones.isEmpty()) {
return QStringList{};
}
New tool dialog to select a zone on time and chart modes
r1168 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);
QSet<QListWidgetItem *> 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);
}
listWidget->addItem(item);
}
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);
}
});
QStringList result;
d.setMinimumWidth(120);
d.resize(d.minimumSizeHint());
d.move(location);
if (d.exec() == QDialog::Accepted) {
for (auto item : checkedItems) {
result += item->text();
}
}
Retrieves zone names from the visualization
r1169 else {
result = selectedZones;
}
New tool dialog to select a zone on time and chart modes
r1168
return result;
}
Time Zone Mode + prepare graph mode
r1171
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 void updateForTimeMode(QTreeView *treeView)
Time Zone Mode + prepare graph mode
r1171 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 auto selectedRows = treeView->selectionModel()->selectedRows();
Time Zone Mode + prepare graph mode
r1171
if (selectedRows.count() == 1) {
Edition of event products via the inspector
r1183 auto event = m_Model->getEvent(selectedRows.first());
Displays TStart & TEnd for events
r1185 if (event) {
if (m_VisualizationWidget) {
if (auto tab = m_VisualizationWidget->currentTabWidget()) {
for (auto zoneName : m_ZonesForTimeMode) {
if (auto zone = tab->getZoneWithName(zoneName)) {
SqpRange eventRange;
eventRange.m_TStart = event->getTStart();
eventRange.m_TEnd = event->getTEnd();
zone->setZoneRange(eventRange);
}
Time Zone Mode + prepare graph mode
r1171 }
}
Displays TStart & TEnd for events
r1185 else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: no tab found in the visualization";
}
Time Zone Mode + prepare graph mode
r1171 }
else {
qCWarning(LOG_CatalogueEventsWidget())
Displays TStart & TEnd for events
r1185 << "updateTimeZone: visualization widget not found";
Time Zone Mode + prepare graph mode
r1171 }
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: not compatible with multiple events selected";
}
}
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 void updateForGraphMode(QTreeView *treeView)
Time Zone Mode + prepare graph mode
r1171 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 auto selectedRows = treeView->selectionModel()->selectedRows();
Time Zone Mode + prepare graph mode
r1171
if (selectedRows.count() == 1) {
Edition of event products via the inspector
r1183 auto event = m_Model->getEvent(selectedRows.first());
Time Zone Mode + prepare graph mode
r1171 if (m_VisualizationWidget) {
if (auto tab = m_VisualizationWidget->currentTabWidget()) {
if (auto zone = tab->getZoneWithName(m_ZoneForGraphMode)) {
// TODO
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateGraphMode: no tab found in the visualization";
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateGraphMode: visualization widget not found";
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateGraphMode: not compatible with multiple events selected";
}
}
New tool dialog to select a zone on time and chart modes
r1168 };
Events
r1136
Sub widget classes
r1130 CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent)
Events
r1136 : QWidget(parent),
ui(new Ui::CatalogueEventsWidget),
impl{spimpl::make_unique_impl<CatalogueEventsWidgetPrivate>()}
Sub widget classes
r1130 {
ui->setupUi(this);
Events
r1136
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->m_Model = new CatalogueEventsModel{this};
ui->treeView->setModel(impl->m_Model);
TableModel for events
r1163
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 ui->treeView->setSortingEnabled(true);
ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
ui->treeView->setDragEnabled(true);
TableModel for events
r1163
Events
r1136 connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) {
if (checked) {
ui->btnChart->setChecked(false);
Time Zone Mode + prepare graph mode
r1171 impl->m_ZonesForTimeMode
= impl->selectZone(this, impl->m_ZonesForTimeMode, true,
this->mapToGlobal(ui->btnTime->frameGeometry().center()));
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->updateForTimeMode(ui->treeView);
Events
r1136 }
});
connect(ui->btnChart, &QToolButton::clicked, [this](auto checked) {
if (checked) {
ui->btnTime->setChecked(false);
New tool dialog to select a zone on time and chart modes
r1168 impl->m_ZoneForGraphMode
Retrieves zone names from the visualization
r1169 = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false,
New tool dialog to select a zone on time and chart modes
r1168 this->mapToGlobal(ui->btnChart->frameGeometry().center()))
.value(0);
Time Zone Mode + prepare graph mode
r1171
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->updateForGraphMode(ui->treeView);
Events
r1136 }
});
Multi selection of catalogues
r1165 auto emitSelection = [this]() {
Adaptation to the shared pointers of catalogue controller
r1176 QVector<std::shared_ptr<DBEvent> > events;
Edition of event products via the inspector
r1183 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 for (auto rowIndex : ui->treeView->selectionModel()->selectedRows()) {
Edition of event products via the inspector
r1183
auto itemType = impl->m_Model->itemTypeOf(rowIndex);
if (itemType == CatalogueEventsModel::ItemType::Event) {
events << impl->m_Model->getEvent(rowIndex);
}
else if (itemType == CatalogueEventsModel::ItemType::EventProduct) {
eventProducts << qMakePair(impl->m_Model->getParentEvent(rowIndex),
impl->m_Model->getEventProduct(rowIndex));
}
Manage inspector with multiple events selected
r1164 }
Edition of event products via the inspector
r1183 if (!events.isEmpty() && eventProducts.isEmpty()) {
emit this->eventsSelected(events);
}
else if (events.isEmpty() && !eventProducts.isEmpty()) {
emit this->eventProductsSelected(eventProducts);
}
else {
emit this->selectionCleared();
}
Multi selection of catalogues
r1165 };
Skeleton to fill the inspector with the selection
r1140
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 connect(ui->treeView, &QTreeView::clicked, emitSelection);
connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, emitSelection);
Skeleton to fill the inspector with the selection
r1140
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() {
auto isNotMultiSelection = ui->treeView->selectionModel()->selectedRows().count() <= 1;
Fixes
r1141 ui->btnChart->setEnabled(isNotMultiSelection);
ui->btnTime->setEnabled(isNotMultiSelection);
Time Zone Mode + prepare graph mode
r1171
if (isNotMultiSelection && ui->btnTime->isChecked()) {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->updateForTimeMode(ui->treeView);
Time Zone Mode + prepare graph mode
r1171 }
else if (isNotMultiSelection && ui->btnChart->isChecked()) {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->updateForGraphMode(ui->treeView);
Time Zone Mode + prepare graph mode
r1171 }
Skeleton to fill the inspector with the selection
r1140 });
Basic interactions
r1138
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
"Apply" and "cancel" buttons on an event
r1194 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Name,
QHeaderView::Stretch);
ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Validation,
QHeaderView::Fixed);
ui->treeView->header()->resizeSection((int)CatalogueEventsModel::Column::Validation,
VALIDATION_COLUMN_SIZE);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 ui->treeView->header()->setSortIndicatorShown(true);
"Apply" and "cancel" buttons on an event
r1194
connect(impl->m_Model, &CatalogueEventsModel::modelSorted, [this]() {
auto allEvents = impl->m_Model->events();
for (auto event : allEvents) {
setEventChanges(event, impl->m_Model->eventsHasChanges(event));
}
});
Handle selection of trash and repository items
r1265
populateWithAllEvents();
Sub widget classes
r1130 }
CatalogueEventsWidget::~CatalogueEventsWidget()
{
delete ui;
}
Events
r1136
Retrieves zone names from the visualization
r1169 void CatalogueEventsWidget::setVisualizationWidget(VisualizationWidget *visualization)
{
impl->m_VisualizationWidget = visualization;
}
Updates model after an event has been created through the colored zone
r1262 void CatalogueEventsWidget::addEvent(const std::shared_ptr<DBEvent> &event)
{
impl->addEvent(event, ui->treeView);
}
Edition of events from the inspector
r1181 void CatalogueEventsWidget::setEventChanges(const std::shared_ptr<DBEvent> &event, bool hasChanges)
{
impl->m_Model->refreshEvent(event);
"Apply" and "cancel" buttons on an event
r1194
auto eventIndex = impl->m_Model->indexOf(event);
auto validationIndex
= eventIndex.sibling(eventIndex.row(), (int)CatalogueEventsModel::Column::Validation);
Some fixes
r1266 if (validationIndex.isValid()) {
if (hasChanges) {
if (ui->treeView->indexWidget(validationIndex) == nullptr) {
auto widget = CatalogueExplorerHelper::buildValidationWidget(
ui->treeView,
[this, event]() {
sqpApp->catalogueController().saveEvent(event);
setEventChanges(event, false);
},
[this, event]() { setEventChanges(event, false); });
ui->treeView->setIndexWidget(validationIndex, widget);
}
Updates model after an event has been created through the colored zone
r1262
Some fixes
r1266 impl->m_Model->setEventHasChanges(event, hasChanges);
}
"Apply" and "cancel" buttons on an event
r1194 }
else {
Updates model after an event has been created through the colored zone
r1262 qCWarning(LOG_CatalogueEventsWidget())
<< "setEventChanges: the event is not displayed in the model.";
"Apply" and "cancel" buttons on an event
r1194 }
Updates model after an event has been created through the colored zone
r1262 }
QVector<std::shared_ptr<DBCatalogue> > CatalogueEventsWidget::displayedCatalogues() const
{
return impl->m_DisplayedCatalogues;
}
bool CatalogueEventsWidget::isAllEventsDisplayed() const
{
Handle selection of trash and repository items
r1265 return impl->m_DisplayedCatalogues.isEmpty() && !impl->m_Model->events().isEmpty();
Updates model after an event has been created through the colored zone
r1262 }
"Apply" and "cancel" buttons on an event
r1194
Updates model after an event has been created through the colored zone
r1262 bool CatalogueEventsWidget::isEventDisplayed(const std::shared_ptr<DBEvent> &event) const
{
return impl->m_Model->indexOf(event).isValid();
Edition of events from the inspector
r1181 }
Adaptation to the shared pointers of catalogue controller
r1176 void CatalogueEventsWidget::populateWithCatalogues(
const QVector<std::shared_ptr<DBCatalogue> > &catalogues)
Basic interactions
r1138 {
Updates model after an event has been created through the colored zone
r1262 impl->m_DisplayedCatalogues = catalogues;
Multi selection of catalogues
r1165 QSet<QUuid> eventIds;
Adaptation to the shared pointers of catalogue controller
r1176 QVector<std::shared_ptr<DBEvent> > events;
Multi selection of catalogues
r1165
for (auto catalogue : catalogues) {
Adaptation to the shared pointers of catalogue controller
r1176 auto catalogueEvents = sqpApp->catalogueController().retrieveEventsFromCatalogue(catalogue);
Multi selection of catalogues
r1165 for (auto event : catalogueEvents) {
Adaptation to the shared pointers of catalogue controller
r1176 if (!eventIds.contains(event->getUniqId())) {
Multi selection of catalogues
r1165 events << event;
Adaptation to the shared pointers of catalogue controller
r1176 eventIds.insert(event->getUniqId());
Multi selection of catalogues
r1165 }
}
Display catalogues and events with CatalogueAPI
r1162 }
Basic interactions
r1138
Change the event model to a treeview model + update the last version of CatalogueAPI
r1182 impl->setEvents(events, ui->treeView);
Events
r1136 }
Displays all events
r1192
void CatalogueEventsWidget::populateWithAllEvents()
{
Updates model after an event has been created through the colored zone
r1262 impl->m_DisplayedCatalogues.clear();
Displays all events
r1192 auto allEvents = sqpApp->catalogueController().retrieveAllEvents();
QVector<std::shared_ptr<DBEvent> > events;
for (auto event : allEvents) {
events << event;
}
impl->setEvents(events, ui->treeView);
}
Updates model after an event has been created through the colored zone
r1262
Handle selection of trash and repository items
r1265 void CatalogueEventsWidget::clear()
{
impl->m_DisplayedCatalogues.clear();
impl->setEvents({}, ui->treeView);
}
Updates model after an event has been created through the colored zone
r1262 void CatalogueEventsWidget::refresh()
{
if (impl->m_DisplayedCatalogues.isEmpty()) {
populateWithAllEvents();
}
else {
populateWithCatalogues(impl->m_DisplayedCatalogues);
}
}