25#ifndef TGUI_SIGNAL_HPP
26#define TGUI_SIGNAL_HPP
30#include <TGUI/Global.hpp>
32#include <TGUI/Animation.hpp>
33#include <TGUI/Color.hpp>
34#include <TGUI/Filesystem.hpp>
35#include <TGUI/String.hpp>
36#include <TGUI/Vector2.hpp>
42#include <unordered_map>
73 m_name{std::move(name)}
75 if (1 + extraParameters > m_parameters.size())
76 m_parameters.resize(1 + extraParameters);
107 template <
typename Func,
typename... BoundArgs>
108 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
121 template <
typename Func,
122 typename... BoundArgs,
123 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
124 unsigned int connect(
const Func& func,
const BoundArgs&... args)
126 const auto id = ++m_lastSignalId;
127 if constexpr (
sizeof...(BoundArgs) == 0)
128 m_handlers[
id] = func;
131 m_handlers[id] = [=] { std::invoke(func, args...); };
145 template <
typename Func,
146 typename... BoundArgs,
147 typename std::enable_if_t<
148 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Widget>&,
const String&)>>>* =
nullptr>
149 unsigned int connectEx(
const Func& func,
const BoundArgs&... args)
152 return connect([func, name = m_name, args...]() { std::invoke(func, args..., getWidget(), name); });
225 template <
typename Type>
228 return *
static_cast<const std::decay_t<Type>*
>(m_parameters[paramIndex]);
234 bool m_enabled =
true;
236 std::unordered_map<
unsigned int, std::function<void()>> m_handlers;
238 static unsigned int m_lastSignalId;
239 static std::deque<const void*> m_parameters;
248 template <
typename T>
256 Signal{std::move(name), 1}
268 template <
typename Func,
typename... BoundArgs>
269 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
282 template <
typename Func,
283 typename... BoundArgs,
284 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
285 unsigned int connect(
const Func& func,
const BoundArgs&... args)
298 template <
typename Func,
299 typename... BoundArgs,
300 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&..., T)>>>* =
nullptr>
301 unsigned int connect(
const Func& func,
const BoundArgs&... args)
316 if (m_handlers.empty())
319 m_parameters[1] =
static_cast<const void*
>(¶m);
330 template <
typename T1,
typename T2>
338 Signal{std::move(name), 2}
350 template <
typename Func,
typename... BoundArgs>
351 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
364 template <
typename Func,
365 typename... BoundArgs,
366 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
367 unsigned int connect(
const Func& func,
const BoundArgs&... args)
380 template <
typename Func,
381 typename... BoundArgs,
382 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&..., T1, T2)>>>* =
nullptr>
383 unsigned int connect(
const Func& func,
const BoundArgs&... args)
399 if (m_handlers.empty())
402 m_parameters[1] =
static_cast<const void*
>(¶m1);
403 m_parameters[2] =
static_cast<const void*
>(¶m2);
431 Signal{std::move(name), 1}
443 template <
typename Func,
typename... BoundArgs>
444 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
457 template <
typename Func,
458 typename... BoundArgs,
459 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
460 unsigned int connect(
const Func& func,
const BoundArgs&... args)
473 template <
typename Func,
474 typename... BoundArgs,
475 typename std::enable_if_t<
476 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<ChildWindow>&)>>>* =
nullptr>
477 unsigned int connect(
const Func& func,
const BoundArgs&... args)
479 return Signal::connect([=] { std::invoke(func, args..., dereferenceChildWindow()); });
497 static std::shared_ptr<ChildWindow> dereferenceChildWindow();
517 Signal{std::move(name), 3}
529 template <
typename Func,
typename... BoundArgs>
530 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
543 template <
typename Func,
544 typename... BoundArgs,
545 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
546 unsigned int connect(
const Func& func,
const BoundArgs&... args)
559 template <
typename Func,
560 typename... BoundArgs,
561 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
int)>>>* =
nullptr>
562 unsigned int connect(
const Func& func,
const BoundArgs&... args)
575 template <
typename Func,
576 typename... BoundArgs,
577 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const String&)>>>* =
nullptr>
578 unsigned int connect(
const Func& func,
const BoundArgs&... args)
591 template <
typename Func,
592 typename... BoundArgs,
593 typename std::enable_if_t<
594 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const String&,
const String&)>>>* =
nullptr>
595 unsigned int connect(
const Func& func,
const BoundArgs&... args)
633 Signal{std::move(name), 3}
645 template <
typename Func,
typename... BoundArgs>
646 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
659 template <
typename Func,
660 typename... BoundArgs,
661 std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
662 unsigned int connect(
const Func& func,
const BoundArgs&... args)
675 template <
typename Func,
676 typename... BoundArgs,
677 std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
int)>>>* =
nullptr>
678 unsigned int connect(
const Func& func,
const BoundArgs&... args)
691 template <
typename Func,
692 typename... BoundArgs,
693 std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Panel>&)>>>* =
nullptr>
694 unsigned int connect(
const Func& func,
const BoundArgs&... args)
696 return Signal::connect([=] { std::invoke(func, args..., dereferencePanel()); });
707 template <
typename Func,
708 typename... BoundArgs,
709 std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const String&)>>>* =
nullptr>
710 unsigned int connect(
const Func& func,
const BoundArgs&... args)
723 template <
typename Func,
724 typename... BoundArgs,
725 std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
int,
const std::shared_ptr<Panel>&)>>>* =
nullptr>
726 unsigned int connect(
const Func& func,
const BoundArgs&... args)
739 template <
typename Func,
740 typename... BoundArgs,
742 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Panel>&,
const String&)>>>* =
nullptr>
743 unsigned int connect(
const Func& func,
const BoundArgs&... args)
756 template <
typename Func,
757 typename... BoundArgs,
759 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
int,
const std::shared_ptr<Panel>&,
const String&)>>>* =
nullptr>
760 unsigned int connect(
const Func& func,
const BoundArgs&... args)
776 bool emit(
const Widget* widget,
int index,
const std::shared_ptr<Panel>& panel,
const String&
id);
784 static std::shared_ptr<Panel> dereferencePanel();
804 Signal{std::move(name), 3}
816 template <
typename Func,
typename... BoundArgs>
817 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
830 template <
typename Func,
831 typename... BoundArgs,
832 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
833 unsigned int connect(
const Func& func,
const BoundArgs&... args)
846 template <
typename Func,
847 typename... BoundArgs,
848 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const String&)>>>* =
nullptr>
849 unsigned int connect(
const Func& func,
const BoundArgs&... args)
862 template <
typename Func,
863 typename... BoundArgs,
864 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const Filesystem::Path&)>>>* =
nullptr>
865 unsigned int connect(
const Func& func,
const BoundArgs&... args)
878 template <
typename Func,
879 typename... BoundArgs,
880 typename std::enable_if_t<
881 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::vector<Filesystem::Path>&)>>>* =
nullptr>
882 unsigned int connect(
const Func& func,
const BoundArgs&... args)
895 bool emit(
const Widget* widget,
const std::vector<Filesystem::Path>& paths);
913 Signal{std::move(name), 2}
925 template <
typename Func,
typename... BoundArgs>
926 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
939 template <
typename Func,
940 typename... BoundArgs,
941 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
942 unsigned int connect(
const Func& func,
const BoundArgs&... args)
955 template <
typename Func,
956 typename... BoundArgs,
957 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
ShowEffectType)>>>* =
nullptr>
958 unsigned int connect(
const Func& func,
const BoundArgs&... args)
971 template <
typename Func,
972 typename... BoundArgs,
973 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
bool)>>>* =
nullptr>
974 unsigned int connect(
const Func& func,
const BoundArgs&... args)
987 template <
typename Func,
988 typename... BoundArgs,
989 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
ShowEffectType,
bool)>>>* =
nullptr>
990 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1023 Signal{std::move(name), 1}
1035 template <
typename Func,
typename... BoundArgs>
1036 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1038 return connect(func, args...);
1049 template <
typename Func,
1050 typename... BoundArgs,
1051 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
1052 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1065 template <
typename Func,
1066 typename... BoundArgs,
1067 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
AnimationType)>>>* =
nullptr>
1068 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1100 Signal{std::move(name), 2}
1112 template <
typename Func,
typename... BoundArgs>
1113 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1115 return connect(func, args...);
1126 template <
typename Func,
1127 typename... BoundArgs,
1128 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...)>>>* =
nullptr>
1129 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1142 template <
typename Func,
1143 typename... BoundArgs,
1144 typename std::enable_if_t<std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const String&)>>>* =
nullptr>
1145 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1158 template <
typename Func,
1159 typename... BoundArgs,
1160 typename std::enable_if_t<
1161 std::is_convertible_v<Func, std::function<void(
const BoundArgs&...,
const std::vector<String>&)>>>* =
nullptr>
1162 unsigned int connect(
const Func& func,
const BoundArgs&... args)
Child window widget.
Definition ChildWindow.hpp:43
Object to represent paths on a filesystem.
Definition Filesystem.hpp:55
Group of widgets that has a background color and optional borders.
Definition Panel.hpp:39
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:1052
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:1036
SignalAnimationType(String &&name)
Constructor.
Definition Signal.hpp:1022
bool emit(const Widget *widget, AnimationType type)
Call all connected signal handlers.
bool emit(ChildWindow *childWindow)
Call all connected signal handlers.
SignalChildWindow(String &&name)
Constructor.
Definition Signal.hpp:430
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:477
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:444
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:460
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:817
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:833
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:882
bool emit(const Widget *widget, const std::vector< Filesystem::Path > &paths)
Call all connected signal handlers.
SignalFileDialogPaths(String &&name)
Constructor.
Definition Signal.hpp:803
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:1162
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:1129
SignalItemHierarchy(String &&name)
Constructor.
Definition Signal.hpp:1099
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:1113
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:530
SignalItem(String &&name)
Constructor.
Definition Signal.hpp:516
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:546
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:694
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:662
SignalPanelListBoxItem(String &&name)
Constructor.
Definition Signal.hpp:632
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:646
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:942
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:926
bool emit(const Widget *widget, ShowEffectType type, bool visible)
Call all connected signal handlers.
SignalShowEffect(String &&name)
Constructor.
Definition Signal.hpp:912
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:332
bool emit(const Widget *widget, T1 param1, T2 param2)
Call all connected signal handlers.
Definition Signal.hpp:397
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:367
SignalTyped2(String &&name)
Constructor.
Definition Signal.hpp:337
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:351
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:250
SignalTyped(String &&name)
Constructor.
Definition Signal.hpp:255
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:269
bool emit(const Widget *widget, T param)
Call all connected signal handlers.
Definition Signal.hpp:314
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:285
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:226
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:108
bool isEnabled() const
Returns whether this signal calls the connected functions when triggered.
Definition Signal.hpp:209
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:196
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:183
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:124
virtual ~Signal()=default
Default destructor.
Signal(String &&name, std::size_t extraParameters=0)
Constructor.
Definition Signal.hpp:72
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:149
Wrapper class to store strings.
Definition String.hpp:94
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:37
SignalTyped< int > SignalInt
Signal with one "int" as optional unbound parameter.
Definition Signal.hpp:408
ShowEffectType
Type of effect to show/hide widget.
Definition Animation.hpp:44
SignalTyped2< float, float > SignalRange
Signal with two floats as optional unbound parameters.
Definition Signal.hpp:416
SignalTyped< Color > SignalColor
Signal with one "Color" as optional unbound parameter.
Definition Signal.hpp:412
SignalTyped< unsigned int > SignalUInt
Signal with one "unsigned int" as optional unbound parameter.
Definition Signal.hpp:409
SignalTyped< Vector2f > SignalVector2f
Signal with one "Vector2f" as optional unbound parameter.
Definition Signal.hpp:414
SignalTyped< bool > SignalBool
Signal with one "bool" as optional unbound parameter.
Definition Signal.hpp:410
AnimationType
Type of animation.
Definition Animation.hpp:62
SignalTyped< FloatRect > SignalFloatRect
Signal with one "FloatRect" as optional unbound parameter.
Definition Signal.hpp:415
SignalTyped< const String & > SignalString
Signal with one "String" as optional unbound parameter.
Definition Signal.hpp:413
SignalTyped< float > SignalFloat
Signal with one "float" as optional unbound parameter.
Definition Signal.hpp:411