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.abstractitemview;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.abstractitemmodel;
17 import qt.core.coreevent;
18 import qt.core.flags;
19 import qt.core.itemselectionmodel;
20 import qt.core.list;
21 import qt.core.namespace;
22 import qt.core.object;
23 import qt.core.point;
24 import qt.core.rect;
25 import qt.core.size;
26 import qt.core.string;
27 import qt.core.variant;
28 import qt.gui.event;
29 import qt.gui.region;
30 import qt.helpers;
31 import qt.widgets.abstractitemdelegate;
32 import qt.widgets.abstractscrollarea;
33 import qt.widgets.styleoption;
34 import qt.widgets.widget;
35 
36 extern(C++, class) struct tst_QAbstractItemView;
37 extern(C++, class) struct tst_QTreeView;
38 
39 /+ QT_REQUIRE_CONFIG(itemviews); +/
40 
41 
42 extern(C++, class) struct QAbstractItemViewPrivate;
43 
44 /// Binding for C++ class [QAbstractItemView](https://doc.qt.io/qt-6/qabstractitemview.html).
45 abstract class /+ Q_WIDGETS_EXPORT +/ QAbstractItemView : QAbstractScrollArea
46 {
47     mixin(Q_OBJECT);
48     /+ Q_PROPERTY(bool autoScroll READ hasAutoScroll WRITE setAutoScroll)
49     Q_PROPERTY(int autoScrollMargin READ autoScrollMargin WRITE setAutoScrollMargin)
50     Q_PROPERTY(EditTriggers editTriggers READ editTriggers WRITE setEditTriggers)
51     Q_PROPERTY(bool tabKeyNavigation READ tabKeyNavigation WRITE setTabKeyNavigation)
52 #if QT_CONFIG(draganddrop)
53     Q_PROPERTY(bool showDropIndicator READ showDropIndicator WRITE setDropIndicatorShown)
54     Q_PROPERTY(bool dragEnabled READ dragEnabled WRITE setDragEnabled)
55     Q_PROPERTY(bool dragDropOverwriteMode READ dragDropOverwriteMode WRITE setDragDropOverwriteMode)
56     Q_PROPERTY(DragDropMode dragDropMode READ dragDropMode WRITE setDragDropMode)
57     Q_PROPERTY(Qt::DropAction defaultDropAction READ defaultDropAction WRITE setDefaultDropAction)
58 #endif
59     Q_PROPERTY(bool alternatingRowColors READ alternatingRowColors WRITE setAlternatingRowColors)
60     Q_PROPERTY(SelectionMode selectionMode READ selectionMode WRITE setSelectionMode)
61     Q_PROPERTY(SelectionBehavior selectionBehavior READ selectionBehavior
62                WRITE setSelectionBehavior)
63     Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize NOTIFY iconSizeChanged)
64     Q_PROPERTY(Qt::TextElideMode textElideMode READ textElideMode WRITE setTextElideMode)
65     Q_PROPERTY(ScrollMode verticalScrollMode READ verticalScrollMode WRITE setVerticalScrollMode
66                RESET resetVerticalScrollMode)
67     Q_PROPERTY(ScrollMode horizontalScrollMode READ horizontalScrollMode
68                WRITE setHorizontalScrollMode RESET resetHorizontalScrollMode) +/
69 
70 public:
71     enum SelectionMode {
72         NoSelection,
73         SingleSelection,
74         MultiSelection,
75         ExtendedSelection,
76         ContiguousSelection
77     }
78     /+ Q_ENUM(SelectionMode) +/
79 
80     enum SelectionBehavior {
81         SelectItems,
82         SelectRows,
83         SelectColumns
84     }
85     /+ Q_ENUM(SelectionBehavior) +/
86 
87     enum ScrollHint {
88         EnsureVisible,
89         PositionAtTop,
90         PositionAtBottom,
91         PositionAtCenter
92     }
93     /+ Q_ENUM(ScrollHint) +/
94 
95     enum EditTrigger {
96         NoEditTriggers = 0,
97         CurrentChanged = 1,
98         DoubleClicked = 2,
99         SelectedClicked = 4,
100         EditKeyPressed = 8,
101         AnyKeyPressed = 16,
102         AllEditTriggers = 31
103     }
104 
105     /+ Q_DECLARE_FLAGS(EditTriggers, EditTrigger) +/
106 alias EditTriggers = QFlags!(EditTrigger);    /+ Q_FLAG(EditTriggers) +/
107 
108     enum ScrollMode {
109         ScrollPerItem,
110         ScrollPerPixel
111     }
112     /+ Q_ENUM(ScrollMode) +/
113 
114     mixin(changeItaniumMangling(q{mangleConstructorBaseObject}, q{
115     /+ explicit +/this(QWidget parent = null);
116     }));
117     ~this();
118 
119     /+ virtual +/ void setModel(QAbstractItemModel model);
120     final QAbstractItemModel model() const;
121 
122     /+ virtual +/ void setSelectionModel(QItemSelectionModel selectionModel);
123     final QItemSelectionModel selectionModel() const;
124 
125     final void setItemDelegate(QAbstractItemDelegate delegate_);
126     final QAbstractItemDelegate itemDelegate() const;
127 
128     final void setSelectionMode(SelectionMode mode);
129     final SelectionMode selectionMode() const;
130 
131     final void setSelectionBehavior(SelectionBehavior behavior);
132     final SelectionBehavior selectionBehavior() const;
133 
134     final QModelIndex currentIndex() const;
135     final QModelIndex rootIndex() const;
136 
137     final void setEditTriggers(EditTriggers triggers);
138     final EditTriggers editTriggers() const;
139 
140     final void setVerticalScrollMode(ScrollMode mode);
141     final ScrollMode verticalScrollMode() const;
142     final void resetVerticalScrollMode();
143 
144     final void setHorizontalScrollMode(ScrollMode mode);
145     final ScrollMode horizontalScrollMode() const;
146     final void resetHorizontalScrollMode();
147 
148     final void setAutoScroll(bool enable);
149     final bool hasAutoScroll() const;
150 
151     final void setAutoScrollMargin(int margin);
152     final int autoScrollMargin() const;
153 
154     final void setTabKeyNavigation(bool enable);
155     final bool tabKeyNavigation() const;
156 
157 /+ #if QT_CONFIG(draganddrop) +/
158     final void setDropIndicatorShown(bool enable);
159     final bool showDropIndicator() const;
160 
161     final void setDragEnabled(bool enable);
162     final bool dragEnabled() const;
163 
164     final void setDragDropOverwriteMode(bool overwrite);
165     final bool dragDropOverwriteMode() const;
166 
167     enum DragDropMode {
168         NoDragDrop,
169         DragOnly,
170         DropOnly,
171         DragDrop,
172         InternalMove
173     }
174     /+ Q_ENUM(DragDropMode) +/
175 
176     final void setDragDropMode(DragDropMode behavior);
177     final DragDropMode dragDropMode() const;
178 
179     final void setDefaultDropAction(/+ Qt:: +/qt.core.namespace.DropAction dropAction);
180     final /+ Qt:: +/qt.core.namespace.DropAction defaultDropAction() const;
181 /+ #endif +/
182 
183     final void setAlternatingRowColors(bool enable);
184     final bool alternatingRowColors() const;
185 
186     final void setIconSize(ref const(QSize) size);
187     final QSize iconSize() const;
188 
189     final void setTextElideMode(/+ Qt:: +/qt.core.namespace.TextElideMode mode);
190     final /+ Qt:: +/qt.core.namespace.TextElideMode textElideMode() const;
191 
192     /+ virtual +/ void keyboardSearch(ref const(QString) search);
193 
194     /+ virtual +/ abstract QRect visualRect(ref const(QModelIndex) index) const;
195     /+ virtual +/ abstract void scrollTo(ref const(QModelIndex) index, ScrollHint hint = ScrollHint.EnsureVisible);
196     /+ virtual +/ abstract QModelIndex indexAt(ref const(QPoint) point) const;
197 
198     final QSize sizeHintForIndex(ref const(QModelIndex) index) const;
199     /+ virtual +/ int sizeHintForRow(int row) const;
200     /+ virtual +/ int sizeHintForColumn(int column) const;
201 
202     final void openPersistentEditor(ref const(QModelIndex) index);
203     final void closePersistentEditor(ref const(QModelIndex) index);
204     final bool isPersistentEditorOpen(ref const(QModelIndex) index) const;
205 
206     final void setIndexWidget(ref const(QModelIndex) index, QWidget widget);
207     final QWidget indexWidget(ref const(QModelIndex) index) const;
208 
209     final void setItemDelegateForRow(int row, QAbstractItemDelegate delegate_);
210     final QAbstractItemDelegate itemDelegateForRow(int row) const;
211 
212     final void setItemDelegateForColumn(int column, QAbstractItemDelegate delegate_);
213     final QAbstractItemDelegate itemDelegateForColumn(int column) const;
214 
215 /+ #if QT_DEPRECATED_SINCE(6, 0) +/
216     /+ QT_DEPRECATED_VERSION_X_6_0("Use itemDelegateForIndex instead") +/
217         final QAbstractItemDelegate itemDelegate(ref const(QModelIndex) index) const
218     { return itemDelegateForIndex(index); }
219 /+ #endif +/
220     /+ virtual +/ QAbstractItemDelegate itemDelegateForIndex(ref const(QModelIndex) index) const;
221 
222     /+ virtual +/ override QVariant inputMethodQuery(/+ Qt:: +/qt.core.namespace.InputMethodQuery query) const;
223 
224     /+ using QAbstractScrollArea::update; +/
225 
226 public /+ Q_SLOTS +/:
227     /+ virtual +/ @QSlot void reset();
228     /+ virtual +/ @QSlot void setRootIndex(ref const(QModelIndex) index);
229     /+ virtual +/ @QSlot void doItemsLayout();
230     /+ virtual +/ @QSlot void selectAll();
231     @QSlot final void edit(ref const(QModelIndex) index);
232     @QSlot final void clearSelection();
233     @QSlot final void setCurrentIndex(ref const(QModelIndex) index);
234     @QSlot final void scrollToTop();
235     @QSlot final void scrollToBottom();
236     @QSlot final void update(ref const(QModelIndex) index);
237 
238 protected /+ Q_SLOTS +/:
239     /+ virtual +/ @QSlot void dataChanged(ref const(QModelIndex) topLeft, ref const(QModelIndex) bottomRight,
240                                  ref const(QList!(int)) roles = globalInitVar!(QList!(int)));
241     /+ virtual +/ @QSlot void rowsInserted(ref const(QModelIndex) parent, int start, int end);
242     /+ virtual +/ @QSlot void rowsAboutToBeRemoved(ref const(QModelIndex) parent, int start, int end);
243     /+ virtual +/ @QSlot void selectionChanged(ref const(QItemSelection) selected, ref const(QItemSelection) deselected);
244     /+ virtual +/ @QSlot void currentChanged(ref const(QModelIndex) current, ref const(QModelIndex) previous);
245     /+ virtual +/ @QSlot void updateEditorData();
246     /+ virtual +/ @QSlot void updateEditorGeometries();
247     /+ virtual +/ @QSlot void updateGeometries();
248     /+ virtual +/ @QSlot void verticalScrollbarAction(int action);
249     /+ virtual +/ @QSlot void horizontalScrollbarAction(int action);
250     /+ virtual +/ @QSlot void verticalScrollbarValueChanged(int value);
251     /+ virtual +/ @QSlot void horizontalScrollbarValueChanged(int value);
252     /+ virtual +/ @QSlot void closeEditor(QWidget editor, QAbstractItemDelegate.EndEditHint hint);
253     /+ virtual +/ @QSlot void commitData(QWidget editor);
254     /+ virtual +/ @QSlot void editorDestroyed(QObject editor);
255 
256 /+ Q_SIGNALS +/public:
257     @QSignal final void pressed(ref const(QModelIndex) index);
258     @QSignal final void clicked(ref const(QModelIndex) index);
259     @QSignal final void doubleClicked(ref const(QModelIndex) index);
260 
261     @QSignal final void activated(ref const(QModelIndex) index);
262     @QSignal final void entered(ref const(QModelIndex) index);
263     @QSignal final void viewportEntered();
264 
265     @QSignal final void iconSizeChanged(ref const(QSize) size);
266 
267 protected:
268     mixin(changeItaniumMangling(q{mangleConstructorBaseObject}, q{
269     this(ref QAbstractItemViewPrivate , QWidget parent = null);
270     }));
271 
272     enum CursorAction { MoveUp, MoveDown, MoveLeft, MoveRight,
273                         MoveHome, MoveEnd, MovePageUp, MovePageDown,
274                         MoveNext, MovePrevious }
275     /+ virtual +/ abstract QModelIndex moveCursor(CursorAction cursorAction,
276                                        /+ Qt:: +/qt.core.namespace.KeyboardModifiers modifiers);
277 
278     /+ virtual +/ abstract int horizontalOffset() const;
279     /+ virtual +/ abstract int verticalOffset() const;
280 
281     /+ virtual +/ abstract bool isIndexHidden(ref const(QModelIndex) index) const;
282 
283     /+ virtual +/ abstract void setSelection(ref const(QRect) rect, QItemSelectionModel.SelectionFlags command);
284     /+ virtual +/ abstract QRegion visualRegionForSelection(ref const(QItemSelection) selection) const;
285     /+ virtual +/ QModelIndexList selectedIndexes() const;
286 
287     /+ virtual +/ bool edit(ref const(QModelIndex) index, EditTrigger trigger, QEvent event);
288 
289     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
290     /+ virtual +/ QItemSelectionModel.SelectionFlags selectionCommand(ref const(QModelIndex) index,
291                                                                      const(QEvent) event = null) const;
292     }));
293 
294 /+ #if QT_CONFIG(draganddrop) +/
295     /+ virtual +/ void startDrag(/+ Qt:: +/qt.core.namespace.DropActions supportedActions);
296 /+ #endif +/
297 
298     /+ virtual +/ void initViewItemOption(QStyleOptionViewItem* option) const;
299 
300     enum State {
301         NoState,
302         DraggingState,
303         DragSelectingState,
304         EditingState,
305         ExpandingState,
306         CollapsingState,
307         AnimatingState
308     }
309 
310     final State state() const;
311     final void setState(State state);
312 
313     final void scheduleDelayedItemsLayout();
314     final void executeDelayedItemsLayout();
315 
316     final void setDirtyRegion(ref const(QRegion) region);
317     final void scrollDirtyRegion(int dx, int dy);
318     final QPoint dirtyRegionOffset() const;
319 
320     final void startAutoScroll();
321     final void stopAutoScroll();
322     final void doAutoScroll();
323 
324     override bool focusNextPrevChild(bool next);
325     override bool event(QEvent event);
326     override bool viewportEvent(QEvent event);
327     override void mousePressEvent(QMouseEvent event);
328     override void mouseMoveEvent(QMouseEvent event);
329     override void mouseReleaseEvent(QMouseEvent event);
330     override void mouseDoubleClickEvent(QMouseEvent event);
331 /+ #if QT_CONFIG(draganddrop) +/
332     override void dragEnterEvent(QDragEnterEvent event);
333     override void dragMoveEvent(QDragMoveEvent event);
334     override void dragLeaveEvent(QDragLeaveEvent event);
335     override void dropEvent(QDropEvent event);
336 /+ #endif +/
337     override void focusInEvent(QFocusEvent event);
338     override void focusOutEvent(QFocusEvent event);
339     override void keyPressEvent(QKeyEvent event);
340     override void resizeEvent(QResizeEvent event);
341     override void timerEvent(QTimerEvent event);
342     override void inputMethodEvent(QInputMethodEvent event);
343     override bool eventFilter(QObject object, QEvent event);
344 
345 /+ #if QT_CONFIG(draganddrop) +/
346     enum DropIndicatorPosition { OnItem, AboveItem, BelowItem, OnViewport }
347     final DropIndicatorPosition dropIndicatorPosition() const;
348 /+ #endif +/
349 
350     override QSize viewportSizeHint() const;
351 
352 private:
353     /+ Q_DECLARE_PRIVATE(QAbstractItemView) +/
354     /+ Q_DISABLE_COPY(QAbstractItemView) +/
355     /+ Q_PRIVATE_SLOT(d_func(), void _q_columnsAboutToBeRemoved(const QModelIndex&, int, int))
356     Q_PRIVATE_SLOT(d_func(), void _q_columnsRemoved(const QModelIndex&, int, int))
357     Q_PRIVATE_SLOT(d_func(), void _q_columnsInserted(const QModelIndex&, int, int))
358     Q_PRIVATE_SLOT(d_func(), void _q_rowsInserted(const QModelIndex&, int, int))
359     Q_PRIVATE_SLOT(d_func(), void _q_rowsRemoved(const QModelIndex&, int, int))
360     Q_PRIVATE_SLOT(d_func(), void _q_columnsMoved(const QModelIndex&, int, int, const QModelIndex&, int))
361     Q_PRIVATE_SLOT(d_func(), void _q_rowsMoved(const QModelIndex&, int, int, const QModelIndex&, int))
362     Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed())
363     Q_PRIVATE_SLOT(d_func(), void _q_layoutChanged())
364     Q_PRIVATE_SLOT(d_func(), void _q_headerDataChanged())
365 #if QT_CONFIG(gestures) && QT_CONFIG(scroller)
366     Q_PRIVATE_SLOT(d_func(), void _q_scrollerStateChanged())
367 #endif +/
368 
369     /+ friend class ::tst_QAbstractItemView; +/
370     /+ friend class ::tst_QTreeView; +/
371     /+ friend class QTreeViewPrivate; +/ // needed to compile with MSVC
372     /+ friend class QListModeViewBase; +/
373     /+ friend class QListViewPrivate; +/
374     /+ friend class QAbstractSlider; +/
375     mixin(CREATE_CONVENIENCE_WRAPPERS);
376 }
377 /+pragma(inline, true) QFlags!(QAbstractItemView.EditTriggers.enum_type) operator |(QAbstractItemView.EditTriggers.enum_type f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/{return QFlags!(QAbstractItemView.EditTriggers.enum_type)(f1)|f2;}+/
378 /+pragma(inline, true) QFlags!(QAbstractItemView.EditTriggers.enum_type) operator |(QAbstractItemView.EditTriggers.enum_type f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/{return f2|f1;}+/
379 /+pragma(inline, true) QFlags!(QAbstractItemView.EditTriggers.enum_type) operator &(QAbstractItemView.EditTriggers.enum_type f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/{return QFlags!(QAbstractItemView.EditTriggers.enum_type)(f1)&f2;}+/
380 /+pragma(inline, true) QFlags!(QAbstractItemView.EditTriggers.enum_type) operator &(QAbstractItemView.EditTriggers.enum_type f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/{return f2&f1;}+/
381 /+pragma(inline, true) void operator +(QAbstractItemView.EditTriggers.enum_type f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/;+/
382 /+pragma(inline, true) void operator +(QAbstractItemView.EditTriggers.enum_type f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/;+/
383 /+pragma(inline, true) void operator +(int f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/;+/
384 /+pragma(inline, true) void operator -(QAbstractItemView.EditTriggers.enum_type f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/;+/
385 /+pragma(inline, true) void operator -(QAbstractItemView.EditTriggers.enum_type f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/;+/
386 /+pragma(inline, true) void operator -(int f1, QFlags!(QAbstractItemView.EditTriggers.enum_type) f2)/+noexcept+/;+/
387 /+pragma(inline, true) QIncompatibleFlag operator |(QAbstractItemView.EditTriggers.enum_type f1, int f2)/+noexcept+/{return QIncompatibleFlag(int(f1)|f2);}+/
388 /+pragma(inline, true) void operator +(int f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/;+/
389 /+pragma(inline, true) void operator +(QAbstractItemView.EditTriggers.enum_type f1, int f2)/+noexcept+/;+/
390 /+pragma(inline, true) void operator -(int f1, QAbstractItemView.EditTriggers.enum_type f2)/+noexcept+/;+/
391 /+pragma(inline, true) void operator -(QAbstractItemView.EditTriggers.enum_type f1, int f2)/+noexcept+/;+/
392 
393 /+ Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstractItemView::EditTriggers) +/