Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickpositioners_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QQUICKPOSITIONERS_P_H
6#define QQUICKPOSITIONERS_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick/private/qtquickglobal_p.h>
20
22
24#if QT_CONFIG(quick_viewtransitions)
25#include "qquickitemviewtransition_p.h"
26#endif
27
28#include <QtCore/qobject.h>
29#include <QtCore/qstring.h>
30
31#include <memory>
32#include <vector>
33
34QT_BEGIN_NAMESPACE
35
36class QQuickBasePositionerPrivate;
37
39{
41
42public:
44
45 Q_PROPERTY(int index READ index NOTIFY indexChanged FINAL)
48
49 int index() const { return m_index; }
50 void setIndex(int index);
51
52 bool isFirstItem() const { return m_isFirstItem; }
53 void setIsFirstItem(bool isFirstItem);
54
55 bool isLastItem() const { return m_isLastItem; }
56 void setIsLastItem(bool isLastItem);
57
62
63private:
64 int m_index;
65 bool m_isFirstItem;
66 bool m_isLastItem;
67};
68
69class Q_QUICK_EXPORT QQuickBasePositioner : public QQuickImplicitSizeItem
70{
71 Q_OBJECT
72
73 Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)
74#if QT_CONFIG(quick_viewtransitions)
75 Q_PROPERTY(QQuickTransition *populate READ populate WRITE setPopulate NOTIFY populateChanged)
76 Q_PROPERTY(QQuickTransition *move READ move WRITE setMove NOTIFY moveChanged)
77 Q_PROPERTY(QQuickTransition *add READ add WRITE setAdd NOTIFY addChanged)
78#endif
79
80 Q_PROPERTY(qreal padding READ padding WRITE setPadding RESET resetPadding NOTIFY paddingChanged REVISION(2, 6))
81 Q_PROPERTY(qreal topPadding READ topPadding WRITE setTopPadding RESET resetTopPadding NOTIFY topPaddingChanged REVISION(2, 6))
82 Q_PROPERTY(qreal leftPadding READ leftPadding WRITE setLeftPadding RESET resetLeftPadding NOTIFY leftPaddingChanged REVISION(2, 6))
83 Q_PROPERTY(qreal rightPadding READ rightPadding WRITE setRightPadding RESET resetRightPadding NOTIFY rightPaddingChanged REVISION(2, 6))
84 Q_PROPERTY(qreal bottomPadding READ bottomPadding WRITE setBottomPadding RESET resetBottomPadding NOTIFY bottomPaddingChanged REVISION(2, 6))
85
86 QML_NAMED_ELEMENT(Positioner)
87 QML_ADDED_IN_VERSION(2, 0)
88 QML_UNCREATABLE("Positioner is an abstract type that is only available as an attached property.")
89 QML_ATTACHED(QQuickPositionerAttached)
90
91public:
92 enum PositionerType { None = 0x0, Horizontal = 0x1, Vertical = 0x2, Both = 0x3 };
93
94 QQuickBasePositioner(PositionerType, QQuickItem *parent);
95 ~QQuickBasePositioner();
96
97 qreal spacing() const;
98 void setSpacing(qreal);
99
100#if QT_CONFIG(quick_viewtransitions)
101 QQuickTransition *populate() const;
102 void setPopulate(QQuickTransition *);
103
104 QQuickTransition *move() const;
105 void setMove(QQuickTransition *);
106
107 QQuickTransition *add() const;
108 void setAdd(QQuickTransition *);
109#endif
110
111 static QQuickPositionerAttached *qmlAttachedProperties(QObject *obj);
112
113 void updateAttachedProperties(QQuickPositionerAttached *specificProperty = nullptr, QQuickItem *specificPropertyOwner = nullptr) const;
114
115 qreal padding() const;
116 void setPadding(qreal padding);
117 void resetPadding();
118
119 qreal topPadding() const;
120 void setTopPadding(qreal padding);
121 void resetTopPadding();
122
123 qreal leftPadding() const;
124 void setLeftPadding(qreal padding);
125 void resetLeftPadding();
126
127 qreal rightPadding() const;
128 void setRightPadding(qreal padding);
129 void resetRightPadding();
130
131 qreal bottomPadding() const;
132 void setBottomPadding(qreal padding);
133 void resetBottomPadding();
134
135 Q_REVISION(2, 9) Q_INVOKABLE void forceLayout();
136
137protected:
138 QQuickBasePositioner(QQuickBasePositionerPrivate &dd, PositionerType at, QQuickItem *parent);
139 void componentComplete() override;
140 void itemChange(ItemChange, const ItemChangeData &) override;
141
142 void updatePolish() override;
143
144Q_SIGNALS:
145 void spacingChanged();
146 void populateChanged();
147 void moveChanged();
148 void addChanged();
149 Q_REVISION(2, 6) void paddingChanged();
150 Q_REVISION(2, 6) void topPaddingChanged();
151 Q_REVISION(2, 6) void leftPaddingChanged();
152 Q_REVISION(2, 6) void rightPaddingChanged();
153 Q_REVISION(2, 6) void bottomPaddingChanged();
154 Q_REVISION(2, 9) void positioningComplete();
155
156protected Q_SLOTS:
157 void prePositioning();
158
159protected:
160 virtual void doPositioning(QSizeF *contentSize)=0;
161 virtual void reportConflictingAnchors()=0;
162
163 class PositionedItem
164 {
165 public :
166 PositionedItem(QQuickItem *i);
167 bool operator==(const PositionedItem &other) const { return other.item == item; }
168 bool operator==(const QQuickItem *other) const { return other == this->item; }
169
170 qreal itemX() const;
171 qreal itemY() const;
172
173 void moveTo(const QPointF &pos);
174
175#if QT_CONFIG(quick_viewtransitions)
176 void transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget);
177 bool prepareTransition(QQuickItemViewTransitioner *transitioner, const QRectF &viewBounds);
178 void startTransition(QQuickItemViewTransitioner *transitioner);
179#endif
180
181 void updatePadding(qreal lp, qreal tp, qreal rp, qreal bp);
182
183 QQuickItem *item;
184#if QT_CONFIG(quick_viewtransitions)
185 std::unique_ptr<QQuickItemViewTransitionableItem> transitionableItem;
186#endif
187 int index;
188 bool isNew;
189 bool isVisible;
190
191 qreal topPadding;
192 qreal leftPadding;
193 qreal rightPadding;
194 qreal bottomPadding;
195 };
196
197 std::vector<PositionedItem> positionedItems;
198 std::vector<PositionedItem> unpositionedItems; //Still 'in' the positioner, just not positioned
199
200 void positionItem(qreal x, qreal y, PositionedItem *target);
201 void positionItemX(qreal, PositionedItem *target);
202 void positionItemY(qreal, PositionedItem *target);
203
204private:
205 Q_DISABLE_COPY(QQuickBasePositioner)
206 Q_DECLARE_PRIVATE(QQuickBasePositioner)
207};
208
209class Q_QUICK_EXPORT QQuickColumn : public QQuickBasePositioner
210{
211 Q_OBJECT
212 QML_NAMED_ELEMENT(Column)
213 QML_ADDED_IN_VERSION(2, 0)
214public:
215 QQuickColumn(QQuickItem *parent=nullptr);
216
217protected:
218 void doPositioning(QSizeF *contentSize) override;
219 void reportConflictingAnchors() override;
220};
221
222class QQuickRowPrivate;
223class Q_QUICK_EXPORT QQuickRow: public QQuickBasePositioner
224{
225 Q_OBJECT
226 Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
227 Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
228 QML_NAMED_ELEMENT(Row)
229 QML_ADDED_IN_VERSION(2, 0)
230
231public:
232 QQuickRow(QQuickItem *parent=nullptr);
233
234 Qt::LayoutDirection layoutDirection() const;
235 void setLayoutDirection (Qt::LayoutDirection);
236 Qt::LayoutDirection effectiveLayoutDirection() const;
237
238Q_SIGNALS:
239 void layoutDirectionChanged();
240 void effectiveLayoutDirectionChanged();
241
242protected:
243 void doPositioning(QSizeF *contentSize) override;
244 void reportConflictingAnchors() override;
245private:
246 Q_DECLARE_PRIVATE(QQuickRow)
247};
248
250class Q_QUICK_EXPORT QQuickGrid : public QQuickBasePositioner
251{
252 Q_OBJECT
253 Q_PROPERTY(int rows READ rows WRITE setRows NOTIFY rowsChanged)
254 Q_PROPERTY(int columns READ columns WRITE setColumns NOTIFY columnsChanged)
255 Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged RESET resetRowSpacing)
256 Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged RESET resetColumnSpacing)
257 Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
258 Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
259 Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
260 Q_PROPERTY(HAlignment horizontalItemAlignment READ hItemAlign WRITE setHItemAlign NOTIFY horizontalAlignmentChanged REVISION(2, 1))
261 Q_PROPERTY(HAlignment effectiveHorizontalItemAlignment READ effectiveHAlign NOTIFY effectiveHorizontalAlignmentChanged REVISION(2, 1))
262 Q_PROPERTY(VAlignment verticalItemAlignment READ vItemAlign WRITE setVItemAlign NOTIFY verticalAlignmentChanged REVISION(2, 1))
263 QML_NAMED_ELEMENT(Grid)
264 QML_ADDED_IN_VERSION(2, 0)
265
266public:
267 QQuickGrid(QQuickItem *parent=nullptr);
268
269 int rows() const { return m_rows; }
270 void setRows(const int rows);
271
272 int columns() const { return m_columns; }
273 void setColumns(const int columns);
274
275 qreal rowSpacing() const { return m_rowSpacing; }
276 void setRowSpacing(qreal);
277 void resetRowSpacing() { m_useRowSpacing = false; }
278
279 qreal columnSpacing() const { return m_columnSpacing; }
280 void setColumnSpacing(qreal);
281 void resetColumnSpacing() { m_useColumnSpacing = false; }
282
283 enum Flow { LeftToRight, TopToBottom };
284 Q_ENUM(Flow)
285 Flow flow() const;
286 void setFlow(Flow);
287
288 Qt::LayoutDirection layoutDirection() const;
289 void setLayoutDirection (Qt::LayoutDirection);
290 Qt::LayoutDirection effectiveLayoutDirection() const;
291
292 enum HAlignment { AlignLeft = Qt::AlignLeft,
293 AlignRight = Qt::AlignRight,
294 AlignHCenter = Qt::AlignHCenter};
295 Q_ENUM(HAlignment)
296 enum VAlignment { AlignTop = Qt::AlignTop,
297 AlignBottom = Qt::AlignBottom,
298 AlignVCenter = Qt::AlignVCenter };
299 Q_ENUM(VAlignment)
300
301 HAlignment hItemAlign() const;
302 void setHItemAlign(HAlignment align);
303 HAlignment effectiveHAlign() const;
304
305 VAlignment vItemAlign() const;
306 void setVItemAlign(VAlignment align);
307
308Q_SIGNALS:
309 void rowsChanged();
310 void columnsChanged();
311 void flowChanged();
312 void layoutDirectionChanged();
313 void effectiveLayoutDirectionChanged();
314 void rowSpacingChanged();
315 void columnSpacingChanged();
316 Q_REVISION(2, 1) void horizontalAlignmentChanged(QQuickGrid::HAlignment alignment);
317 Q_REVISION(2, 1) void effectiveHorizontalAlignmentChanged(QQuickGrid::HAlignment alignment);
318 Q_REVISION(2, 1) void verticalAlignmentChanged(QQuickGrid::VAlignment alignment);
319
320protected:
321 void doPositioning(QSizeF *contentSize) override;
322 void reportConflictingAnchors() override;
323
324private:
325 int m_rows;
326 int m_columns;
327 qreal m_rowSpacing;
328 qreal m_columnSpacing;
329 bool m_useRowSpacing;
330 bool m_useColumnSpacing;
331 Flow m_flow;
332 HAlignment m_hItemAlign;
333 VAlignment m_vItemAlign;
334 Q_DECLARE_PRIVATE(QQuickGrid)
335};
336
338class Q_QUICK_EXPORT QQuickFlow: public QQuickBasePositioner
339{
340 Q_OBJECT
341 Q_PROPERTY(Flow flow READ flow WRITE setFlow NOTIFY flowChanged)
342 Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
343 Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
344 QML_NAMED_ELEMENT(Flow)
345 QML_ADDED_IN_VERSION(2, 0)
346public:
347 QQuickFlow(QQuickItem *parent=nullptr);
348
349 enum Flow { LeftToRight, TopToBottom };
350 Q_ENUM(Flow)
351 Flow flow() const;
352 void setFlow(Flow);
353
354 Qt::LayoutDirection layoutDirection() const;
355 void setLayoutDirection (Qt::LayoutDirection);
356 Qt::LayoutDirection effectiveLayoutDirection() const;
357
358Q_SIGNALS:
359 void flowChanged();
360 void layoutDirectionChanged();
361 void effectiveLayoutDirectionChanged();
362
363protected:
364 void doPositioning(QSizeF *contentSize) override;
365 void reportConflictingAnchors() override;
366protected:
367 QQuickFlow(QQuickFlowPrivate &dd, QQuickItem *parent);
368private:
369 Q_DECLARE_PRIVATE(QQuickFlow)
370};
371
372QT_END_NAMESPACE
373
374#endif // QQUICKPOSITIONERS_P_H
void watchChanges(QQuickItem *other)
void setLeftPadding(qreal value, bool reset=false)
void setBottomPadding(qreal value, bool reset=false)
void setRightPadding(qreal value, bool reset=false)
void setTopPadding(qreal value, bool reset=false)
void unwatchChanges(QQuickItem *other)
For specifying a base for QQuickGraphics layouts.
\qmltype Flow \nativetype QQuickFlow \inqmlmodule QtQuick \inherits Item
\qmltype Grid \nativetype QQuickGrid \inqmlmodule QtQuick \inherits Item
void setIsFirstItem(bool isFirstItem)
\qmlattachedproperty bool QtQuick::Positioner::isFirstItem \qmlattachedproperty bool QtQuick::Positio...
void setIsLastItem(bool isLastItem)
\qmltype Row \nativetype QQuickRow \inqmlmodule QtQuick \inherits Item
static QT_BEGIN_NAMESPACE const QQuickItemPrivate::ChangeTypes positionerWatchedChanges
QT_REQUIRE_CONFIG(quick_positioners)