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.listwidget;
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.listview;
35 import qt.widgets.widget;
36 version(QT_NO_DATASTREAM){}else
37     import qt.core.datastream;
38 
39 /+ QT_REQUIRE_CONFIG(listwidget); +/
40 
41 
42 extern(C++, class) struct QListModel;
43 extern(C++, class) struct QListWidgetItemPrivate;
44 
45 /// Binding for C++ class [QListWidgetItem](https://doc.qt.io/qt-6/qlistwidgetitem.html).
46 class /+ Q_WIDGETS_EXPORT +/ QListWidgetItem
47 {
48 private:
49     /+ friend class QListModel; +/
50     /+ friend class QListWidget; +/
51 public:
52     enum ItemType { Type = 0, UserType = 1000 }
53     /+ explicit +/this(QListWidget listview = null, int type = ItemType.Type);
54     /+ explicit +/this(ref const(QString) text, QListWidget listview = null, int type = ItemType.Type);
55     /+ explicit +/this(ref const(QIcon) icon, ref const(QString) text,
56                                  QListWidget listview = null, int type = ItemType.Type);
57     /+ QListWidgetItem(const QListWidgetItem &other); +/
58     /+ virtual +/~this();
59 
60     /+ virtual +/ QListWidgetItem clone() const;
61 
62     pragma(inline, true) final QListWidget listWidget() const { return cast(QListWidget)view; }
63 
64     final void setSelected(bool select);
65     final bool isSelected() const;
66 
67     pragma(inline, true) final void setHidden(bool ahide)
68     { if (view) view.setRowHidden(view.row(this), ahide); }
69     pragma(inline, true) final bool isHidden() const
70     { return (view ? view.isRowHidden(view.row(this)) : false); }
71 
72     pragma(inline, true) final /+ Qt:: +/qt.core.namespace.ItemFlags flags() const { return itemFlags; }
73     final void setFlags(/+ Qt:: +/qt.core.namespace.ItemFlags flags);
74 
75     pragma(inline, true) final QString text() const
76         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole).toString(); }
77     pragma(inline, true) final void setText(ref const(QString) atext)
78     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.DisplayRole, atext); }
79 
80 /+    pragma(inline, true) final QIcon icon() const
81         { return qvariant_cast!(QIcon)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole)); }
82     pragma(inline, true) final void setIcon(ref const(QIcon) aicon)
83     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.DecorationRole, aicon); }+/
84 
85     pragma(inline, true) final QString statusTip() const
86         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole).toString(); }
87     pragma(inline, true) final void setStatusTip(ref const(QString) astatusTip)
88     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.StatusTipRole, astatusTip); }
89 
90 /+ #if QT_CONFIG(tooltip) +/
91     pragma(inline, true) final QString toolTip() const
92         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole).toString(); }
93     pragma(inline, true) final void setToolTip(ref const(QString) atoolTip)
94     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.ToolTipRole, atoolTip); }
95 /+ #endif
96 
97 #if QT_CONFIG(whatsthis) +/
98     pragma(inline, true) final QString whatsThis() const
99         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole).toString(); }
100     pragma(inline, true) final void setWhatsThis(ref const(QString) awhatsThis)
101     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.WhatsThisRole, awhatsThis); }
102 /+ #endif +/
103 
104     pragma(inline, true) final QFont font() const
105         { return qvariant_cast!(QFont)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole)); }
106     pragma(inline, true) final void setFont(ref const(QFont) afont)
107     { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.FontRole, afont); }
108 
109     pragma(inline, true) final int textAlignment() const
110         { return data(/+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole).toInt(); }
111     pragma(inline, true) final void setTextAlignment(int alignment)
112         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.TextAlignmentRole, alignment); }
113 
114     pragma(inline, true) final QBrush background() const
115         { return qvariant_cast!(QBrush)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole)); }
116     pragma(inline, true) final void setBackground(ref const(QBrush) brush)
117         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.BackgroundRole, brush.style() != /+ Qt:: +/qt.core.namespace.BrushStyle.NoBrush ? QVariant.fromValue(brush) : QVariant()); }
118 
119     pragma(inline, true) final QBrush foreground() const
120         { return qvariant_cast!(QBrush)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.ForegroundRole)); }
121     pragma(inline, true) final void setForeground(ref const(QBrush) brush)
122         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.ForegroundRole, brush.style() != /+ Qt:: +/qt.core.namespace.BrushStyle.NoBrush ? QVariant.fromValue(brush) : QVariant()); }
123 
124     pragma(inline, true) final /+ Qt:: +/qt.core.namespace.CheckState checkState() const
125         { return static_cast!(/+ Qt:: +/qt.core.namespace.CheckState)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole).toInt()); }
126     pragma(inline, true) final void setCheckState(/+ Qt:: +/qt.core.namespace.CheckState state)
127         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.CheckStateRole, static_cast!(int)(state)); }
128 
129     pragma(inline, true) final QSize sizeHint() const
130         { return qvariant_cast!(QSize)(data(/+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole)); }
131     pragma(inline, true) final void setSizeHint(ref const(QSize) size)
132         { setData(/+ Qt:: +/qt.core.namespace.ItemDataRole.SizeHintRole, size.isValid() ? QVariant.fromValue(size) : QVariant()); }
133 
134     /+ virtual +/ QVariant data(int role) const;
135     /+ virtual +/ void setData(int role, ref const(QVariant) value);
136     final void setData(T)(int role, T value)
137     {
138         static if(is(const(T) == const(QVariant)))
139             QVariant v = value;
140         else
141             QVariant v = QVariant.fromValue(value);
142         setData(role, v);
143     }
144 
145     pragma(mangle, mangleOpLess("QListWidgetItem"))
146     bool opLess(const QListWidgetItem other) const;
147 
148     version(QT_NO_DATASTREAM){}else
149     {
150         /+ virtual +/ void read(ref QDataStream in_);
151         /+ virtual +/ void write(ref QDataStream out_) const;
152     }
153     /+ QListWidgetItem &operator=(const QListWidgetItem &other); +/
154 
155     pragma(inline, true) final int type() const { return rtti; }
156 
157 private:
158     final QListModel* listModel() const;
159     int rtti;
160     QListWidget view;
161     QListWidgetItemPrivate* d;
162     /+ Qt:: +/qt.core.namespace.ItemFlags itemFlags;
163     mixin(CREATE_CONVENIENCE_WRAPPERS);
164 }
165 
166 /+ #if QT_CONFIG(tooltip)
167 #endif
168 
169 #if QT_CONFIG(whatsthis)
170 #endif
171 
172 #ifndef QT_NO_DATASTREAM
173 Q_WIDGETS_EXPORT QDataStream &operator<<(QDataStream &out, const QListWidgetItem &item);
174 Q_WIDGETS_EXPORT QDataStream &operator>>(QDataStream &in, QListWidgetItem &item);
175 #endif +/
176 
177 extern(C++, class) struct QListWidgetPrivate;
178 
179 /// Binding for C++ class [QListWidget](https://doc.qt.io/qt-6/qlistwidget.html).
180 class /+ Q_WIDGETS_EXPORT +/ QListWidget : QListView
181 {
182     mixin(Q_OBJECT);
183     /+ Q_PROPERTY(int count READ count)
184     Q_PROPERTY(int currentRow READ currentRow WRITE setCurrentRow NOTIFY currentRowChanged
185                USER true)
186     Q_PROPERTY(bool sortingEnabled READ isSortingEnabled WRITE setSortingEnabled) +/
187 
188     /+ friend class QListWidgetItem; +/
189     /+ friend class QListModel; +/
190 public:
191     /+ explicit +/this(QWidget parent = null);
192     ~this();
193 
194     override void setSelectionModel(QItemSelectionModel selectionModel);
195 
196     final QListWidgetItem item(int row) const;
197     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
198     final int row(const(QListWidgetItem) item) const;
199     }));
200     final void insertItem(int row, QListWidgetItem item);
201     final void insertItem(int row, ref const(QString) label);
202     final void insertItems(int row, ref const(QStringList) labels);
203     pragma(inline, true) final void addItem(ref const(QString) label) { insertItem(count(), label); }
204     pragma(inline, true) final void addItem(QListWidgetItem aitem)
205     { insertItem(count(), aitem); }
206     pragma(inline, true) final void addItems(ref const(QStringList) labels) { insertItems(count(), labels); }
207     final QListWidgetItem takeItem(int row);
208     final int count() const;
209 
210     final QListWidgetItem currentItem() const;
211     final void setCurrentItem(QListWidgetItem item);
212     final void setCurrentItem(QListWidgetItem item, QItemSelectionModel.SelectionFlags command);
213 
214     final int currentRow() const;
215     final void setCurrentRow(int row);
216     final void setCurrentRow(int row, QItemSelectionModel.SelectionFlags command);
217 
218     final QListWidgetItem itemAt(ref const(QPoint) p) const;
219     pragma(inline, true) final QListWidgetItem itemAt(int ax, int ay) const
220     { auto tmp = QPoint(ax, ay); return itemAt(tmp); }
221     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
222     final QRect visualItemRect(const(QListWidgetItem) item) const;
223     }));
224 
225     final void sortItems(/+ Qt:: +/qt.core.namespace.SortOrder order = /+ Qt:: +/qt.core.namespace.SortOrder.AscendingOrder);
226     final void setSortingEnabled(bool enable);
227     final bool isSortingEnabled() const;
228 
229     final void editItem(QListWidgetItem item);
230     final void openPersistentEditor(QListWidgetItem item);
231     final void closePersistentEditor(QListWidgetItem item);
232     /+ using QAbstractItemView::isPersistentEditorOpen; +/
233     final bool isPersistentEditorOpen(QListWidgetItem item) const;
234 
235     final QWidget itemWidget(QListWidgetItem item) const;
236     final void setItemWidget(QListWidgetItem item, QWidget widget);
237     pragma(inline, true) final void removeItemWidget(QListWidgetItem aItem)
238     { setItemWidget(aItem, null); }
239 
240     final QList!(QListWidgetItem) selectedItems() const;
241     final QList!(QListWidgetItem) findItems(ref const(QString) text, /+ Qt:: +/qt.core.namespace.MatchFlags flags) const;
242 
243     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
244     final QList!(QListWidgetItem) items(const(QMimeData) data) const;
245     }));
246 
247     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
248     final QModelIndex indexFromItem(const(QListWidgetItem) item) const;
249     }));
250     final QListWidgetItem itemFromIndex(ref const(QModelIndex) index) const;
251 
252 protected:
253 /+ #if QT_CONFIG(draganddrop) +/
254     override void dropEvent(QDropEvent event);
255 /+ #endif +/
256 public /+ Q_SLOTS +/:
257     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
258     @QSlot final void scrollToItem(const(QListWidgetItem) item, QAbstractItemView.ScrollHint hint = ScrollHint.EnsureVisible);
259     }));
260     @QSlot final void clear();
261 
262 /+ Q_SIGNALS +/public:
263     @QSignal final void itemPressed(QListWidgetItem item);
264     @QSignal final void itemClicked(QListWidgetItem item);
265     @QSignal final void itemDoubleClicked(QListWidgetItem item);
266     @QSignal final void itemActivated(QListWidgetItem item);
267     @QSignal final void itemEntered(QListWidgetItem item);
268     @QSignal final void itemChanged(QListWidgetItem item);
269 
270     @QSignal final void currentItemChanged(QListWidgetItem current, QListWidgetItem previous);
271     @QSignal final void currentTextChanged(ref const(QString) currentText);
272     @QSignal final void currentRowChanged(int currentRow);
273 
274     @QSignal final void itemSelectionChanged();
275 
276 protected:
277     override bool event(QEvent e);
278     /+ virtual +/ QStringList mimeTypes() const;
279     /+ virtual +/ QMimeData mimeData(ref const(QList!(QListWidgetItem)) items) const;
280 /+ #if QT_CONFIG(draganddrop) +/
281     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
282     /+ virtual +/ bool dropMimeData(int index, const(QMimeData) data, /+ Qt:: +/qt.core.namespace.DropAction action);
283     }));
284     /+ virtual +/ /+ Qt:: +/qt.core.namespace.DropActions supportedDropActions() const;
285 /+ #endif +/
286 
287 private:
288     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
289     protected override void setModel(QAbstractItemModel model);
290     }));
291     final /+ Qt:: +/qt.core.namespace.SortOrder sortOrder() const;
292 
293     /+ Q_DECLARE_PRIVATE(QListWidget) +/
294     /+ Q_DISABLE_COPY(QListWidget) +/
295 
296     /+ Q_PRIVATE_SLOT(d_func(), void _q_emitItemPressed(const QModelIndex &index))
297     Q_PRIVATE_SLOT(d_func(), void _q_emitItemClicked(const QModelIndex &index))
298     Q_PRIVATE_SLOT(d_func(), void _q_emitItemDoubleClicked(const QModelIndex &index))
299     Q_PRIVATE_SLOT(d_func(), void _q_emitItemActivated(const QModelIndex &index))
300     Q_PRIVATE_SLOT(d_func(), void _q_emitItemEntered(const QModelIndex &index))
301     Q_PRIVATE_SLOT(d_func(), void _q_emitItemChanged(const QModelIndex &index))
302     Q_PRIVATE_SLOT(d_func(), void _q_emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &current))
303     Q_PRIVATE_SLOT(d_func(), void _q_sort())
304     Q_PRIVATE_SLOT(d_func(), void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)) +/
305     mixin(CREATE_CONVENIENCE_WRAPPERS);
306 }
307