use std::sync::{Arc, Mutex};
use crate::window::AppWindow;
pub struct WindowManager(Mutex<Vec<Arc<Mutex<AppWindow>>>>);
impl WindowManager {
pub(crate) fn new() -> WindowManager {
WindowManager(Mutex::new(Vec::with_capacity(1)))
}
pub(crate) fn allocate_new_window_id(&self) -> usize {
let windows = self.0.lock().unwrap();
windows.len() + 1
}
pub(crate) fn add(&self, window: Arc<Mutex<AppWindow>>) {
let mut windows = self.0.lock().unwrap();
if let None = windows.iter().position(|w| Arc::ptr_eq(&w, &window)) {
windows.push(window);
}
}
pub(crate) fn will_close(&self, window_id: usize) {
let mut windows = self.0.lock().unwrap();
if let Some(index) = windows.iter().position(|window| {
let mut w = window.lock().unwrap();
if w.id == window_id {
w.delegate.will_close();
return true;
}
false
}) {
windows.remove(index);
}
}
}