use crate::render::layout_cache::LayoutContainer;
use crate::render::widget::Widget;
use crate::render::widget_cache::WidgetContainer;
pub type FunctionNoParametersType =
Option<Box<dyn FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer])>>;
pub type FunctionPointParametersType =
Option<Box<dyn FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer], Vec<i32>)>>;
pub type FunctionClickParametersType =
Option<Box<dyn FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer], u8, u8, bool)>>;
#[derive(Default)]
pub struct CallbackRegistry {
pub on_tick: FunctionNoParametersType,
pub on_mouse_entered: FunctionNoParametersType,
pub on_mouse_exited: FunctionNoParametersType,
pub on_mouse_moved: FunctionPointParametersType,
pub on_mouse_scrolled: FunctionPointParametersType,
pub on_mouse_clicked: FunctionClickParametersType,
has_on_tick: bool,
has_on_mouse_entered: bool,
has_on_mouse_exited: bool,
has_on_mouse_moved: bool,
has_on_mouse_scrolled: bool,
has_on_mouse_clicked: bool,
}
impl CallbackRegistry {
pub fn new() -> Self {
Self {
on_tick: None,
on_mouse_entered: None,
on_mouse_exited: None,
on_mouse_moved: None,
on_mouse_scrolled: None,
on_mouse_clicked: None,
has_on_tick: false,
has_on_mouse_entered: false,
has_on_mouse_exited: false,
has_on_mouse_moved: false,
has_on_mouse_scrolled: false,
has_on_mouse_clicked: false,
}
}
pub fn on_tick<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer]) + 'static,
{
self.on_tick = Some(Box::new(callback));
self.has_on_tick = true;
}
pub fn on_mouse_entered<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer]) + 'static,
{
self.on_mouse_entered = Some(Box::new(callback));
self.has_on_mouse_entered = true;
}
pub fn on_mouse_exited<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer]) + 'static,
{
self.on_mouse_exited = Some(Box::new(callback));
self.has_on_mouse_exited = true;
}
pub fn on_mouse_moved<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer], Vec<i32>) + 'static,
{
self.on_mouse_moved = Some(Box::new(callback));
self.has_on_mouse_moved = true;
}
pub fn on_mouse_scrolled<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer], Vec<i32>) + 'static,
{
self.on_mouse_scrolled = Some(Box::new(callback));
self.has_on_mouse_scrolled = true;
}
pub fn on_mouse_clicked<F>(&mut self, callback: F)
where
F: FnMut(&mut dyn Widget, &[WidgetContainer], &[LayoutContainer], u8, u8, bool) + 'static,
{
self.on_mouse_clicked = Some(Box::new(callback));
self.has_on_mouse_clicked = true;
}
pub fn has_on_tick(&mut self) -> bool {
self.has_on_tick
}
pub fn has_on_mouse_entered(&mut self) -> bool {
self.has_on_mouse_entered
}
pub fn has_on_mouse_exited(&mut self) -> bool {
self.has_on_mouse_exited
}
pub fn has_on_mouse_moved(&mut self) -> bool {
self.has_on_mouse_moved
}
pub fn has_on_mouse_scrolled(&mut self) -> bool {
self.has_on_mouse_scrolled
}
pub fn has_on_mouse_clicked(&mut self) -> bool {
self.has_on_mouse_clicked
}
}
pub fn widget_id_for_name(widgets: &[WidgetContainer], name: String) -> usize {
match widgets.iter().find(|x| x.get_widget_name() == name.clone()) {
Some(x) => x.get_widget_id() as usize,
None => 0 as usize,
}
}