use super::*;
#[allow(unused)]
use crate::Widget; use crate::{WidgetConfig, WidgetId};
pub trait Handler: WidgetConfig {
type Msg;
#[inline]
fn activation_via_press(&self) -> bool {
false
}
#[inline]
fn handle(&mut self, _: &mut Manager, event: Event) -> Response<Self::Msg> {
Response::Unhandled(event)
}
}
pub trait SendEvent: Handler {
fn send(&mut self, mgr: &mut Manager, id: WidgetId, event: Event) -> Response<Self::Msg>;
}
impl<'a> Manager<'a> {
pub fn handle_generic<W>(
widget: &mut W,
mgr: &mut Manager,
mut event: Event,
) -> Response<<W as Handler>::Msg>
where
W: Handler + ?Sized,
{
if widget.activation_via_press() {
match event {
Event::PressStart { source, coord, .. } if source.is_primary() => {
mgr.request_grab(widget.id(), source, coord, GrabMode::Grab, None);
return Response::None;
}
Event::PressMove { source, cur_id, .. } => {
let cond = cur_id == Some(widget.id());
let target = if cond { cur_id } else { None };
mgr.set_grab_depress(source, target);
return Response::None;
}
Event::PressEnd { end_id, .. } if end_id == Some(widget.id()) => {
event = Event::Activate;
}
_ => (),
};
}
match event {
Event::NavFocus => return Response::Focus(widget.rect()),
_ => (),
}
widget.handle(mgr, event)
}
}