QmlMaterial 0.1.0
Loading...
Searching...
No Matches
popup.hpp
1#pragma once
2
3#include <QQmlEngine>
4#include <QPointer>
5#include <QQuickItem>
6#include <QTimer>
7
8class QFocusEvent;
9
10namespace qml_material
11{
12
13class Popup : public QQuickItem {
14 Q_OBJECT
15 QML_NAMED_ELEMENT(Popup2)
16
17 Q_PROPERTY(bool opened READ isOpened NOTIFY openedChanged FINAL)
18 Q_PROPERTY(bool entering READ entering NOTIFY enteringChanged FINAL)
19 Q_PROPERTY(bool closing READ closing NOTIFY closingChanged FINAL)
20 Q_PROPERTY(bool modal READ modal WRITE setModal NOTIFY modalChanged FINAL)
21 Q_PROPERTY(bool dim READ dim WRITE setDim NOTIFY dimChanged FINAL)
22 Q_PROPERTY(bool fullScreen READ fullScreen WRITE setFullScreen NOTIFY fullScreenChanged FINAL)
23 Q_PROPERTY(bool visualFocus READ visualFocus NOTIFY visualFocusChanged FINAL)
24 Q_PROPERTY(Qt::FocusReason focusReason READ focusReason NOTIFY focusReasonChanged FINAL)
25 Q_PROPERTY(ClosePolicy closePolicy READ closePolicy WRITE setClosePolicy NOTIFY
26 closePolicyChanged FINAL)
27 Q_PROPERTY(bool deferredCompletion READ deferredCompletion WRITE setDeferredCompletion NOTIFY
28 deferredCompletionChanged FINAL)
29 Q_PROPERTY(int hideDelay READ hideDelay WRITE setHideDelay NOTIFY hideDelayChanged FINAL)
30 Q_PROPERTY(QQuickItem* popupItem READ popupItem WRITE setPopupItem NOTIFY popupItemChanged FINAL)
31 Q_PROPERTY(QQuickItem* overlayItem READ overlayItem NOTIFY overlayItemChanged FINAL)
32 Q_PROPERTY(qreal overlayWidth READ overlayWidth NOTIFY overlayGeometryChanged FINAL)
33 Q_PROPERTY(qreal overlayHeight READ overlayHeight NOTIFY overlayGeometryChanged FINAL)
34
35public:
36 explicit Popup(QQuickItem* parent = nullptr);
37
38 enum ClosePolicyFlag {
39 NoAutoClose = 0x00,
40 CloseOnPressOutside = 0x01,
41 CloseOnPressOutsideParent = 0x02,
42 CloseOnReleaseOutside = 0x04,
43 CloseOnReleaseOutsideParent = 0x08,
44 CloseOnEscape = 0x10
45 };
46 Q_DECLARE_FLAGS(ClosePolicy, ClosePolicyFlag)
47 Q_FLAG(ClosePolicy)
48
49 bool isOpened() const;
50 bool entering() const;
51 bool closing() const;
52
53 bool modal() const;
54 void setModal(bool value);
55
56 bool dim() const;
57 void setDim(bool value);
58
59 bool fullScreen() const;
60 void setFullScreen(bool value);
61
62 bool visualFocus() const;
63 Qt::FocusReason focusReason() const;
64
65 ClosePolicy closePolicy() const;
66 void setClosePolicy(ClosePolicy value);
67
68 bool deferredCompletion() const;
69 void setDeferredCompletion(bool value);
70
71 int hideDelay() const;
72 void setHideDelay(int value);
73
74 QQuickItem* popupItem() const;
75 void setPopupItem(QQuickItem* item);
76
77 QQuickItem* overlayItem() const;
78 qreal overlayWidth() const;
79 qreal overlayHeight() const;
80
81 Q_INVOKABLE void open();
82 Q_INVOKABLE void close();
83 Q_INVOKABLE void completeEnter();
84 Q_INVOKABLE void completeExit();
85
86 Q_SIGNAL void aboutToShow();
87 Q_SIGNAL void enteringChanged();
88 Q_SIGNAL void openedChanged();
89 Q_SIGNAL void opened();
90 Q_SIGNAL void aboutToHide();
91 Q_SIGNAL void closingChanged();
92 Q_SIGNAL void closed();
93 Q_SIGNAL void modalChanged();
94 Q_SIGNAL void dimChanged();
95 Q_SIGNAL void fullScreenChanged();
96 Q_SIGNAL void visualFocusChanged();
97 Q_SIGNAL void focusReasonChanged();
98 Q_SIGNAL void closePolicyChanged();
99 Q_SIGNAL void deferredCompletionChanged();
100 Q_SIGNAL void hideDelayChanged();
101 Q_SIGNAL void popupItemChanged();
102 Q_SIGNAL void overlayItemChanged();
103 Q_SIGNAL void overlayGeometryChanged();
104
105protected:
106 void focusInEvent(QFocusEvent* event) override;
107 void focusOutEvent(QFocusEvent* event) override;
108 void keyPressEvent(QKeyEvent* event) override;
109 void mousePressEvent(QMouseEvent* event) override;
110 void mouseReleaseEvent(QMouseEvent* event) override;
111 void wheelEvent(QWheelEvent* event) override;
112 bool childMouseEventFilter(QQuickItem* item, QEvent* event) override;
113 void itemChange(ItemChange change, const ItemChangeData& value) override;
114
115private:
116 void setEntering(bool value);
117 void setOpened(bool value);
118 void setClosing(bool value);
119 void finishClose();
120 void updateInputAcceptance();
121 void saveFocus();
122 void restoreFocus();
123 void setFocusReason(Qt::FocusReason reason);
124 bool isVisualFocusReason(Qt::FocusReason reason) const;
125 void updateOverlayItem();
126 void setOverlayItem(QQuickItem* item);
127 void useOverlayParent();
128 void restoreParentItem();
129 bool containsPopup(const QPointF& point) const;
130 bool containsParent(const QPointF& point) const;
131 bool tryClose(const QPointF& point, ClosePolicy flags);
132 bool handlePress(const QPointF& point, QEvent* event);
133 bool handleRelease(const QPointF& point, QEvent* event);
134 bool blockInput(const QPointF& point, QEvent* event) const;
135
136private:
137 bool m_opened { false };
138 bool m_entering { false };
139 bool m_closing { false };
140 bool m_modal { false };
141 bool m_dim { false };
142 bool m_fullScreen { false };
143 bool m_deferredCompletion { false };
144 bool m_outsidePressed { false };
145 bool m_outsideParentPressed { false };
146 Qt::FocusReason m_focusReason { Qt::OtherFocusReason };
147 ClosePolicy m_closePolicy { CloseOnEscape | CloseOnPressOutside };
148 int m_hideDelay { 0 };
149 QPointer<QQuickItem> m_popupItem;
150 QPointer<QQuickItem> m_overlayItem;
151 QPointer<QQuickItem> m_previousFocusItem;
152 QPointer<QQuickItem> m_previousParentItem;
153 QPointF m_previousPosition;
154 QPointF m_pressPoint;
155 bool m_parentItemStored { false };
156 QTimer m_hideTimer;
157};
158
159} // namespace qml_material
160
161Q_DECLARE_OPERATORS_FOR_FLAGS(qml_material::Popup::ClosePolicy)