QmlMaterial 0.1.0
Loading...
Searching...
No Matches
button_state.hpp
1#pragma once
2#include "qml_material/style/button_interaction_state.hpp"
3#include "qml_material/token/button.hpp"
4#include <optional>
5Q_MOC_INCLUDE("qml_material/control/button.hpp")
6namespace qml_material
7{
8class Button;
9class QML_MATERIAL_API ButtonAppearanceState : public ButtonInteractionState {
10 Q_OBJECT
11 QML_NAMED_ELEMENT(StateButtonBase)
12 QML_UNCREATABLE("Use StateButton or StateSplitButton")
13 Q_PROPERTY(qml_material::Button* item READ item WRITE setItem NOTIFY itemChanged FINAL)
14 Q_PROPERTY(int size READ size WRITE setSize NOTIFY sizeChanged BINDABLE bindableSize FINAL)
15 Q_PROPERTY(bool isRound READ isRound WRITE setIsRound NOTIFY isRoundChanged BINDABLE
16 bindableIsRound FINAL)
17 Q_PROPERTY(qreal containerHeight READ containerHeight NOTIFY geometryChanged)
18 Q_PROPERTY(qreal iconSize READ iconSize NOTIFY geometryChanged)
19 Q_PROPERTY(qreal leadingSpace READ leadingSpace NOTIFY geometryChanged)
20 Q_PROPERTY(qreal trailingSpace READ trailingSpace NOTIFY geometryChanged)
21 Q_PROPERTY(qreal spacing READ spacing NOTIFY geometryChanged)
22 Q_PROPERTY(int type READ type WRITE setType NOTIFY typeChanged BINDABLE bindableType FINAL)
23
24public:
25 Button* item() const;
26 void setItem(Button*);
27 int size() const;
28 void setSize(int);
29 QBindable<int> bindableSize();
30 bool isRound() const;
31 void setIsRound(bool);
32 QBindable<bool> bindableIsRound();
33 virtual qreal containerHeight() const = 0;
34 virtual qreal iconSize() const = 0;
35 virtual qreal leadingSpace() const = 0;
36 virtual qreal trailingSpace() const = 0;
37 virtual qreal spacing() const = 0;
38 Q_SIGNAL void geometryChanged();
39 Q_SIGNAL void sizeChanged();
40 Q_SIGNAL void isRoundChanged();
41 int type() const;
42 void setType(int);
43 QBindable<int> bindableType();
44 Q_SIGNAL void typeChanged();
45
46protected:
47 explicit ButtonAppearanceState(QObject* parent = nullptr);
48
49private:
50 void bindAppearance();
51 QColor defaultTextColor() const;
52 QColor defaultBackgroundColor() const;
53 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ButtonAppearanceState, int, m_type,
54 int(Enum::ButtonType::BtElevated),
55 &ButtonAppearanceState::typeChanged)
56 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ButtonAppearanceState, int, m_size,
57 int(Enum::ButtonSize::S),
58 &ButtonAppearanceState::sizeChanged)
59 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(ButtonAppearanceState, bool, m_isRound, true,
60 &ButtonAppearanceState::isRoundChanged)
61 BindingLifetime m_bindingLifetime { bindingSet().lifetime() };
62};
63
64class QML_MATERIAL_API ButtonState : public ButtonAppearanceState {
65 Q_OBJECT
66 QML_NAMED_ELEMENT(StateButton)
67 Q_PROPERTY(qml_material::token::ButtonSize sizeTokens READ sizeTokens WRITE setSizeTokens NOTIFY
68 sizeTokensChanged BINDABLE bindableSizeTokens FINAL)
69 Q_PROPERTY(qml_material::token::ButtonSizeItem sizeToken READ sizeToken NOTIFY sizeTokenChanged)
70
71public:
72 explicit ButtonState(QObject* parent = nullptr);
73 token::ButtonSize sizeTokens() const;
74 void setSizeTokens(const token::ButtonSize&);
75 QBindable<token::ButtonSize> bindableSizeTokens();
76
77 token::ButtonSizeItem sizeToken() const;
78 qreal containerHeight() const override;
79 qreal iconSize() const override;
80 qreal leadingSpace() const override;
81 qreal trailingSpace() const override;
82 qreal spacing() const override;
83
84 Q_SIGNAL void sizeTokensChanged();
85 Q_SIGNAL void sizeTokenChanged();
86
87private:
88 void bindTargets();
89 Q_OBJECT_BINDABLE_PROPERTY(ButtonState, token::ButtonSize, m_sizeTokens,
90 &ButtonState::sizeTokensChanged)
91 Q_OBJECT_BINDABLE_PROPERTY(ButtonState, token::ButtonSizeItem, m_selectedSize,
92 &ButtonState::sizeTokenChanged)
93 BindingLifetime m_bindingLifetime { bindingSet().lifetime() };
94};
95} // namespace qml_material
Button size tokens for a specific size class.
Definition button.hpp:13
Collection of button size tokens for different size classes.
Definition button.hpp:47