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>
38#if !TGUI_EXPERIMENTAL_USE_STD_MODULE
39 #include <unordered_map>
40 #include <type_traits>
52TGUI_MODULE_EXPORT
namespace tgui
78 m_name{std::move(name)}
80 if (1 + extraParameters > m_parameters.size())
81 m_parameters.resize(1 + extraParameters);
117 template <
typename Func,
typename... BoundArgs>
118 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
120 return connect(func, args...);
132 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
133 unsigned int connect(
const Func& func,
const BoundArgs&... args)
135 const auto id = ++m_lastSignalId;
136#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
137 if constexpr(
sizeof...(BoundArgs) == 0)
138 m_handlers[id] = func;
142 m_handlers[id] = [=]{ invokeFunc(func, args...); };
157 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>
158 unsigned int connectEx(
const Func& func,
const BoundArgs&... args)
161 return connect([func, name=m_name, args...](){ invokeFunc(func, args..., getWidget(), name); });
242 template <
typename Type>
245 return *
static_cast<const std::decay_t<Type>*
>(m_parameters[paramIndex]);
249#if defined(__cpp_lib_invoke) && (__cpp_lib_invoke >= 201411L)
250 template <
typename Func,
typename... Args>
251 static void invokeFunc(Func&& func, Args&&... args)
253 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
257 template <
typename Func,
typename... Args,
typename std::enable_if_t<std::is_member_pointer<std::decay_t<Func>>::value>* =
nullptr>
258 static void invokeFunc(Func&& func, Args&&... args)
260 (std::mem_fn(func))(std::forward<Args>(args)...);
263 template <
typename Func,
typename... Args,
typename std::enable_if_t<!std::is_member_pointer<std::decay_t<Func>>::value>* =
nullptr>
264 static void invokeFunc(Func&& func, Args&&... args)
266 std::forward<Func>(func)(std::forward<Args>(args)...);
274 bool m_enabled =
true;
276 std::unordered_map<
unsigned int, std::function<void()>> m_handlers;
278 static unsigned int m_lastSignalId;
279 static std::deque<const void*> m_parameters;
289 template <
typename T>
298 Signal{std::move(name), 1}
311 template <
typename Func,
typename... BoundArgs>
312 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
326 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
327 unsigned int connect(
const Func& func,
const BoundArgs&... args)
341 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T)>>::value>* =
nullptr>
342 unsigned int connect(
const Func& func,
const BoundArgs&... args)
344 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<T>(1)); });
358 if (m_handlers.empty())
361 m_parameters[1] =
static_cast<const void*
>(¶m);
373 template <
typename T1,
typename T2>
382 Signal{std::move(name), 2}
395 template <
typename Func,
typename... BoundArgs>
396 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
410 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
411 unsigned int connect(
const Func& func,
const BoundArgs&... args)
425 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T1, T2)>>::value>* =
nullptr>
426 unsigned int connect(
const Func& func,
const BoundArgs&... args)
428 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<T1>(1), dereferenceParam<T2>(2)); });
443 if (m_handlers.empty())
446 m_parameters[1] =
static_cast<const void*
>(¶m1);
447 m_parameters[2] =
static_cast<const void*
>(¶m2);
477 Signal{std::move(name), 1}
490 template <
typename Func,
typename... BoundArgs>
491 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
493 return connect(func, args...);
505 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
506 unsigned int connect(
const Func& func,
const BoundArgs&... args)
508 return Signal::connect(func, args...);
520 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>
521 unsigned int connect(
const Func& func,
const BoundArgs&... args)
523 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceChildWindow()); });
543 static std::shared_ptr<ChildWindow> dereferenceChildWindow();
566 Signal{std::move(name), 3}
579 template <
typename Func,
typename... BoundArgs>
580 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
582 return connect(func, args...);
594 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
595 unsigned int connect(
const Func& func,
const BoundArgs&... args)
597 return Signal::connect(func, args...);
609 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int)>>::value>* =
nullptr>
610 unsigned int connect(
const Func& func,
const BoundArgs&... args)
612 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<int>(1)); });
624 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
625 unsigned int connect(
const Func& func,
const BoundArgs&... args)
627 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(2)); });
639 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>
640 unsigned int connect(
const Func& func,
const BoundArgs&... args)
642 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(2), dereferenceParam<String>(3)); });
681 Signal{std::move(name), 3}
693 template<
typename Func,
typename... BoundArgs>
694 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
696 return connect(func, args...);
708 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
709 unsigned int connect(
const Func& func,
const BoundArgs&... args)
711 return Signal::connect(func, args...);
723 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int)>>::value>* =
nullptr>
724 unsigned int connect(
const Func& func,
const BoundArgs&... args)
726 return Signal::connect([=] { invokeFunc(func, args..., dereferenceParam<int>(1)); });
738 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Panel>&)>>::value>* =
nullptr>
739 unsigned int connect(
const Func& func,
const BoundArgs&... args)
741 return Signal::connect([=] { invokeFunc(func, args..., dereferencePanel()); });
753 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
754 unsigned int connect(
const Func& func,
const BoundArgs&... args)
756 return Signal::connect([=] { invokeFunc(func, args..., dereferenceParam<String>(3)); });
768 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int,
const std::shared_ptr<Panel>&)>>::value>* =
nullptr>
769 unsigned int connect(
const Func& func,
const BoundArgs&... args)
771 return Signal::connect([=] { invokeFunc(func, args..., dereferenceParam<int>(1), dereferencePanel()); });
783 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Panel>&,
const String&)>>::value>* =
nullptr>
784 unsigned int connect(
const Func& func,
const BoundArgs&... args)
786 return Signal::connect([=] { invokeFunc(func, args..., dereferencePanel(), dereferenceParam<String>(3)); });
798 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int,
const std::shared_ptr<Panel>&,
const String&)>>::value>* =
nullptr>
799 unsigned int connect(
const Func& func,
const BoundArgs&... args)
801 return Signal::connect([=] { invokeFunc(func, args..., dereferenceParam<int>(1), dereferencePanel(), dereferenceParam<String>(3)); });
815 bool emit(
const Widget* widget,
int index,
const std::shared_ptr<Panel>& panel,
const String&
id);
824 static std::shared_ptr<Panel> dereferencePanel();
846 Signal{std::move(name), 3}
858 template <
typename Func,
typename... BoundArgs>
859 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
861 return connect(func, args...);
872 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
873 unsigned int connect(
const Func& func,
const BoundArgs&... args)
875 return Signal::connect(func, args...);
886 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
887 unsigned int connect(
const Func& func,
const BoundArgs&... args)
889 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(1)); });
900 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const Filesystem::Path&)>>::value>* =
nullptr>
901 unsigned int connect(
const Func& func,
const BoundArgs&... args)
903 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<Filesystem::Path>(2)); });
914 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>
915 unsigned int connect(
const Func& func,
const BoundArgs&... args)
917 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<std::vector<Filesystem::Path>>(3)); });
928 bool emit(
const Widget* widget,
const std::vector<Filesystem::Path>& paths);
948 Signal{std::move(name), 2}
961 template <
typename Func,
typename... BoundArgs>
962 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
964 return connect(func, args...);
976 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
977 unsigned int connect(
const Func& func,
const BoundArgs&... args)
979 return Signal::connect(func, args...);
991 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType)>>::value>* =
nullptr>
992 unsigned int connect(
const Func& func,
const BoundArgs&... args)
994 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<ShowEffectType>(1)); });
1006 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
bool)>>::value>* =
nullptr>
1007 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1009 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<bool>(2)); });
1021 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType,
bool)>>::value>* =
nullptr>
1022 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1024 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<ShowEffectType>(1), dereferenceParam<bool>(2)); });
1058 Signal{std::move(name), 1}
1071 template <
typename Func,
typename... BoundArgs>
1072 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1074 return connect(func, args...);
1086 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
1087 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1089 return Signal::connect(func, args...);
1101 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
AnimationType)>>::value>* =
nullptr>
1102 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1104 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<AnimationType>(1)); });
1138 Signal{std::move(name), 2}
1151 template <
typename Func,
typename... BoundArgs>
1152 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1154 return connect(func, args...);
1166 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
1167 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1169 return Signal::connect(func, args...);
1181 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
1182 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1184 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<String>(1)); });
1196 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>
1197 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1199 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceParam<std::vector<String>>(2)); });
Child window widget.
Definition ChildWindow.hpp:47
Object to represent paths on a filesystem.
Definition Filesystem.hpp:59
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:1051
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:1087
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:1072
SignalAnimationType(String &&name)
Constructor.
Definition Signal.hpp:1057
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:470
SignalChildWindow(String &&name)
Constructor.
Definition Signal.hpp:476
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:521
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:491
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:506
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:839
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:859
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:873
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:915
bool emit(const Widget *widget, const std::vector< Filesystem::Path > &paths)
Call all connected signal handlers.
SignalFileDialogPaths(String &&name)
Constructor.
Definition Signal.hpp:845
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:1131
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:1197
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:1167
SignalItemHierarchy(String &&name)
Constructor.
Definition Signal.hpp:1137
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:1152
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:559
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:580
SignalItem(String &&name)
Constructor.
Definition Signal.hpp:565
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:595
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:675
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:739
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:709
SignalPanelListBoxItem(String &&name)
Constructor.
Definition Signal.hpp:680
bool emit(const Widget *widget, int index, const std::shared_ptr< Panel > &panel, 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:694
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:941
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:977
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:962
bool emit(const Widget *widget, ShowEffectType type, bool visible)
Call all connected signal handlers.
SignalShowEffect(String &&name)
Constructor.
Definition Signal.hpp:947
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:375
bool emit(const Widget *widget, T1 param1, T2 param2)
Call all connected signal handlers.
Definition Signal.hpp:441
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:411
SignalTyped2(String &&name)
Constructor.
Definition Signal.hpp:381
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:396
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:291
SignalTyped(String &&name)
Constructor.
Definition Signal.hpp:297
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:312
bool emit(const Widget *widget, T param)
Call all connected signal handlers.
Definition Signal.hpp:356
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:327
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:62
bool emit(const Widget *widget)
Call all connected signal handlers.
static TGUI_NODISCARD 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:243
Signal(const Signal &other)
Copy constructor which will not copy the 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:118
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:210
TGUI_NODISCARD bool isEnabled() const
Returns whether this signal calls the connected functions when triggered.
Definition Signal.hpp:224
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.
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:133
virtual ~Signal()=default
Default destructor.
Signal(String &&name, std::size_t extraParameters=0)
Constructor.
Definition Signal.hpp:77
Signal & operator=(Signal &&other) noexcept=default
Default move assignment operator.
TGUI_NODISCARD String getName() const
Returns the name given to the signal.
Definition Signal.hpp:196
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:158
Wrapper class to store strings.
Definition String.hpp:101
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:39
ShowEffectType
Type of effect to show/hide widget.
Definition Animation.hpp:47
AnimationType
Type of animation.
Definition Animation.hpp:66