26#ifndef TGUI_SIGNAL_HPP
27#define TGUI_SIGNAL_HPP
31#include <TGUI/Global.hpp>
32#include <TGUI/String.hpp>
33#include <TGUI/Color.hpp>
34#include <TGUI/Vector2.hpp>
35#include <TGUI/Animation.hpp>
36#include <TGUI/Filesystem.hpp>
37#include <unordered_map>
74 m_name{std::move(name)}
76 if (1 + extraParameters > m_parameters.size())
77 m_parameters.resize(1 + extraParameters);
113 template <
typename Func,
typename... BoundArgs>
114 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
116 return connect(func, args...);
128 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
129 unsigned int connect(
const Func& func,
const BoundArgs&... args)
131 const auto id = ++m_lastSignalId;
132#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
133 if constexpr(
sizeof...(BoundArgs) == 0)
134 m_handlers[id] = func;
138 m_handlers[id] = [=]{ invokeFunc(func, args...); };
153 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., std::shared_ptr<Widget>,
const String&)>>::value>* =
nullptr>
154 unsigned int connectEx(
const Func& func,
const BoundArgs&... args)
157 return connect([func, name=m_name, args...](){ invokeFunc(func, args..., getWidget(), name); });
238 template <
typename Type>
241 return *
static_cast<const std::decay_t<Type>*
>(m_parameters[paramIndex]);
245#if defined(__cpp_lib_invoke) && (__cpp_lib_invoke >= 201411L)
246 template <
typename Func,
typename... Args>
247 static void invokeFunc(Func&& func, Args&&... args)
249 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
253 template <
typename Func,
typename... Args,
typename std::enable_if<std::is_member_pointer<std::decay_t<Func>>::value>::type* =
nullptr>
254 static void invokeFunc(Func&& func, Args&&... args)
256 (std::mem_fn(func))(std::forward<Args>(args)...);
259 template <
typename Func,
typename... Args,
typename std::enable_if<!std::is_member_pointer<std::decay_t<Func>>::value>::type* =
nullptr>
260 static void invokeFunc(Func&& func, Args&&... args)
262 std::forward<Func>(func)(std::forward<Args>(args)...);
270 bool m_enabled =
true;
272 std::unordered_map<
unsigned int, std::function<void()>> m_handlers;
274 static unsigned int m_lastSignalId;
275 static std::deque<const void*> m_parameters;
285 template <
typename T>
294 Signal{std::move(name), 1}
307 template <
typename Func,
typename... BoundArgs>
308 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
322 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
323 unsigned int connect(
const Func& func,
const BoundArgs&... args)
337 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T)>>::value>* =
nullptr>
338 unsigned int connect(
const Func& func,
const BoundArgs&... args)
340 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<T>(1)); });
354 if (m_handlers.empty())
357 m_parameters[1] =
static_cast<const void*
>(¶m);
369 template <
typename T1,
typename T2>
378 Signal{std::move(name), 2}
391 template <
typename Func,
typename... BoundArgs>
392 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
406 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
407 unsigned int connect(
const Func& func,
const BoundArgs&... args)
421 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T1, T2)>>::value>* =
nullptr>
422 unsigned int connect(
const Func& func,
const BoundArgs&... args)
424 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<T1>(1), dereferenceParam<T2>(2)); });
439 if (m_handlers.empty())
442 m_parameters[1] =
static_cast<const void*
>(¶m1);
443 m_parameters[2] =
static_cast<const void*
>(¶m2);
473 Signal{std::move(name), 1}
486 template <
typename Func,
typename... BoundArgs>
487 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
489 return connect(func, args...);
501 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
502 unsigned int connect(
const Func& func,
const BoundArgs&... args)
504 return Signal::connect(func, args...);
516 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<ChildWindow>&)>>::value>* =
nullptr>
517 unsigned int connect(
const Func& func,
const BoundArgs&... args)
519 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceChildWindow()); });
539 static std::shared_ptr<ChildWindow> dereferenceChildWindow();
562 Signal{std::move(name), 3}
575 template <
typename Func,
typename... BoundArgs>
576 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
578 return connect(func, args...);
590 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
591 unsigned int connect(
const Func& func,
const BoundArgs&... args)
593 return Signal::connect(func, args...);
605 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int)>>::value>* =
nullptr>
606 unsigned int connect(
const Func& func,
const BoundArgs&... args)
608 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<int>(1)); });
620 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
621 unsigned int connect(
const Func& func,
const BoundArgs&... args)
623 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(2)); });
635 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&,
const String&)>>::value>* =
nullptr>
636 unsigned int connect(
const Func& func,
const BoundArgs&... args)
638 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(2), dereferenceParam<String>(3)); });
675 Signal{std::move(name), 3}
687 template <
typename Func,
typename... BoundArgs>
688 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
690 return connect(func, args...);
701 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
702 unsigned int connect(
const Func& func,
const BoundArgs&... args)
704 return Signal::connect(func, args...);
715 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
716 unsigned int connect(
const Func& func,
const BoundArgs&... args)
718 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(1)); });
729 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const Filesystem::Path&)>>::value>* =
nullptr>
730 unsigned int connect(
const Func& func,
const BoundArgs&... args)
732 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<Filesystem::Path>(2)); });
743 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::vector<Filesystem::Path>&)>>::value>* =
nullptr>
744 unsigned int connect(
const Func& func,
const BoundArgs&... args)
746 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<std::vector<Filesystem::Path>>(3)); });
757 bool emit(
const Widget* widget,
const std::vector<Filesystem::Path>& paths);
777 Signal{std::move(name), 2}
790 template <
typename Func,
typename... BoundArgs>
791 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
793 return connect(func, args...);
805 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
806 unsigned int connect(
const Func& func,
const BoundArgs&... args)
808 return Signal::connect(func, args...);
820 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType)>>::value>* =
nullptr>
821 unsigned int connect(
const Func& func,
const BoundArgs&... args)
823 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<ShowEffectType>(1)); });
835 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
bool)>>::value>* =
nullptr>
836 unsigned int connect(
const Func& func,
const BoundArgs&... args)
838 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<bool>(2)); });
850 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType,
bool)>>::value>* =
nullptr>
851 unsigned int connect(
const Func& func,
const BoundArgs&... args)
853 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<ShowEffectType>(1), dereferenceParam<bool>(2)); });
887 Signal{std::move(name), 1}
900 template <
typename Func,
typename... BoundArgs>
901 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
903 return connect(func, args...);
915 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
916 unsigned int connect(
const Func& func,
const BoundArgs&... args)
918 return Signal::connect(func, args...);
930 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
AnimationType)>>::value>* =
nullptr>
931 unsigned int connect(
const Func& func,
const BoundArgs&... args)
933 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<AnimationType>(1)); });
967 Signal{std::move(name), 2}
980 template <
typename Func,
typename... BoundArgs>
981 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
983 return connect(func, args...);
995 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
996 unsigned int connect(
const Func& func,
const BoundArgs&... args)
998 return Signal::connect(func, args...);
1010 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
1011 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1013 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(1)); });
1025 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::vector<String>&)>>::value>* =
nullptr>
1026 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1028 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<std::vector<String>>(2)); });
Child window widget.
Definition: ChildWindow.hpp:44
Object to represent paths on a filesystem.
Definition: Filesystem.hpp:56
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:880
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:916
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:901
SignalAnimationType(String &&name)
Constructor.
Definition: Signal.hpp:886
bool emit(const Widget *widget, AnimationType type)
Call all connected signal handlers.
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:466
SignalChildWindow(String &&name)
Constructor.
Definition: Signal.hpp:472
bool emit(ChildWindow *param)
Call all connected signal handlers.
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:517
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:487
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:502
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:668
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:688
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:702
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:744
bool emit(const Widget *widget, const std::vector< Filesystem::Path > &paths)
Call all connected signal handlers.
SignalFileDialogPaths(String &&name)
Constructor.
Definition: Signal.hpp:674
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:960
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:1026
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:996
SignalItemHierarchy(String &&name)
Constructor.
Definition: Signal.hpp:966
bool emit(const Widget *widget, const String &item, const std::vector< String > &fullItem)
Call all connected signal handlers.
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:981
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:555
bool emit(const Widget *widget, int index, const String &item, const String &id)
Call all connected signal handlers.
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:576
SignalItem(String &&name)
Constructor.
Definition: Signal.hpp:561
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:591
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:770
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:806
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:791
bool emit(const Widget *widget, ShowEffectType type, bool visible)
Call all connected signal handlers.
SignalShowEffect(String &&name)
Constructor.
Definition: Signal.hpp:776
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:371
bool emit(const Widget *widget, T1 param1, T2 param2)
Call all connected signal handlers.
Definition: Signal.hpp:437
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:407
SignalTyped2(String &&name)
Constructor.
Definition: Signal.hpp:377
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:392
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:287
SignalTyped(String &&name)
Constructor.
Definition: Signal.hpp:293
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:308
bool emit(const Widget *widget, T param)
Call all connected signal handlers.
Definition: Signal.hpp:352
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:323
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:58
bool emit(const Widget *widget)
Call all connected signal handlers.
Signal(const Signal &other)
Copy constructor which will not copy the signal handlers.
static const std::decay_t< Type > & dereferenceParam(std::size_t paramIndex)
Turns the void* parameters back into its original type right before calling the callback function.
Definition: Signal.hpp:239
unsigned int operator()(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:114
bool isEnabled() const
Returns whether this signal calls the connected functions when triggered.
Definition: Signal.hpp:220
void disconnectAll()
Disconnect all signal handler from this signal.
void setEnabled(bool enabled)
Changes whether this signal calls the connected functions when triggered.
Definition: Signal.hpp:206
bool disconnect(unsigned int id)
Disconnect a signal handler from this signal.
Signal & operator=(const Signal &other)
Copy assignment operator which will not copy the signal handlers.
String getName() const
Returns the name given to the signal.
Definition: Signal.hpp:192
unsigned int connect(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:129
virtual ~Signal()=default
Default destructor.
Signal(String &&name, std::size_t extraParameters=0)
Constructor.
Definition: Signal.hpp:73
Signal & operator=(Signal &&other) noexcept=default
Default move assignment operator.
Signal(Signal &&other) noexcept=default
Default move constructor.
static std::shared_ptr< Widget > getWidget()
Extracts the widget stored in the first parameter.
unsigned int connectEx(const Func &func, const BoundArgs &... args)
Connects a signal handler that will be called when this signal is emitted.
Definition: Signal.hpp:154
Wrapper class to store strings.
Definition: String.hpp:79
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
ShowEffectType
Type of effect to show/hide widget.
Definition: Animation.hpp:44
AnimationType
Type of animation.
Definition: Animation.hpp:63