##// END OF EJS Templates
Updates model after an event has been created through the colored zone
Updates model after an event has been created through the colored zone

File last commit:

r1262:99c1ba5e139b
r1262:99c1ba5e139b
Show More
CatalogueEventsWidget.cpp
399 lines | 14.1 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));
}
});
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);
if (hasChanges) {
if (ui->treeView->indexWidget(validationIndex) == nullptr) {
auto widget = CatalogueExplorerHelper::buildValidationWidget(
Add saveEvent action
r1254 ui->treeView,
[this, event]() {
sqpApp->catalogueController().saveEvent(event);
setEventChanges(event, false);
},
"Apply" and "cancel" buttons on an event
r1194 [this, event]() { setEventChanges(event, false); });
ui->treeView->setIndexWidget(validationIndex, widget);
}
Updates model after an event has been created through the colored zone
r1262
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
{
return impl->m_DisplayedCatalogues.isEmpty();
}
"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
void CatalogueEventsWidget::refresh()
{
if (impl->m_DisplayedCatalogues.isEmpty()) {
populateWithAllEvents();
}
else {
populateWithCatalogues(impl->m_DisplayedCatalogues);
}
}