use std::rc::Rc;
use crate::{prelude::*, proc_macros::*};
#[derive(Clone, Default, Debug, Event)]
pub struct TextInputEvent {
pub text: String,
}
pub type TextHandler = dyn Fn(&mut StatesContext, &str) -> bool + 'static;
#[derive(IntoHandler)]
pub struct TextInputEventHandler {
handler: Rc<TextHandler>,
}
impl EventHandler for TextInputEventHandler {
fn handle_event(&self, state_context: &mut StatesContext, event: &EventBox) -> bool {
event
.downcast_ref::<TextInputEvent>()
.ok()
.map_or(false, |event| {
(self.handler)(state_context, event.text.as_str())
})
}
fn handles_event(&self, event: &EventBox) -> bool {
event.is_type::<TextInputEvent>()
}
}
pub trait TextInputHandler: Sized + Widget {
fn on_text_input<H: Fn(&mut StatesContext, &str) -> bool + 'static>(self, handler: H) -> Self {
self.insert_handler(TextInputEventHandler {
handler: Rc::new(handler),
})
}
}