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.treewidget;
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.color;
30 import qt.gui.event;
31 import qt.gui.font;
32 import qt.gui.icon;
33 import qt.helpers;
34 import qt.widgets.abstractitemview;
35 import qt.widgets.treeview;
36 import qt.widgets.treewidgetitemiterator;
37 import qt.widgets.widget;
38 import qt.widgets.widgetitemdata;
39 version(QT_NO_DATASTREAM){}else
40     import qt.core.datastream;
41 
42 /+ QT_REQUIRE_CONFIG(treewidget); +/
43 
44 
45 extern(C++, class) struct QTreeWidgetItemPrivate;
46 
47 /// Binding for C++ class [QTreeWidgetItem](https://doc.qt.io/qt-6/qtreewidgetitem.html).
48 class /+ Q_WIDGETS_EXPORT +/ QTreeWidgetItem
49 {
50 private:
51     /+ friend class QTreeModel; +/
52     /+ friend class QTreeWidget; +/
53     /+ friend class QTreeWidgetPrivate; +/
54     /+ friend class QTreeWidgetItemIterator; +/
55     /+ friend class QTreeWidgetItemPrivate; +/
56 public:
57     enum ItemType { Type = 0, UserType = 1000 }
58     /+ explicit +/this(int type = ItemType.Type);
59     /+ explicit +/this(ref const(QStringList) strings, int type = ItemType.Type);
60     /+ explicit +/this(QTreeWidget treeview, int type = ItemType.Type);
61     this(QTreeWidget treeview, ref const(QStringList) strings, int type = ItemType.Type);
62     this(QTreeWidget treeview, QTreeWidgetItem after, int type = ItemType.Type);
63     /+ explicit +/this(QTreeWidgetItem parent, int type = ItemType.Type);
64     this(QTreeWidgetItem parent, ref const(QStringList) strings, int type = ItemType.Type);
65     this(QTreeWidgetItem parent, QTreeWidgetItem after, int type = ItemType.Type);
66     /+ QTreeWidgetItem(const QTreeWidgetItem &other); +/
67     /+ virtual +/~this();
68 
69     /+ virtual +/ QTreeWidgetItem clone() const;
70 
71     pragma(inline, true) final QTreeWidget treeWidget() const { return cast(QTreeWidget)view; }
72 
73     final void setSelected(bool select);
74     final bool isSelected() const;
75 
76     final void setHidden(bool hide);
77     final bool isHidden() const;
78 
79     final void setExpanded(bool expand);
80     final bool isExpanded() const;
81 
82     final void setFirstColumnSpanned(bool span);
83     final bool isFirstColumnSpanned() const;
84 
85     pragma(inline, true) final void setDisabled(bool disabled)
86     { setFlags(disabled ? (flags() & ~/+ Qt:: +/qt.core.namespace.ItemFlag.ItemIsEnabled) : flags() | /+ Qt:: +/qt.core.namespace.ItemFlag.ItemIsEnabled); }
87     pragma(inline, true) final bool isDisabled() const
88     { return !(flags() & /+ Qt:: +/qt.core.namespace.ItemFlag.ItemIsEnabled); }
89 
90     enum ChildIndicatorPolicy { ShowIndicator, DontShowIndicator, DontShowIndicatorWhenChildless }
91     final void setChildIndicatorPolicy(ChildIndicatorPolicy policy);
92     final ChildIndicatorPolicy childIndicatorPolicy() const;
93 
94     final /+ Qt:: +/qt.core.namespace.ItemFlags flags() const;
95     final void setFlags(/+ Qt:: +/qt.core.namespace.ItemFlags flags);
96 
97     pragma(inline, true) final QString text(int column) const
98         { return data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole).toString(); }
99     pragma(inline, true) final void setText(int column, ref const(QString) atext)
100     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole, atext); }
101 
102     pragma(inline, true) final QIcon icon(int column) const
103         { return qvariant_cast!(QIcon)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole)); }
104     pragma(inline, true) final void setIcon(int column, ref const(QIcon) aicon)
105     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole, aicon); }
106 
107     pragma(inline, true) final QString statusTip(int column) const
108         { return data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole).toString(); }
109     pragma(inline, true) final void setStatusTip(int column, ref const(QString) astatusTip)
110     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole, astatusTip); }
111 
112 /+ #if QT_CONFIG(tooltip) +/
113     pragma(inline, true) final QString toolTip(int column) const
114         { return data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole).toString(); }
115     pragma(inline, true) final void setToolTip(int column, ref const(QString) atoolTip)
116     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole, atoolTip); }
117 /+ #endif
118 
119 #if QT_CONFIG(whatsthis) +/
120     pragma(inline, true) final QString whatsThis(int column) const
121         { return data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole).toString(); }
122     pragma(inline, true) final void setWhatsThis(int column, ref const(QString) awhatsThis)
123     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole, awhatsThis); }
124 /+ #endif +/
125 
126     pragma(inline, true) final QFont font(int column) const
127         { return qvariant_cast!(QFont)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole)); }
128     pragma(inline, true) final void setFont(int column, ref const(QFont) afont)
129     { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole, afont); }
130 
131     pragma(inline, true) final int textAlignment(int column) const
132         { return data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole).toInt(); }
133     pragma(inline, true) final void setTextAlignment(int column, int alignment)
134         { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole, alignment); }
135 
136     pragma(inline, true) final QBrush background(int column) const
137         { return qvariant_cast!(QBrush)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole)); }
138     pragma(inline, true) final void setBackground(int column, ref const(QBrush) brush)
139         { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole, brush.style() != /+ Qt:: +/qt.core.namespace.BrushStyle.NoBrush ? QVariant.fromValue(brush) : QVariant()); }
140     pragma(inline, true) final void setBackground(int column, const(QColor) color)
141         { setBackground(column, QBrush(color)); }
142 
143     pragma(inline, true) final QBrush foreground(int column) const
144         { return qvariant_cast!(QBrush)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.ForegroundRole)); }
145     pragma(inline, true) final void setForeground(int column, ref const(QBrush) brush)
146         { setData(column, /+ 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(int column) const
149         { return static_cast!(/+ Qt:: +/qt.core.namespace.CheckState)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole).toInt()); }
150     pragma(inline, true) final void setCheckState(int column, /+ Qt:: +/qt.core.namespace.CheckState state)
151         { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole, cast(int)state); }
152 
153     pragma(inline, true) final QSize sizeHint(int column) const
154         { return qvariant_cast!(QSize)(data(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole)); }
155     pragma(inline, true) final void setSizeHint(int column, ref const(QSize) size)
156         { setData(column, /+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole, size.isValid() ? QVariant(size) : QVariant()); }
157 
158     /+ virtual +/ QVariant data(int column, int role) const;
159     /+ virtual +/ void setData(int column, int role, ref const(QVariant) value);
160     final void setData(T)(int column, 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(column, role, v);
167     }
168 
169     pragma(mangle, mangleOpLess("QTreeWidgetItem"))
170     bool opLess(const(QTreeWidgetItem) 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     /+ QTreeWidgetItem &operator=(const QTreeWidgetItem &other); +/
178 
179     pragma(inline, true) final QTreeWidgetItem parent() const { return cast(QTreeWidgetItem)par; }
180     pragma(inline, true) final QTreeWidgetItem child(int index) const {
181         if (index < 0 || index >= children.size())
182             return null;
183         executePendingSort();
184         return cast(QTreeWidgetItem)children.at(index);
185     }
186     pragma(inline, true) final int childCount() const { return cast(int)children.count(); }
187     pragma(inline, true) final int columnCount() const { return cast(int)values.count(); }
188     pragma(inline, true) final int indexOfChild(QTreeWidgetItem achild) const
189     { executePendingSort(); return cast(int)children.indexOf(achild); }
190 
191     final void addChild(QTreeWidgetItem child);
192     final void insertChild(int index, QTreeWidgetItem child);
193     final void removeChild(QTreeWidgetItem child);
194     final QTreeWidgetItem takeChild(int index);
195 
196     final void addChildren(ref const(QList!(QTreeWidgetItem)) children);
197     final void insertChildren(int index, ref const(QList!(QTreeWidgetItem)) children);
198     final QList!(QTreeWidgetItem) takeChildren();
199 
200     pragma(inline, true) final int type() const { return rtti; }
201     pragma(inline, true) final void sortChildren(int column, /+ Qt:: +/qt.core.namespace.SortOrder order)
202         { sortChildren(column, order, false); }
203 
204 protected:
205     final void emitDataChanged();
206 
207 private:
208     final void sortChildren(int column, /+ Qt:: +/qt.core.namespace.SortOrder order, bool climb);
209     final QVariant childrenCheckState(int column) const;
210     final void itemChanged();
211     final void executePendingSort() const;
212     final QTreeModel* treeModel(QTreeWidget v = null) const;
213 
214     int rtti;
215     // One item has a vector of column entries. Each column has a vector of (role, value) pairs.
216     QList!(QList!(QWidgetItemData)) values;
217     QTreeWidget view;
218     QTreeWidgetItemPrivate* d;
219     QTreeWidgetItem par;
220     QList!(QTreeWidgetItem) children;
221     /+ Qt:: +/qt.core.namespace.ItemFlags itemFlags;
222     mixin(CREATE_CONVENIENCE_WRAPPERS);
223 }
224 
225 /+ #if QT_CONFIG(statustip)
226 #endif
227 
228 #if QT_CONFIG(tooltip)
229 #endif
230 
231 #if QT_CONFIG(whatsthis)
232 #endif
233 
234 #ifndef QT_NO_DATASTREAM
235 Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QTreeWidgetItem &item);
236 Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QTreeWidgetItem &item);
237 #endif +/
238 
239 extern(C++, class) struct QTreeWidgetPrivate;
240 
241 /// Binding for C++ class [QTreeWidget](https://doc.qt.io/qt-6/qtreewidget.html).
242 class /+ Q_WIDGETS_EXPORT +/ QTreeWidget : QTreeView
243 {
244     mixin(Q_OBJECT);
245     /+ Q_PROPERTY(int columnCount READ columnCount WRITE setColumnCount)
246     Q_PROPERTY(int topLevelItemCount READ topLevelItemCount) +/
247 
248     /+ friend class QTreeModel; +/
249     /+ friend class QTreeWidgetItem; +/
250 public:
251     /+ explicit +/this(QWidget parent = null);
252     ~this();
253 
254     final int columnCount() const;
255     final void setColumnCount(int columns);
256 
257     final QTreeWidgetItem invisibleRootItem() const;
258     final QTreeWidgetItem topLevelItem(int index) const;
259     final int topLevelItemCount() const;
260     final void insertTopLevelItem(int index, QTreeWidgetItem item);
261     final void addTopLevelItem(QTreeWidgetItem item);
262     final QTreeWidgetItem takeTopLevelItem(int index);
263     final int indexOfTopLevelItem(QTreeWidgetItem item) const;
264 
265     final void insertTopLevelItems(int index, ref const(QList!(QTreeWidgetItem)) items);
266     final void addTopLevelItems(ref const(QList!(QTreeWidgetItem)) items);
267 
268     final QTreeWidgetItem headerItem() const;
269     final void setHeaderItem(QTreeWidgetItem item);
270     final void setHeaderLabels(ref const(QStringList) labels);
271 /+    pragma(inline, true) final void setHeaderLabel(ref const(QString) alabel)
272     { auto tmp = QStringList(alabel); setHeaderLabels(tmp); }+/
273 
274     final QTreeWidgetItem currentItem() const;
275     final int currentColumn() const;
276     final void setCurrentItem(QTreeWidgetItem item);
277     final void setCurrentItem(QTreeWidgetItem item, int column);
278     final void setCurrentItem(QTreeWidgetItem item, int column, QItemSelectionModel.SelectionFlags command);
279 
280     final QTreeWidgetItem itemAt(ref const(QPoint) p) const;
281     pragma(inline, true) final QTreeWidgetItem itemAt(int ax, int ay) const
282     { auto tmp = QPoint(ax, ay); return itemAt(tmp); }
283     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
284     final QRect visualItemRect(const(QTreeWidgetItem) item) const;
285     }));
286 
287     final int sortColumn() const;
288     final void sortItems(int column, /+ Qt:: +/qt.core.namespace.SortOrder order);
289 
290     final void editItem(QTreeWidgetItem item, int column = 0);
291     final void openPersistentEditor(QTreeWidgetItem item, int column = 0);
292     final void closePersistentEditor(QTreeWidgetItem item, int column = 0);
293     /+ using QAbstractItemView::isPersistentEditorOpen; +/
294     final bool isPersistentEditorOpen(QTreeWidgetItem item, int column = 0) const;
295 
296     final QWidget itemWidget(QTreeWidgetItem item, int column) const;
297     final void setItemWidget(QTreeWidgetItem item, int column, QWidget widget);
298     pragma(inline, true) final void removeItemWidget(QTreeWidgetItem item, int column)
299     { setItemWidget(item, column, null); }
300 
301     final QList!(QTreeWidgetItem) selectedItems() const;
302     final QList!(QTreeWidgetItem) findItems(ref const(QString) text, /+ Qt:: +/qt.core.namespace.MatchFlags flags,
303                                           int column = 0) const;
304 
305     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
306     final QTreeWidgetItem itemAbove(const(QTreeWidgetItem) item) const;
307     }));
308     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
309     final QTreeWidgetItem itemBelow(const(QTreeWidgetItem) item) const;
310     }));
311 
312     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
313     final QModelIndex indexFromItem(const(QTreeWidgetItem) item, int column = 0) const;
314     }));
315     final QTreeWidgetItem itemFromIndex(ref const(QModelIndex) index) const;
316 
317     override void setSelectionModel(QItemSelectionModel selectionModel);
318 
319 public /+ Q_SLOTS +/:
320     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
321     @QSlot final void scrollToItem(const(QTreeWidgetItem) item,
322                           QAbstractItemView.ScrollHint hint = ScrollHint.EnsureVisible);
323     }));
324     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
325     @QSlot final void expandItem(const(QTreeWidgetItem) item);
326     }));
327     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
328     @QSlot final void collapseItem(const(QTreeWidgetItem) item);
329     }));
330     @QSlot final void clear();
331 
332 /+ Q_SIGNALS +/public:
333     @QSignal final void itemPressed(QTreeWidgetItem item, int column);
334     @QSignal final void itemClicked(QTreeWidgetItem item, int column);
335     @QSignal final void itemDoubleClicked(QTreeWidgetItem item, int column);
336     @QSignal final void itemActivated(QTreeWidgetItem item, int column);
337     @QSignal final void itemEntered(QTreeWidgetItem item, int column);
338     @QSignal final void itemChanged(QTreeWidgetItem item, int column);
339     @QSignal final void itemExpanded(QTreeWidgetItem item);
340     @QSignal final void itemCollapsed(QTreeWidgetItem item);
341     @QSignal final void currentItemChanged(QTreeWidgetItem current, QTreeWidgetItem previous);
342     @QSignal final void itemSelectionChanged();
343 
344 protected:
345     override bool event(QEvent e);
346     /+ virtual +/ QStringList mimeTypes() const;
347     /+ virtual +/ QMimeData mimeData(ref const(QList!(QTreeWidgetItem)) items) const;
348     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
349     /+ virtual +/ bool dropMimeData(QTreeWidgetItem parent, int index,
350                                   const(QMimeData) data, /+ Qt:: +/qt.core.namespace.DropAction action);
351     }));
352     /+ virtual +/ /+ Qt:: +/qt.core.namespace.DropActions supportedDropActions() const;
353 
354 /+ #if QT_CONFIG(draganddrop) +/
355     override void dropEvent(QDropEvent event);
356 /+ #endif +/
357 private:
358     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
359     protected override void setModel(QAbstractItemModel model);
360     }));
361 
362     /+ Q_DECLARE_PRIVATE(QTreeWidget) +/
363     /+ Q_DISABLE_COPY(QTreeWidget) +/
364 
365     /+ Q_PRIVATE_SLOT(d_func(), void _q_emitItemPressed(const QModelIndex &index))
366     Q_PRIVATE_SLOT(d_func(), void _q_emitItemClicked(const QModelIndex &index))
367     Q_PRIVATE_SLOT(d_func(), void _q_emitItemDoubleClicked(const QModelIndex &index))
368     Q_PRIVATE_SLOT(d_func(), void _q_emitItemActivated(const QModelIndex &index))
369     Q_PRIVATE_SLOT(d_func(), void _q_emitItemEntered(const QModelIndex &index))
370     Q_PRIVATE_SLOT(d_func(), void _q_emitItemChanged(const QModelIndex &index))
371     Q_PRIVATE_SLOT(d_func(), void _q_emitItemExpanded(const QModelIndex &index))
372     Q_PRIVATE_SLOT(d_func(), void _q_emitItemCollapsed(const QModelIndex &index))
373     Q_PRIVATE_SLOT(d_func(), void _q_emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &current))
374     Q_PRIVATE_SLOT(d_func(), void _q_sort())
375     Q_PRIVATE_SLOT(d_func(), void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight))
376     Q_PRIVATE_SLOT(d_func(), void _q_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)) +/
377     mixin(CREATE_CONVENIENCE_WRAPPERS);
378 }
379