1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.widgets.tablewidget;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.abstractitemmodel;
17 import qt.core.coreevent;
18 import qt.core.itemselectionmodel;
19 import qt.core.list;
20 import qt.core.mimedata;
21 import qt.core.namespace;
22 import qt.core.point;
23 import qt.core.rect;
24 import qt.core.size;
25 import qt.core.string;
26 import qt.core.stringlist;
27 import qt.core.variant;
28 import qt.gui.brush;
29 import qt.gui.event;
30 import qt.gui.font;
31 import qt.gui.icon;
32 import qt.helpers;
33 import qt.widgets.abstractitemview;
34 import qt.widgets.tableview;
35 import qt.widgets.widget;
36 import qt.widgets.widgetitemdata;
37 version(QT_NO_DATASTREAM){}else
38     import qt.core.datastream;
39 
40 /+ QT_REQUIRE_CONFIG(tablewidget); +/
41 
42 
43 /// Binding for C++ class [QTableWidgetSelectionRange](https://doc.qt.io/qt-6/qtablewidgetselectionrange.html).
44 extern(C++, class) struct QTableWidgetSelectionRange
45 {
46 public:
47     /+ QTableWidgetSelectionRange() = default; +/
48     this(int top, int left, int bottom, int right)
49     {
50         this.m_top = top;
51         this.m_left = left;
52         this.m_bottom = bottom;
53         this.m_right = right;
54     }
55 
56     pragma(inline, true) int topRow() const { return m_top; }
57     pragma(inline, true) int bottomRow() const { return m_bottom; }
58     pragma(inline, true) int leftColumn() const { return m_left; }
59     pragma(inline, true) int rightColumn() const { return m_right; }
60     pragma(inline, true) int rowCount() const { return m_bottom - m_top + 1; }
61     pragma(inline, true) int columnCount() const { return m_right - m_left + 1; }
62 private:
63     int m_top = -1; int m_left = -1; int m_bottom = -2; int m_right = -2;
64     mixin(CREATE_CONVENIENCE_WRAPPERS);
65 }
66 
67 extern(C++, class) struct QTableModel;
68 extern(C++, class) struct QTableWidgetItemPrivate;
69 
70 /// Binding for C++ class [QTableWidgetItem](https://doc.qt.io/qt-6/qtablewidgetitem.html).
71 class /+ Q_WIDGETS_EXPORT +/ QTableWidgetItem
72 {
73 private:
74     /+ friend class QTableWidget; +/
75     /+ friend class QTableModel; +/
76 public:
77     enum ItemType { Type = 0, UserType = 1000 }
78     /+ explicit +/this(int type = ItemType.Type);
79     /+ explicit +/this(ref const(QString) text, int type = ItemType.Type);
80     /+ explicit +/this(ref const(QIcon) icon, ref const(QString) text, int type = ItemType.Type);
81     /+ QTableWidgetItem(const QTableWidgetItem &other); +/
82     /+ virtual +/~this();
83 
84     /+ virtual +/ QTableWidgetItem clone() const;
85 
86     pragma(inline, true) final QTableWidget tableWidget() const { return cast(QTableWidget)view; }
87 
88     pragma(inline, true) final int row() const
89     { return (view ? view.row(this) : -1); }
90     pragma(inline, true) final int column() const
91     { return (view ? view.column(this) : -1); }
92 
93     final void setSelected(bool select);
94     final bool isSelected() const;
95 
96     pragma(inline, true) final /+ Qt:: +/qt.core.namespace.ItemFlags flags() const { return itemFlags; }
97     final void setFlags(/+ Qt:: +/qt.core.namespace.ItemFlags flags);
98 
99     pragma(inline, true) final QString text() const
100         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole).toString(); }
101     pragma(inline, true) final void setText(ref const(QString) atext)
102     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole, atext); }
103 
104     pragma(inline, true) final QIcon icon() const
105         { return qvariant_cast!(QIcon)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole)); }
106     pragma(inline, true) final void setIcon(ref const(QIcon) aicon)
107     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole, aicon); }
108 
109     pragma(inline, true) final QString statusTip() const
110         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole).toString(); }
111     pragma(inline, true) final void setStatusTip(ref const(QString) astatusTip)
112     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole, astatusTip); }
113 
114 /+ #if QT_CONFIG(tooltip) +/
115     pragma(inline, true) final QString toolTip() const
116         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole).toString(); }
117     pragma(inline, true) final void setToolTip(ref const(QString) atoolTip)
118     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole, atoolTip); }
119 /+ #endif
120 
121 #if QT_CONFIG(whatsthis) +/
122     pragma(inline, true) final QString whatsThis() const
123         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole).toString(); }
124     pragma(inline, true) final void setWhatsThis(ref const(QString) awhatsThis)
125     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole, awhatsThis); }
126 /+ #endif +/
127 
128     pragma(inline, true) final QFont font() const
129         { return qvariant_cast!(QFont)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole)); }
130     pragma(inline, true) final void setFont(ref const(QFont) afont)
131     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole, afont); }
132 
133     pragma(inline, true) final int textAlignment() const
134         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole).toInt(); }
135     pragma(inline, true) final void setTextAlignment(int alignment)
136         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole, alignment); }
137 
138     pragma(inline, true) final QBrush background() const
139         { return qvariant_cast!(QBrush)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole)); }
140     pragma(inline, true) final void setBackground(ref const(QBrush) brush)
141         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole, brush.style() != /+ Qt:: +/qt.core.namespace.BrushStyle.NoBrush ? QVariant.fromValue(brush) : QVariant()); }
142 
143     pragma(inline, true) final QBrush foreground() const
144         { return qvariant_cast!(QBrush)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.ForegroundRole)); }
145     pragma(inline, true) final void setForeground(ref const(QBrush) brush)
146         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.ForegroundRole, brush.style() != /+ Qt:: +/qt.core.namespace.BrushStyle.NoBrush ? QVariant.fromValue(brush) : QVariant()); }
147 
148     pragma(inline, true) final /+ Qt:: +/qt.core.namespace.CheckState checkState() const
149         { return static_cast!(/+ Qt:: +/qt.core.namespace.CheckState)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole).toInt()); }
150     pragma(inline, true) final void setCheckState(/+ Qt:: +/qt.core.namespace.CheckState state)
151         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole, cast(int)state); }
152 
153     pragma(inline, true) final QSize sizeHint() const
154         { return qvariant_cast!(QSize)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole)); }
155     pragma(inline, true) final void setSizeHint(ref const(QSize) size)
156         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }
157 
158     /+ virtual +/ QVariant data(int role) const;
159     /+ virtual +/ void setData(int role, ref const(QVariant) value);
160     final void setData(T)(int role, T value)
161     {
162         static if(is(const(T) == const(QVariant)))
163             QVariant v = value;
164         else
165             QVariant v = QVariant.fromValue(value);
166         setData(role, v);
167     }
168 
169     pragma(mangle, mangleOpLess("QTableWidgetItem"))
170     bool opLess(const QTableWidgetItem other) const;
171 
172     version(QT_NO_DATASTREAM){}else
173     {
174         /+ virtual +/ void read(ref QDataStream in_);
175         /+ virtual +/ void write(ref QDataStream out_) const;
176     }
177     /+ QTableWidgetItem &operator=(const QTableWidgetItem &other); +/
178 
179     pragma(inline, true) final int type() const { return rtti; }
180 
181 private:
182     final QTableModel* tableModel() const;
183 
184 private:
185     int rtti;
186     QList!(QWidgetItemData) values;
187     QTableWidget view;
188     QTableWidgetItemPrivate* d;
189     /+ Qt:: +/qt.core.namespace.ItemFlags itemFlags;
190     mixin(CREATE_CONVENIENCE_WRAPPERS);
191 }
192 
193 /+ #if QT_CONFIG(tooltip)
194 #endif
195 
196 #if QT_CONFIG(whatsthis)
197 #endif
198 
199 #ifndef QT_NO_DATASTREAM
200 Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTableWidgetItem &item);
201 Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item);
202 #endif +/
203 
204 extern(C++, class) struct QTableWidgetPrivate;
205 
206 /// Binding for C++ class [QTableWidget](https://doc.qt.io/qt-6/qtablewidget.html).
207 class /+ Q_WIDGETS_EXPORT +/ QTableWidget : QTableView
208 {
209     mixin(Q_OBJECT);
210     /+ Q_PROPERTY(int rowCount READ rowCount WRITE setRowCount)
211     Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount) +/
212 
213     /+ friend class QTableModel; +/
214 public:
215     /+ explicit +/this(QWidget parent = null);
216     this(int rows, int columns, QWidget parent = null);
217     ~this();
218 
219     final void setRowCount(int rows);
220     final int rowCount() const;
221 
222     final void setColumnCount(int columns);
223     final int columnCount() const;
224 
225     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
226     final int row(const(QTableWidgetItem) item) const;
227     }));
228     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
229     final int column(const(QTableWidgetItem) item) const;
230     }));
231 
232     final QTableWidgetItem item(int row, int column) const;
233     final void setItem(int row, int column, QTableWidgetItem item);
234     final QTableWidgetItem takeItem(int row, int column);
235     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
236     final QList!(QTableWidgetItem) items(const(QMimeData) data) const;
237     }));
238     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
239     final QModelIndex indexFromItem(const(QTableWidgetItem) item) const;
240     }));
241     final QTableWidgetItem itemFromIndex(ref const(QModelIndex) index) const;
242 
243     final QTableWidgetItem verticalHeaderItem(int row) const;
244     final void setVerticalHeaderItem(int row, QTableWidgetItem item);
245     final QTableWidgetItem takeVerticalHeaderItem(int row);
246 
247     final QTableWidgetItem horizontalHeaderItem(int column) const;
248     final void setHorizontalHeaderItem(int column, QTableWidgetItem item);
249     final QTableWidgetItem takeHorizontalHeaderItem(int column);
250     final void setVerticalHeaderLabels(ref const(QStringList) labels);
251     final void setHorizontalHeaderLabels(ref const(QStringList) labels);
252 
253     final int currentRow() const;
254     final int currentColumn() const;
255     final QTableWidgetItem currentItem() const;
256     final void setCurrentItem(QTableWidgetItem item);
257     final void setCurrentItem(QTableWidgetItem item, QItemSelectionModel.SelectionFlags command);
258     final void setCurrentCell(int row, int column);
259     final void setCurrentCell(int row, int column, QItemSelectionModel.SelectionFlags command);
260 
261     final void sortItems(int column, /+ Qt:: +/qt.core.namespace.SortOrder order = /+ Qt:: +/qt.core.namespace.SortOrder.AscendingOrder);
262 //    final void setSortingEnabled(bool enable);
263 //    final bool isSortingEnabled() const;
264 
265     final void editItem(QTableWidgetItem item);
266     final void openPersistentEditor(QTableWidgetItem item);
267     final void closePersistentEditor(QTableWidgetItem item);
268     /+ using QAbstractItemView::isPersistentEditorOpen; +/
269     final bool isPersistentEditorOpen(QTableWidgetItem item) const;
270 
271     final QWidget cellWidget(int row, int column) const;
272     final void setCellWidget(int row, int column, QWidget widget);
273     pragma(inline, true) final void removeCellWidget(int arow, int acolumn)
274     { setCellWidget(arow, acolumn, null); }
275 
276     final void setRangeSelected(ref const(QTableWidgetSelectionRange) range, bool select);
277 
278     final QList!(QTableWidgetSelectionRange) selectedRanges() const;
279     final QList!(QTableWidgetItem) selectedItems() const;
280     final QList!(QTableWidgetItem) findItems(ref const(QString) text, /+ Qt:: +/qt.core.namespace.MatchFlags flags) const;
281 
282     final int visualRow(int logicalRow) const;
283     final int visualColumn(int logicalColumn) const;
284 
285     final QTableWidgetItem itemAt(ref const(QPoint) p) const;
286     pragma(inline, true) final QTableWidgetItem itemAt(int ax, int ay) const
287     { auto tmp = QPoint(ax, ay); return itemAt(tmp); }
288     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
289     final QRect visualItemRect(const(QTableWidgetItem) item) const;
290     }));
291 
292     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
293     final const(QTableWidgetItem) itemPrototype() const;
294     }));
295     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
296     final void setItemPrototype(const(QTableWidgetItem) item);
297     }));
298 
299 public /+ Q_SLOTS +/:
300     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
301     @QSlot final void scrollToItem(const(QTableWidgetItem) item, QAbstractItemView.ScrollHint hint = ScrollHint.EnsureVisible);
302     }));
303     @QSlot final void insertRow(int row);
304     @QSlot final void insertColumn(int column);
305     @QSlot final void removeRow(int row);
306     @QSlot final void removeColumn(int column);
307     @QSlot final void clear();
308     @QSlot final void clearContents();
309 
310 /+ Q_SIGNALS +/public:
311     @QSignal final void itemPressed(QTableWidgetItem item);
312     @QSignal final void itemClicked(QTableWidgetItem item);
313     @QSignal final void itemDoubleClicked(QTableWidgetItem item);
314 
315     @QSignal final void itemActivated(QTableWidgetItem item);
316     @QSignal final void itemEntered(QTableWidgetItem item);
317     @QSignal final void itemChanged(QTableWidgetItem item);
318 
319     @QSignal final void currentItemChanged(QTableWidgetItem current, QTableWidgetItem previous);
320     @QSignal final void itemSelectionChanged();
321 
322     @QSignal final void cellPressed(int row, int column);
323     @QSignal final void cellClicked(int row, int column);
324     @QSignal final void cellDoubleClicked(int row, int column);
325 
326     @QSignal final void cellActivated(int row, int column);
327     @QSignal final void cellEntered(int row, int column);
328     @QSignal final void cellChanged(int row, int column);
329 
330     @QSignal final void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn);
331 
332 protected:
333     override bool event(QEvent e);
334     /+ virtual +/ QStringList mimeTypes() const;
335     /+ virtual +/ QMimeData mimeData(ref const(QList!(QTableWidgetItem)) items) const;
336     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
337     /+ virtual +/ bool dropMimeData(int row, int column, const(QMimeData) data, qt.core.namespace.DropAction action);
338     }));
339     /+ virtual +/ /+ Qt:: +/qt.core.namespace.DropActions supportedDropActions() const;
340 
341 protected:
342 /+ #if QT_CONFIG(draganddrop) +/
343     override void dropEvent(QDropEvent event);
344 /+ #endif +/
345 private:
346     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
347     protected override void setModel(QAbstractItemModel model);
348     }));
349 
350     /+ Q_DECLARE_PRIVATE(QTableWidget) +/
351     /+ Q_DISABLE_COPY(QTableWidget) +/
352 
353     /+ Q_PRIVATE_SLOT(d_func(), void _q_emitItemPressed(const QModelIndex &index))
354     Q_PRIVATE_SLOT(d_func(), void _q_emitItemClicked(const QModelIndex &index))
355     Q_PRIVATE_SLOT(d_func(), void _q_emitItemDoubleClicked(const QModelIndex &index))
356     Q_PRIVATE_SLOT(d_func(), void _q_emitItemActivated(const QModelIndex &index))
357     Q_PRIVATE_SLOT(d_func(), void _q_emitItemEntered(const QModelIndex &index))
358     Q_PRIVATE_SLOT(d_func(), void _q_emitItemChanged(const QModelIndex &index))
359     Q_PRIVATE_SLOT(d_func(), void _q_emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &current))
360     Q_PRIVATE_SLOT(d_func(), void _q_sort())
361     Q_PRIVATE_SLOT(d_func(), void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)) +/
362     mixin(CREATE_CONVENIENCE_WRAPPERS);
363 }
364