1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTABLEWIDGET_P_H
5#define QTABLEWIDGET_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. This header file may change
12// from version to version without notice, or even be removed.
13//
14// We mean it.
15//
16
17#include <QtWidgets/private/qtwidgetsglobal_p.h>
18#include <qheaderview.h>
19#include <qtablewidget.h>
20#include <qabstractitemmodel.h>
21#include <private/qabstractitemmodel_p.h>
22#include <private/qtableview_p.h>
23#include <private/qwidgetitemdata_p.h>
24
25#include <array>
26
27QT_REQUIRE_CONFIG(tablewidget);
28
29QT_BEGIN_NAMESPACE
30
31class QTableWidgetMimeData : public QMimeData
32{
33 Q_OBJECT
34public:
35 QList<QTableWidgetItem*> items;
36};
37
38class QTableModelLessThan
39{
40public:
41 inline bool operator()(QTableWidgetItem *i1, QTableWidgetItem *i2) const
42 { return (*i1 < *i2); }
43};
44
45class QTableModelGreaterThan
46{
47public:
48 inline bool operator()(QTableWidgetItem *i1, QTableWidgetItem *i2) const
49 { return (*i2 < *i1); }
50};
51
52class QTableModel : public QAbstractTableModel
53{
54 Q_OBJECT
55 friend class QTableWidget;
56
57public:
58 QTableModel(int rows, int columns, QTableWidget *parent);
59 ~QTableModel();
60
61 inline QTableWidget *view() const { return qobject_cast<QTableWidget *>(object: QObject::parent()); }
62
63 bool insertRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override;
64 bool insertColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()) override;
65
66 bool removeRows(int row, int count = 1, const QModelIndex &parent = QModelIndex()) override;
67 bool removeColumns(int column, int count = 1, const QModelIndex &parent = QModelIndex()) override;
68
69 bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild) override;
70
71 void setItem(int row, int column, QTableWidgetItem *item);
72 QTableWidgetItem *takeItem(int row, int column);
73 QTableWidgetItem *item(int row, int column) const;
74 QTableWidgetItem *item(const QModelIndex &index) const;
75 void removeItem(QTableWidgetItem *item);
76
77 void setHorizontalHeaderItem(int section, QTableWidgetItem *item);
78 void setVerticalHeaderItem(int section, QTableWidgetItem *item);
79 QTableWidgetItem *takeHorizontalHeaderItem(int section);
80 QTableWidgetItem *takeVerticalHeaderItem(int section);
81 QTableWidgetItem *horizontalHeaderItem(int section);
82 QTableWidgetItem *verticalHeaderItem(int section);
83
84 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
85 { return QAbstractTableModel::index(row, column, parent); }
86
87 QModelIndex index(const QTableWidgetItem *item) const;
88
89 void setRowCount(int rows);
90 void setColumnCount(int columns);
91
92 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
93 int columnCount(const QModelIndex &parent = QModelIndex()) const override;
94
95 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
96 bool setData(const QModelIndex &index, const QVariant &value, int role) override;
97 bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override;
98 bool clearItemData(const QModelIndex &index) override;
99
100 QMap<int, QVariant> itemData(const QModelIndex &index) const override;
101
102 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
103 bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) override;
104
105 Qt::ItemFlags flags(const QModelIndex &index) const override;
106
107 void sort(int column, Qt::SortOrder order) override;
108 static bool itemLessThan(const std::pair<QTableWidgetItem*,int> &left,
109 const std::pair<QTableWidgetItem*,int> &right);
110 static bool itemGreaterThan(const std::pair<QTableWidgetItem*,int> &left,
111 const std::pair<QTableWidgetItem*,int> &right);
112
113 void ensureSorted(int column, Qt::SortOrder order, int start, int end);
114 QList<QTableWidgetItem *> columnItems(int column) const;
115 void updateRowIndexes(QModelIndexList &indexes, int movedFromRow, int movedToRow);
116 static QList<QTableWidgetItem *>::iterator
117 sortedInsertionIterator(const QList<QTableWidgetItem *>::iterator &begin,
118 const QList<QTableWidgetItem *>::iterator &end, Qt::SortOrder order,
119 QTableWidgetItem *item);
120
121 bool isValid(const QModelIndex &index) const;
122 inline long tableIndex(int row, int column) const
123 { return (row * horizontalHeaderItems.size()) + column; }
124
125 void clear();
126 void clearContents();
127 void itemChanged(QTableWidgetItem *item, const QList<int> &roles = QList<int>());
128
129 QTableWidgetItem *createItem() const;
130 const QTableWidgetItem *itemPrototype() const;
131 void setItemPrototype(const QTableWidgetItem *item);
132
133 // dnd
134 QStringList mimeTypes() const override;
135 QMimeData *mimeData(const QModelIndexList &indexes) const override;
136 bool dropMimeData(const QMimeData *data, Qt::DropAction action,
137 int row, int column, const QModelIndex &parent) override;
138 Qt::DropActions supportedDropActions() const override;
139 Qt::DropActions supportedDragActions() const override;
140
141 QMimeData *internalMimeData() const;
142
143private:
144 const QTableWidgetItem *prototype;
145 QList<QTableWidgetItem *> tableItems;
146 QList<QTableWidgetItem *> verticalHeaderItems;
147 QList<QTableWidgetItem *> horizontalHeaderItems;
148
149 // A cache must be mutable if get-functions should have const modifiers
150 mutable QModelIndexList cachedIndexes;
151};
152
153class QTableWidgetPrivate : public QTableViewPrivate
154{
155 Q_DECLARE_PUBLIC(QTableWidget)
156public:
157 QTableWidgetPrivate() : QTableViewPrivate() {}
158 inline QTableModel *tableModel() const { return qobject_cast<QTableModel*>(object: model); }
159 void setup();
160 void clearConnections();
161
162 // view signals
163 void emitItemPressed(const QModelIndex &index);
164 void emitItemClicked(const QModelIndex &index);
165 void emitItemDoubleClicked(const QModelIndex &index);
166 void emitItemActivated(const QModelIndex &index);
167 void emitItemEntered(const QModelIndex &index);
168 // model signals
169 void emitItemChanged(const QModelIndex &index);
170 // selection signals
171 void emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &current);
172 // sorting
173 void sort();
174 void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
175
176 std::array<QMetaObject::Connection, 10> connections;
177 std::optional<Qt::DropActions> supportedDragActions;
178};
179
180class QTableWidgetItemPrivate
181{
182public:
183 QTableWidgetItemPrivate(QTableWidgetItem *item) : q(item), id(-1), headerItem(false) {}
184 QTableWidgetItem *q;
185 int id;
186 bool headerItem; // Qt 7 TODO: inline this stuff in the public class.
187};
188
189QT_END_NAMESPACE
190
191#endif // QTABLEWIDGET_P_H
192

source code of qtbase/src/widgets/itemviews/qtablewidget_p.h