use crate::types::ScrollState;
#[derive(Debug, Default, Clone)]
pub struct ModalState {
pub position: (f64, f64),
pub dragging: bool,
pub drag_offset: (f64, f64),
pub active_tab: usize,
pub hovered_tab: Option<usize>,
pub current_page: usize,
pub scroll: ScrollState,
pub hovered_close: bool,
pub footer_hovered: Option<usize>,
}
impl ModalState {
pub fn start_drag(&mut self, cursor_pos: (f64, f64), modal_origin: (f64, f64)) {
self.dragging = true;
self.drag_offset = (
cursor_pos.0 - modal_origin.0,
cursor_pos.1 - modal_origin.1,
);
}
pub fn update_drag(
&mut self,
cursor_pos: (f64, f64),
screen_size: (f64, f64),
modal_size: (f64, f64),
) {
if !self.dragging {
return;
}
let x = (cursor_pos.0 - self.drag_offset.0)
.clamp(0.0, (screen_size.0 - modal_size.0).max(0.0));
let y = (cursor_pos.1 - self.drag_offset.1)
.clamp(0.0, (screen_size.1 - modal_size.1).max(0.0));
self.position = (x, y);
}
pub fn end_drag(&mut self) {
self.dragging = false;
}
pub fn set_active_tab(&mut self, index: usize) {
self.active_tab = index;
self.scroll.reset();
}
pub fn next_page(&mut self, page_count: usize) {
if page_count > 0 {
self.current_page = (self.current_page + 1).min(page_count.saturating_sub(1));
}
}
pub fn prev_page(&mut self) {
self.current_page = self.current_page.saturating_sub(1);
}
}