##// END OF EJS Templates
TableModel for events
trabillard -
r1130:da2e9b24ace3
parent child
Show More
@@ -0,0 +1,33
1 #ifndef SCIQLOP_CATALOGUEEVENTSTABLEMODEL_H
2 #define SCIQLOP_CATALOGUEEVENTSTABLEMODEL_H
3
4 #include <Common/spimpl.h>
5 #include <QAbstractTableModel>
6
7 #include <DBEvent.h>
8
9 class CatalogueEventsTableModel : public QAbstractTableModel {
10 public:
11 CatalogueEventsTableModel(QObject *parent = nullptr);
12
13 void setEvents(const QVector<DBEvent> &events);
14 DBEvent getEvent(int row) const;
15
16
17 // Model
18 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
19 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
20 Qt::ItemFlags flags(const QModelIndex &index) const override;
21 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
22 QVariant headerData(int section, Qt::Orientation orientation,
23 int role = Qt::DisplayRole) const override;
24
25 void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
26
27
28 private:
29 class CatalogueEventsTableModelPrivate;
30 spimpl::unique_impl_ptr<CatalogueEventsTableModelPrivate> impl;
31 };
32
33 #endif // SCIQLOP_CATALOGUEEVENTSTABLEMODEL_H
@@ -0,0 +1,119
1 #include "Catalogue/CatalogueEventsTableModel.h"
2
3 #include <Common/DateUtils.h>
4 #include <DBEvent.h>
5 #include <DBTag.h>
6
7 struct CatalogueEventsTableModel::CatalogueEventsTableModelPrivate {
8 QVector<DBEvent> m_Events;
9
10 enum class Column { Event, TStart, TEnd, Tags, Product, NbColumn };
11 QStringList columnNames()
12 {
13 return QStringList{tr("Event"), tr("TStart"), tr("TEnd"), tr("Tags"), tr("Product")};
14 }
15
16 QVariant eventData(int col, const DBEvent &event) const
17 {
18 switch (static_cast<Column>(col)) {
19 case Column::Event:
20 return event.getName();
21 case Column::TStart:
22 return DateUtils::dateTime(event.getTStart());
23 case Column::TEnd:
24 return DateUtils::dateTime(event.getTEnd());
25 case Column::Product:
26 return event.getProduct();
27 case Column::Tags: {
28 QString tagList;
29 auto tags = const_cast<DBEvent *>(&event)->getTags();
30 for (auto tag : tags) {
31 tagList += tag.getName();
32 tagList += ' ';
33 }
34
35 return tagList;
36 }
37 default:
38 break;
39 }
40
41 Q_ASSERT(false);
42 return QStringLiteral("Unknown Data");
43 }
44 };
45
46 CatalogueEventsTableModel::CatalogueEventsTableModel(QObject *parent)
47 : QAbstractTableModel(parent),
48 impl{spimpl::make_unique_impl<CatalogueEventsTableModelPrivate>()}
49 {
50 }
51
52 void CatalogueEventsTableModel::setEvents(const QVector<DBEvent> &events)
53 {
54 beginResetModel();
55 impl->m_Events = events;
56 endResetModel();
57 }
58
59 DBEvent CatalogueEventsTableModel::getEvent(int row) const
60 {
61 return impl->m_Events.value(row);
62 }
63
64 int CatalogueEventsTableModel::rowCount(const QModelIndex &parent) const
65 {
66 int r = impl->m_Events.count();
67 return r;
68 }
69
70 int CatalogueEventsTableModel::columnCount(const QModelIndex &parent) const
71 {
72 int c = static_cast<int>(CatalogueEventsTableModelPrivate::Column::NbColumn);
73 return c;
74 }
75
76 Qt::ItemFlags CatalogueEventsTableModel::flags(const QModelIndex &index) const
77 {
78 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
79 }
80
81 QVariant CatalogueEventsTableModel::data(const QModelIndex &index, int role) const
82 {
83 if (index.isValid()) {
84 auto event = impl->m_Events.value(index.row());
85
86 switch (role) {
87 case Qt::DisplayRole:
88 return impl->eventData(index.column(), event);
89 break;
90 }
91 }
92
93 return QVariant{};
94 }
95
96 QVariant CatalogueEventsTableModel::headerData(int section, Qt::Orientation orientation,
97 int role) const
98 {
99 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
100 return impl->columnNames().value(section);
101 }
102
103 return QVariant();
104 }
105
106 void CatalogueEventsTableModel::sort(int column, Qt::SortOrder order)
107 {
108 std::sort(impl->m_Events.begin(), impl->m_Events.end(),
109 [this, column, order](auto e1, auto e2) {
110 auto data1 = impl->eventData(column, e1);
111 auto data2 = impl->eventData(column, e2);
112
113 auto result = data1.toString() < data2.toString();
114
115 return order == Qt::AscendingOrder ? result : !result;
116 });
117
118 emit dataChanged(QModelIndex(), QModelIndex());
119 }
@@ -40,7 +40,7 ExternalProject_Add(
40 GIT_REPOSITORY https://perrinel@hephaistos.lpp.polytechnique.fr/rhodecode/GIT_REPOSITORIES/LPP/Users/mperrinel/CatalogueAPI
40 GIT_REPOSITORY https://perrinel@hephaistos.lpp.polytechnique.fr/rhodecode/GIT_REPOSITORIES/LPP/Users/mperrinel/CatalogueAPI
41 GIT_TAG develop
41 GIT_TAG develop
42
42
43 UPDATE_COMMAND ${GIT_EXECUTABLE} pull
43 UPDATE_COMMAND ${GIT_EXECUTABLE} pull origin develop
44 PATCH_COMMAND ""
44 PATCH_COMMAND ""
45
45
46 SOURCE_DIR "${CATALOGUEAPI_SOURCES_PATH}"
46 SOURCE_DIR "${CATALOGUEAPI_SOURCES_PATH}"
@@ -107,7 +107,8 gui_sources = [
107 'src/Catalogue/CatalogueEventsWidget.cpp',
107 'src/Catalogue/CatalogueEventsWidget.cpp',
108 'src/Catalogue/CatalogueSideBarWidget.cpp',
108 'src/Catalogue/CatalogueSideBarWidget.cpp',
109 'src/Catalogue/CatalogueInspectorWidget.cpp',
109 'src/Catalogue/CatalogueInspectorWidget.cpp',
110 'src/Catalogue/CatalogueTreeWidgetItem.cpp'
110 'src/Catalogue/CatalogueTreeWidgetItem.cpp',
111 'src/Catalogue/CatalogueEventsTableModel.cpp'
111 ]
112 ]
112
113
113 gui_inc = include_directories(['include'])
114 gui_inc = include_directories(['include'])
@@ -2,6 +2,7
2 #include "ui_CatalogueEventsWidget.h"
2 #include "ui_CatalogueEventsWidget.h"
3
3
4 #include <Catalogue/CatalogueController.h>
4 #include <Catalogue/CatalogueController.h>
5 #include <Catalogue/CatalogueEventsTableModel.h>
5 #include <CatalogueDao.h>
6 #include <CatalogueDao.h>
6 #include <DBCatalogue.h>
7 #include <DBCatalogue.h>
7 #include <SqpApplication.h>
8 #include <SqpApplication.h>
@@ -11,12 +12,8
11 const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss");
12 const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss");
12
13
13 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
14 struct CatalogueEventsWidget::CatalogueEventsWidgetPrivate {
14 void addEventItem(const QStringList &data, QTableWidget *tableWidget);
15
15
16 enum class Column { Event, TStart, TEnd, Tags, Product, NbColumn };
16 CatalogueEventsTableModel *m_Model = nullptr;
17 QStringList columnNames() { return QStringList{"Event", "TStart", "TEnd", "Tags", "Product"}; }
18
19 QVector<DBEvent> m_Events;
20 };
17 };
21
18
22
19
@@ -27,6 +24,11 CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent)
27 {
24 {
28 ui->setupUi(this);
25 ui->setupUi(this);
29
26
27 impl->m_Model = new CatalogueEventsTableModel(this);
28 ui->tableView->setModel(impl->m_Model);
29
30 ui->tableView->setSortingEnabled(true);
31
30 connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) {
32 connect(ui->btnTime, &QToolButton::clicked, [this](auto checked) {
31 if (checked) {
33 if (checked) {
32 ui->btnChart->setChecked(false);
34 ui->btnChart->setChecked(false);
@@ -39,33 +41,28 CatalogueEventsWidget::CatalogueEventsWidget(QWidget *parent)
39 }
41 }
40 });
42 });
41
43
42 connect(ui->tableWidget, &QTableWidget::cellClicked, [this](auto row, auto column) {
44 connect(ui->tableView, &QTableView::clicked, [this](auto index) {
43 auto event = impl->m_Events.value(row);
45 auto event = impl->m_Model->getEvent(index.row());
44 emit this->eventSelected(event);
46 emit this->eventSelected(event);
45 });
47 });
46
48
47 connect(ui->tableWidget, &QTableWidget::currentItemChanged,
49 connect(ui->tableView->selectionModel(), &QItemSelectionModel::currentChanged,
48 [this](auto current, auto previous) {
50 [this](auto current, auto previous) {
49 if (current && current->row() >= 0) {
51 if (current.isValid() && current.row() >= 0) {
50 auto event = impl->m_Events.value(current->row());
52 auto event = impl->m_Model->getEvent(current.row());
51 emit this->eventSelected(event);
53 emit this->eventSelected(event);
52 }
54 }
53 });
55 });
54
56
55 connect(ui->tableWidget, &QTableWidget::itemSelectionChanged, [this]() {
57 connect(ui->tableView->selectionModel(), &QItemSelectionModel::selectionChanged, [this]() {
56 auto selection = ui->tableWidget->selectedRanges();
58 auto isNotMultiSelection = ui->tableView->selectionModel()->selectedRows().count() <= 1;
57 auto isNotMultiSelection
58 = selection.isEmpty() || (selection.count() == 1 && selection.first().rowCount() == 1);
59 ui->btnChart->setEnabled(isNotMultiSelection);
59 ui->btnChart->setEnabled(isNotMultiSelection);
60 ui->btnTime->setEnabled(isNotMultiSelection);
60 ui->btnTime->setEnabled(isNotMultiSelection);
61 });
61 });
62
62
63 Q_ASSERT(impl->columnNames().count() == (int)CatalogueEventsWidgetPrivate::Column::NbColumn);
63 ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
64 ui->tableWidget->setColumnCount((int)CatalogueEventsWidgetPrivate::Column::NbColumn);
64 ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
65 ui->tableWidget->setHorizontalHeaderLabels(impl->columnNames());
65 ui->tableView->horizontalHeader()->setSortIndicatorShown(true);
66 ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
67 ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
68 ui->tableWidget->horizontalHeader()->setSortIndicatorShown(true);
69 }
66 }
70
67
71 CatalogueEventsWidget::~CatalogueEventsWidget()
68 CatalogueEventsWidget::~CatalogueEventsWidget()
@@ -75,41 +72,15 CatalogueEventsWidget::~CatalogueEventsWidget()
75
72
76 void CatalogueEventsWidget::populateWithCatalogue(const DBCatalogue &catalogue)
73 void CatalogueEventsWidget::populateWithCatalogue(const DBCatalogue &catalogue)
77 {
74 {
78 ui->tableWidget->clearContents();
79 ui->tableWidget->setRowCount(0);
80
81 auto &dao = sqpApp->catalogueController().getDao();
75 auto &dao = sqpApp->catalogueController().getDao();
82 auto events = dao.getCatalogueEvents(catalogue);
76 auto events = dao.getCatalogueEvents(catalogue);
83
77
78 QVector<DBEvent> eventVector;
84 for (auto event : events) {
79 for (auto event : events) {
85 impl->m_Events << event;
80 eventVector << event;
86
87 auto tags = event.getTags();
88 QString tagList;
89 for (auto tag : tags) {
90 tagList += tag.getName();
91 tagList += ' ';
92 }
93
94 impl->addEventItem({event.getName(),
95 DateUtils::dateTime(event.getTStart()).toString(DATETIME_FORMAT),
96 DateUtils::dateTime(event.getTEnd()).toString(DATETIME_FORMAT), tagList,
97 event.getProduct()},
98 ui->tableWidget);
99 }
81 }
100 }
101
82
102 void CatalogueEventsWidget::CatalogueEventsWidgetPrivate::addEventItem(const QStringList &data,
83 ui->tableView->setSortingEnabled(false);
103 QTableWidget *tableWidget)
84 impl->m_Model->setEvents(eventVector);
104 {
85 ui->tableView->setSortingEnabled(true);
105 tableWidget->setSortingEnabled(false);
106 auto row = tableWidget->rowCount();
107 tableWidget->setRowCount(row + 1);
108
109 for (auto i = 0; i < (int)Column::NbColumn; ++i) {
110 auto item = new QTableWidgetItem(data.value(i));
111 item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
112 tableWidget->setItem(row, i, item);
113 }
114 tableWidget->setSortingEnabled(true);
115 }
86 }
@@ -34,7 +34,7
34 <string>+</string>
34 <string>+</string>
35 </property>
35 </property>
36 <property name="icon">
36 <property name="icon">
37 <iconset>
37 <iconset resource="../../resources/sqpguiresources.qrc">
38 <normaloff>:/icones/add.png</normaloff>:/icones/add.png</iconset>
38 <normaloff>:/icones/add.png</normaloff>:/icones/add.png</iconset>
39 </property>
39 </property>
40 <property name="autoRaise">
40 <property name="autoRaise">
@@ -48,7 +48,7
48 <string> - </string>
48 <string> - </string>
49 </property>
49 </property>
50 <property name="icon">
50 <property name="icon">
51 <iconset>
51 <iconset resource="../../resources/sqpguiresources.qrc">
52 <normaloff>:/icones/remove.png</normaloff>:/icones/remove.png</iconset>
52 <normaloff>:/icones/remove.png</normaloff>:/icones/remove.png</iconset>
53 </property>
53 </property>
54 <property name="autoRaise">
54 <property name="autoRaise">
@@ -69,7 +69,7
69 <string>T</string>
69 <string>T</string>
70 </property>
70 </property>
71 <property name="icon">
71 <property name="icon">
72 <iconset>
72 <iconset resource="../../resources/sqpguiresources.qrc">
73 <normaloff>:/icones/time.png</normaloff>:/icones/time.png</iconset>
73 <normaloff>:/icones/time.png</normaloff>:/icones/time.png</iconset>
74 </property>
74 </property>
75 <property name="checkable">
75 <property name="checkable">
@@ -86,7 +86,7
86 <string>G</string>
86 <string>G</string>
87 </property>
87 </property>
88 <property name="icon">
88 <property name="icon">
89 <iconset>
89 <iconset resource="../../resources/sqpguiresources.qrc">
90 <normaloff>:/icones/chart.png</normaloff>:/icones/chart.png</iconset>
90 <normaloff>:/icones/chart.png</normaloff>:/icones/chart.png</iconset>
91 </property>
91 </property>
92 <property name="checkable">
92 <property name="checkable">
@@ -114,26 +114,35
114 </layout>
114 </layout>
115 </item>
115 </item>
116 <item>
116 <item>
117 <widget class="QTableWidget" name="tableWidget">
117 <widget class="QTableView" name="tableView">
118 <property name="alternatingRowColors">
119 <bool>true</bool>
120 </property>
121 <property name="selectionBehavior">
118 <property name="selectionBehavior">
122 <enum>QAbstractItemView::SelectRows</enum>
119 <enum>QAbstractItemView::SelectRows</enum>
123 </property>
120 </property>
121 <attribute name="horizontalHeaderVisible">
122 <bool>true</bool>
123 </attribute>
124 <attribute name="horizontalHeaderHighlightSections">
124 <attribute name="horizontalHeaderHighlightSections">
125 <bool>false</bool>
125 <bool>false</bool>
126 </attribute>
126 </attribute>
127 <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
128 <bool>true</bool>
129 </attribute>
127 <attribute name="verticalHeaderVisible">
130 <attribute name="verticalHeaderVisible">
128 <bool>false</bool>
131 <bool>false</bool>
129 </attribute>
132 </attribute>
130 <attribute name="verticalHeaderDefaultSectionSize">
133 <attribute name="verticalHeaderDefaultSectionSize">
131 <number>25</number>
134 <number>25</number>
132 </attribute>
135 </attribute>
136 <attribute name="verticalHeaderHighlightSections">
137 <bool>false</bool>
138 </attribute>
133 </widget>
139 </widget>
134 </item>
140 </item>
135 </layout>
141 </layout>
136 </widget>
142 </widget>
137 <resources/>
143 <resources>
144 <include location="../../resources/sqpguiresources.qrc"/>
145 <include location="../../resources/sqpguiresources.qrc"/>
146 </resources>
138 <connections/>
147 <connections/>
139 </ui>
148 </ui>
General Comments 0
You need to be logged in to leave comments. Login now