##// END OF EJS Templates
Fixes the refresh of data that was not working all the time
Fixes the refresh of data that was not working all the time

File last commit:

r1261:7185ea8182da merge
r1270:c436df4b66de
Show More
CatalogueEventsWidget.cpp
470 lines | 17.2 KiB | text/x-c | CppLexer
/ gui / src / Catalogue / CatalogueEventsWidget.cpp
Sub widget classes
r1095 #include "Catalogue/CatalogueEventsWidget.h"
#include "ui_CatalogueEventsWidget.h"
Display catalogues and events with CatalogueAPI
r1129 #include <Catalogue/CatalogueController.h>
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 #include <Catalogue/CatalogueEventsModel.h>
"Apply" and "cancel" buttons on an event
r1162 #include <Catalogue/CatalogueExplorerHelper.h>
Display catalogues and events with CatalogueAPI
r1129 #include <CatalogueDao.h>
#include <DBCatalogue.h>
#include <SqpApplication.h>
Retrieves zone names from the visualization
r1136 #include <Visualization/VisualizationTabWidget.h>
#include <Visualization/VisualizationWidget.h>
Time Zone Mode + prepare graph mode
r1138 #include <Visualization/VisualizationZoneWidget.h>
Display catalogues and events with CatalogueAPI
r1129
New tool dialog to select a zone on time and chart modes
r1135 #include <QDialog>
#include <QDialogButtonBox>
#include <QListWidget>
connect remove event button
r1241 #include <QMessageBox>
New tool dialog to select a zone on time and chart modes
r1135
Time Zone Mode + prepare graph mode
r1138 Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget")
Display catalogues and events with CatalogueAPI
r1129
"Apply" and "cancel" buttons on an event
r1162 /// Fixed size of the validation column
const auto VALIDATION_COLUMN_SIZE = 35;
Skeleton to fill the inspector with the selection
r1105
Events
r1101 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 CatalogueEventsModel *m_Model = nullptr;
Time Zone Mode + prepare graph mode
r1138 QStringList m_ZonesForTimeMode;
New tool dialog to select a zone on time and chart modes
r1135 QString m_ZoneForGraphMode;
Updates model after an event has been created through the colored zone
r1231 QVector<std::shared_ptr<DBCatalogue> > m_DisplayedCatalogues;
Fix creation of first event
r1257 bool m_AllEventDisplayed = false;
Methods to facilitate add/remove operations
r1134
Retrieves zone names from the visualization
r1136 VisualizationWidget *m_VisualizationWidget = nullptr;
store events with changes in the catalogue controller
r1237 void setEvents(const QVector<std::shared_ptr<DBEvent> > &events, CatalogueEventsWidget *widget)
Methods to facilitate add/remove operations
r1134 {
store events with changes in the catalogue controller
r1237 widget->ui->treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1134 m_Model->setEvents(events);
store events with changes in the catalogue controller
r1237 widget->ui->treeView->setSortingEnabled(true);
for (auto event : events) {
if (sqpApp->catalogueController().eventHasChanges(event)) {
auto index = m_Model->indexOf(event);
widget->setEventChanges(event, true);
}
}
Methods to facilitate add/remove operations
r1134 }
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 void addEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
Methods to facilitate add/remove operations
r1134 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1134 m_Model->addEvent(event);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 treeView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1134 }
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 void removeEvent(const std::shared_ptr<DBEvent> &event, QTreeView *treeView)
Methods to facilitate add/remove operations
r1134 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 treeView->setSortingEnabled(false);
Methods to facilitate add/remove operations
r1134 m_Model->removeEvent(event);
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 treeView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1134 }
Events
r1101
Retrieves zone names from the visualization
r1136 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
r1135 {
Retrieves zone names from the visualization
r1136 auto availableZones = getAvailableVisualizationZoneList();
if (availableZones.isEmpty()) {
return QStringList{};
}
New tool dialog to select a zone on time and chart modes
r1135 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
r1136 else {
result = selectedZones;
}
New tool dialog to select a zone on time and chart modes
r1135
return result;
}
Time Zone Mode + prepare graph mode
r1138
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 void updateForTimeMode(QTreeView *treeView)
Time Zone Mode + prepare graph mode
r1138 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 auto selectedRows = treeView->selectionModel()->selectedRows();
Time Zone Mode + prepare graph mode
r1138
if (selectedRows.count() == 1) {
Edition of event products via the inspector
r1150 auto event = m_Model->getEvent(selectedRows.first());
Displays TStart & TEnd for events
r1152 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
r1138 }
}
Displays TStart & TEnd for events
r1152 else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: no tab found in the visualization";
}
Time Zone Mode + prepare graph mode
r1138 }
else {
qCWarning(LOG_CatalogueEventsWidget())
Displays TStart & TEnd for events
r1152 << "updateTimeZone: visualization widget not found";
Time Zone Mode + prepare graph mode
r1138 }
}
}
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
r1149 void updateForGraphMode(QTreeView *treeView)
Time Zone Mode + prepare graph mode
r1138 {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 auto selectedRows = treeView->selectionModel()->selectedRows();
Time Zone Mode + prepare graph mode
r1138
if (selectedRows.count() == 1) {
Edition of event products via the inspector
r1150 auto event = m_Model->getEvent(selectedRows.first());
Time Zone Mode + prepare graph mode
r1138 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";
}
}
connect remove event button
r1241
void getSelectedItems(
QTreeView *treeView, QVector<std::shared_ptr<DBEvent> > &events,
QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > &eventProducts)
{
for (auto rowIndex : treeView->selectionModel()->selectedRows()) {
auto itemType = m_Model->itemTypeOf(rowIndex);
if (itemType == CatalogueEventsModel::ItemType::Event) {
events << m_Model->getEvent(rowIndex);
}
else if (itemType == CatalogueEventsModel::ItemType::EventProduct) {
eventProducts << qMakePair(m_Model->getParentEvent(rowIndex),
m_Model->getEventProduct(rowIndex));
}
}
}
New tool dialog to select a zone on time and chart modes
r1135 };
Events
r1101
Sub widget classes
r1095 CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent)
Events
r1101 : QWidget(parent),
ui(new Ui::CatalogueEventsWidget),
impl{spimpl::make_unique_impl<CatalogueEventsWidgetPrivate>()}
Sub widget classes
r1095 {
ui->setupUi(this);
Events
r1101
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 impl->m_Model = new CatalogueEventsModel{this};
ui->treeView->setModel(impl->m_Model);
TableModel for events
r1130
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 ui->treeView->setSortingEnabled(true);
ui->treeView->setDragDropMode(QAbstractItemView::DragDrop);
ui->treeView->setDragEnabled(true);
TableModel for events
r1130
Events
r1101 connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) {
if (checked) {
ui->btnChart->setChecked(false);
Time Zone Mode + prepare graph mode
r1138 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
r1149 impl->updateForTimeMode(ui->treeView);
Events
r1101 }
});
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
r1135 impl->m_ZoneForGraphMode
Retrieves zone names from the visualization
r1136 = impl->selectZone(this, {impl->m_ZoneForGraphMode}, false,
New tool dialog to select a zone on time and chart modes
r1135 this->mapToGlobal(ui->btnChart->frameGeometry().center()))
.value(0);
Time Zone Mode + prepare graph mode
r1138
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 impl->updateForGraphMode(ui->treeView);
Events
r1101 }
});
connect remove event button
r1241 connect(ui->btnRemove, &QToolButton::clicked, [this]() {
Adaptation to the shared pointers of catalogue controller
r1143 QVector<std::shared_ptr<DBEvent> > events;
Edition of event products via the inspector
r1150 QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
connect remove event button
r1241 impl->getSelectedItems(ui->treeView, events, eventProducts);
Edition of event products via the inspector
r1150
connect remove event button
r1241 if (!events.isEmpty() && eventProducts.isEmpty()) {
Edition of event products via the inspector
r1150
connect remove event button
r1241 if (QMessageBox::warning(this, tr("Remove Event(s)"),
tr("The selected event(s) will be completly removed "
"from the repository!\nAre you sure you want to continue?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No)
== QMessageBox::Yes) {
for (auto event : events) {
sqpApp->catalogueController().removeEvent(event);
impl->removeEvent(event, ui->treeView);
}
Edition of event products via the inspector
r1150 }
Manage inspector with multiple events selected
r1131 }
connect remove event button
r1241 });
fix refresh of events after a discard
r1245 connect(ui->treeView, &QTreeView::clicked, this, &CatalogueEventsWidget::emitSelection);
connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this,
&CatalogueEventsWidget::emitSelection);
Skeleton to fill the inspector with the selection
r1105
connect remove event button
r1241 ui->btnRemove->setEnabled(false); // Disabled by default when nothing is selected
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 connect(ui->treeView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() {
auto isNotMultiSelection = ui->treeView->selectionModel()->selectedRows().count() <= 1;
Fixes
r1106 ui->btnChart->setEnabled(isNotMultiSelection);
ui->btnTime->setEnabled(isNotMultiSelection);
Time Zone Mode + prepare graph mode
r1138
if (isNotMultiSelection && ui->btnTime->isChecked()) {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 impl->updateForTimeMode(ui->treeView);
Time Zone Mode + prepare graph mode
r1138 }
else if (isNotMultiSelection && ui->btnChart->isChecked()) {
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 impl->updateForGraphMode(ui->treeView);
Time Zone Mode + prepare graph mode
r1138 }
connect remove event button
r1241
QVector<std::shared_ptr<DBEvent> > events;
QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
impl->getSelectedItems(ui->treeView, events, eventProducts);
ui->btnRemove->setEnabled(!events.isEmpty() && eventProducts.isEmpty());
Skeleton to fill the inspector with the selection
r1105 });
Basic interactions
r1103
Change the event model to a treeview model + update the last version of CatalogueAPI
r1149 ui->treeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
small gui improvements
r1238 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Tags,
"Apply" and "cancel" buttons on an event
r1162 QHeaderView::Stretch);
ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Validation,
QHeaderView::Fixed);
small gui improvements
r1238 ui->treeView->header()->setSectionResizeMode((int)CatalogueEventsModel::Column::Name,
QHeaderView::Interactive);
"Apply" and "cancel" buttons on an event
r1162 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
r1149 ui->treeView->header()->setSortIndicatorShown(true);
"Apply" and "cancel" buttons on an event
r1162
connect(impl->m_Model, &CatalogueEventsModel::modelSorted, [this]() {
auto allEvents = impl->m_Model->events();
for (auto event : allEvents) {
store events with changes in the catalogue controller
r1237 setEventChanges(event, sqpApp->catalogueController().eventHasChanges(event));
"Apply" and "cancel" buttons on an event
r1162 }
});
Handle selection of trash and repository items
r1234
populateWithAllEvents();
Sub widget classes
r1095 }
CatalogueEventsWidget::~CatalogueEventsWidget()
{
delete ui;
}
Events
r1101
Retrieves zone names from the visualization
r1136 void CatalogueEventsWidget::setVisualizationWidget(VisualizationWidget *visualization)
{
impl->m_VisualizationWidget = visualization;
}
Updates model after an event has been created through the colored zone
r1231 void CatalogueEventsWidget::addEvent(const std::shared_ptr<DBEvent> &event)
{
impl->addEvent(event, ui->treeView);
}
Edition of events from the inspector
r1148 void CatalogueEventsWidget::setEventChanges(const std::shared_ptr<DBEvent> &event, bool hasChanges)
{
impl->m_Model->refreshEvent(event);
"Apply" and "cancel" buttons on an event
r1162
auto eventIndex = impl->m_Model->indexOf(event);
auto validationIndex
= eventIndex.sibling(eventIndex.row(), (int)CatalogueEventsModel::Column::Validation);
Some fixes
r1235 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);
},
Add discard method for event
r1243 [this, event]() {
Discard an added event remove it now.
r1260 bool removed = false;
sqpApp->catalogueController().discardEvent(event, removed);
if (removed) {
impl->m_Model->removeEvent(event);
}
else {
setEventChanges(event, false);
impl->m_Model->refreshEvent(event, true);
}
fix refresh of events after a discard
r1245 emitSelection();
Add discard method for event
r1243 });
Some fixes
r1235 ui->treeView->setIndexWidget(validationIndex, widget);
}
store events with changes in the catalogue controller
r1237 }
else {
// Note: the widget is destroyed
ui->treeView->setIndexWidget(validationIndex, nullptr);
Some fixes
r1235 }
"Apply" and "cancel" buttons on an event
r1162 }
else {
Updates model after an event has been created through the colored zone
r1231 qCWarning(LOG_CatalogueEventsWidget())
<< "setEventChanges: the event is not displayed in the model.";
"Apply" and "cancel" buttons on an event
r1162 }
Updates model after an event has been created through the colored zone
r1231 }
QVector<std::shared_ptr<DBCatalogue> > CatalogueEventsWidget::displayedCatalogues() const
{
return impl->m_DisplayedCatalogues;
}
bool CatalogueEventsWidget::isAllEventsDisplayed() const
{
Fix creation of first event
r1257 return impl->m_AllEventDisplayed;
Updates model after an event has been created through the colored zone
r1231 }
"Apply" and "cancel" buttons on an event
r1162
Updates model after an event has been created through the colored zone
r1231 bool CatalogueEventsWidget::isEventDisplayed(const std::shared_ptr<DBEvent> &event) const
{
return impl->m_Model->indexOf(event).isValid();
Edition of events from the inspector
r1148 }
Adaptation to the shared pointers of catalogue controller
r1143 void CatalogueEventsWidget::populateWithCatalogues(
const QVector<std::shared_ptr<DBCatalogue> > &catalogues)
Basic interactions
r1103 {
Updates model after an event has been created through the colored zone
r1231 impl->m_DisplayedCatalogues = catalogues;
Fix creation of first event
r1257 impl->m_AllEventDisplayed = false;
Updates model after an event has been created through the colored zone
r1231
Multi selection of catalogues
r1132 QSet<QUuid> eventIds;
Adaptation to the shared pointers of catalogue controller
r1143 QVector<std::shared_ptr<DBEvent> > events;
Multi selection of catalogues
r1132
for (auto catalogue : catalogues) {
Adaptation to the shared pointers of catalogue controller
r1143 auto catalogueEvents = sqpApp->catalogueController().retrieveEventsFromCatalogue(catalogue);
Multi selection of catalogues
r1132 for (auto event : catalogueEvents) {
Adaptation to the shared pointers of catalogue controller
r1143 if (!eventIds.contains(event->getUniqId())) {
Multi selection of catalogues
r1132 events << event;
Adaptation to the shared pointers of catalogue controller
r1143 eventIds.insert(event->getUniqId());
Multi selection of catalogues
r1132 }
}
Display catalogues and events with CatalogueAPI
r1129 }
Basic interactions
r1103
store events with changes in the catalogue controller
r1237 impl->setEvents(events, this);
Events
r1101 }
Displays all events
r1160
void CatalogueEventsWidget::populateWithAllEvents()
{
Updates model after an event has been created through the colored zone
r1231 impl->m_DisplayedCatalogues.clear();
Fix creation of first event
r1257 impl->m_AllEventDisplayed = true;
Updates model after an event has been created through the colored zone
r1231
Displays all events
r1160 auto allEvents = sqpApp->catalogueController().retrieveAllEvents();
QVector<std::shared_ptr<DBEvent> > events;
for (auto event : allEvents) {
events << event;
}
store events with changes in the catalogue controller
r1237 impl->setEvents(events, this);
Displays all events
r1160 }
Updates model after an event has been created through the colored zone
r1231
Handle selection of trash and repository items
r1234 void CatalogueEventsWidget::clear()
{
impl->m_DisplayedCatalogues.clear();
Fix creation of first event
r1257 impl->m_AllEventDisplayed = false;
store events with changes in the catalogue controller
r1237 impl->setEvents({}, this);
Handle selection of trash and repository items
r1234 }
Updates model after an event has been created through the colored zone
r1231 void CatalogueEventsWidget::refresh()
{
Fix creation of first event
r1257 if (isAllEventsDisplayed()) {
Updates model after an event has been created through the colored zone
r1231 populateWithAllEvents();
}
Fix creation of first event
r1257 else if (!impl->m_DisplayedCatalogues.isEmpty()) {
Updates model after an event has been created through the colored zone
r1231 populateWithCatalogues(impl->m_DisplayedCatalogues);
}
}
fix refresh of events after a discard
r1245
void CatalogueEventsWidget::emitSelection()
{
QVector<std::shared_ptr<DBEvent> > events;
QVector<QPair<std::shared_ptr<DBEvent>, std::shared_ptr<DBEventProduct> > > eventProducts;
impl->getSelectedItems(ui->treeView, events, eventProducts);
if (!events.isEmpty() && eventProducts.isEmpty()) {
emit eventsSelected(events);
}
else if (events.isEmpty() && !eventProducts.isEmpty()) {
emit eventProductsSelected(eventProducts);
}
else {
emit selectionCleared();
}
}