QmlMaterial 0.1.0
Loading...
Searching...
No Matches
button_group.hpp
1#pragma once
2
3#include <QHash>
4#include <QQmlListProperty>
5#include <qqml.h>
6#include "qml_material/control/abstract_button.hpp"
7#include "qml_material/util/selection_set.hpp"
8
9namespace qml_material
10{
11class ButtonGroupAttached;
12class QML_MATERIAL_API ButtonGroup : public QObject {
13 Q_OBJECT
14 QML_NAMED_ELEMENT(ButtonGroup)
15 QML_ATTACHED(ButtonGroupAttached)
16
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)
23public:
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);
41
42private:
43 friend class AbstractButton;
44 void update(AbstractButton* preferred = nullptr);
45 void clear();
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;
51};
52
53class QML_MATERIAL_API ButtonGroupAttached : public QObject {
54 Q_OBJECT
55 Q_PROPERTY(ButtonGroup* group READ group WRITE setGroup NOTIFY groupChanged FINAL)
56public:
57 explicit ButtonGroupAttached(QObject*);
58 ButtonGroup* group() const;
59 void setGroup(ButtonGroup*);
60 Q_SIGNAL void groupChanged();
61
62private:
63 QPointer<AbstractButton> m_member;
64};
65} // namespace qml_material
66QML_DECLARE_TYPEINFO(qml_material::ButtonGroup, QML_HAS_ATTACHED_PROPERTIES)