use std::{collections::HashMap, fmt::Debug};
use r3bl_rs_utils_core::*;
use crate::*;
#[derive(Clone, PartialEq, Eq, Debug, Default)]
pub struct HasFocus {
pub cursor_position_map: CursorPositionMap,
pub maybe_id: Option<FlexBoxIdType>,
pub maybe_id_before_modal: Option<FlexBoxIdType>,
}
pub type CursorPositionMap = HashMap<FlexBoxIdType, Option<Position>>;
impl HasFocus {
pub fn get_id(&self) -> Option<FlexBoxIdType> { self.maybe_id }
pub fn is_empty(&self) -> bool { self.maybe_id.is_none() }
pub fn is_set(&self) -> bool { !self.is_empty() }
pub fn set_id(&mut self, id: FlexBoxIdType) { self.maybe_id = Some(id) }
pub fn does_id_have_focus(&self, id: FlexBoxIdType) -> bool { self.maybe_id == Some(id) }
pub fn does_current_box_have_focus(&self, current_box: &FlexBox) -> bool { self.does_id_have_focus(current_box.id) }
}
impl HasFocus {
pub fn set_modal_id(&mut self, id: FlexBoxIdType) {
self.maybe_id_before_modal = self.maybe_id;
self.set_id(id);
}
pub fn is_modal_set(&self) -> bool { self.maybe_id_before_modal.is_some() }
pub fn is_modal_id(&self, id: FlexBoxIdType) -> bool { self.is_modal_set() && self.does_id_have_focus(id) }
pub fn reset_modal_id(&mut self) -> Option<FlexBoxIdType> {
if let Some(prev_id) = self.maybe_id_before_modal {
self.maybe_id = Some(prev_id);
self.maybe_id_before_modal = None;
Some(prev_id)
} else {
None
}
}
}
impl HasFocus {
pub fn set_cursor_position_for_id(&mut self, id: FlexBoxIdType, maybe_position: Option<Position>) {
let map = &mut self.cursor_position_map;
map.insert(id, maybe_position);
}
pub fn get_cursor_position_for_id(&self, id: FlexBoxIdType) -> Option<Position> {
let map = &self.cursor_position_map;
if let Some(value) = map.get(&id) {
*value
} else {
None
}
}
}