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
35{
36 Q_OBJECT
37 Q_DISABLE_COPY(SkippableAsyncState)
38
39public:
40 using SkipPredicate = std::function<bool()>;
41 using SetupFunction = std::function<void(SkippableAsyncState* state)>;
42 using SkipAction = std::function<void()>;
43
51 SkippableAsyncState(const QString& stateName,
52 QState* parent,
53 SkipPredicate skipPredicate,
54 SetupFunction setupFunc,
55 SkipAction skipAction = nullptr,
56 int timeoutMsecs = 0);
57
59 void complete() { waitComplete(); }
60
62 void fail() { waitFailed(); }
63
67 template<typename Func>
68 void connectToCompletion(typename QtPrivate::FunctionPointer<Func>::Object* sender, Func signal)
69 {
70 _completionConnection = connect(sender, signal, this, [this]() {
71 complete();
72 });
73 }
74
77 template<typename Func, typename Slot>
78 void connectToCompletion(typename QtPrivate::FunctionPointer<Func>::Object* sender, Func signal, Slot slot)
79 {
80 _completionConnection = connect(sender, signal, this, slot);
81 }
82
84 void setSkipPredicate(SkipPredicate predicate) { _skipPredicate = std::move(predicate); }
85
87 void setSetupFunction(SetupFunction setupFunc) { _setupFunction = std::move(setupFunc); }
88
90 void setSkipAction(SkipAction skipAction) { _skipAction = std::move(skipAction); }
91
92signals:
94 void skipped();
95
96protected:
97 void connectWaitSignal() override;
98 void disconnectWaitSignal() override;
99 void onWaitEntered() override;
100
101private:
102 SkipPredicate _skipPredicate;
103 SetupFunction _setupFunction;
104 SkipAction _skipAction;
105 QMetaObject::Connection _completionConnection;
106 bool _wasSkipped = false;
107};
QString stateName() const
Combines skip condition checking with async operation setup in a single state.
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.
Base class for states that wait for something with optional timeout.
int timeoutMsecs() const