Base class for event handling. More...
#include <dispatcher.hpp>
Classes | |
struct | tsignal |
Helper struct to generate the various signal types. More... | |
struct | tsignal_queue |
Helper struct to generate the various event queues. More... | |
Public Types | |
enum | tevent_type { pre = 1, child = 2, post = 4 } |
enum | tposition { front_pre_child, back_pre_child, front_child, back_child, front_post_child, back_post_child } |
The position where to add a new callback in the signal handler. More... | |
enum | tmouse_behavior { all, hit, none } |
The behavior of the mouse events. More... | |
Public Member Functions | |
tdispatcher () | |
virtual | ~tdispatcher () |
void | connect () |
Connects the dispatcher to the event handler. More... | |
virtual bool | is_at (const tpoint &coordinate) const =0 |
Determines whether the location is inside an active widget. More... | |
bool | has_event (const tevent event, const tevent_type event_type) |
bool | fire (const tevent event, twidget &target) |
Fires an event which has no extra parameters. More... | |
bool | fire (const tevent event, twidget &target, const tpoint &coordinate) |
Fires an event which takes a coordinate parameter. More... | |
bool | fire (const tevent event, twidget &target, const SDLKey key, const SDLMod modifier, const utf8::string &unicode) |
Fires an event which takes keyboard parameters. More... | |
bool | fire (const tevent event, twidget &target, void *) |
Fires an event which takes notification parameters. More... | |
bool | fire (const tevent event, twidget &target, tmessage &message) |
Fires an event which takes message parameters. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event, boost::mpl::int_ < E > > >::type | connect_signal (const tsignal_function &signal, const tposition position=back_child) |
Connect a signal for callback in tset_event. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event, boost::mpl::int_ < E > > >::type | disconnect_signal (const tsignal_function &signal, const tposition position=back_child) |
Disconnect a signal for callback in tset_event. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_mouse, boost::mpl::int_< E > > >::type | connect_signal (const tsignal_mouse_function &signal, const tposition position=back_child) |
Connect a signal for callback in tset_event_mouse. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_mouse, boost::mpl::int_< E > > >::type | disconnect_signal (const tsignal_mouse_function &signal, const tposition position=back_child) |
Disconnect a signal for callback in tset_event_mouse. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_keyboard, boost::mpl::int_< E > > >::type | connect_signal (const tsignal_keyboard_function &signal, const tposition position=back_child) |
Connect a signal for callback in tset_event_keyboard. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_keyboard, boost::mpl::int_< E > > >::type | disconnect_signal (const tsignal_keyboard_function &signal, const tposition position=back_child) |
Disconnect a signal for callback in tset_event_keyboard. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_notification, boost::mpl::int_< E > > >::type | connect_signal (const tsignal_notification_function &signal, const tposition position=back_child) |
Connect a signal for callback in tset_event_notification. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_notification, boost::mpl::int_< E > > >::type | disconnect_signal (const tsignal_notification_function &signal, const tposition position=back_child) |
Disconnect a signal for callback in tset_event_notification. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_message, boost::mpl::int_< E > > >::type | connect_signal (const tsignal_message_function &signal, const tposition position=back_child) |
Connect a signal for callback in tset_event_message. More... | |
template<tevent E> | |
boost::enable_if < boost::mpl::has_key < tset_event_message, boost::mpl::int_< E > > >::type | disconnect_signal (const tsignal_message_function &signal, const tposition position=back_child) |
Disconnect a signal for callback in tset_event_message. More... | |
void | capture_mouse () |
Captures the mouse. More... | |
void | release_mouse () |
Releases the mouse capture. More... | |
void | set_mouse_behavior (const tmouse_behavior mouse_behavior) |
tmouse_behavior | get_mouse_behavior () const |
void | set_want_keyboard_input (const bool want_keyboard_input) |
bool | get_want_keyboard_input () const |
void | register_hotkey (const hotkey::HOTKEY_COMMAND id, const thotkey_function &function) |
Registers a hotkey. More... | |
bool | execute_hotkey (const hotkey::HOTKEY_COMMAND id) |
Executes a hotkey. More... | |
Private Attributes | |
tmouse_behavior | mouse_behavior_ |
The mouse behavior for the dispatcher. More... | |
bool | want_keyboard_input_ |
Does the dispatcher want to receive keyboard input. More... | |
tsignal_queue< tsignal_function > | signal_queue_ |
Signal queue for callbacks in tset_event. More... | |
tsignal_queue < tsignal_mouse_function > | signal_mouse_queue_ |
Signal queue for callbacks in tset_event_mouse. More... | |
tsignal_queue < tsignal_keyboard_function > | signal_keyboard_queue_ |
Signal queue for callbacks in tset_event_keyboard. More... | |
tsignal_queue < tsignal_notification_function > | signal_notification_queue_ |
Signal queue for callbacks in tset_event_notification. More... | |
tsignal_queue < tsignal_message_function > | signal_message_queue_ |
Signal queue for callbacks in tset_event_message. More... | |
bool | connected_ |
Are we connected to the event handler. More... | |
std::map < hotkey::HOTKEY_COMMAND, thotkey_function > | hotkeys_ |
The registered hotkeys for this dispatcher. More... | |
Friends | |
struct | tdispatcher_implementation |
Base class for event handling.
A dispatcher has slots for events, when an event arrives it looks for the functions that registered themselves for that event and calls their callbacks.
This class is a base class for all widgets[1], what a widget does on a callback can differ greatly, an image might ignore all events a window can track the mouse location and fire MOUSE_ENTER and MOUSE_LEAVE events to the widgets involved.
[1] Not really sure whether it will be a base clase for a twidget or tcontrol yet.
Definition at line 122 of file dispatcher.hpp.
enum gui2::event::tdispatcher::tevent_type |
Enumerator | |
---|---|
pre | |
child | |
post |
Definition at line 155 of file dispatcher.hpp.
enum gui2::event::tdispatcher::tmouse_behavior |
The behavior of the mouse events.
Normally for mouse events there's first checked whether a dispatcher has captured the mouse if so it gets the event. If not the dispatcher is searched from the back to the front in the layers and its behavior is checked.
If after these tests no dispatcher is found the event is ignored.
Enumerator | |
---|---|
all | |
hit | |
none |
Definition at line 476 of file dispatcher.hpp.
enum gui2::event::tdispatcher::tposition |
The position where to add a new callback in the signal handler.
The signal handler has three callback queues:
For every queue it's possible to add a new event in the front or in the back.
Whether all three queues are executed depend on the whether the callbacks modify the handled and halt flag.
Here are some use case examples. A button that plays a sound and executes an optional user callback:
A toggle button may or may not be toggled:
Enumerator | |
---|---|
front_pre_child | |
back_pre_child | |
front_child | |
back_child | |
front_post_child | |
back_post_child |
Definition at line 249 of file dispatcher.hpp.
gui2::event::tdispatcher::tdispatcher | ( | ) |
Definition at line 29 of file dispatcher.cpp.
|
virtual |
Definition at line 42 of file dispatcher.cpp.
References connected_, and gui2::event::disconnect_dispatcher().
|
inline |
Captures the mouse.
Definition at line 483 of file dispatcher.hpp.
References gui2::event::capture_mouse().
void gui2::event::tdispatcher::connect | ( | ) |
Connects the dispatcher to the event handler.
When a dispatcher is connected to the event handler it will get the events directly from the event handler. This is wanted for top level items like windows but not for most other widgets.
So a window can call connect to register itself, it will automatically disconnect upon destruction.
Definition at line 49 of file dispatcher.cpp.
References gui2::event::connect_dispatcher(), and connected_.
Referenced by gui2::twindow::twindow().
|
inline |
Connect a signal for callback in tset_event.
The function uses some boost magic to avoid registering the wrong function, but the common way to use this function is: widget->connect_signal<EVENT_ID>( std::bind(&tmy_dialog::my_member, this)); This allows simply adding a member of a dialog to be used as a callback for widget without a lot of magic. Note most widgets probably will get a callback like connect_signal_mouse_left_click(const tsignal_function& callback) which hides this function for the average use.
E | The event the callback needs to react to. |
signal | The callback function. |
position | The position to place the callback. |
Definition at line 278 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::connect_signal(), and signal_queue_.
Referenced by connect_queue(), gui2::event::connect_signal_mouse_left_click(), gui2::event::connect_signal_notify_modified(), gui2::event::connect_signal_pre_key_press(), gui2::ttitle_screen::pre_show(), gui2::event::tdistributor::tdistributor(), gui2::event::tmouse_button< sdl_button_down, sdl_button_up, button_down, button_up, button_click, button_double_click >::tmouse_button(), gui2::event::tmouse_motion::tmouse_motion(), and gui2::ttree_view_node::ttree_view_node().
|
inline |
Connect a signal for callback in tset_event_mouse.
E | The event the callback needs to react to. |
signal | The callback function. |
position | The position to place the callback. |
Definition at line 313 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::connect_signal(), and signal_mouse_queue_.
|
inline |
Connect a signal for callback in tset_event_keyboard.
E | The event the callback needs to react to. |
signal | The callback function. |
position | The position to place the callback. |
Definition at line 348 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::connect_signal(), and signal_keyboard_queue_.
|
inline |
Connect a signal for callback in tset_event_notification.
E | The event the callback needs to react to. |
signal | The callback function. |
position | The position to place the callback. Since the message is send to a widget directly the pre and post positions make no sense and shouldn't be used. |
Definition at line 386 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::connect_signal(), and signal_notification_queue_.
|
inline |
Connect a signal for callback in tset_event_message.
E | The event the callback needs to react to. |
signal | The callback function. |
position | The position to place the callback. Since the message is send to a widget directly the pre and post positions make no sense and shouldn't be used. |
Definition at line 429 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::connect_signal(), and signal_message_queue_.
|
inline |
Disconnect a signal for callback in tset_event.
E | The event the callback was used for. |
signal | The callback function. |
position | The place where the function was added. Needed remove the event from the right place. (The function doesn't care whether was added in front or back.) |
Definition at line 297 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::disconnect_signal(), and signal_queue_.
Referenced by gui2::event::disconnect_signal_mouse_left_click(), gui2::tdebug_clock::post_show(), and gui2::event::tdistributor::~tdistributor().
|
inline |
Disconnect a signal for callback in tset_event_mouse.
E | The event the callback was used for. |
signal | The callback function. |
position | The place where the function was added. Needed remove the event from the right place. (The function doesn't care whether was added in front or back.) |
Definition at line 332 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::disconnect_signal(), and signal_mouse_queue_.
|
inline |
Disconnect a signal for callback in tset_event_keyboard.
E | The event the callback was used for. |
signal | The callback function. |
position | The place where the function was added. Needed remove the event from the right place. (The function doesn't care whether was added in front or back.) |
Definition at line 367 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::disconnect_signal(), and signal_keyboard_queue_.
|
inline |
Disconnect a signal for callback in tset_event_notification.
E | The event the callback was used for. |
signal | The callback function. |
position | The place where the function was added. Needed remove the event from the right place. (The function doesn't care whether was added in front or back, but it needs to know the proper queue so it's save to add with front_child and remove with back_child. But it's not save to add with front_child and remove with front_pre_child) |
Definition at line 410 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::disconnect_signal(), and signal_notification_queue_.
|
inline |
Disconnect a signal for callback in tset_event_message.
E | The event the callback was used for. |
signal | The callback function. |
position | The place where the function was added. Needed remove the event from the right place. (The function doesn't care whether was added in front or back, but it needs to know the proper queue so it's save to add with front_child and remove with back_child. But it's not save to add with front_child and remove with front_pre_child) |
Definition at line 453 of file dispatcher.hpp.
References gui2::event::tdispatcher::tsignal_queue< T >::disconnect_signal(), and signal_message_queue_.
bool gui2::event::tdispatcher::execute_hotkey | ( | const hotkey::HOTKEY_COMMAND | id | ) |
Executes a hotkey.
id | The hotkey to execute. |
Definition at line 309 of file dispatcher.cpp.
References hotkeys_, and itor.
Referenced by gui2::event::thandler::hotkey_pressed().
Fires an event which has no extra parameters.
Definition at line 144 of file dispatcher.cpp.
References gui2::event::fire_event_double_click(), gui2::event::LEFT_BUTTON_CLICK, gui2::event::LEFT_BUTTON_DOUBLE_CLICK, gui2::event::MIDDLE_BUTTON_CLICK, gui2::event::MIDDLE_BUTTON_DOUBLE_CLICK, gui2::event::RIGHT_BUTTON_CLICK, gui2::event::RIGHT_BUTTON_DOUBLE_CLICK, gui2::tevent_executor::wants_mouse_left_double_click(), gui2::tevent_executor::wants_mouse_middle_double_click(), and gui2::tevent_executor::wants_mouse_right_double_click().
Referenced by BOOST_AUTO_TEST_CASE(), gui2::tpane::create_item(), gui2::ttext_::handle_key_backspace(), gui2::ttext_::handle_key_default(), gui2::ttext_::handle_key_delete(), gui2::event::tdistributor::keyboard_capture(), gui2::event::thandler::mouse(), gui2::event::tmouse_motion::mouse_enter(), gui2::event::tmouse_motion::mouse_leave(), gui2::event::tmouse_motion::mouse_motion(), gui2::tscrollbar_::move_positioner(), gui2::ttext_::paste_selection(), gui2::tscrollbar_::scroll(), gui2::twidget::set_visible(), gui2::event::tmouse_motion::show_tooltip(), gui2::trepeating_button::signal_handler_left_button_down(), gui2::tscrollbar_::signal_handler_left_button_down(), gui2::event::tdistributor::signal_handler_sdl_key_down(), gui2::event::tmouse_motion::signal_handler_sdl_mouse_motion(), gui2::event::tmouse_motion::signal_handler_sdl_wheel(), gui2::event::tmouse_motion::signal_handler_show_helptip(), gui2::tcontrol::signal_handler_show_helptip(), gui2::tcontrol::signal_handler_show_tooltip(), and gui2::twidget::~twidget().
bool gui2::event::tdispatcher::fire | ( | const tevent | event, |
twidget & | target, | ||
const tpoint & | coordinate | ||
) |
Fires an event which takes a coordinate parameter.
event | The event to fire. |
target | The widget that should receive the event. |
coordinate | The mouse position for the event. |
Definition at line 200 of file dispatcher.cpp.
bool gui2::event::tdispatcher::fire | ( | const tevent | event, |
twidget & | target, | ||
const SDLKey | key, | ||
const SDLMod | modifier, | ||
const utf8::string & | unicode | ||
) |
Fires an event which takes keyboard parameters.
event | The event to fire. |
target | The widget that should receive the event. |
key | The SDL key code of the key pressed. |
modifier | The SDL key modifiers used. |
unicode | The unicode value for the key pressed. |
Definition at line 235 of file dispatcher.cpp.
Fires an event which takes notification parameters.
event | The event to fire. |
target | The widget that should receive the event. |
Definition at line 263 of file dispatcher.cpp.
Fires an event which takes message parameters.
event | The event to fire. |
target | The widget that should receive the event. Normally this is the window holding the widget. |
message | The extra information needed for a window (or another widget in the chain) to handle the message. |
Definition at line 294 of file dispatcher.cpp.
|
inline |
Definition at line 501 of file dispatcher.hpp.
References mouse_behavior_.
|
inline |
Definition at line 511 of file dispatcher.hpp.
References want_keyboard_input_.
Referenced by gui2::event::capture_keyboard().
bool gui2::event::tdispatcher::has_event | ( | const tevent | event, |
const tevent_type | event_type | ||
) |
Definition at line 56 of file dispatcher.cpp.
Referenced by gui2::event::implementation::build_event_chain(), gui2::event::implementation::fire_event(), and gui2::event::fire_event_double_click().
|
pure virtual |
Determines whether the location is inside an active widget.
This is used to see whether a mouse event is inside the widget.
coordinate | The coordinate to test whether inside the widget. |
Implemented in gui2::twidget.
void gui2::event::tdispatcher::register_hotkey | ( | const hotkey::HOTKEY_COMMAND | id, |
const thotkey_function & | function | ||
) |
Registers a hotkey.
Once that's done execute_hotkey will first try to execute a global hotkey and if that fails tries the hotkeys in this dispatcher.
id | The hotkey to register. |
function | The callback function to call. |
Definition at line 303 of file dispatcher.cpp.
References hotkeys_, and gui2::id.
Referenced by gui2::ttitle_screen::post_build(), gui2::tlobby_main::post_build(), and gui2::twindow::twindow().
|
inline |
Releases the mouse capture.
Definition at line 489 of file dispatcher.hpp.
References gui2::event::release_mouse().
|
inline |
Definition at line 496 of file dispatcher.hpp.
References mouse_behavior_.
Referenced by gui2::twindow::show_non_modal(), and gui2::twindow::show_tooltip().
|
inline |
Definition at line 506 of file dispatcher.hpp.
References want_keyboard_input_.
Referenced by gui2::twindow::show_tooltip().
|
friend |
Definition at line 124 of file dispatcher.hpp.
|
private |
Are we connected to the event handler.
Definition at line 683 of file dispatcher.hpp.
Referenced by connect(), and ~tdispatcher().
|
private |
The registered hotkeys for this dispatcher.
Definition at line 686 of file dispatcher.hpp.
Referenced by execute_hotkey(), and register_hotkey().
|
private |
The mouse behavior for the dispatcher.
Definition at line 653 of file dispatcher.hpp.
Referenced by get_mouse_behavior(), and set_mouse_behavior().
|
private |
Signal queue for callbacks in tset_event_keyboard.
Definition at line 674 of file dispatcher.hpp.
Referenced by connect_signal(), and disconnect_signal().
|
private |
Signal queue for callbacks in tset_event_message.
Definition at line 680 of file dispatcher.hpp.
Referenced by connect_signal(), and disconnect_signal().
|
private |
Signal queue for callbacks in tset_event_mouse.
Definition at line 671 of file dispatcher.hpp.
Referenced by connect_signal(), and disconnect_signal().
|
private |
Signal queue for callbacks in tset_event_notification.
Definition at line 677 of file dispatcher.hpp.
Referenced by connect_signal(), and disconnect_signal().
|
private |
Signal queue for callbacks in tset_event.
Definition at line 668 of file dispatcher.hpp.
Referenced by connect_signal(), and disconnect_signal().
|
private |
Does the dispatcher want to receive keyboard input.
Definition at line 665 of file dispatcher.hpp.
Referenced by get_want_keyboard_input(), and set_want_keyboard_input().