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.headerview;
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.namespace;
21 import qt.core.point;
22 import qt.core.rect;
23 import qt.core.size;
24 import qt.gui.event;
25 import qt.gui.painter;
26 import qt.gui.region;
27 import qt.helpers;
28 import qt.widgets.abstractitemview;
29 import qt.widgets.styleoption;
30 import qt.widgets.widget;
31 version(QT_NO_DATASTREAM){}else
32     import qt.core.bytearray;
33 
34 /+ QT_REQUIRE_CONFIG(itemviews); +/
35 
36 
37 extern(C++, class) struct QHeaderViewPrivate;
38 
39 /// Binding for C++ class [QHeaderView](https://doc.qt.io/qt-6/qheaderview.html).
40 class /+ Q_WIDGETS_EXPORT +/ QHeaderView : QAbstractItemView
41 {
42     mixin(Q_OBJECT);
43     /+ Q_PROPERTY(bool firstSectionMovable READ isFirstSectionMovable WRITE setFirstSectionMovable)
44     Q_PROPERTY(bool showSortIndicator READ isSortIndicatorShown WRITE setSortIndicatorShown)
45     Q_PROPERTY(bool highlightSections READ highlightSections WRITE setHighlightSections)
46     Q_PROPERTY(bool stretchLastSection READ stretchLastSection WRITE setStretchLastSection)
47     Q_PROPERTY(bool cascadingSectionResizes READ cascadingSectionResizes
48                WRITE setCascadingSectionResizes)
49     Q_PROPERTY(int defaultSectionSize READ defaultSectionSize WRITE setDefaultSectionSize
50                RESET resetDefaultSectionSize)
51     Q_PROPERTY(int minimumSectionSize READ minimumSectionSize WRITE setMinimumSectionSize)
52     Q_PROPERTY(int maximumSectionSize READ maximumSectionSize WRITE setMaximumSectionSize)
53     Q_PROPERTY(Qt::Alignment defaultAlignment READ defaultAlignment WRITE setDefaultAlignment)
54     Q_PROPERTY(bool sortIndicatorClearable READ isSortIndicatorClearable
55                WRITE setSortIndicatorClearable NOTIFY sortIndicatorClearableChanged) +/
56 
57 public:
58 
59     enum ResizeMode
60     {
61         Interactive,
62         Stretch,
63         Fixed,
64         ResizeToContents,
65         Custom = ResizeMode.Fixed
66     }
67     /+ Q_ENUM(ResizeMode) +/
68 
69     /+ explicit +/this(/+ Qt:: +/qt.core.namespace.Orientation orientation, QWidget parent = null);
70     /+ virtual +/~this();
71 
72     override void setModel(QAbstractItemModel model);
73 
74     final /+ Qt:: +/qt.core.namespace.Orientation orientation() const;
75     final int offset() const;
76     final int length() const;
77     override QSize sizeHint() const;
78     override void setVisible(bool v);
79     final int sectionSizeHint(int logicalIndex) const;
80 
81     final int visualIndexAt(int position) const;
82     final int logicalIndexAt(int position) const;
83 
84     pragma(inline, true) final int logicalIndexAt(int ax, int ay) const
85     { return orientation() == /+ Qt:: +/qt.core.namespace.Orientation.Horizontal ? logicalIndexAt(ax) : logicalIndexAt(ay); }
86     pragma(inline, true) final int logicalIndexAt(ref const(QPoint) apos) const
87     { return logicalIndexAt(apos.x(), apos.y()); }
88 
89     final int sectionSize(int logicalIndex) const;
90     final int sectionPosition(int logicalIndex) const;
91     final int sectionViewportPosition(int logicalIndex) const;
92 
93     final void moveSection(int from, int to);
94     final void swapSections(int first, int second);
95     final void resizeSection(int logicalIndex, int size);
96     final void resizeSections(ResizeMode mode);
97 
98     final bool isSectionHidden(int logicalIndex) const;
99     final void setSectionHidden(int logicalIndex, bool hide);
100     final int hiddenSectionCount() const;
101 
102     pragma(inline, true) final void hideSection(int alogicalIndex)
103     { setSectionHidden(alogicalIndex, true); }
104     pragma(inline, true) final void showSection(int alogicalIndex)
105     { setSectionHidden(alogicalIndex, false); }
106 
107     final int count() const;
108     final int visualIndex(int logicalIndex) const;
109     final int logicalIndex(int visualIndex) const;
110 
111     final void setSectionsMovable(bool movable);
112     final bool sectionsMovable() const;
113     final void setFirstSectionMovable(bool movable);
114     final bool isFirstSectionMovable() const;
115 
116     final void setSectionsClickable(bool clickable);
117     final bool sectionsClickable() const;
118 
119     final void setHighlightSections(bool highlight);
120     final bool highlightSections() const;
121 
122     final ResizeMode sectionResizeMode(int logicalIndex) const;
123     final void setSectionResizeMode(ResizeMode mode);
124     final void setSectionResizeMode(int logicalIndex, ResizeMode mode);
125 
126     final void setResizeContentsPrecision(int precision);
127     final int  resizeContentsPrecision() const;
128 
129     final int stretchSectionCount() const;
130 
131     final void setSortIndicatorShown(bool show);
132     final bool isSortIndicatorShown() const;
133 
134     final void setSortIndicator(int logicalIndex, /+ Qt:: +/qt.core.namespace.SortOrder order);
135     final int sortIndicatorSection() const;
136     final /+ Qt:: +/qt.core.namespace.SortOrder sortIndicatorOrder() const;
137 
138     final void setSortIndicatorClearable(bool clearable);
139     final bool isSortIndicatorClearable() const;
140 
141     final bool stretchLastSection() const;
142     final void setStretchLastSection(bool stretch);
143 
144     final bool cascadingSectionResizes() const;
145     final void setCascadingSectionResizes(bool enable);
146 
147     final int defaultSectionSize() const;
148     final void setDefaultSectionSize(int size);
149     final void resetDefaultSectionSize();
150 
151     final int minimumSectionSize() const;
152     final void setMinimumSectionSize(int size);
153     final int maximumSectionSize() const;
154     final void setMaximumSectionSize(int size);
155 
156     final /+ Qt:: +/qt.core.namespace.Alignment defaultAlignment() const;
157     final void setDefaultAlignment(/+ Qt:: +/qt.core.namespace.Alignment alignment);
158 
159     override void doItemsLayout();
160     final bool sectionsMoved() const;
161     final bool sectionsHidden() const;
162 
163     version(QT_NO_DATASTREAM){}else
164     {
165         final QByteArray saveState() const;
166         final bool restoreState(ref const(QByteArray) state);
167     }
168 
169     override void reset();
170 
171 public /+ Q_SLOTS +/:
172     @QSlot final void setOffset(int offset);
173     @QSlot final void setOffsetToSectionPosition(int visualIndex);
174     @QSlot final void setOffsetToLastSection();
175     @QSlot final void headerDataChanged(/+ Qt:: +/qt.core.namespace.Orientation orientation, int logicalFirst, int logicalLast);
176 
177 /+ Q_SIGNALS +/public:
178     @QSignal final void sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex);
179     @QSignal final void sectionResized(int logicalIndex, int oldSize, int newSize);
180     @QSignal final void sectionPressed(int logicalIndex);
181     @QSignal final void sectionClicked(int logicalIndex);
182     @QSignal final void sectionEntered(int logicalIndex);
183     @QSignal final void sectionDoubleClicked(int logicalIndex);
184     @QSignal final void sectionCountChanged(int oldCount, int newCount);
185     @QSignal final void sectionHandleDoubleClicked(int logicalIndex);
186     @QSignal final void geometriesChanged();
187     @QSignal final void sortIndicatorChanged(int logicalIndex, /+ Qt:: +/qt.core.namespace.SortOrder order);
188     @QSignal final void sortIndicatorClearableChanged(bool clearable);
189 
190 protected /+ Q_SLOTS +/:
191     @QSlot final void updateSection(int logicalIndex);
192     @QSlot final void resizeSections();
193     @QSlot final void sectionsInserted(ref const(QModelIndex) parent, int logicalFirst, int logicalLast);
194     @QSlot final void sectionsAboutToBeRemoved(ref const(QModelIndex) parent, int logicalFirst, int logicalLast);
195 
196 protected:
197     this(ref QHeaderViewPrivate dd, /+ Qt:: +/qt.core.namespace.Orientation orientation, QWidget parent = null);
198     final void initialize();
199 
200     final void initializeSections();
201     final void initializeSections(int start, int end);
202     override void currentChanged(ref const(QModelIndex) current, ref const(QModelIndex) old);
203 
204     override bool event(QEvent e);
205     override void paintEvent(QPaintEvent e);
206     override void mousePressEvent(QMouseEvent e);
207     override void mouseMoveEvent(QMouseEvent e);
208     override void mouseReleaseEvent(QMouseEvent e);
209     override void mouseDoubleClickEvent(QMouseEvent e);
210     override bool viewportEvent(QEvent e);
211 
212     /+ virtual +/ void paintSection(QPainter* painter, ref const(QRect) rect, int logicalIndex) const;
213     /+ virtual +/ QSize sectionSizeFromContents(int logicalIndex) const;
214 
215     override int horizontalOffset() const;
216     override int verticalOffset() const;
217     override void updateGeometries();
218     override void scrollContentsBy(int dx, int dy);
219 
220     override void dataChanged(ref const(QModelIndex) topLeft, ref const(QModelIndex) bottomRight,
221                          ref const(QList!(int)) roles = globalInitVar!(QList!(int)));
222     override void rowsInserted(ref const(QModelIndex) parent, int start, int end);
223 
224     override QRect visualRect(ref const(QModelIndex) index) const;
225     override void scrollTo(ref const(QModelIndex) index, ScrollHint hint);
226 
227     override QModelIndex indexAt(ref const(QPoint) p) const;
228     override bool isIndexHidden(ref const(QModelIndex) index) const;
229 
230     override QModelIndex moveCursor(CursorAction, /+ Qt:: +/qt.core.namespace.KeyboardModifiers);
231     override void setSelection(ref const(QRect) rect, QItemSelectionModel.SelectionFlags flags);
232     override QRegion visualRegionForSelection(ref const(QItemSelection) selection) const;
233     /+ virtual +/ void initStyleOptionForIndex(QStyleOptionHeader* option, int logicalIndex) const;
234     /+ virtual +/ void initStyleOption(QStyleOptionHeader* option) const;
235 
236     /+ friend class QTableView; +/
237     /+ friend class QTreeView; +/
238 
239 private:
240     mixin(changeWindowsMangling(q{mangleChangeAccess("private")}, q{
241     protected override void initStyleOption(QStyleOptionFrame* option) const;
242     }));
243 
244     // ### Qt6: make them protected slots in QHeaderViewPrivate
245     /+ Q_PRIVATE_SLOT(d_func(), void _q_sectionsRemoved(const QModelIndex &parent, int logicalFirst, int logicalLast))
246     Q_PRIVATE_SLOT(d_func(), void _q_sectionsAboutToBeMoved(const QModelIndex &sourceParent, int logicalStart, int logicalEnd, const QModelIndex &destinationParent, int logicalDestination))
247     Q_PRIVATE_SLOT(d_func(), void _q_sectionsMoved(const QModelIndex &sourceParent, int logicalStart, int logicalEnd, const QModelIndex &destinationParent, int logicalDestination))
248     Q_PRIVATE_SLOT(d_func(), void _q_sectionsAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(),
249                                                               QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint))
250     Q_PRIVATE_SLOT(d_func(), void _q_sectionsChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(),
251                                                      QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint))
252     Q_DECLARE_PRIVATE(QHeaderView) +/
253     /+ Q_DISABLE_COPY(QHeaderView) +/
254     mixin(CREATE_CONVENIENCE_WRAPPERS);
255 }
256