##// END OF EJS Templates
Fix a problem with the update of a graph or a variable
Fix a problem with the update of a graph or a variable

File last commit:

r1138:f7fe3621eadc
r1139:e6af7b17a39a
Show More
CatalogueEventsWidget.cpp
292 lines | 10.3 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>
TableModel for events
r1130 #include <Catalogue/CatalogueEventsTableModel.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>
Time Zone Mode + prepare graph mode
r1138 Q_LOGGING_CATEGORY(LOG_CatalogueEventsWidget, "CatalogueEventsWidget")
Display catalogues and events with CatalogueAPI
r1129
/// Format of the dates appearing in the label of a cursor
const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss");
Skeleton to fill the inspector with the selection
r1105
Events
r1101 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
TableModel for events
r1130 CatalogueEventsTableModel *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;
Methods to facilitate add/remove operations
r1134
Retrieves zone names from the visualization
r1136 VisualizationWidget *m_VisualizationWidget = nullptr;
Methods to facilitate add/remove operations
r1134 void setEvents(const QVector<DBEvent> &events, QTableView *tableView)
{
tableView->setSortingEnabled(false);
m_Model->setEvents(events);
tableView->setSortingEnabled(true);
}
void addEvent(const DBEvent &event, QTableView *tableView)
{
tableView->setSortingEnabled(false);
m_Model->addEvent(event);
tableView->setSortingEnabled(true);
}
void removeEvent(const DBEvent &event, QTableView *tableView)
{
tableView->setSortingEnabled(false);
m_Model->removeEvent(event);
tableView->setSortingEnabled(true);
}
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
void updateForTimeMode(QTableView *tableView)
{
auto selectedRows = tableView->selectionModel()->selectedRows();
if (selectedRows.count() == 1) {
auto event = m_Model->getEvent(selectedRows.first().row());
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);
}
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: no tab found in the visualization";
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: visualization widget not found";
}
}
else {
qCWarning(LOG_CatalogueEventsWidget())
<< "updateTimeZone: not compatible with multiple events selected";
}
}
void updateForGraphMode(QTableView *tableView)
{
auto selectedRows = tableView->selectionModel()->selectedRows();
if (selectedRows.count() == 1) {
auto event = m_Model->getEvent(selectedRows.first().row());
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
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
Drag d'un event sur le TimeWidget
r1133 impl->m_Model = new CatalogueEventsTableModel{this};
TableModel for events
r1130 ui->tableView->setModel(impl->m_Model);
ui->tableView->setSortingEnabled(true);
Methods to facilitate add/remove operations
r1134 ui->tableView->setDragDropMode(QAbstractItemView::DragDrop);
ui->tableView->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()));
impl->updateForTimeMode(ui->tableView);
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
impl->updateForGraphMode(ui->tableView);
Events
r1101 }
});
Multi selection of catalogues
r1132 auto emitSelection = [this]() {
Manage inspector with multiple events selected
r1131 QVector<DBEvent> events;
for (auto rowIndex : ui->tableView->selectionModel()->selectedRows()) {
events << impl->m_Model->getEvent(rowIndex.row());
}
emit this->eventsSelected(events);
Multi selection of catalogues
r1132 };
Skeleton to fill the inspector with the selection
r1105
Multi selection of catalogues
r1132 connect(ui->tableView, &QTableView::clicked, emitSelection);
connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged, emitSelection);
Skeleton to fill the inspector with the selection
r1105
TableModel for events
r1130 connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() {
auto isNotMultiSelection = ui->tableView->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()) {
impl->updateForTimeMode(ui->tableView);
}
else if (isNotMultiSelection && ui->btnChart->isChecked()) {
impl->updateForGraphMode(ui->tableView);
}
Skeleton to fill the inspector with the selection
r1105 });
Basic interactions
r1103
TableModel for events
r1130 ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableView->horizontalHeader()->setSortIndicatorShown(true);
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;
}
Multi selection of catalogues
r1132 void CatalogueEventsWidget::populateWithCatalogues(const QVector<DBCatalogue> &catalogues)
Basic interactions
r1103 {
Display catalogues and events with CatalogueAPI
r1129 auto &dao = sqpApp->catalogueController().getDao();
Multi selection of catalogues
r1132 QSet<QUuid> eventIds;
QVector<DBEvent> events;
for (auto catalogue : catalogues) {
auto catalogueEvents = dao.getCatalogueEvents(catalogue);
for (auto event : catalogueEvents) {
if (!eventIds.contains(event.getUniqId())) {
events << event;
eventIds.insert(event.getUniqId());
}
}
Display catalogues and events with CatalogueAPI
r1129 }
Basic interactions
r1103
Methods to facilitate add/remove operations
r1134 impl->setEvents(events, ui->tableView);
Events
r1101 }