QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SkippableAsyncState.h
Go to the documentation of this file.
1#pragma once
2
3#include "WaitStateBase.h"
4
5#include <functional>
6
33{
34 Q_OBJECT
35 Q_DISABLE_COPY(SkippableAsyncState)
36
37public:
38 using SkipPredicate = std::function<bool()>;
39 using SetupFunction = std::function<void(SkippableAsyncState* state)>;
40 using SkipAction = std::function<void()>;
41
49 SkippableAsyncState(const QString& stateName,
50 QState* parent,
51 SkipPredicate skipPredicate,
52 SetupFunction setupFunc,
53 SkipAction skipAction = nullptr,
54 int timeoutMsecs = 0);
55
57 void complete() { waitComplete(); }
58
60 void fail() { waitFailed(); }
61
65 template<typename Func>
66 void connectToCompletion(typename QtPrivate::FunctionPointer<Func>::Object* sender, Func signal)
67 {
68 _completionConnection = connect(sender, signal, this, [this]() {
69 complete();
70 });
71 }
72
75 template<typename Func, typename Slot>
76 void connectToCompletion(typename QtPrivate::FunctionPointer<Func>::Object* sender, Func signal, Slot slot)
77 {
78 _completionConnection = connect(sender, signal, this, slot);
79 }
80
82 void setSkipPredicate(SkipPredicate predicate) { _skipPredicate = std::move(predicate); }
83
85 void setSetupFunction(SetupFunction setupFunc) { _setupFunction = std::move(setupFunc); }
86
88 void setSkipAction(SkipAction skipAction) { _skipAction = std::move(skipAction); }
89
90signals:
92 void skipped();
93
94protected:
95 void connectWaitSignal() override;
96 void disconnectWaitSignal() override;
97 void onWaitEntered() override;
98
99private:
100 SkipPredicate _skipPredicate;
101 SetupFunction _setupFunction;
102 SkipAction _skipAction;
103 QMetaObject::Connection _completionConnection;
104 bool _wasSkipped = false;
105};
QString stateName() const
std::function< void()> SkipAction
void connectToCompletion(typename QtPrivate::FunctionPointer< Func >::Object *sender, Func signal)
void setSkipAction(SkipAction skipAction)
Set the skip action.
void setSkipPredicate(SkipPredicate predicate)
Set the skip predicate.
void skipped()
Emitted when skip predicate returns true and the state is skipped.
std::function< bool()> SkipPredicate
void onWaitEntered() override
Called when the state is entered - subclasses should call base implementation.
void complete()
Call this to signal that the async operation has completed successfully.
std::function< void(SkippableAsyncState *state)> SetupFunction
void fail()
Call this to signal that the async operation has failed.
void setSetupFunction(SetupFunction setupFunc)
Set the setup function.
void connectWaitSignal() override
Subclasses override to set up their signal connections.
void connectToCompletion(typename QtPrivate::FunctionPointer< Func >::Object *sender, Func signal, Slot slot)
void disconnectWaitSignal() override
Subclasses override to tear down their signal connections.
int timeoutMsecs() const