7 #ifndef _FCITX_UTILS_CONNECTABLEOBJECT_H_ 8 #define _FCITX_UTILS_CONNECTABLEOBJECT_H_ 14 #include <fcitx-utils/fcitxutils_export.h> 15 #include <fcitx-utils/macros.h> 25 #define FCITX_DECLARE_SIGNAL(CLASS_NAME, NAME, ...) \ 27 using signalType = __VA_ARGS__; \ 28 using signature = fcitxMakeMetaString(#CLASS_NAME "::" #NAME); \ 32 #define FCITX_DEFINE_SIGNAL(CLASS_NAME, NAME) \ 33 ::fcitx::SignalAdaptor<CLASS_NAME::NAME> CLASS_NAME##NAME##Adaptor { this } 36 #define FCITX_DEFINE_SIGNAL_PRIVATE(CLASS_NAME, NAME) \ 37 ::fcitx::SignalAdaptor<CLASS_NAME::NAME> CLASS_NAME##NAME##Adaptor { q_ptr } 41 class ConnectableObject;
44 template <
typename T,
typename Combiner = LastValue<
typename std::function<
45 typename T::signalType>::result_type>>
59 template <
typename T,
typename Combiner>
66 template <
typename SignalType,
typename F>
68 auto signal = findSignal(SignalType::signature::data());
72 ->connect(std::forward<F>(func));
77 template <
typename SignalType>
78 void disconnectAll() {
79 auto signal = findSignal(SignalType::signature::data());
94 template <
typename SignalType,
typename... Args>
95 auto emit(Args &&...args) {
96 return std::as_const(*this).emit<SignalType>(
97 std::forward<Args>(args)...);
100 template <
typename SignalType,
typename... Args>
101 auto emit(Args &&...args)
const {
102 auto signal = findSignal(SignalType::signature::data());
104 signal))(std::forward<Args>(args)...);
107 template <
typename SignalType,
108 typename Combiner =
LastValue<
typename std::function<
109 typename SignalType::signalType>::result_type>>
110 void registerSignal() {
112 SignalType::signature::data(),
117 template <
typename SignalType>
118 void unregisterSignal() {
119 _unregisterSignal(SignalType::signature::data());
123 void _registerSignal(std::string name, std::unique_ptr<SignalBase> signal);
124 void _unregisterSignal(
const std::string &name);
126 SignalBase *findSignal(
const std::string &name);
127 SignalBase *findSignal(
const std::string &name)
const;
129 std::unique_ptr<ConnectableObjectPrivate> d_ptr;
133 template <
typename T,
typename Combiner>
135 self->registerSignal<T, Combiner>();
138 template <
typename T,
typename Combiner>
140 self->unregisterSignal<T>();
147 #endif // _FCITX_UTILS_CONNECTABLEOBJECT_H_ Base class for all object supports connection.
#define FCITX_DECLARE_SIGNAL(CLASS_NAME, NAME,...)
Declare signal by type.
Helper class to register class.
Class to represent a signal. May be used like a functor.
A signal-slot implemention.
Combiner that return the last value.