QmlMaterial 0.1.0
Loading...
Searching...
No Matches
page_stack_entries_p.hpp
1#pragma once
2
3#include <QObject>
4#include <QPointer>
5#include <QQuickItem>
6#include <QMap>
7#include <QSet>
8#include <optional>
9
10namespace qml_material
11{
12// Tracks navigation lifetimes; the view owns presentation and the caller owns page objects.
13class PageStackEntries : public QObject {
14 Q_OBJECT
15public:
16 enum class Status
17 {
18 Inactive,
19 Entering,
20 Active,
21 Exiting
22 };
23 enum class Operation
24 {
25 Push,
26 Replace,
27 Pop,
28 Clear
29 };
30 struct Entry {
31 quint64 id = 0;
32 QPointer<QQuickItem> item;
33 Status status = Status::Inactive;
34 bool retiring = false;
35 };
36 struct Transition {
37 quint64 id = 0;
38 quint64 from = 0;
39 quint64 to = 0;
40 Operation operation = Operation::Push;
41 };
42 explicit PageStackEntries(QObject* parent = nullptr): QObject(parent) {}
43 ~PageStackEntries() override;
44 int depth() const { return m_stack.size(); }
45 quint64 currentId() const { return m_stack.isEmpty() ? 0 : m_stack.last(); }
46 QQuickItem* currentItem() const { return entry(currentId()).item; }
47 Entry entry(quint64 id) const { return m_entries.value(id); }
48 quint64 idAt(int index) const { return m_stack.value(index); }
49 int indexOf(quint64 id) const { return m_stack.indexOf(id); }
50 QList<Entry> entries() const { return m_entries.values(); }
51 std::optional<Transition> transition() const { return m_transition; }
52 quint64 push(QQuickItem* item) { return navigate(Operation::Push, item); }
53 quint64 replace(QQuickItem* item) { return navigate(Operation::Replace, item); }
54 quint64 pop() { return navigate(Operation::Pop, nullptr); }
55 quint64 clear() { return navigate(Operation::Clear, nullptr); }
56 bool finish(quint64 transitionId);
57 void shutdown();
58 Q_SIGNAL void changed();
59 Q_SIGNAL void transitionRequested(quint64 id);
60 Q_SIGNAL void entryRemoved(quint64 id, QQuickItem* item);
61
62private:
63 quint64 navigate(Operation, QQuickItem*);
64 void retire(quint64);
65 Entry erase(quint64);
66 QList<Entry> settle();
67 void destroyed(quint64);
68 void notify(const QList<Entry>& removed = {});
69 QMap<quint64, Entry> m_entries;
70 QMap<quint64, QMetaObject::Connection> m_connections;
71 QList<quint64> m_stack;
72 std::optional<Transition> m_transition;
73 QSet<quint64> m_destroyed;
74 quint64 m_next_entry = 0;
75 quint64 m_next_transition = 0;
76 int m_notification_depth = 0;
77 bool m_closed = false;
78};
79} // namespace qml_material