diff --git a/src/gui/core/event/dispatcher.cpp b/src/gui/core/event/dispatcher.cpp index 866120d81b3a..f88df493b0e9 100644 --- a/src/gui/core/event/dispatcher.cpp +++ b/src/gui/core/event/dispatcher.cpp @@ -75,20 +75,20 @@ bool dispatcher::has_event(const ui_event event, const event_queue_type event_ty << ".\n"; #endif - return find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)) - || find(event, - dispatcher_implementation::has_handler(event_type, *this)); + return find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)) + || find( + event, dispatcher_implementation::has_handler(event_type, *this)); } /** diff --git a/src/gui/core/event/dispatcher_private.hpp b/src/gui/core/event/dispatcher_private.hpp index 7f5431b1d054..0e14c0176c9e 100644 --- a/src/gui/core/event/dispatcher_private.hpp +++ b/src/gui/core/event/dispatcher_private.hpp @@ -60,10 +60,10 @@ struct dispatcher_implementation * @returns The signal of the type \ * dispatcher::signal_type \ */ \ - template \ + template \ static typename std::enable_if::value, \ - dispatcher::signal_type >::type&\ - event_signal(dispatcher& dispatcher, const ui_event event) \ + dispatcher::signal_type>::type& \ + event_signal(dispatcher& dispatcher, const ui_event event) \ { \ return dispatcher.QUEUE.queue[event]; \ } \ @@ -81,10 +81,10 @@ struct dispatcher_implementation * @returns The signal of the type \ * dispatcher::signal_type \ */ \ - template \ + template \ static typename std::enable_if::value, \ - dispatcher::signal_type >::type&\ - event_signal(dispatcher& dispatcher, const ui_event event) \ + dispatcher::signal_type>::type& \ + event_signal(dispatcher& dispatcher, const ui_event event) \ { \ return dispatcher.QUEUE.queue[event]; \ } @@ -101,7 +101,7 @@ struct dispatcher_implementation * @param TYPE The type to wrap for @ref * IMPLEMENT_EVENT_SIGNAL. */ -#define IMPLEMENT_EVENT_SIGNAL_WRAPPER(TYPE) \ +#define IMPLEMENT_EVENT_SIGNAL_WRAPPER(TYPE) \ IMPLEMENT_EVENT_SIGNAL(set_event_##TYPE, \ signal_##TYPE##_function, \ signal_##TYPE##_queue_) @@ -127,10 +127,9 @@ struct dispatcher_implementation * Constructor. * * @param event_type The type of event to look for. - * @param dispatcher The dispatcher whose signal queue is used. + * @param dispatcher The dispatcher whose signal queue is used. */ - has_handler(const dispatcher::event_queue_type event_type, - dispatcher& dispatcher) + has_handler(const dispatcher::event_queue_type event_type, dispatcher& dispatcher) : event_type_(event_type), dispatcher_(dispatcher) { } @@ -143,27 +142,30 @@ struct dispatcher_implementation * * @tparam T A key from an event set used to instantiate * the proper @p event_signal function. - * @param event The event to get the signal for. + * @param event The event to get the signal for. * * @returns Whether or not the handler is found. */ // not called operator() to work around a problem in MSVC // (known to affect all versions up to 2015) - template + template bool oper(ui_event event) { if((event_type_ & dispatcher::pre) && !event_signal(dispatcher_, event).pre_child.empty()) { return true; } + if((event_type_ & dispatcher::child) && !event_signal(dispatcher_, event).child.empty()) { return true; } + if((event_type_ & dispatcher::post) && !event_signal(dispatcher_, event).post_child.empty()) { return true; } + return false; } @@ -178,10 +180,10 @@ namespace implementation { /** Specialized class when itor == end */ -template +template struct find { - template + template static bool execute(itor*, end*, E, F) { return false; @@ -189,15 +191,14 @@ struct find }; /** Specialized class when itor != end */ -template <> +template<> struct find { - template + template static bool execute(itor*, end*, E event, F functor) { typedef typename boost::mpl::deref::type item; - typedef typename boost::mpl::apply1, item>::type - arg; + typedef typename boost::mpl::apply1, item>::type arg; boost::value_initialized x; @@ -236,14 +237,14 @@ struct find * * @returns Whether or not the function found a result. */ -template +template inline bool find(E event, F functor) { typedef typename boost::mpl::begin::type begin; typedef typename boost::mpl::end::type end; return implementation::find::value>::execute( - static_cast(nullptr), static_cast(nullptr), event, functor); + static_cast(nullptr), static_cast(nullptr), event, functor); } namespace implementation @@ -297,23 +298,20 @@ namespace implementation * * container 1 * * dispatcher */ -template -inline std::vector > +template +inline std::vector> build_event_chain(const ui_event event, widget* dispatcher, widget* w) { assert(dispatcher); assert(w); - std::vector > result; + std::vector> result; while(w != dispatcher) { w = w->parent(); assert(w); - if(w->has_event(event, - dispatcher::event_queue_type(dispatcher::pre - | dispatcher::post))) { - + if(w->has_event(event, dispatcher::event_queue_type(dispatcher::pre | dispatcher::post))) { result.emplace_back(w, event); } } @@ -330,20 +328,16 @@ build_event_chain(const ui_event event, widget* dispatcher, widget* w) * * @returns An empty vector. */ -template <> -inline std::vector > -build_event_chain(const ui_event event, - widget* dispatcher, - widget* w) +template<> +inline std::vector> +build_event_chain(const ui_event event, widget* dispatcher, widget* w) { assert(dispatcher); assert(w); - assert(!w->has_event(event, - dispatcher::event_queue_type(dispatcher::pre - | dispatcher::post))); + assert(!w->has_event(event, dispatcher::event_queue_type(dispatcher::pre | dispatcher::post))); - return std::vector >(); + return std::vector>(); } #ifdef _MSC_VER @@ -367,26 +361,21 @@ build_event_chain(const ui_event event, * * container 1 * * container 2 */ -template <> -inline std::vector > -build_event_chain(const ui_event event, - widget* dispatcher, - widget* w) +template<> +inline std::vector> +build_event_chain(const ui_event event, widget* dispatcher, widget* w) { assert(dispatcher); assert(w); assert(w == dispatcher); - std::vector > result; + std::vector> result; /* We only should add the parents of the widget to the chain. */ while((w = w->parent())) { assert(w); - if(w->has_event(event, - dispatcher::event_queue_type(dispatcher::pre - | dispatcher::post))) { - + if(w->has_event(event, dispatcher::event_queue_type(dispatcher::pre | dispatcher::post))) { result.emplace(result.begin(), w, event); } } @@ -403,9 +392,9 @@ build_event_chain(const ui_event event, * This is called with the same parameters as fire_event except for the * event_chain, which contains the widgets with the events to call for them. */ -template +template inline bool fire_event(const ui_event event, - std::vector >& event_chain, + std::vector>& event_chain, widget* dispatcher, widget* w, F&&... params) @@ -415,14 +404,12 @@ inline bool fire_event(const ui_event event, /***** ***** ***** Pre ***** ***** *****/ for(auto& ritor_widget : boost::adaptors::reverse(event_chain)) { - - dispatcher::signal_type& signal - = dispatcher_implementation::event_signal( - *ritor_widget.first, ritor_widget.second); + dispatcher::signal_type& signal = + dispatcher_implementation::event_signal(*ritor_widget.first, ritor_widget.second); for(auto& pre_func : signal.pre_child) { - pre_func(*dispatcher, ritor_widget.second, handled, halt, std::forward(params)...); + if(halt) { assert(handled); break; @@ -436,12 +423,10 @@ inline bool fire_event(const ui_event event, /***** ***** ***** Child ***** ***** *****/ if(w->has_event(event, dispatcher::child)) { - - dispatcher::signal_type& signal - = dispatcher_implementation::event_signal(*w, event); + dispatcher::signal_type& signal = + dispatcher_implementation::event_signal(*w, event); for(auto& func : signal.child) { - func(*dispatcher, event, handled, halt, std::forward(params)...); if(halt) { @@ -457,14 +442,12 @@ inline bool fire_event(const ui_event event, /***** ***** ***** Post ***** ***** *****/ for(auto& itor_widget : event_chain) { - - dispatcher::signal_type& signal - = dispatcher_implementation::event_signal( - *itor_widget.first, itor_widget.second); + dispatcher::signal_type& signal = + dispatcher_implementation::event_signal(*itor_widget.first, itor_widget.second); for(auto& post_func : signal.post_child) { - post_func(*dispatcher, itor_widget.second, handled, halt, std::forward(params)...); + if(halt) { assert(handled); break; @@ -504,7 +487,7 @@ inline bool fire_event(const ui_event event, * * @returns Whether or not the event was handled. */ -template +template inline bool fire_event(const ui_event event, dispatcher* d, widget* w, F&&... params) { @@ -513,25 +496,24 @@ fire_event(const ui_event event, dispatcher* d, widget* w, F&&... params) widget* dispatcher_w = dynamic_cast(d); - std::vector > event_chain - = implementation::build_event_chain(event, dispatcher_w, w); + std::vector> event_chain = + implementation::build_event_chain(event, dispatcher_w, w); - return implementation::fire_event( - event, event_chain, dispatcher_w, w, std::forward(params)...); + return implementation::fire_event(event, event_chain, dispatcher_w, w, std::forward(params)...); } -template + bool(event_executor::*wants_double_click)() const, + typename T, + typename... F> inline bool fire_event_double_click(dispatcher* dsp, widget* wgt, F&&... params) { assert(dsp); assert(wgt); - std::vector > event_chain; + std::vector> event_chain; widget* w = wgt; widget* d = dynamic_cast(dsp); @@ -540,18 +522,11 @@ fire_event_double_click(dispatcher* dsp, widget* wgt, F&&... params) assert(w); if((w->*wants_double_click)()) { - - if(w->has_event(double_click, - dispatcher::event_queue_type(dispatcher::pre - | dispatcher::post))) { - + if(w->has_event(double_click, dispatcher::event_queue_type(dispatcher::pre | dispatcher::post))) { event_chain.emplace_back(w, double_click); } } else { - if(w->has_event(click, - dispatcher::event_queue_type(dispatcher::pre - | dispatcher::post))) { - + if(w->has_event(click, dispatcher::event_queue_type(dispatcher::pre | dispatcher::post))) { event_chain.emplace_back(w, click); } } @@ -559,10 +534,10 @@ fire_event_double_click(dispatcher* dsp, widget* wgt, F&&... params) if((wgt->*wants_double_click)()) { return implementation::fire_event( - double_click, event_chain, d, wgt, std::forward(params)...); + double_click, event_chain, d, wgt, std::forward(params)...); } else { return implementation::fire_event( - click, event_chain, d, wgt, std::forward(params)...); + click, event_chain, d, wgt, std::forward(params)...); } }