Trait kas::event::SendEvent [−][src]
pub trait SendEvent: Handler {
fn send(
&mut self,
mgr: &mut Manager<'_>,
id: WidgetId,
event: Event
) -> Response<Self::Msg>;
}
Expand description
Event routing
This trait is part of the Widget
family and is derived by
derive(Widget)
unless #[handler(send = noauto)]
or #[handler(noauto)]
is used.
This trait is responsible for routing events to the correct widget. It is
separate from Handler
since it can be derived for many parent widgets,
even when event handling must be implemented manually.
This trait is implemented by derive(Widget)
when a #[handler]
attribute
is present (except with parameter send=noauto
).
Required methods
Send an event
This method is responsible for routing events toward descendents.
WidgetId
values are assigned via depth-first search with parents
ordered after all children. Disabling a widget is recursive, hence
disabled widgets should not forward any events.
The following logic is recommended for routing events:
if self.is_disabled() {
return Response::Unhandled;
}
if id <= self.child1.id() {
self.child1.event(mgr, id, event).into()
} else if id <= self.child2.id() {
self.child2.event(mgr, id, event).into()
} ... {
} else {
debug_assert!(id == self.id(), "SendEvent::send: bad WidgetId");
Manager::handle_generic(self, mgr, event)
}
Parents which don’t handle any events themselves may simplify this:
if !self.is_disabled() && id <= self.w.id() {
return self.w.send(mgr, id, event);
}
Response::Unhandled
When the child’s Handler::Msg
type is not VoidMsg
, its response
messages can be handled here (in place of .into()
above).
The example above uses Manager::handle_generic
, which is an optional
tool able to perform some simplifications on events. It is also valid to
call Handler::handle
directly or simply to embed handling logic here.