use prometeu_hal::color::Color; use prometeu_hal::window::{Rect, Window, WindowId}; /// PROMETEU Window Manager. pub struct WindowManager { pub windows: Vec, pub focused: Option, } impl WindowManager { pub fn new() -> Self { Self { windows: Vec::new(), focused: None } } pub fn add_window(&mut self, title: String, viewport: Rect, color: Color) -> WindowId { let id = WindowId(self.windows.len() as u32); let window = Window { id, viewport, has_focus: false, title, color }; self.windows.push(window); id } pub fn remove_window(&mut self, id: WindowId) { self.windows.retain(|w| w.id != id); if self.focused == Some(id) { self.focused = None; } } pub fn remove_all_windows(&mut self) { self.windows.clear(); self.focused = None; } pub fn set_focus(&mut self, id: WindowId) { self.focused = Some(id); for window in &mut self.windows { window.has_focus = window.id == id; } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_window_manager_focus() { let mut wm = WindowManager::new(); let id1 = wm.add_window("Window 1".to_string(), Rect { x: 0, y: 0, w: 10, h: 10 }, Color::WHITE); let id2 = wm.add_window( "Window 2".to_string(), Rect { x: 10, y: 10, w: 10, h: 10 }, Color::WHITE, ); assert_eq!(wm.windows.len(), 2); assert_eq!(wm.focused, None); wm.set_focus(id1); assert_eq!(wm.focused, Some(id1)); assert!(wm.windows[0].has_focus); assert!(!wm.windows[1].has_focus); wm.set_focus(id2); assert_eq!(wm.focused, Some(id2)); assert!(!wm.windows[0].has_focus); assert!(wm.windows[1].has_focus); } #[test] fn test_window_manager_remove_window() { let mut wm = WindowManager::new(); let id = wm.add_window("Window".to_string(), Rect { x: 0, y: 0, w: 10, h: 10 }, Color::WHITE); wm.set_focus(id); assert_eq!(wm.focused, Some(id)); wm.remove_window(id); assert_eq!(wm.windows.len(), 0); assert_eq!(wm.focused, None); } }