Krita Source Code Documentation
Loading...
Searching...
No Matches
TableModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#include "TableModel.h"
7
8#include <QDateTime>
9#include <QApplication>
10
12 : QSqlRelationalDelegate(parent)
13{}
14
15QRect getNewRect(const QStyleOptionViewItem &option)
16{
17 // get the rectangle in the middle of the field
18 const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
19 QRect newRect = QStyle::alignedRect(option.direction, Qt::AlignCenter,
20 QSize(option.decorationSize.width() +
21 5,option.decorationSize.height()),
22 QRect(option.rect.x() + textMargin, option.rect.y(),
23 option.rect.width() -
24 (2 * textMargin), option.rect.height()));
25 return newRect;
26}
27
28void TableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
29{
30 QStyleOptionViewItem viewItemOption(option);
31 // Only do this if we are accessing the column with boolean variables.
32 if (m_booleanColumns.contains(index.column())) {
33 // This basically changes the rectangle in which the check box is drawn.
34 viewItemOption.rect = getNewRect(option);
35 }
36 // Draw the check box using the new rectangle.
37 QSqlRelationalDelegate::paint(painter, viewItemOption, index);
38}
39
40QSize TableDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
41{
42 return QSqlRelationalDelegate::sizeHint(option, index);
43}
44
45bool TableDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
46{
47 if (m_editable) {
48 if (m_booleanColumns.contains(index.column())) {
49 QStyleOptionViewItem optionCheckable = option;
50 optionCheckable.rect = getNewRect(option);
51 optionCheckable.features |= QStyleOptionViewItem::HasCheckIndicator;
52 return QSqlRelationalDelegate::editorEvent(event, model, optionCheckable, index);
53 } else {
54 return QSqlRelationalDelegate::editorEvent(event, model, option, index);
55 }
56 }
57 return false;
58}
59
60QWidget *TableDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
61{
62 if (m_editable) {
63 if (m_booleanColumns.contains(index.column())) {
64 QStyleOptionViewItem optionCheckable = option;
65 optionCheckable.features |= QStyleOptionViewItem::HasCheckIndicator;
66 optionCheckable.rect = getNewRect(option);
67 return QSqlRelationalDelegate::createEditor(parent, optionCheckable, index);
68 } else {
69 return QSqlRelationalDelegate::createEditor(parent, option, index);
70 }
71 }
72 return 0;
73}
74
76{
77 m_dateTimeColumns << column;
78}
79
81{
82 m_booleanColumns << column;
83}
84
85void TableDelegate::setEditable(bool editable)
86{
87 m_editable = editable;
88}
89
90
91TableModel::TableModel(QObject *parent, QSqlDatabase db)
92 : QSqlRelationalTableModel(parent, db)
93{
94 this->setEditStrategy(QSqlTableModel::OnFieldChange);
95}
96
101
102QVariant TableModel::data(const QModelIndex &index, int role) const
103{
104 QVariant d = QSqlRelationalTableModel::data(index, role);
105 if (role == Qt::DisplayRole) {
106 if (m_dateTimeColumns.contains(index.column())) {
107 return QDateTime::fromSecsSinceEpoch(d.toInt()).toString();
108 } else if (m_booleanColumns.contains(index.column())) {
109 return {};
110 }
111 }
112 else if (role == Qt::CheckStateRole) {
113 if (m_booleanColumns.contains(index.column())) {
114 if (d.toInt() == 0) {
115 return Qt::Unchecked;
116 }
117 else {
118 return Qt::Checked;
119 }
120 }
121 return {};
122 }
123 return d;
124}
125
126bool TableModel::setData(const QModelIndex & index, const QVariant & value, int role)
127{
128 if (m_booleanColumns.contains(index.column()) && role == Qt::CheckStateRole) {
129 // Writing the data when the check box is set to checked.
130 if (value == Qt::Checked) {
131 // Let's write the new value
132 return QSqlTableModel::setData(index, 1, Qt::EditRole);
133 // Writing the data when the check box is set to unchecked
134 } else if (value == Qt::Unchecked) {
135 // Let's write the new value
136 return QSqlTableModel::setData(index, 0, Qt::EditRole);
137 }
138 }
139
140 bool response = QSqlTableModel::setData(index, value, role);
141 return response;
142}
143
144Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
145{
146 Qt::ItemFlags f = QSqlRelationalTableModel::flags((index));
147 if (m_booleanColumns.contains(index.column())) {
148 f |= Qt::ItemIsUserCheckable;
149 }
150 return f;
151
152}
153
155{
156 m_dateTimeColumns << column;
157}
158
160{
161 m_booleanColumns << column;
162}
float value(const T *src, size_t ch)
QRect getNewRect(const QStyleOptionViewItem &option)
TableDelegate(QObject *parent)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
QVector< int > m_dateTimeColumns
Definition TableModel.h:33
void addDateTimeColumn(int column)
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
QVector< int > m_booleanColumns
Definition TableModel.h:32
void setEditable(bool editable)
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void addBooleanColumn(int column)
TableModel(QObject *parent=nullptr, QSqlDatabase db=QSqlDatabase())
QVector< int > m_dateTimeColumns
Definition TableModel.h:57
QVector< int > m_booleanColumns
Definition TableModel.h:56
Qt::ItemFlags flags(const QModelIndex &index) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
void addBooleanColumn(int column)
~TableModel() override
void addDateTimeColumn(int column)
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override