1// Copyright (C) 2017 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
4#ifndef QQUICKPOPUP_P_P_H
5#define QQUICKPOPUP_P_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtQuickTemplates2/private/qquickpopup_p.h>
19#include <QtQuickTemplates2/private/qquickcontrol_p.h>
20#include <QtQuickTemplates2/private/qquicktheme_p.h>
21
22#include <QtCore/private/qobject_p.h>
23#include <QtQuick/qquickitem.h>
24#include <QtQuick/private/qquickitemchangelistener_p.h>
25#include <QtQuick/private/qquicktransitionmanager_p_p.h>
26#include <QtQuick/private/qquickitem_p.h>
27
28#include <QtCore/qpointer.h>
29
30QT_BEGIN_NAMESPACE
31
32class QQuickTransition;
33class QQuickTransitionManager;
34class QQuickPopup;
35class QQuickPopupAnchors;
36class QQuickPopupItem;
37class QQuickPopupWindow;
38class QQuickPopupPrivate;
39class QQuickPopupPositioner;
40
41class Q_QUICKTEMPLATES2_EXPORT QQuickPopupTransitionManager : public QQuickTransitionManager
42{
43public:
44 QQuickPopupTransitionManager(QQuickPopupPrivate *popup);
45
46 void transitionEnter();
47 void transitionExit();
48
49protected:
50 void finished() override;
51
52private:
53 QQuickPopupPrivate *popup = nullptr;
54};
55
56class Q_QUICKTEMPLATES2_EXPORT QQuickPopupPrivate
57 : public QObjectPrivate
58 , public QQuickItemChangeListener
59 , public QQuickPaletteProviderPrivateBase<QQuickPopup, QQuickPopupPrivate>
60{
61public:
62 Q_DECLARE_PUBLIC(QQuickPopup)
63
64 QQuickPopupPrivate();
65
66 static QQuickPopupPrivate *get(QQuickPopup *popup)
67 {
68 return popup->d_func();
69 }
70
71 QQmlListProperty<QObject> contentData();
72 QQmlListProperty<QQuickItem> contentChildren();
73
74 void init();
75 void closeOrReject();
76 bool tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags);
77
78 bool contains(const QPointF &scenePos) const;
79
80#if QT_CONFIG(quicktemplates2_multitouch)
81 virtual bool acceptTouch(const QTouchEvent::TouchPoint &point);
82#endif
83 virtual bool blockInput(QQuickItem *item, const QPointF &point) const;
84
85 virtual bool handlePress(QQuickItem* item, const QPointF &point, ulong timestamp);
86 virtual bool handleMove(QQuickItem* item, const QPointF &point, ulong timestamp);
87 virtual bool handleRelease(QQuickItem* item, const QPointF &point, ulong timestamp);
88 virtual bool handleReleaseWithoutGrab(const QEventPoint &) { return false; }
89 virtual void handleUngrab();
90
91 bool handleMouseEvent(QQuickItem *item, QMouseEvent *event);
92 bool handleHoverEvent(QQuickItem *item, QHoverEvent *event);
93#if QT_CONFIG(quicktemplates2_multitouch)
94 bool handleTouchEvent(QQuickItem *item, QTouchEvent *event);
95#endif
96
97 QMarginsF windowInsets() const;
98 QPointF windowInsetsTopLeft() const;
99 void setEffectivePosFromWindowPos(const QPointF &windowPos);
100 void reposition();
101
102 bool usePopupWindow() const;
103 void adjustPopupItemParentAndWindow();
104 void createOverlay();
105 QQuickItem *createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent) const;
106 void destroyDimmer();
107 void toggleOverlay();
108 void updateContentPalettes(const QPalette& parentPalette);
109
110 virtual QQuickPopup::PopupType resolvedPopupType() const;
111
112 virtual void showDimmer();
113 virtual void hideDimmer();
114 virtual void resizeDimmer();
115
116 virtual bool prepareEnterTransition();
117 virtual bool prepareExitTransition();
118 virtual void finalizeEnterTransition();
119 virtual void finalizeExitTransition();
120
121 virtual void opened();
122
123 virtual Qt::WindowFlags popupWindowType() const;
124
125 QMarginsF getMargins() const;
126
127 void setTopMargin(qreal value, bool reset = false);
128 void setLeftMargin(qreal value, bool reset = false);
129 void setRightMargin(qreal value, bool reset = false);
130 void setBottomMargin(qreal value, bool reset = false);
131
132 QQuickPopupAnchors *getAnchors();
133 virtual QQuickPopupPositioner *getPositioner();
134
135 void setWindow(QQuickWindow *window);
136 void itemDestroyed(QQuickItem *item) override;
137
138 QPalette defaultPalette() const override;
139
140 void updateChildrenPalettes(const QPalette &parentPalette) override;
141
142 enum TransitionState {
143 NoTransition, EnterTransition, ExitTransition
144 };
145
146 static const QQuickPopup::ClosePolicy DefaultClosePolicy;
147
148 bool focus = false;
149 bool modal = false;
150 bool dim = false;
151 bool hasDim = false;
152 bool visible = false;
153 bool complete = true;
154 bool positioning = false;
155 bool hasWidth = false;
156 bool hasHeight = false;
157 bool hasTopMargin = false;
158 bool hasLeftMargin = false;
159 bool hasRightMargin = false;
160 bool hasBottomMargin = false;
161 bool hasZ = false;
162 bool allowVerticalFlip = false;
163 bool allowHorizontalFlip = false;
164 bool allowVerticalMove = true;
165 bool allowHorizontalMove = true;
166 bool allowVerticalResize = true;
167 bool allowHorizontalResize = true;
168 bool hadActiveFocusBeforeExitTransition = false;
169 bool interactive = true;
170 bool hasClosePolicy = false;
171 bool outsidePressed = false;
172 bool outsideParentPressed = false;
173 bool inDestructor = false;
174 bool relaxEdgeConstraint = false;
175 bool popupWindowDirty = false;
176 int touchId = -1;
177 qreal x = 0;
178 qreal y = 0;
179 QPointF effectivePos;
180 qreal margins = -1;
181 qreal topMargin = 0;
182 qreal leftMargin = 0;
183 qreal rightMargin = 0;
184 qreal bottomMargin = 0;
185 QPointF pressPoint;
186 TransitionState transitionState = NoTransition;
187 QQuickPopup::ClosePolicy closePolicy = DefaultClosePolicy;
188 QQuickItem *parentItem = nullptr;
189 QQuickItem *dimmer = nullptr;
190 QPointer<QQuickWindow> window;
191 QQuickTransition *enter = nullptr;
192 QQuickTransition *exit = nullptr;
193 QQuickPopupItem *popupItem = nullptr;
194 QQuickPopupWindow *popupWindow = nullptr;
195 QQuickPopupPositioner *positioner = nullptr;
196 QList<QQuickStateAction> enterActions;
197 QList<QQuickStateAction> exitActions;
198 QQuickPopupTransitionManager transitionManager;
199 QQuickPopupAnchors *anchors = nullptr;
200 qreal explicitDimmerOpacity = 0;
201 qreal prevOpacity = 0;
202 qreal prevScale = 0;
203 QString m_title;
204 QQuickPopup::PopupType m_popupType = QQuickPopup::Item;
205
206 friend class QQuickPopupTransitionManager;
207};
208
209QT_END_NAMESPACE
210
211#endif // QQUICKPOPUP_P_P_H
212

source code of qtdeclarative/src/quicktemplates/qquickpopup_p_p.h