QmlMaterial 0.1.0
Loading...
Searching...
No Matches
button_group_container.hpp
1#pragma once
2
3#include "qml_material/control/container.hpp"
4#include "qml_material/core/enum.hpp"
5#include "qml_material/token/button_group.hpp"
6#include <QVariantAnimation>
7
8namespace qml_material
9{
10class ButtonGroupContainerAttached;
11class QML_MATERIAL_API ButtonGroupContainer : public MaterialContainer {
12 Q_OBJECT
13 QML_NAMED_ELEMENT(ButtonGroupContainer)
14 QML_ATTACHED(ButtonGroupContainerAttached)
15 Q_PROPERTY(Variant variant READ variant WRITE setVariant NOTIFY variantChanged FINAL)
16 Q_PROPERTY(bool animateWidth READ animateWidth WRITE setAnimateWidth RESET resetAnimateWidth
17 NOTIFY animateWidthChanged FINAL)
18 Q_PROPERTY(qreal expandedRatio READ expandedRatio WRITE setExpandedRatio NOTIFY
19 expandedRatioChanged FINAL)
20 Q_PROPERTY(int size READ buttonSize WRITE setButtonSize NOTIFY sizeChanged FINAL)
21public:
22 enum Variant
23 {
24 Standard,
25 Connected
26 };
27 Q_ENUM(Variant)
28 explicit ButtonGroupContainer(QQuickItem* parent = nullptr);
29 ~ButtonGroupContainer() override;
30 static ButtonGroupContainerAttached* qmlAttachedProperties(QObject*);
31 Variant variant() const { return m_variant; }
32 void setVariant(Variant);
33 bool animateWidth() const { return m_animateWidth.value_or(m_variant == Standard); }
34 void setAnimateWidth(bool);
35 void resetAnimateWidth();
36 qreal expandedRatio() const { return m_expandedRatio; }
37 void setExpandedRatio(qreal);
38 int buttonSize() const { return m_size; }
39 void setButtonSize(int);
40 Q_SIGNAL void variantChanged();
41 Q_SIGNAL void animateWidthChanged();
42 Q_SIGNAL void expandedRatioChanged();
43 Q_SIGNAL void sizeChanged();
44
45protected:
46 bool isContent(QQuickItem*) const override;
47 void itemAdded(QQuickItem*) override;
48 void itemRemoved(QQuickItem*) override;
49 void updatePolish() override;
50 qreal defaultSpacing() const override;
51
52private:
53 Variant m_variant = Standard;
54 std::optional<bool> m_animateWidth;
55 qreal m_expandedRatio = token::ButtonGroup::expandedRatio;
56 int m_size = int(Enum::ButtonSize::S);
57};
58
59class QML_MATERIAL_API ButtonGroupContainerAttached : public QObject {
60 Q_OBJECT
61 Q_PROPERTY(qreal preferredWidth READ preferredWidth WRITE setPreferredWidth RESET
62 resetPreferredWidth NOTIFY layoutChanged FINAL)
63 Q_PROPERTY(qreal minimumWidth READ minimumWidth WRITE setMinimumWidth RESET resetMinimumWidth
64 NOTIFY layoutChanged FINAL)
65 Q_PROPERTY(qreal defaultMinimumWidth READ defaultMinimumWidth WRITE setDefaultMinimumWidth
66 NOTIFY layoutChanged FINAL)
67 Q_PROPERTY(qreal weight READ weight WRITE setWeight NOTIFY layoutChanged FINAL)
68 Q_PROPERTY(qreal compressionLimit READ compressionLimit WRITE setCompressionLimit RESET
69 resetCompressionLimit NOTIFY layoutChanged FINAL)
70 Q_PROPERTY(qreal defaultCompressionLimit READ defaultCompressionLimit WRITE
71 setDefaultCompressionLimit NOTIFY layoutChanged FINAL)
72 Q_PROPERTY(int position READ position NOTIFY contextChanged FINAL)
73 Q_PROPERTY(bool connected READ connected NOTIFY contextChanged FINAL)
74 Q_PROPERTY(bool grouped READ grouped NOTIFY contextChanged FINAL)
75 Q_PROPERTY(int size READ buttonSize NOTIFY contextChanged FINAL)
76public:
77 explicit ButtonGroupContainerAttached(QObject*);
78 ~ButtonGroupContainerAttached() override;
79 qreal preferredWidth() const { return m_preferredWidth.value_or(-1); }
80 void setPreferredWidth(qreal);
81 void resetPreferredWidth();
82 qreal minimumWidth() const { return m_minimumWidth.value_or(m_defaultMinimumWidth); }
83 void setMinimumWidth(qreal);
84 void resetMinimumWidth();
85 qreal defaultMinimumWidth() const { return m_defaultMinimumWidth; }
86 void setDefaultMinimumWidth(qreal);
87 qreal weight() const { return m_weight; }
88 void setWeight(qreal);
89 qreal compressionLimit() const {
90 return m_compressionLimit.value_or(m_defaultCompressionLimit);
91 }
92 void setCompressionLimit(qreal);
93 void resetCompressionLimit();
94 qreal defaultCompressionLimit() const { return m_defaultCompressionLimit; }
95 void setDefaultCompressionLimit(qreal);
96 int position() const { return m_position; }
97 bool connected() const;
98 bool grouped() const { return owner() != nullptr; }
99 int buttonSize() const;
100 qreal pressProgress() const { return m_progress; }
101 Q_SIGNAL void layoutChanged();
102 Q_SIGNAL void contextChanged();
103
104private:
105 friend class ButtonGroupContainer;
106 void setPosition(int);
107 void membershipChanged();
108 void updatePress();
109 void animateTo(qreal);
110 void stopAnimation();
111 ButtonGroupContainer* owner() const;
112 void restoreWidth();
113 bool m_managedWidth = false;
114 bool m_originalWidthValid = false;
115 qreal m_originalWidth = 0;
116 std::optional<qreal> m_preferredWidth, m_compressionLimit, m_minimumWidth;
117 qreal m_defaultMinimumWidth = 0, m_weight = 0, m_defaultCompressionLimit = 0;
118 qreal m_progress = 0;
119 int m_position = int(Enum::ItemPosition::PosSingle);
120 QVariantAnimation m_animation;
121 bool m_releasing = false;
122 QList<QMetaObject::Connection> m_ownerConnections;
123};
124} // namespace qml_material
125QML_DECLARE_TYPEINFO(qml_material::ButtonGroupContainer, QML_HAS_ATTACHED_PROPERTIES)