#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OverlayKind {
Help,
Export,
Legend,
}
#[derive(Debug, Clone, Default)]
pub struct OverlayState {
current: Option<OverlayKind>,
}
impl OverlayState {
#[must_use]
pub const fn new() -> Self {
Self { current: None }
}
#[must_use]
pub const fn has_overlay(&self) -> bool {
self.current.is_some()
}
#[must_use]
pub fn is_showing(&self, kind: OverlayKind) -> bool {
self.current == Some(kind)
}
#[must_use]
pub const fn current(&self) -> Option<OverlayKind> {
self.current
}
pub const fn show(&mut self, kind: OverlayKind) {
self.current = Some(kind);
}
pub const fn close(&mut self) {
self.current = None;
}
pub const fn close_all(&mut self) {
self.current = None;
}
pub fn toggle(&mut self, kind: OverlayKind) {
if self.current == Some(kind) {
self.current = None;
} else {
self.current = Some(kind);
}
}
pub fn toggle_help(&mut self) {
self.toggle(OverlayKind::Help);
}
pub fn toggle_export(&mut self) {
self.toggle(OverlayKind::Export);
}
pub fn toggle_legend(&mut self) {
self.toggle(OverlayKind::Legend);
}
#[must_use]
pub fn show_help(&self) -> bool {
self.is_showing(OverlayKind::Help)
}
#[must_use]
pub fn show_export(&self) -> bool {
self.is_showing(OverlayKind::Export)
}
#[must_use]
pub fn show_legend(&self) -> bool {
self.is_showing(OverlayKind::Legend)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_overlay_state_new() {
let state = OverlayState::new();
assert!(!state.has_overlay());
assert!(state.current().is_none());
}
#[test]
fn test_overlay_state_show() {
let mut state = OverlayState::new();
state.show(OverlayKind::Help);
assert!(state.has_overlay());
assert!(state.is_showing(OverlayKind::Help));
assert!(state.show_help());
assert!(!state.show_export());
assert!(!state.show_legend());
}
#[test]
fn test_overlay_state_mutual_exclusion() {
let mut state = OverlayState::new();
state.show(OverlayKind::Help);
assert!(state.is_showing(OverlayKind::Help));
state.show(OverlayKind::Export);
assert!(state.is_showing(OverlayKind::Export));
assert!(!state.is_showing(OverlayKind::Help));
state.show(OverlayKind::Legend);
assert!(state.is_showing(OverlayKind::Legend));
assert!(!state.is_showing(OverlayKind::Export));
}
#[test]
fn test_overlay_state_toggle() {
let mut state = OverlayState::new();
state.toggle(OverlayKind::Help);
assert!(state.is_showing(OverlayKind::Help));
state.toggle(OverlayKind::Help);
assert!(!state.has_overlay());
state.toggle(OverlayKind::Help);
state.toggle(OverlayKind::Export);
assert!(state.is_showing(OverlayKind::Export));
assert!(!state.is_showing(OverlayKind::Help));
}
#[test]
fn test_overlay_state_close() {
let mut state = OverlayState::new();
state.show(OverlayKind::Help);
assert!(state.has_overlay());
state.close();
assert!(!state.has_overlay());
}
#[test]
fn test_overlay_state_close_all() {
let mut state = OverlayState::new();
state.show(OverlayKind::Legend);
state.close_all();
assert!(!state.has_overlay());
}
#[test]
fn test_overlay_state_convenience_toggles() {
let mut state = OverlayState::new();
state.toggle_help();
assert!(state.show_help());
state.toggle_export();
assert!(state.show_export());
assert!(!state.show_help());
state.toggle_legend();
assert!(state.show_legend());
assert!(!state.show_export());
}
}