use std::collections::HashMap;
use crate::types::ScrollState;
pub const DEFAULT_SIDEBAR_WIDTH: f64 = 340.0;
pub const MIN_SIDEBAR_WIDTH: f64 = 280.0;
pub const MAX_SIDEBAR_WIDTH: f64 = 4000.0;
#[derive(Debug, Clone)]
pub struct SidebarState {
pub is_collapsed: bool,
pub width: f64,
pub active_tab: Option<String>,
pub scroll_per_panel: HashMap<String, ScrollState>,
pub resize_dragging: bool,
pub resize_drag_start_x: f64,
pub resize_drag_start_width: f64,
pub header_action_hovered: Option<String>,
}
impl Default for SidebarState {
fn default() -> Self {
Self {
is_collapsed: false,
width: DEFAULT_SIDEBAR_WIDTH,
active_tab: None,
scroll_per_panel: HashMap::new(),
resize_dragging: false,
resize_drag_start_x: 0.0,
resize_drag_start_width: DEFAULT_SIDEBAR_WIDTH,
header_action_hovered: None,
}
}
}
impl SidebarState {
pub fn get_or_insert_scroll(&mut self, panel_id: &str) -> &mut ScrollState {
self.scroll_per_panel
.entry(panel_id.to_owned())
.or_default()
}
pub fn start_resize_drag(&mut self, x: f64) {
self.resize_dragging = true;
self.resize_drag_start_x = x;
self.resize_drag_start_width = self.width;
}
pub fn update_resize_drag(&mut self, x: f64, delta_sign: f64) {
if !self.resize_dragging {
return;
}
let delta = (self.resize_drag_start_x - x) * delta_sign;
self.width = (self.resize_drag_start_width + delta)
.clamp(MIN_SIDEBAR_WIDTH, MAX_SIDEBAR_WIDTH);
}
pub fn end_resize_drag(&mut self) {
self.resize_dragging = false;
}
pub fn toggle_collapse(&mut self) {
self.is_collapsed = !self.is_collapsed;
}
pub fn set_active_tab(&mut self, id: impl Into<String>) {
self.active_tab = Some(id.into());
}
}