84 lines
2.2 KiB
Rust
84 lines
2.2 KiB
Rust
use prometeu_hal::color::Color;
|
|
use prometeu_hal::window::{Rect, Window, WindowId};
|
|
|
|
/// PROMETEU Window Manager.
|
|
pub struct WindowManager {
|
|
pub windows: Vec<Window>,
|
|
pub focused: Option<WindowId>,
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|