25#ifndef TGUI_SIGNAL_HPP
26#define TGUI_SIGNAL_HPP
30#include <TGUI/Global.hpp>
31#include <TGUI/String.hpp>
32#include <TGUI/Color.hpp>
33#include <TGUI/Vector2.hpp>
34#include <TGUI/Animation.hpp>
35#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);
108 template <
typename Func,
typename... BoundArgs>
109 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
122 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
123 unsigned int connect(
const Func& func,
const BoundArgs&... args)
125 const auto id = ++m_lastSignalId;
126#if defined(__cpp_if_constexpr) && (__cpp_if_constexpr >= 201606L)
127 if constexpr(
sizeof...(BoundArgs) == 0)
128 m_handlers[
id] = func;
132 m_handlers[id] = [=]{ invokeFunc(func, args...); };
146 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const std::shared_ptr<Widget>&,
const String&)>>::value>* =
nullptr>
147 unsigned int connectEx(
const Func& func,
const BoundArgs&... args)
150 return connect([func, name=m_name, args...](){ invokeFunc(func, args..., getWidget(), name); });
223 template <
typename Type>
226 return *
static_cast<const std::decay_t<Type>*
>(m_parameters[paramIndex]);
229#if defined(__cpp_lib_invoke) && (__cpp_lib_invoke >= 201411L)
230 template <
typename Func,
typename... Args>
231 static void invokeFunc(Func&& func, Args&&... args)
233 std::invoke(std::forward<Func>(func), std::forward<Args>(args)...);
237 template <
typename Func,
typename... Args,
typename std::enable_if_t<std::is_member_pointer<std::decay_t<Func>>::value>* =
nullptr>
238 static void invokeFunc(Func&& func, Args&&... args)
240 (std::mem_fn(func))(std::forward<Args>(args)...);
243 template <
typename Func,
typename... Args,
typename std::enable_if_t<!std::is_member_pointer<std::decay_t<Func>>::value>* =
nullptr>
244 static void invokeFunc(Func&& func, Args&&... args)
246 std::forward<Func>(func)(std::forward<Args>(args)...);
253 bool m_enabled =
true;
255 std::unordered_map<
unsigned int, std::function<void()>> m_handlers;
257 static unsigned int m_lastSignalId;
258 static std::deque<const void*> m_parameters;
267 template <
typename T>
276 Signal{std::move(name), 1}
288 template <
typename Func,
typename... BoundArgs>
289 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
302 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
303 unsigned int connect(
const Func& func,
const BoundArgs&... args)
316 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T)>>::value>* =
nullptr>
317 unsigned int connect(
const Func& func,
const BoundArgs&... args)
332 if (m_handlers.empty())
335 m_parameters[1] =
static_cast<const void*
>(¶m);
346 template <
typename T1,
typename T2>
355 Signal{std::move(name), 2}
367 template <
typename Func,
typename... BoundArgs>
368 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
381 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
382 unsigned int connect(
const Func& func,
const BoundArgs&... args)
395 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&..., T1, T2)>>::value>* =
nullptr>
396 unsigned int connect(
const Func& func,
const BoundArgs&... args)
412 if (m_handlers.empty())
415 m_parameters[1] =
static_cast<const void*
>(¶m1);
416 m_parameters[2] =
static_cast<const void*
>(¶m2);
445 Signal{std::move(name), 1}
457 template <
typename Func,
typename... BoundArgs>
458 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
471 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
472 unsigned int connect(
const Func& func,
const BoundArgs&... args)
485 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>
486 unsigned int connect(
const Func& func,
const BoundArgs&... args)
488 return Signal::connect([=]{ invokeFunc(func, args..., dereferenceChildWindow()); });
506 static std::shared_ptr<ChildWindow> dereferenceChildWindow();
527 Signal{std::move(name), 3}
539 template <
typename Func,
typename... BoundArgs>
540 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
553 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
554 unsigned int connect(
const Func& func,
const BoundArgs&... args)
567 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int)>>::value>* =
nullptr>
568 unsigned int connect(
const Func& func,
const BoundArgs&... args)
581 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
582 unsigned int connect(
const Func& func,
const BoundArgs&... args)
595 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>
596 unsigned int connect(
const Func& func,
const BoundArgs&... args)
634 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,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
660 unsigned int connect(
const Func& func,
const BoundArgs&... args)
673 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
int)>>::value>* =
nullptr>
674 unsigned int connect(
const Func& func,
const BoundArgs&... args)
687 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>
688 unsigned int connect(
const Func& func,
const BoundArgs&... args)
690 return Signal::connect([=] { invokeFunc(func, args..., dereferencePanel()); });
701 template<
typename Func,
typename... BoundArgs, std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
702 unsigned int connect(
const Func& func,
const BoundArgs&... args)
715 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>
716 unsigned int connect(
const Func& func,
const BoundArgs&... args)
729 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>
730 unsigned int connect(
const Func& func,
const BoundArgs&... args)
743 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>
744 unsigned int connect(
const Func& func,
const BoundArgs&... args)
759 bool emit(
const Widget* widget,
int index,
const std::shared_ptr<Panel>& panel,
const String&
id);
767 static std::shared_ptr<Panel> dereferencePanel();
788 Signal{std::move(name), 3}
800 template <
typename Func,
typename... BoundArgs>
801 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
814 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
815 unsigned int connect(
const Func& func,
const BoundArgs&... args)
828 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
829 unsigned int connect(
const Func& func,
const BoundArgs&... args)
842 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const Filesystem::Path&)>>::value>* =
nullptr>
843 unsigned int connect(
const Func& func,
const BoundArgs&... args)
856 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>
857 unsigned int connect(
const Func& func,
const BoundArgs&... args)
870 bool emit(
const Widget* widget,
const std::vector<Filesystem::Path>& paths);
889 Signal{std::move(name), 2}
901 template <
typename Func,
typename... BoundArgs>
902 unsigned int operator()(
const Func& func,
const BoundArgs&... 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)
929 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType)>>::value>* =
nullptr>
930 unsigned int connect(
const Func& func,
const BoundArgs&... args)
943 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
bool)>>::value>* =
nullptr>
944 unsigned int connect(
const Func& func,
const BoundArgs&... args)
957 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
ShowEffectType,
bool)>>::value>* =
nullptr>
958 unsigned int connect(
const Func& func,
const BoundArgs&... args)
991 Signal{std::move(name), 1}
1003 template <
typename Func,
typename... BoundArgs>
1004 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1006 return connect(func, args...);
1017 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
1018 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1031 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
AnimationType)>>::value>* =
nullptr>
1032 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1065 Signal{std::move(name), 2}
1077 template <
typename Func,
typename... BoundArgs>
1078 unsigned int operator()(
const Func& func,
const BoundArgs&... args)
1080 return connect(func, args...);
1091 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...)>>::value>* =
nullptr>
1092 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1105 template <
typename Func,
typename... BoundArgs,
typename std::enable_if_t<std::is_convertible<Func, std::function<void(
const BoundArgs&...,
const String&)>>::value>* =
nullptr>
1106 unsigned int connect(
const Func& func,
const BoundArgs&... args)
1119 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>
1120 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:56
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:1018
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:1004
SignalAnimationType(String &&name)
Constructor.
Definition Signal.hpp:990
bool emit(const Widget *widget, AnimationType type)
Call all connected signal handlers.
SignalChildWindow(String &&name)
Constructor.
Definition Signal.hpp:444
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:486
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:458
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:472
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:801
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:815
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:857
bool emit(const Widget *widget, const std::vector< Filesystem::Path > &paths)
Call all connected signal handlers.
SignalFileDialogPaths(String &&name)
Constructor.
Definition Signal.hpp:787
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:1120
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:1092
SignalItemHierarchy(String &&name)
Constructor.
Definition Signal.hpp:1064
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:1078
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:540
SignalItem(String &&name)
Constructor.
Definition Signal.hpp:526
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:554
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: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:660
SignalPanelListBoxItem(String &&name)
Constructor.
Definition Signal.hpp:633
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: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:902
bool emit(const Widget *widget, ShowEffectType type, bool visible)
Call all connected signal handlers.
SignalShowEffect(String &&name)
Constructor.
Definition Signal.hpp:888
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:348
bool emit(const Widget *widget, T1 param1, T2 param2)
Call all connected signal handlers.
Definition Signal.hpp:410
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:382
SignalTyped2(String &&name)
Constructor.
Definition Signal.hpp:354
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:368
Signal to which the user can subscribe to get callbacks from.
Definition Signal.hpp:269
SignalTyped(String &&name)
Constructor.
Definition Signal.hpp:275
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:289
bool emit(const Widget *widget, T param)
Call all connected signal handlers.
Definition Signal.hpp:330
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:303
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:224
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:109
bool isEnabled() const
Returns whether this signal calls the connected functions when triggered.
Definition Signal.hpp:207
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:194
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:181
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:123
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:147
Wrapper class to store strings.
Definition String.hpp:94
Namespace that contains all TGUI functions and classes.
Definition AbsoluteOrRelativeValue.hpp:36
SignalTyped< int > SignalInt
Signal with one "int" as optional unbound parameter.
Definition Signal.hpp:421
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:429
SignalTyped< Color > SignalColor
Signal with one "Color" as optional unbound parameter.
Definition Signal.hpp:425
SignalTyped< unsigned int > SignalUInt
Signal with one "unsigned int" as optional unbound parameter.
Definition Signal.hpp:422
SignalTyped< Vector2f > SignalVector2f
Signal with one "Vector2f" as optional unbound parameter.
Definition Signal.hpp:427
SignalTyped< bool > SignalBool
Signal with one "bool" as optional unbound parameter.
Definition Signal.hpp:423
AnimationType
Type of animation.
Definition Animation.hpp:62
SignalTyped< FloatRect > SignalFloatRect
Signal with one "FloatRect" as optional unbound parameter.
Definition Signal.hpp:428
SignalTyped< const String & > SignalString
Signal with one "String" as optional unbound parameter.
Definition Signal.hpp:426
SignalTyped< float > SignalFloat
Signal with one "float" as optional unbound parameter.
Definition Signal.hpp:424