From 06a55855a9e28c90a9462be10d671c28fa506da0 Mon Sep 17 00:00:00 2001 From: Bruno Van de Velde Date: Wed, 30 Aug 2017 01:17:35 +0200 Subject: [PATCH] Let parameter detection look for widget and signal name as first unbound parameters --- include/TGUI/Signal.hpp | 61 ++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/include/TGUI/Signal.hpp b/include/TGUI/Signal.hpp index 8953e676..f791b83f 100644 --- a/include/TGUI/Signal.hpp +++ b/include/TGUI/Signal.hpp @@ -633,6 +633,40 @@ namespace tgui { }; + template + struct binder, std::string, UnboundArgs...>, TypeSet<>> + { + template + static auto bind(Signal& signal, std::function&& handler, BoundArgs&&... args) + { + return bindImpl(std::index_sequence_for{}, signal, std::forward>(handler), std::forward(args)...); + } + + private: + + template + static auto bindImpl(std::index_sequence, Signal& signal, std::function&& handler, BoundArgs&&... args) + { + if constexpr (sizeof...(UnboundArgs) == 0) + { + return [=](const std::shared_ptr& widget, const std::string& signalName) { + std::invoke(handler, unbind(std::forward(args))..., widget, signalName); + }; + } + else // There are unbound parameters that have to be checked at runtime + { + std::size_t offset = signal.validateTypes({typeid(UnboundArgs)...}); + return [=](const std::shared_ptr& widget, const std::string& signalName) { + std::invoke(handler, + unbind(std::forward(args))..., + widget, + signalName, + internal_signal::dereference(internal_signal::parameters[offset + Indices])...); + }; + } + } + }; + template struct binder, TypeSet<>> { @@ -647,12 +681,19 @@ namespace tgui template static auto bindImpl(std::index_sequence, Signal& signal, std::function&& handler, BoundArgs&&... args) { - const std::size_t offset = signal.validateTypes({typeid(UnboundArgs)...}); - return [=](){ - std::invoke(handler, - unbind(std::forward(args))..., - internal_signal::dereference>(internal_signal::parameters[offset + Indices])...); - }; + if constexpr (sizeof...(UnboundArgs) == 0) + { + return [=](){ std::invoke(handler, unbind(std::forward(args))...); }; + } + else // There are unbound parameters that have to be checked at runtime + { + std::size_t offset = signal.validateTypes({typeid(UnboundArgs)...}); + return [=](){ + std::invoke(handler, + unbind(std::forward(args))..., + internal_signal::dereference(internal_signal::parameters[offset + Indices])...); + }; + } } }; } @@ -724,9 +765,9 @@ namespace tgui unsigned int connect(std::string signalName, Func&& handler, const Args&... args) { return getSignal(toLower(std::move(signalName))).connect( - [f=std::function&, const std::string&)>(handler), args...] - (const std::shared_ptr& w, const std::string& s) - { f(args..., w, s); } + [f=std::function&, const std::string&)>(handler), args...] (const std::shared_ptr& w, const std::string& s) { + f(args..., w, s); + } ); } @@ -850,7 +891,7 @@ namespace tgui else { Signal& signal = getSignal(toLower(std::move(signalName))); - return signal.connect(internal_signals::binder, internal_signals::TypeSet>::bind(signal, std::forward>(func), std::forward(args)...)); + return signal.connect(internal_signals::binder...>, internal_signals::TypeSet>::bind(signal, std::forward>(func), std::forward(args)...)); } } #endif // TGUI_ENABLE_SIGNAL_EXTENSION