QmlMaterial 0.1.0
Loading...
Searching...
No Matches
side_sheet.hpp
1#pragma once
2
3#include "qml_material/control/panel.hpp"
4
5namespace qml_material
6{
7class QML_MATERIAL_API SideSheet : public Control {
8 Q_OBJECT
9 QML_NAMED_ELEMENT(SideSheetBase)
10 Q_CLASSINFO("DefaultProperty", "contentData")
11 Q_PROPERTY(QQmlListProperty<QObject> contentData READ contentData FINAL)
12 Q_PROPERTY(Panel* sheetItem READ sheetItem CONSTANT FINAL)
13 Q_PROPERTY(QQuickItem* mainContent READ contentItem WRITE setContentItem NOTIFY
14 contentItemChanged FINAL)
15 Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged FINAL)
16 Q_PROPERTY(State state READ state NOTIFY stateChanged FINAL)
17 Q_PROPERTY(State lastStableState READ lastStableState NOTIFY stateChanged FINAL)
18 Q_PROPERTY(bool dragging READ dragging NOTIFY stateChanged FINAL)
19 Q_PROPERTY(qreal position READ position WRITE setPosition NOTIFY positionChanged FINAL)
20 Q_PROPERTY(Edge edge READ edge WRITE setEdge NOTIFY configurationChanged FINAL)
21 Q_PROPERTY(Qt::Edge effectiveEdge READ effectiveEdge NOTIFY configurationChanged FINAL)
22 Q_PROPERTY(
23 qreal sheetWidth READ sheetWidth WRITE setSheetWidth NOTIFY configurationChanged FINAL)
24 Q_PROPERTY(qreal effectiveSheetWidth READ effectiveSheetWidth NOTIFY sheetGeometryChanged FINAL)
25 Q_PROPERTY(qreal occupiedWidth READ occupiedWidth NOTIFY sheetGeometryChanged FINAL)
26 Q_PROPERTY(bool detached READ detached WRITE setDetached NOTIFY configurationChanged FINAL)
27 Q_PROPERTY(bool coplanar READ coplanar WRITE setCoplanar NOTIFY configurationChanged FINAL)
28 Q_PROPERTY(bool draggable READ draggable WRITE setDraggable NOTIFY configurationChanged FINAL)
29 Q_PROPERTY(qreal hideFriction READ hideFriction WRITE setHideFriction NOTIFY
30 configurationChanged FINAL)
31public:
32 enum Edge
33 {
34 Start,
35 End,
36 Left,
37 Right
38 };
39 Q_ENUM(Edge)
40 enum State
41 {
42 Hidden,
43 Expanded,
44 Dragging,
45 Settling
46 };
47 Q_ENUM(State)
48 explicit SideSheet(QQuickItem* parent = nullptr);
49 QQmlListProperty<QObject> contentData() { return m_sheet->contentData(); }
50 Panel* sheetItem() const { return m_sheet; }
51 bool expanded() const { return m_expanded; }
52 State state() const { return m_state; }
53 State lastStableState() const { return m_lastStable; }
54 bool dragging() const { return m_state == Dragging; }
55 qreal position() const { return m_position; }
56 Edge edge() const { return m_edge; }
57 Qt::Edge effectiveEdge() const;
58 qreal sheetWidth() const { return m_sheetWidth; }
59 qreal effectiveSheetWidth() const;
60 qreal occupiedWidth() const;
61 bool detached() const { return m_detached; }
62 bool coplanar() const { return m_coplanar; }
63 bool draggable() const { return m_draggable; }
64 qreal hideFriction() const { return m_hideFriction; }
65 void setExpanded(bool);
66 void setPosition(qreal);
67 void setEdge(Edge);
68 void setSheetWidth(qreal);
69 void setDetached(bool);
70 void setCoplanar(bool);
71 void setDraggable(bool);
72 void setHideFriction(qreal);
73 Q_INVOKABLE void open() { setExpanded(true); }
74 Q_INVOKABLE void close() { setExpanded(false); }
75 Q_INVOKABLE bool beginDrag();
76 Q_INVOKABLE void dragBy(QPointF delta);
77 Q_INVOKABLE void releaseDrag(QPointF velocity);
78 Q_INVOKABLE void cancelDrag();
79 Q_INVOKABLE void completeTransition(quint32 revision);
80 Q_SIGNAL void expandedChanged();
81 Q_SIGNAL void stateChanged();
82 Q_SIGNAL void positionChanged();
83 Q_SIGNAL void configurationChanged();
84 Q_SIGNAL void sheetGeometryChanged();
85 Q_SIGNAL void transitionRequested(quint32 revision, qreal position, bool animate);
86 Q_SIGNAL void opened();
87 Q_SIGNAL void closed();
88
89protected:
90 QRectF contentRect() const override;
91 void classBegin() override;
92 void componentComplete() override;
93 void geometryChange(const QRectF&, const QRectF&) override;
94
95private:
96 qreal margin() const { return m_detached ? 16 : 0; }
97 qreal hiddenX() const;
98 qreal expandedX() const;
99 qreal sheetX() const;
100 bool releaseOpens(QPointF velocity) const;
101 void request(bool expanded, bool animate);
102 void updateLayout();
103 void configurationUpdated();
104 Panel* m_sheet;
105 Edge m_edge = End;
106 State m_state = Hidden;
107 State m_lastStable = Hidden;
108 qreal m_position = 0;
109 qreal m_sheetWidth = 256;
110 qreal m_hideFriction = 0.1;
111 bool m_expanded = false;
112 bool m_detached = false;
113 bool m_coplanar = false;
114 bool m_draggable = true;
115 bool m_initializing = false;
116 bool m_layoutBusy = false;
117 bool m_layoutDirty = false;
118 quint32 m_revision = 0;
119};
120} // namespace qml_material