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>
10class ButtonGroupContainerAttached;
11class QML_MATERIAL_API ButtonGroupContainer :
public MaterialContainer {
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)
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();
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;
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);
59class QML_MATERIAL_API ButtonGroupContainerAttached :
public QObject {
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)
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);
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();
105 friend class ButtonGroupContainer;
106 void setPosition(
int);
107 void membershipChanged();
109 void animateTo(qreal);
110 void stopAnimation();
111 ButtonGroupContainer* owner()
const;
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;
125QML_DECLARE_TYPEINFO(qml_material::ButtonGroupContainer, QML_HAS_ATTACHED_PROPERTIES)