QmlMaterial 0.1.0
Loading...
Searching...
No Matches
app_bar_scroll.hpp
1#pragma once
2
3#include "qml_material/input/nested_scroll_connection.hpp"
4#include <QQmlParserStatus>
5#include <QVariantAnimation>
6#include <optional>
7
8namespace qml_material
9{
10class QML_MATERIAL_API AppBarScroll : public NestedScrollConnection, public QQmlParserStatus {
11 Q_OBJECT
12 QML_ELEMENT
13 Q_INTERFACES(QQmlParserStatus)
14 Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged FINAL)
15 Q_PROPERTY(qreal collapseDistance READ collapseDistance WRITE setCollapseDistance NOTIFY
16 collapseDistanceChanged FINAL)
17 Q_PROPERTY(
18 qreal heightOffset READ heightOffset WRITE setHeightOffset NOTIFY heightOffsetChanged FINAL)
19 Q_PROPERTY(qreal collapsedFraction READ collapsedFraction NOTIFY heightOffsetChanged FINAL)
20 Q_PROPERTY(bool overlapped READ overlapped NOTIFY overlappedChanged FINAL)
21 Q_PROPERTY(qreal contentOffset READ contentOffset WRITE setContentOffset NOTIFY
22 contentOffsetChanged FINAL)
23 Q_PROPERTY(
24 qreal overlappedFraction READ overlappedFraction NOTIFY overlappedFractionChanged FINAL)
25 Q_PROPERTY(bool contentAtStart READ contentAtStart WRITE setContentAtStart NOTIFY
26 contentAtStartChanged FINAL)
27 Q_PROPERTY(bool active READ active NOTIFY activeChanged FINAL)
28 Q_PROPERTY(bool settling READ settling NOTIFY settlingChanged FINAL)
29 Q_PROPERTY(bool animationsEnabled READ animationsEnabled WRITE setAnimationsEnabled NOTIFY
30 animationsEnabledChanged FINAL)
31 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged FINAL)
32 Q_PROPERTY(bool reverseLayout READ reverseLayout WRITE setReverseLayout NOTIFY
33 reverseLayoutChanged FINAL)
34public:
35 enum Mode
36 {
37 Pinned,
38 EnterAlways,
39 ExitUntilCollapsed
40 };
41 Q_ENUM(Mode)
42 explicit AppBarScroll(QObject* parent = nullptr);
43 void classBegin() override;
44 void componentComplete() override;
45 Mode mode() const { return m_mode; }
46 qreal collapseDistance() const { return m_distance; }
47 qreal heightOffset() const { return m_offset; }
48 qreal collapsedFraction() const { return m_distance > 0 ? -m_offset / m_distance : 0; }
49 bool overlapped() const { return m_enabled && (! m_contentAtStart || m_offset < 0); }
50 qreal contentOffset() const { return m_contentOffset; }
51 qreal overlappedFraction() const;
52 bool contentAtStart() const { return m_contentAtStart; }
53 bool active() const { return m_active; }
54 bool settling() const { return m_snap->state() == QAbstractAnimation::Running; }
55 bool animationsEnabled() const { return m_animationsEnabled; }
56 bool enabled() const { return m_enabled; }
57 bool reverseLayout() const { return m_reverseLayout; }
58 void setMode(Mode);
59 void setCollapseDistance(qreal);
60 void setHeightOffset(qreal);
61 void setContentAtStart(bool);
62 void setContentOffset(qreal);
63 void setAnimationsEnabled(bool);
64 void setEnabled(bool);
65 void setReverseLayout(bool);
66 QPointF preScroll(QPointF, Source) override;
67 QPointF postScroll(QPointF, QPointF, Source) override;
68 bool canConsume(QPointF, Source) const override;
69 void begin(Source) override;
70 void end(bool cancelled) override;
71 Q_INVOKABLE void reset();
72 Q_SIGNAL void modeChanged();
73 Q_SIGNAL void collapseDistanceChanged();
74 Q_SIGNAL void heightOffsetChanged();
75 Q_SIGNAL void contentAtStartChanged();
76 Q_SIGNAL void overlappedChanged();
77 Q_SIGNAL void activeChanged();
78 Q_SIGNAL void settlingChanged();
79 Q_SIGNAL void animationsEnabledChanged();
80 Q_SIGNAL void contentOffsetChanged();
81 Q_SIGNAL void overlappedFractionChanged();
82 Q_SIGNAL void enabledChanged();
83 Q_SIGNAL void reverseLayoutChanged();
84 Q_SIGNAL void inputStarted();
85
86private:
87 QPointF consume(QPointF);
88 void update(qreal, bool);
89 Mode m_mode = ExitUntilCollapsed;
90 qreal m_distance = 0;
91 qreal m_offset = 0;
92 qreal m_contentOffset = 0;
93 bool m_contentAtStart = true;
94 bool m_active = false;
95 bool m_enabled = true;
96 bool m_reverseLayout = false;
97 bool m_animationsEnabled = true;
98 bool m_initializing = false;
99 quint64 m_revision = 0;
100 QVariantAnimation* m_snap;
101 std::optional<qreal> m_initialOffset;
102};
103} // namespace qml_material