QmlMaterial 0.1.0
Loading...
Searching...
No Matches
drawer.hpp
1#pragma once
2
3#include "qml_material/control/popup.hpp"
4#include "qml_material/item/item_proxy.hpp"
5
6namespace qml_material
7{
8class QML_MATERIAL_API Drawer : public Popup {
9 Q_OBJECT
10 QML_NAMED_ELEMENT(DrawerBase)
11 Q_PROPERTY(Qt::Edge edge READ edge WRITE setEdge NOTIFY edgeChanged FINAL)
12 Q_PROPERTY(
13 RevealMode revealMode READ revealMode WRITE setRevealMode NOTIFY revealModeChanged FINAL)
14 Q_PROPERTY(qreal position READ position WRITE setPosition NOTIFY positionChanged FINAL)
15 Q_PROPERTY(
16 bool interactive READ interactive WRITE setInteractive NOTIFY interactiveChanged FINAL)
17 Q_PROPERTY(qreal dragMargin READ dragMargin WRITE setDragMargin RESET resetDragMargin NOTIFY
18 dragMarginChanged FINAL)
19public:
20 enum RevealMode
21 {
22 Slide,
23 Expand
24 };
25 Q_ENUM(RevealMode)
26 RevealMode revealMode() const { return m_revealMode; }
27 void setRevealMode(RevealMode);
28 bool prepareExpansion(QObject* owner, ItemProxy* origin);
29 void clearExpansion(QObject* owner);
30 Q_SIGNAL void revealModeChanged();
31 explicit Drawer(QObject* parent = nullptr);
32 ~Drawer() override;
33 bool interactive() const { return m_interactive; }
34 void setInteractive(bool);
35 qreal dragMargin() const { return m_dragMargin; }
36 void setDragMargin(qreal);
37 void resetDragMargin();
38 bool acceptsDrag(const QPointF&) const;
39 bool wantsDrag(const QPointF&) const;
40 void pressDrag(const QPointF&, ulong timestamp);
41 void startDrag(const QPointF&);
42 void moveDrag(const QPointF&);
43 void releaseDrag(const QPointF&, ulong timestamp);
44 void cancelDrag();
45 bool dragging() const { return m_dragging; }
46 void open() override;
47 void close() override;
48 void dismissImmediately() override;
49 Qt::Edge edge() const { return m_edge; }
50 void setEdge(Qt::Edge);
51 qreal position() const { return m_position; }
52 void setPosition(qreal);
53 void updateDimmer(QQuickItem*, qreal opacity) const override;
54 bool blocksScenePoint(const QPointF&) const override;
55 bool overlayContainsScenePoint(const QPointF&) const override;
56 Q_SIGNAL void edgeChanged();
57 Q_SIGNAL void positionChanged();
58 Q_SIGNAL void interactiveChanged();
59 Q_SIGNAL void dragMarginChanged();
60
61protected:
62 QPointF surfacePosition() const override;
63 QSizeF surfaceSize() const override;
64 qreal presentationScale() const override;
65 QList<TransitionTarget> transitionTargets(bool opening) const override;
66 void finalizeTransition(bool opening) override;
67
68private:
69 void registerOverlay();
70 void observeOrigin();
71 QRectF expansionRect() const;
72 ItemProxy::Geometry expansionGeometry() const;
73 ItemProxy::Geometry originGeometry() const;
74 QPointer<ItemProxy> m_origin;
75 QList<QMetaObject::Connection> m_originConnections;
76 ItemProxy::Geometry m_originGeometry;
77 mutable ItemProxy::Geometry m_startGeometry, m_endGeometry, m_anchorGeometry;
78 mutable qreal m_anchorProgress = 0;
79 mutable bool m_geometryReady = false;
80 RevealMode m_revealMode = Slide;
81 qreal axis(const QPointF&) const;
82 qreal extent() const;
83 qreal distanceFromEdge(const QPointF&) const;
84 QPointer<OverlayManager> m_inputOverlay;
85 QPointF m_pressPoint;
86 ulong m_pressTimestamp = 0;
87 qreal m_dragOrigin = 0, m_dragPosition = 0, m_dragMargin = 0;
88 bool m_interactive = true, m_dragging = false, m_wasOpen = false;
89 Qt::Edge m_edge = Qt::LeftEdge;
90 qreal m_position = 0;
91};
92} // namespace qml_material