QmlMaterial 0.1.0
Loading...
Searching...
No Matches
abstract_button.hpp
1#pragma once
2
3#include <QTimer>
4#include <QtCore/private/qproperty_p.h>
5#include "qml_material/control/control.hpp"
6#include "qml_material/control/icon_spec.hpp"
7#include "qml_material/control/action.hpp"
8
9namespace qml_material
10{
11class ButtonGroup;
12class QML_MATERIAL_API AbstractButton : public Control {
13 Q_OBJECT
14 QML_NAMED_ELEMENT(AbstractButtonBase)
15 Q_PROPERTY(QString text READ text WRITE setText RESET resetText NOTIFY textChanged FINAL)
16 Q_PROPERTY(IconSpec* icon READ icon CONSTANT FINAL)
17 Q_PROPERTY(
18 QQuickItem* indicator READ indicator WRITE setIndicator NOTIFY indicatorChanged FINAL)
19 Q_PROPERTY(qreal implicitIndicatorWidth READ implicitIndicatorWidth NOTIFY
20 implicitIndicatorWidthChanged FINAL)
21 Q_PROPERTY(qreal implicitIndicatorHeight READ implicitIndicatorHeight NOTIFY
22 implicitIndicatorHeightChanged FINAL)
23 Q_PROPERTY(Action* action READ action WRITE setAction NOTIFY actionChanged FINAL)
24 Q_PROPERTY(bool autoExclusive READ autoExclusive WRITE setAutoExclusive NOTIFY
25 autoExclusiveChanged FINAL)
26 Q_PROPERTY(Display display READ display WRITE setDisplay NOTIFY displayChanged FINAL)
27 Q_PROPERTY(bool pressed READ isPressed NOTIFY pressedChanged FINAL)
28 Q_PROPERTY(bool down READ isDown WRITE setDown RESET resetDown NOTIFY downChanged FINAL)
29 Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable NOTIFY checkableChanged FINAL)
30 Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY checkedChanged FINAL)
31 Q_PROPERTY(qreal pressX READ pressX NOTIFY pressXChanged FINAL)
32 Q_PROPERTY(qreal pressY READ pressY NOTIFY pressYChanged FINAL)
33 Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat NOTIFY autoRepeatChanged FINAL)
34 Q_PROPERTY(int autoRepeatDelay READ autoRepeatDelay WRITE setAutoRepeatDelay NOTIFY
35 autoRepeatDelayChanged FINAL)
36 Q_PROPERTY(int autoRepeatInterval READ autoRepeatInterval WRITE setAutoRepeatInterval NOTIFY
37 autoRepeatIntervalChanged FINAL)
38 Q_PROPERTY(int longPressInterval READ longPressInterval WRITE setLongPressInterval NOTIFY
39 longPressIntervalChanged FINAL)
40public:
41 enum Display
42 {
43 IconOnly,
44 TextOnly,
45 TextBesideIcon,
46 TextUnderIcon
47 };
48 Q_ENUM(Display)
49 explicit AbstractButton(QQuickItem* parent = nullptr);
50 ~AbstractButton() override;
51 QString text() const;
52 void setText(const QString& value);
53 void resetText();
54 Action* action() const;
55 void setAction(Action*);
56 ButtonGroup* group() const;
57 void setGroup(ButtonGroup*);
58 bool autoExclusive() const { return m_auto_exclusive; }
59 void setAutoExclusive(bool);
60 IconSpec* icon() const { return m_icon; }
61 QQuickItem* indicator() const { return m_indicator; }
62 void setIndicator(QQuickItem*);
63 qreal implicitIndicatorWidth() const { return m_indicator ? m_indicator->implicitWidth() : 0; }
64 qreal implicitIndicatorHeight() const {
65 return m_indicator ? m_indicator->implicitHeight() : 0;
66 }
67 Q_SIGNAL void indicatorChanged();
68 Q_SIGNAL void implicitIndicatorWidthChanged();
69 Q_SIGNAL void implicitIndicatorHeightChanged();
70 Display display() const { return m_display; }
71 void setDisplay(Display value);
72 bool isPressed() const { return m_pressed; }
73 bool isDown() const { return m_down.value(); }
74 void setDown(bool value);
75 void resetDown();
76 QBindable<bool> bindablePressed() const { return QBindable<bool>(&m_pressed); }
77 QBindable<bool> bindableDown() { return QBindable<bool>(&m_down); }
78 QBindable<bool> bindableChecked() { return QBindable<bool>(&m_checked); }
79 QBindable<bool> bindableCheckable() { return QBindable<bool>(&m_checkable); }
80 bool isCheckable() const { return m_checkable; }
81 void setCheckable(bool value);
82 bool isChecked() const { return m_checked; }
83 void setChecked(bool value);
84 qreal pressX() const { return m_point.x(); }
85 qreal pressY() const { return m_point.y(); }
86 bool autoRepeat() const { return m_auto_repeat; }
87 void setAutoRepeat(bool value);
88 int autoRepeatDelay() const { return m_repeat_delay; }
89 void setAutoRepeatDelay(int value);
90 int autoRepeatInterval() const { return m_repeat_interval; }
91 void setAutoRepeatInterval(int value);
92 int longPressInterval() const { return m_hold_interval; }
93 void setLongPressInterval(int value);
94 Q_INVOKABLE void click();
95 Q_INVOKABLE void animateClick();
96 Q_INVOKABLE void toggle();
97 Q_SIGNAL void pressed();
98 Q_SIGNAL void released();
99 Q_SIGNAL void canceled();
100 Q_SIGNAL void clicked();
101 Q_SIGNAL void toggled();
102 Q_SIGNAL void pressAndHold();
103 Q_SIGNAL void doubleClicked();
104 Q_SIGNAL void textChanged();
105 Q_SIGNAL void actionChanged();
106 Q_SIGNAL void groupChanged();
107 Q_SIGNAL void autoExclusiveChanged();
108 Q_SIGNAL void displayChanged();
109 Q_SIGNAL void pressedChanged();
110 Q_SIGNAL void downChanged();
111 Q_SIGNAL void checkableChanged();
112 Q_SIGNAL void checkedChanged();
113 Q_SIGNAL void pressXChanged();
114 Q_SIGNAL void pressYChanged();
115 Q_SIGNAL void autoRepeatChanged();
116 Q_SIGNAL void autoRepeatDelayChanged();
117 Q_SIGNAL void autoRepeatIntervalChanged();
118 Q_SIGNAL void longPressIntervalChanged();
119
120protected:
121 void updateChecked(bool);
122 virtual void nextCheckState();
123 virtual void pointerStarted(const QPointF&) {}
124 virtual void pointerMoved(const QPointF&) {}
125 virtual void interactionEnded() {}
126 virtual bool retainPressOutside() const { return false; }
127 void setCheckedByInteraction(bool);
128 bool canUncheck() const;
129 void mousePressEvent(QMouseEvent* event) override;
130 void mouseMoveEvent(QMouseEvent* event) override;
131 void mouseReleaseEvent(QMouseEvent* event) override;
132 void mouseDoubleClickEvent(QMouseEvent* event) override;
133 void mouseUngrabEvent() override;
134 void touchEvent(QTouchEvent* event) override;
135 void touchUngrabEvent() override;
136 void keyPressEvent(QKeyEvent* event) override;
137 void keyReleaseEvent(QKeyEvent* event) override;
138 void focusOutEvent(QFocusEvent* event) override;
139 void itemChange(ItemChange change, const ItemChangeData& value) override;
140
141private:
142 friend class ButtonGroup;
143 friend class TabBar;
144 void updateCheckable(bool);
145 void checkedChange();
146 void checkableChange();
147 void pressedChange();
148 void enforceAutoExclusive();
149 void activate(bool changed);
150 enum class Input
151 {
152 None,
153 Mouse,
154 Touch,
155 Key,
156 Simulated
157 };
158 void begin(Input input, const QPointF& point);
159 void move(const QPointF& point);
160 void finish(const QPointF& point);
161 void cancel();
162 void changePressed(bool value);
163 void changePoint(const QPointF& point);
164 void startTimers();
165 void stopTimers();
166 void repeat();
167 void observeWindow();
168 bool canActivate() const;
169
170 IconSpec* m_icon;
171 QPointer<QQuickItem> m_indicator;
172 QList<QMetaObject::Connection> m_indicator_connections;
173 QString m_text;
174 bool m_explicit_text = false;
175 bool m_auto_exclusive = false;
176 QPointer<Action> m_action;
177 QPointer<ButtonGroup> m_group;
178 QList<QMetaObject::Connection> m_action_connections;
179 Display m_display = TextBesideIcon;
180 Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(AbstractButton, bool, m_down, &AbstractButton::setDown,
181 false)
182 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(AbstractButton, bool, m_pressed, false)
183 Q_OBJECT_BINDABLE_PROPERTY(AbstractButton, bool, m_checked)
184 Q_OBJECT_BINDABLE_PROPERTY(AbstractButton, bool, m_checkable)
185 QPropertyNotifier m_checkedNotifier, m_checkableNotifier;
186 QPropertyNotifier m_pressedNotifier, m_downNotifier;
187 bool m_explicit_down = false;
188 bool m_auto_repeat = false;
189 bool m_held = false;
190 bool m_repeated = false;
191 bool m_double_click = false;
192 int m_repeat_delay = 300;
193 int m_repeat_interval = 100;
194 int m_hold_interval;
195 int m_touch_id = -1;
196 int m_key = 0;
197 quint64 m_sequence = 0;
198 Input m_input = Input::None;
199 QPointF m_point;
200 QPointF m_origin;
201 QTimer m_repeat_timer;
202 QTimer m_hold_timer;
203 QTimer m_animate_timer;
204 QMetaObject::Connection m_window_connection;
205};
206} // namespace qml_material