use crate::types::Rect;
pub trait ButtonInputHandler {
fn hit_test(&self, mouse_x: f64, mouse_y: f64, rect: &Rect) -> bool {
mouse_x >= rect.x
&& mouse_x <= rect.x + rect.width
&& mouse_y >= rect.y
&& mouse_y <= rect.y + rect.height
}
fn is_click(
&self,
press_x: f64,
press_y: f64,
release_x: f64,
release_y: f64,
rect: &Rect
) -> bool {
self.hit_test(press_x, press_y, rect)
&& self.hit_test(release_x, release_y, rect)
}
fn next_focus(&self, current_id: &str, all_ids: &[String]) -> String {
if all_ids.is_empty() {
return String::new();
}
if let Some(idx) = all_ids.iter().position(|id| id == current_id) {
let next_idx = (idx + 1) % all_ids.len();
all_ids[next_idx].clone()
} else {
all_ids[0].clone()
}
}
fn prev_focus(&self, current_id: &str, all_ids: &[String]) -> String {
if all_ids.is_empty() {
return String::new();
}
if let Some(idx) = all_ids.iter().position(|id| id == current_id) {
let prev_idx = if idx == 0 {
all_ids.len() - 1
} else {
idx - 1
};
all_ids[prev_idx].clone()
} else {
all_ids[all_ids.len() - 1].clone()
}
}
fn is_activation_key(&self, key: &str) -> bool {
key == "Enter" || key == "Space" || key == " "
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct DefaultButtonInputHandler;
impl ButtonInputHandler for DefaultButtonInputHandler {
}