QmlMaterial 0.1.0
Loading...
Searching...
No Matches
action.hpp
1#pragma once
2
3#include <QPointer>
4#include <QProperty>
5#include <QQmlComponent>
6#include <QQmlListProperty>
7#include "qml_material/control/icon_spec.hpp"
8
9namespace qml_material
10{
11class ActionGroup;
12class QML_MATERIAL_API Action : public QObject {
13 Q_OBJECT
14 QML_NAMED_ELEMENT(Action)
15 Q_CLASSINFO("DefaultProperty", "data")
16 Q_PROPERTY(QQmlListProperty<QObject> data READ data NOTIFY dataChanged FINAL)
17 Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged BINDABLE
18 bindableVisible FINAL)
19 Q_PROPERTY(int displayHint READ displayHint WRITE setDisplayHint NOTIFY displayHintChanged
20 BINDABLE bindableDisplayHint FINAL)
21 Q_PROPERTY(int busy READ busy WRITE setBusy NOTIFY busyChanged BINDABLE bindableBusy FINAL)
22 Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged BINDABLE
23 bindableProgress FINAL)
24 Q_PROPERTY(bool closeMenu READ closeMenu WRITE setCloseMenu NOTIFY closeMenuChanged BINDABLE
25 bindableCloseMenu FINAL)
26 Q_PROPERTY(bool separator READ isSeparator WRITE setSeparator NOTIFY separatorChanged BINDABLE
27 bindableSeparator FINAL)
28 Q_PROPERTY(QString tooltip READ tooltip WRITE setTooltip NOTIFY tooltipChanged BINDABLE
29 bindableTooltip FINAL)
30 Q_PROPERTY(QQmlComponent* displayComponent READ displayComponent WRITE setDisplayComponent
31 NOTIFY displayComponentChanged FINAL)
32 Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged BINDABLE bindableText FINAL)
33 Q_PROPERTY(ActionIcon* icon READ icon CONSTANT FINAL)
34 Q_PROPERTY(
35 bool enabled READ isEnabled WRITE setEnabled RESET resetEnabled NOTIFY enabledChanged FINAL)
36 Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable NOTIFY checkableChanged FINAL)
37 Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY checkedChanged FINAL)
38public:
39 explicit Action(QObject* parent = nullptr);
40 QBindable<bool> bindableVisible() { return QBindable<bool>(&m_visible); }
41 QBindable<int> bindableDisplayHint() { return QBindable<int>(&m_displayHint); }
42 QBindable<int> bindableBusy() { return QBindable<int>(&m_busy); }
43 QBindable<qreal> bindableProgress() { return QBindable<qreal>(&m_progress); }
44 QBindable<bool> bindableCloseMenu() { return QBindable<bool>(&m_closeMenu); }
45 QBindable<bool> bindableSeparator() { return QBindable<bool>(&m_separator); }
46 QBindable<QString> bindableTooltip() { return QBindable<QString>(&m_tooltip); }
47 QBindable<QString> bindableText() { return QBindable<QString>(&m_text); }
48 QBindable<bool> bindableCheckable() { return QBindable<bool>(&m_checkable); }
49 QBindable<bool> bindableChecked() { return QBindable<bool>(&m_checked); }
50 ~Action() override;
51 QQmlListProperty<QObject> data();
52 bool isVisible() const { return m_visible; }
53 void setVisible(bool);
54 Q_SIGNAL void visibleChanged();
55 int displayHint() const { return m_displayHint; }
56 void setDisplayHint(int);
57 Q_SIGNAL void displayHintChanged();
58 int busy() const { return m_busy; }
59 void setBusy(int);
60 Q_SIGNAL void busyChanged();
61 qreal progress() const { return m_progress; }
62 void setProgress(qreal);
63 Q_SIGNAL void progressChanged();
64 bool closeMenu() const { return m_closeMenu; }
65 void setCloseMenu(bool);
66 Q_SIGNAL void closeMenuChanged();
67 bool isSeparator() const { return m_separator; }
68 void setSeparator(bool);
69 Q_SIGNAL void separatorChanged();
70 QString tooltip() const { return m_tooltip; }
71 void setTooltip(const QString&);
72 Q_SIGNAL void tooltipChanged();
73 QQmlComponent* displayComponent() const { return m_displayComponent; }
74 void setDisplayComponent(QQmlComponent*);
75 Q_SIGNAL void displayComponentChanged();
76 Q_SIGNAL void dataChanged();
77 QString text() const { return m_text; }
78 void setText(const QString&);
79 ActionIcon* icon() const { return m_icon; }
80 bool isEnabled() const;
81 void setEnabled(bool);
82 void resetEnabled() { setEnabled(true); }
83 bool isCheckable() const { return m_checkable; }
84 void setCheckable(bool);
85 bool isChecked() const { return m_checked; }
86 void setChecked(bool);
87 ActionGroup* group() const;
88 void setGroup(ActionGroup*);
89 bool canToggle() const;
90 bool canTrigger() const { return isEnabled() && ! m_triggering; }
91 Q_INVOKABLE void toggle(QObject* source = nullptr);
92 Q_INVOKABLE void trigger(QObject* source = nullptr);
93 // Activates a presentation that has already applied its checked transition.
94 void triggerFromControl(QObject* source, bool toggled);
95 Q_SIGNAL void textChanged();
96 Q_SIGNAL void enabledChanged();
97 Q_SIGNAL void checkableChanged();
98 Q_SIGNAL void checkedChanged();
99 Q_SIGNAL void groupChanged();
100 Q_SIGNAL void toggled(QObject* source);
101 Q_SIGNAL void triggered(QObject* source);
102
103private:
104 friend class ActionGroup;
105 friend class AbstractButton;
106 void updateChecked(bool);
107 void updateCheckable(bool);
108 void checkedChange();
109 void appendData(QObject*);
110 QList<QObject*> m_data;
111 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, bool, m_visible, true, &Action::visibleChanged)
112 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, int, m_displayHint, 0, &Action::displayHintChanged)
113 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, int, m_busy, 0, &Action::busyChanged)
114 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, qreal, m_progress, 0, &Action::progressChanged)
115 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, bool, m_closeMenu, true, &Action::closeMenuChanged)
116 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, bool, m_separator, false,
117 &Action::separatorChanged)
118 Q_OBJECT_BINDABLE_PROPERTY(Action, QString, m_tooltip, &Action::tooltipChanged)
119 QPointer<QQmlComponent> m_displayComponent;
120 QMetaObject::Connection m_displayComponentConnection;
121 Q_OBJECT_BINDABLE_PROPERTY(Action, QString, m_text, &Action::textChanged)
122 ActionIcon* m_icon;
123 QPointer<ActionGroup> m_group;
124 bool m_enabled = true;
125 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, bool, m_checkable, false)
126 Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(Action, bool, m_checked, false)
127 QPropertyNotifier m_checkedNotifier, m_checkableNotifier;
128 bool m_triggering = false;
129};
130} // namespace qml_material