use std::cell::Cell;
use std::rc::Rc;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct OsWindowState {
pub width: Option<u32>,
pub height: Option<u32>,
pub fullscreen: bool,
pub maximized: bool,
}
impl OsWindowState {
pub fn from_handle(h: &OsWindowHandle) -> Self {
let (w, hgt) = h.size.get();
Self {
width: if w > 0 { Some(w) } else { None },
height: if hgt > 0 { Some(hgt) } else { None },
fullscreen: h.fullscreen.get(),
maximized: h.maximized.get(),
}
}
pub fn serialize(&self) -> String {
format!(
"{},{},{},{}",
self.width.unwrap_or(0),
self.height.unwrap_or(0),
self.fullscreen as u8,
self.maximized as u8,
)
}
pub fn deserialize(s: &str) -> Option<Self> {
let mut it = s.splitn(4, ',');
let w : u32 = it.next()?.trim().parse().ok()?;
let h : u32 = it.next()?.trim().parse().ok()?;
let fs : u8 = it.next()?.trim().parse().ok()?;
let mx : u8 = it.next().and_then(|v| v.trim().parse().ok()).unwrap_or(0);
Some(Self {
width: if w > 0 { Some(w) } else { None },
height: if h > 0 { Some(h) } else { None },
fullscreen: fs != 0,
maximized: mx != 0,
})
}
}
#[derive(Clone)]
pub struct OsWindowHandle {
pub size: Rc<Cell<(u32, u32)>>,
pub fullscreen: Rc<Cell<bool>>,
pub maximized: Rc<Cell<bool>>,
}
impl OsWindowHandle {
pub fn new() -> Self {
Self {
size: Rc::new(Cell::new((0, 0))),
fullscreen: Rc::new(Cell::new(false)),
maximized: Rc::new(Cell::new(false)),
}
}
pub fn apply(&self, s: &OsWindowState) {
let w = s.width.unwrap_or(0);
let h = s.height.unwrap_or(0);
self.size.set((w, h));
self.fullscreen.set(s.fullscreen);
self.maximized.set(s.maximized);
}
}
impl Default for OsWindowHandle {
fn default() -> Self { Self::new() }
}