QmlMaterial 0.1.0
Loading...
Searching...
No Matches
split_button_indicator_state.hpp
1#pragma once
2#include "qml_material/style/common_state.hpp"
3#include "qml_material/token/split_button.hpp"
4#include <optional>
5Q_MOC_INCLUDE("qml_material/control/button.hpp")
6namespace qml_material
7{
8class Button;
9class QML_MATERIAL_API SplitButtonIndicatorState : public CommonState {
10 Q_OBJECT
11 QML_NAMED_ELEMENT(StateSplitButtonIndicator)
12 Q_PROPERTY(qml_material::Button* item READ item WRITE setItem NOTIFY itemChanged FINAL)
13 Q_PROPERTY(int type READ type WRITE setType NOTIFY typeChanged BINDABLE bindableType)
14 Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged BINDABLE bindableSize)
15 Q_PROPERTY(
16 bool isRound READ isRound WRITE setIsRound NOTIFY isRoundChanged BINDABLE bindableIsRound)
17 Q_PROPERTY(qreal baseCorner READ baseCorner NOTIFY baseCornerChanged)
18 Q_PROPERTY(qreal innerCorner READ innerCorner NOTIFY innerCornerChanged)
19 Q_PROPERTY(qml_material::token::SplitButtonSizeItem sizeToken READ sizeToken NOTIFY sizeChanged)
20public:
21 explicit SplitButtonIndicatorState(QObject* parent = nullptr);
22 ~SplitButtonIndicatorState() override;
23 Button* item() const;
24 void setItem(Button*);
25 Q_SIGNAL void itemChanged();
26 int type() const;
27 void setType(int);
28 QBindable<int> bindableType();
29 Q_SIGNAL void typeChanged();
30 int size() const;
31 void setSize(int);
32 QBindable<int> bindableSize();
33 Q_SIGNAL void sizeChanged();
34 bool isRound() const;
35 void setIsRound(bool);
36 QBindable<bool> bindableIsRound();
37 Q_SIGNAL void isRoundChanged();
38 qreal baseCorner() const;
39 qreal innerCorner() const { return m_innerCorner.value(); }
40 token::SplitButtonSizeItem sizeToken() const;
41 Q_SIGNAL void innerCornerChanged();
42 Q_SIGNAL void baseCornerChanged();
43 Q_INVOKABLE qreal calcRadius(int size, bool round, bool pressed) const;
44
45private:
46 enum class Interaction
47 {
48 Base,
49 Disabled
50 };
51 struct Selection {
52 Interaction state = Interaction::Base;
53 quint64 generation = 0;
54 bool operator==(const Selection&) const = default;
55 };
56 void selectionChanged();
57 void updateBackground();
58 StateBindingSet<Interaction> m_bindings { Interaction::Base };
59 QProperty<Button*> m_item { nullptr };
60 QProperty<bool> m_disabled { false };
61 QList<QMetaObject::Connection> m_connections;
62 QList<QMetaObject::Connection> m_backgroundConnections;
63 QProperty<std::optional<qreal>> m_backgroundHeight;
64 bool m_ready = false;
65 Q_OBJECT_BINDABLE_PROPERTY(SplitButtonIndicatorState, Selection, m_selection,
66 &SplitButtonIndicatorState::selectionChanged)
67 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(SplitButtonIndicatorState, int, m_type,
68 int(Enum::ButtonType::BtFilled),
69 &SplitButtonIndicatorState::typeChanged)
70 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(SplitButtonIndicatorState, int, m_size,
71 int(Enum::ButtonSize::S),
72 &SplitButtonIndicatorState::sizeChanged)
73 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(SplitButtonIndicatorState, bool, m_isRound, true,
74 &SplitButtonIndicatorState::isRoundChanged)
75 Q_OBJECT_BINDABLE_PROPERTY(SplitButtonIndicatorState, qreal, m_baseCorner,
76 &SplitButtonIndicatorState::baseCornerChanged)
77 Q_OBJECT_BINDABLE_PROPERTY(SplitButtonIndicatorState, qreal, m_innerCorner,
78 &SplitButtonIndicatorState::innerCornerChanged)
79 StateBindingSet<Interaction>::Lifetime m_lifetime { m_bindings.lifetime() };
80};
81} // namespace qml_material
Split button size tokens for a specific size class.
Definition split_button.hpp:13