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"
12class QML_MATERIAL_API AbstractButton :
public Control {
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)
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)
49 explicit AbstractButton(QQuickItem* parent =
nullptr);
50 ~AbstractButton()
override;
52 void setText(
const QString& value);
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;
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);
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();
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;
142 friend class ButtonGroup;
144 void updateCheckable(
bool);
145 void checkedChange();
146 void checkableChange();
147 void pressedChange();
148 void enforceAutoExclusive();
149 void activate(
bool changed);
158 void begin(Input input,
const QPointF& point);
159 void move(
const QPointF& point);
160 void finish(
const QPointF& point);
162 void changePressed(
bool value);
163 void changePoint(
const QPointF& point);
167 void observeWindow();
168 bool canActivate()
const;
171 QPointer<QQuickItem> m_indicator;
172 QList<QMetaObject::Connection> m_indicator_connections;
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,
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;
190 bool m_repeated = false;
191 bool m_double_click = false;
192 int m_repeat_delay = 300;
193 int m_repeat_interval = 100;
197 quint64 m_sequence = 0;
198 Input m_input = Input::None;
201 QTimer m_repeat_timer;
203 QTimer m_animate_timer;
204 QMetaObject::Connection m_window_connection;