QmlMaterial 0.1.0
Loading...
Searching...
No Matches
page_stack.hpp
1#pragma once
2
3#include "qml_material/control/control.hpp"
4#include <memory>
5
6QT_BEGIN_NAMESPACE
7class QQuickTransition;
8QT_END_NAMESPACE
9
10Q_MOC_INCLUDE("QtQuick/private/qquicktransition_p.h")
11
12namespace qml_material
13{
14class PageStackAttached;
15class QML_MATERIAL_API PageStack : public Control {
16 Q_OBJECT
17 QML_NAMED_ELEMENT(PageStackBase)
18 QML_ATTACHED(PageStackAttached)
19 Q_PROPERTY(int depth READ depth NOTIFY depthChanged FINAL)
20 Q_PROPERTY(bool empty READ empty NOTIFY depthChanged FINAL)
21 Q_PROPERTY(bool busy READ busy NOTIFY busyChanged FINAL)
22 Q_PROPERTY(QQuickTransition* pushEnter READ pushEnter WRITE setPushEnter NOTIFY
23 transitionsChanged FINAL)
24 Q_PROPERTY(
25 QQuickTransition* pushExit READ pushExit WRITE setPushExit NOTIFY transitionsChanged FINAL)
26 Q_PROPERTY(
27 QQuickTransition* popEnter READ popEnter WRITE setPopEnter NOTIFY transitionsChanged FINAL)
28 Q_PROPERTY(
29 QQuickTransition* popExit READ popExit WRITE setPopExit NOTIFY transitionsChanged FINAL)
30 Q_PROPERTY(QQuickTransition* replaceEnter READ replaceEnter WRITE setReplaceEnter NOTIFY
31 transitionsChanged FINAL)
32 Q_PROPERTY(QQuickTransition* replaceExit READ replaceExit WRITE setReplaceExit NOTIFY
33 transitionsChanged FINAL)
34 Q_PROPERTY(QQuickItem* currentItem READ currentItem NOTIFY currentItemChanged FINAL)
35 Q_PROPERTY(QQuickItem* initialItem READ initialItem WRITE setInitialItem NOTIFY
36 initialItemChanged FINAL)
37public:
38 enum Status
39 {
40 Inactive,
41 Deactivating,
42 Activating,
43 Active
44 };
45 Q_ENUM(Status)
46 enum TransitionMode
47 {
48 Immediate,
49 Animated
50 };
51 Q_ENUM(TransitionMode)
52 explicit PageStack(QQuickItem* parent = nullptr);
53 ~PageStack() override;
54 static PageStackAttached* qmlAttachedProperties(QObject*);
55 int depth() const;
56 bool empty() const { return depth() == 0; }
57 bool busy() const;
58 QQuickTransition* pushEnter() const;
59 QQuickTransition* pushExit() const;
60 QQuickTransition* popEnter() const;
61 QQuickTransition* popExit() const;
62 QQuickTransition* replaceEnter() const;
63 QQuickTransition* replaceExit() const;
64 void setPushEnter(QQuickTransition*);
65 void setPushExit(QQuickTransition*);
66 void setPopEnter(QQuickTransition*);
67 void setPopExit(QQuickTransition*);
68 void setReplaceEnter(QQuickTransition*);
69 void setReplaceExit(QQuickTransition*);
70 Q_INVOKABLE void completeTransition();
71 Q_SIGNAL void busyChanged();
72 Q_SIGNAL void transitionsChanged();
73 QQuickItem* currentItem() const;
74 QQuickItem* initialItem() const;
75 void setInitialItem(QQuickItem*);
76 Q_INVOKABLE bool pushItem(QQuickItem*, TransitionMode mode = Animated);
77 Q_INVOKABLE bool replaceCurrentItem(QQuickItem*, TransitionMode mode = Animated);
78 Q_INVOKABLE bool popCurrentItem(TransitionMode mode = Animated);
79 Q_INVOKABLE bool clear(TransitionMode mode = Animated);
80 Q_INVOKABLE QQuickItem* itemAt(int index) const;
81 Q_SIGNAL void depthChanged();
82 Q_SIGNAL void currentItemChanged();
83 Q_SIGNAL void initialItemChanged();
84 Q_SIGNAL void entryRemoved(quint64 id);
85 Q_SIGNAL void entryAdded(quint64 id, QQuickItem* item);
86
87protected:
88 void componentComplete() override;
89 void geometryChange(const QRectF&, const QRectF&) override;
90 bool childMouseEventFilter(QQuickItem*, QEvent*) override;
91
92private:
93 struct State;
94 std::shared_ptr<State> m_state;
95 bool navigate(int operation, QQuickItem*, TransitionMode);
96 void synchronize();
97 void layoutPages();
98 void removePage(quint64);
99 void startTransition(quint64);
100 void motionFinished(quint64);
101 void stopMotions();
102};
103
104class QML_MATERIAL_API MaterialPageStack : public PageStack {
105 Q_OBJECT
106 QML_NAMED_ELEMENT(PageStack)
107 QML_ATTACHED(PageStackAttached)
108public:
109 explicit MaterialPageStack(QQuickItem* parent = nullptr);
110};
111
112class QML_MATERIAL_API PageStackAttached : public QObject {
113 Q_OBJECT
114 Q_PROPERTY(PageStack* view READ view NOTIFY changed FINAL)
115 Q_PROPERTY(int index READ index NOTIFY changed FINAL)
116 Q_PROPERTY(PageStack::Status status READ status NOTIFY statusChanged FINAL)
117public:
118 using Status = PageStack::Status;
119 explicit PageStackAttached(QObject* parent): QObject(parent) {}
120 PageStack* view() const { return m_view; }
121 int index() const { return m_index; }
122 Status status() const { return m_status; }
123 Q_SIGNAL void changed();
124 Q_SIGNAL void statusChanged();
125 Q_SIGNAL void removed();
126
127private:
128 friend class PageStack;
129 void update(PageStack*, int, Status);
130 QPointer<PageStack> m_view;
131 int m_index = -1;
132 Status m_status = PageStack::Inactive;
133 bool m_removing = false;
134};
135} // namespace qml_material
136QML_DECLARE_TYPEINFO(qml_material::PageStack, QML_HAS_ATTACHED_PROPERTIES)
137QML_DECLARE_TYPEINFO(qml_material::MaterialPageStack, QML_HAS_ATTACHED_PROPERTIES)