4#include <QQmlListProperty>
6#include "qml_material/control/abstract_button.hpp"
7#include "qml_material/util/selection_set.hpp"
11class ButtonGroupAttached;
12class QML_MATERIAL_API ButtonGroup :
public QObject {
14 QML_NAMED_ELEMENT(ButtonGroup)
15 QML_ATTACHED(ButtonGroupAttached)
17 Q_PROPERTY(QQmlListProperty<AbstractButton> buttons READ buttons NOTIFY buttonsChanged FINAL)
18 Q_PROPERTY(AbstractButton* checkedButton READ checkedButton WRITE setCheckedButton NOTIFY
19 checkedButtonChanged FINAL)
20 Q_PROPERTY(
bool exclusive READ isExclusive WRITE setExclusive NOTIFY exclusiveChanged FINAL)
21 Q_PROPERTY(Qt::CheckState checkState READ checkState WRITE setCheckState NOTIFY
22 checkStateChanged FINAL)
24 explicit ButtonGroup(QObject* parent =
nullptr): QObject(parent) {}
25 ~ButtonGroup()
override;
26 static ButtonGroupAttached* qmlAttachedProperties(QObject*);
27 QQmlListProperty<AbstractButton> buttons();
28 AbstractButton* checkedButton()
const {
return m_selection.selected; }
29 void setCheckedButton(AbstractButton*);
30 bool isExclusive()
const {
return m_selection.exclusive; }
31 void setExclusive(
bool);
32 Qt::CheckState checkState()
const {
return m_check_state; }
33 void setCheckState(Qt::CheckState);
34 Q_INVOKABLE
void addButton(AbstractButton*);
35 Q_INVOKABLE
void removeButton(AbstractButton*);
36 Q_SIGNAL
void buttonsChanged();
37 Q_SIGNAL
void checkedButtonChanged();
38 Q_SIGNAL
void exclusiveChanged();
39 Q_SIGNAL
void checkStateChanged();
40 Q_SIGNAL
void clicked(AbstractButton* button);
43 friend class AbstractButton;
44 void update(AbstractButton* preferred =
nullptr);
46 utils::SelectionSet<AbstractButton> m_selection;
47 QHash<AbstractButton*, QList<QMetaObject::Connection>> m_connections;
48 AbstractButton* m_notified_selected =
nullptr;
49 Qt::CheckState m_check_state = Qt::Unchecked;
50 bool m_destroying =
false;
53class QML_MATERIAL_API ButtonGroupAttached :
public QObject {
55 Q_PROPERTY(ButtonGroup* group READ group WRITE setGroup NOTIFY groupChanged FINAL)
57 explicit ButtonGroupAttached(QObject*);
58 ButtonGroup* group()
const;
59 void setGroup(ButtonGroup*);
60 Q_SIGNAL
void groupChanged();
63 QPointer<AbstractButton> m_member;
66QML_DECLARE_TYPEINFO(qml_material::ButtonGroup, QML_HAS_ATTACHED_PROPERTIES)