use crate::overlay::OverlayType;
use crate::render::palette_editor::PaletteEditorState;
#[derive(Debug, Clone, Default)]
pub struct OverlayState {
active: Option<OverlayType>,
pub palette_editor: Option<PaletteEditorState>,
}
impl OverlayState {
pub fn new() -> Self {
Self::default()
}
pub fn is_open(&self, overlay: OverlayType) -> bool {
self.active == Some(overlay)
}
pub fn active(&self) -> Option<OverlayType> {
self.active
}
pub fn open(&mut self, overlay: OverlayType) {
self.active = Some(overlay);
}
pub fn close(&mut self) {
self.active = None;
}
pub fn toggle(&mut self, overlay: OverlayType) {
if self.is_open(overlay) {
self.close();
} else {
self.open(overlay);
}
}
pub fn any_open(&self) -> bool {
self.active.is_some()
}
pub fn open_palette_editor(&mut self, state: PaletteEditorState) {
self.palette_editor = Some(state);
self.open(OverlayType::PaletteEditor);
}
pub fn close_palette_editor(&mut self) {
self.palette_editor = None;
if self.is_open(OverlayType::PaletteEditor) {
self.close();
}
}
pub fn is_palette_editor_open(&self) -> bool {
self.is_open(OverlayType::PaletteEditor) && self.palette_editor.is_some()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_state() {
let state = OverlayState::default();
assert!(!state.any_open());
assert_eq!(state.active(), None);
}
#[test]
fn test_open_and_close() {
let mut state = OverlayState::default();
state.open(OverlayType::Controls);
assert!(state.is_open(OverlayType::Controls));
assert!(state.any_open());
state.close();
assert!(!state.is_open(OverlayType::Controls));
assert!(!state.any_open());
}
#[test]
fn test_mutual_exclusivity() {
let mut state = OverlayState::default();
state.open(OverlayType::Controls);
assert!(state.is_open(OverlayType::Controls));
state.open(OverlayType::Dashboard);
assert!(!state.is_open(OverlayType::Controls));
assert!(state.is_open(OverlayType::Dashboard));
}
#[test]
fn test_toggle() {
let mut state = OverlayState::default();
state.toggle(OverlayType::Controls);
assert!(state.is_open(OverlayType::Controls));
state.toggle(OverlayType::Controls);
assert!(!state.is_open(OverlayType::Controls));
state.toggle(OverlayType::Controls);
state.toggle(OverlayType::Dashboard);
assert!(!state.is_open(OverlayType::Controls));
assert!(state.is_open(OverlayType::Dashboard));
}
#[test]
fn test_is_open_false_for_different_overlay() {
let mut state = OverlayState::default();
state.open(OverlayType::Controls);
assert!(state.is_open(OverlayType::Controls));
assert!(!state.is_open(OverlayType::Dashboard));
assert!(!state.is_open(OverlayType::KeyboardHints));
}
}