1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QSTATEMACHINE_H
5#define QSTATEMACHINE_H
6
7#include <QtCore/qcoreevent.h>
8#include <QtCore/qlist.h>
9#include <QtCore/qobject.h>
10#include <QtCore/qset.h>
11#include <QtCore/qvariant.h>
12
13#include <QtStateMachine/qstate.h>
14
15#if __has_include(<chrono>)
16# include <chrono>
17#endif
18
19QT_BEGIN_NAMESPACE
20
21class QStateMachinePrivate;
22class QAbstractAnimation;
23class Q_STATEMACHINE_EXPORT QStateMachine : public QState
24{
25 Q_OBJECT
26 Q_PROPERTY(QString errorString READ errorString BINDABLE bindableErrorString)
27 Q_PROPERTY(QState::RestorePolicy globalRestorePolicy READ globalRestorePolicy
28 WRITE setGlobalRestorePolicy BINDABLE bindableGlobalRestorePolicy)
29 Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
30#if QT_CONFIG(animation)
31 Q_PROPERTY(bool animated READ isAnimated WRITE setAnimated BINDABLE bindableAnimated)
32#endif
33public:
34 class Q_STATEMACHINE_EXPORT SignalEvent : public QEvent
35 {
36 public:
37 SignalEvent(QObject *sender, int signalIndex,
38 const QList<QVariant> &arguments);
39 ~SignalEvent();
40
41 inline QObject *sender() const { return m_sender; }
42 inline int signalIndex() const { return m_signalIndex; }
43 inline QList<QVariant> arguments() const { return m_arguments; }
44
45 private:
46 QObject *m_sender;
47 int m_signalIndex;
48 QList<QVariant> m_arguments;
49
50 friend class QSignalTransitionPrivate;
51 };
52
53 class Q_STATEMACHINE_EXPORT WrappedEvent : public QEvent
54 {
55 public:
56 WrappedEvent(QObject *object, QEvent *event);
57 ~WrappedEvent();
58
59 inline QObject *object() const { return m_object; }
60 inline QEvent *event() const { return m_event; }
61
62 private:
63 QObject *m_object;
64 QEvent *m_event;
65 };
66
67 enum EventPriority {
68 NormalPriority,
69 HighPriority
70 };
71
72 enum Error {
73 NoError,
74 NoInitialStateError,
75 NoDefaultStateInHistoryStateError,
76 NoCommonAncestorForTransitionError,
77 StateMachineChildModeSetToParallelError
78 };
79
80 explicit QStateMachine(QObject *parent = nullptr);
81 explicit QStateMachine(QState::ChildMode childMode, QObject *parent = nullptr);
82 ~QStateMachine();
83
84 void addState(QAbstractState *state);
85 void removeState(QAbstractState *state);
86
87 Error error() const;
88
89 QString errorString() const;
90 void clearError();
91 QBindable<QString> bindableErrorString() const;
92
93 bool isRunning() const;
94
95#if QT_CONFIG(animation)
96 bool isAnimated() const;
97 void setAnimated(bool enabled);
98 QBindable<bool> bindableAnimated();
99
100 void addDefaultAnimation(QAbstractAnimation *animation);
101 QList<QAbstractAnimation *> defaultAnimations() const;
102 void removeDefaultAnimation(QAbstractAnimation *animation);
103#endif // animation
104
105 QState::RestorePolicy globalRestorePolicy() const;
106 void setGlobalRestorePolicy(QState::RestorePolicy restorePolicy);
107 QBindable<QState::RestorePolicy> bindableGlobalRestorePolicy();
108
109 void postEvent(QEvent *event, EventPriority priority = NormalPriority);
110 int postDelayedEvent(QEvent *event, int delay);
111 bool cancelDelayedEvent(int id);
112
113 QSet<QAbstractState*> configuration() const;
114
115 bool eventFilter(QObject *watched, QEvent *event) override;
116
117#if __has_include(<chrono>) || defined(Q_QDOC)
118 int postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
119 {
120 return postDelayedEvent(event, delay: int(delay.count()));
121 }
122#endif
123
124public Q_SLOTS:
125 void start();
126 void stop();
127 void setRunning(bool running);
128
129Q_SIGNALS:
130 void started(QPrivateSignal);
131 void stopped(QPrivateSignal);
132 void runningChanged(bool running);
133
134
135protected:
136 void onEntry(QEvent *event) override;
137 void onExit(QEvent *event) override;
138
139 virtual void beginSelectTransitions(QEvent *event);
140 virtual void endSelectTransitions(QEvent *event);
141
142 virtual void beginMicrostep(QEvent *event);
143 virtual void endMicrostep(QEvent *event);
144
145 bool event(QEvent *e) override;
146
147protected:
148 QStateMachine(QStateMachinePrivate &dd, QObject *parent);
149
150private:
151 Q_DISABLE_COPY(QStateMachine)
152 Q_DECLARE_PRIVATE(QStateMachine)
153 Q_PRIVATE_SLOT(d_func(), void _q_start())
154 Q_PRIVATE_SLOT(d_func(), void _q_process())
155#if QT_CONFIG(animation)
156 Q_PRIVATE_SLOT(d_func(), void _q_animationFinished())
157#endif
158 Q_PRIVATE_SLOT(d_func(), void _q_startDelayedEventTimer(int, int))
159 Q_PRIVATE_SLOT(d_func(), void _q_killDelayedEventTimer(int, int))
160};
161
162QT_END_NAMESPACE
163
164#endif
165

source code of qtscxml/src/statemachine/qstatemachine.h