QmlMaterial 0.1.0
Loading...
Searching...
No Matches
action_group.hpp
1#pragma once
2
3#include <QHash>
4#include <QQmlListProperty>
5#include <qqml.h>
6#include "qml_material/control/action.hpp"
7#include "qml_material/util/selection_set.hpp"
8
9namespace qml_material
10{
11class ActionGroupAttached;
12class QML_MATERIAL_API ActionGroup : public QObject {
13 Q_OBJECT
14 QML_NAMED_ELEMENT(ActionGroup)
15 QML_ATTACHED(ActionGroupAttached)
16 Q_CLASSINFO("DefaultProperty", "actions")
17 Q_PROPERTY(QQmlListProperty<Action> actions READ actions NOTIFY actionsChanged FINAL)
18 Q_PROPERTY(Action* checkedAction READ checkedAction WRITE setCheckedAction NOTIFY
19 checkedActionChanged FINAL)
20 Q_PROPERTY(bool exclusive READ isExclusive WRITE setExclusive NOTIFY exclusiveChanged FINAL)
21 Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged FINAL)
22public:
23 explicit ActionGroup(QObject* parent = nullptr): QObject(parent) {}
24 ~ActionGroup() override;
25 static ActionGroupAttached* qmlAttachedProperties(QObject*);
26 QQmlListProperty<Action> actions();
27 Action* checkedAction() const { return m_selection.selected; }
28 void setCheckedAction(Action*);
29 bool isExclusive() const { return m_selection.exclusive; }
30 void setExclusive(bool);
31 bool isEnabled() const { return m_enabled; }
32 void setEnabled(bool);
33 Q_INVOKABLE void addAction(Action*);
34 Q_INVOKABLE void removeAction(Action*);
35 Q_SIGNAL void actionsChanged();
36 Q_SIGNAL void checkedActionChanged();
37 Q_SIGNAL void exclusiveChanged();
38 Q_SIGNAL void enabledChanged();
39 Q_SIGNAL void triggered(Action* action);
40
41private:
42 friend class Action;
43 void update(Action* preferred = nullptr);
44 void clear();
45 utils::SelectionSet<Action> m_selection;
46 QHash<Action*, QList<QMetaObject::Connection>> m_connections;
47 Action* m_notified_selected = nullptr;
48 bool m_enabled = true;
49 bool m_destroying = false;
50};
51
52class QML_MATERIAL_API ActionGroupAttached : public QObject {
53 Q_OBJECT
54 Q_PROPERTY(ActionGroup* group READ group WRITE setGroup NOTIFY groupChanged FINAL)
55public:
56 explicit ActionGroupAttached(QObject*);
57 ActionGroup* group() const;
58 void setGroup(ActionGroup*);
59 Q_SIGNAL void groupChanged();
60
61private:
62 QPointer<Action> m_member;
63};
64} // namespace qml_material
65QML_DECLARE_TYPEINFO(qml_material::ActionGroup, QML_HAS_ATTACHED_PROPERTIES)