use alloc::boxed::Box;
use rlvgl_core::event::Event;
use rlvgl_core::renderer::Renderer;
use rlvgl_core::widget::{Rect, Widget};
type ClickHandler = Box<dyn FnMut(&mut ClickArea)>;
pub struct ClickArea {
bounds: Rect,
on_click: Option<ClickHandler>,
}
impl ClickArea {
pub fn new(bounds: Rect) -> Self {
Self {
bounds,
on_click: None,
}
}
pub fn set_on_click<F: FnMut(&mut Self) + 'static>(&mut self, handler: F) {
self.on_click = Some(Box::new(handler));
}
fn inside_bounds(&self, x: i32, y: i32) -> bool {
let b = self.bounds;
x >= b.x && x < b.x + b.width && y >= b.y && y < b.y + b.height
}
}
impl Widget for ClickArea {
fn bounds(&self) -> Rect {
self.bounds
}
fn draw(&self, _renderer: &mut dyn Renderer) {}
fn handle_event(&mut self, event: &Event) -> bool {
match event {
Event::PressRelease { x, y } if self.inside_bounds(*x, *y) => {
if let Some(mut cb) = self.on_click.take() {
cb(self);
self.on_click = Some(cb);
}
true
}
_ => false,
}
}
}