//! Common window model types. use crate::scene::{Color, UiSize}; #[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct WindowId(u64); impl WindowId { pub const fn from_raw(raw: u64) -> Self { Self(raw) } pub const fn raw(self) -> u64 { self.0 } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum DecorationMode { Auto, Server, Client, } #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum WindowLifecycle { LogicalClosed, Opening, AwaitingInitialConfigure, OpenHidden, OpenVisible, Closing, } #[derive(Clone, Copy, Debug, PartialEq)] pub struct WindowConfigured { pub actual_inner_size: UiSize, pub scale_factor: f32, pub visible: bool, pub maximized: bool, pub fullscreen: bool, } #[derive(Clone, Debug, PartialEq)] pub struct WindowSpec { pub key: Option, pub title: String, pub app_id: Option, pub open: bool, pub visible: bool, pub requested_inner_size: Option, pub min_inner_size: Option, pub max_inner_size: Option, pub decorations: DecorationMode, pub maximized: bool, pub fullscreen: bool, pub resizable: bool, pub base_color: Color, } impl WindowSpec { pub fn new(title: impl Into) -> Self { Self { key: None, title: title.into(), app_id: None, open: true, visible: true, requested_inner_size: None, min_inner_size: None, max_inner_size: None, decorations: DecorationMode::Auto, maximized: false, fullscreen: false, resizable: true, base_color: Color::rgb(0x08, 0x0C, 0x14), } } pub fn base_color(mut self, color: Color) -> Self { self.base_color = color; self } pub fn key(mut self, key: impl Into) -> Self { self.key = Some(key.into()); self } pub fn app_id(mut self, app_id: impl Into) -> Self { self.app_id = Some(app_id.into()); self } pub fn open(mut self, open: bool) -> Self { self.open = open; self } pub fn visible(mut self, visible: bool) -> Self { self.visible = visible; self } pub fn requested_inner_size(mut self, size: UiSize) -> Self { self.requested_inner_size = Some(size); self } pub fn min_inner_size(mut self, size: UiSize) -> Self { self.min_inner_size = Some(size); self } pub fn max_inner_size(mut self, size: UiSize) -> Self { self.max_inner_size = Some(size); self } pub fn decorations(mut self, decorations: DecorationMode) -> Self { self.decorations = decorations; self } pub fn maximized(mut self, maximized: bool) -> Self { self.maximized = maximized; self } pub fn fullscreen(mut self, fullscreen: bool) -> Self { self.fullscreen = fullscreen; self } pub fn resizable(mut self, resizable: bool) -> Self { self.resizable = resizable; self } } #[derive(Clone, Debug, Default, PartialEq)] pub struct WindowUpdate { pub title: Option, pub open: Option, pub visible: Option, pub requested_inner_size: Option>, pub min_inner_size: Option>, pub max_inner_size: Option>, pub decorations: Option, pub maximized: Option, pub fullscreen: Option, pub resizable: Option, } impl WindowUpdate { pub fn new() -> Self { Self::default() } pub fn title(mut self, title: impl Into) -> Self { self.title = Some(title.into()); self } pub fn open(mut self, open: bool) -> Self { self.open = Some(open); self } pub fn visible(mut self, visible: bool) -> Self { self.visible = Some(visible); self } pub fn requested_inner_size(mut self, size: Option) -> Self { self.requested_inner_size = Some(size); self } pub fn min_inner_size(mut self, size: Option) -> Self { self.min_inner_size = Some(size); self } pub fn max_inner_size(mut self, size: Option) -> Self { self.max_inner_size = Some(size); self } pub fn decorations(mut self, decorations: DecorationMode) -> Self { self.decorations = Some(decorations); self } pub fn maximized(mut self, maximized: bool) -> Self { self.maximized = Some(maximized); self } pub fn fullscreen(mut self, fullscreen: bool) -> Self { self.fullscreen = Some(fullscreen); self } pub fn resizable(mut self, resizable: bool) -> Self { self.resizable = Some(resizable); self } pub fn apply_to(&self, spec: &mut WindowSpec) { if let Some(title) = &self.title { spec.title = title.clone(); } if let Some(open) = self.open { spec.open = open; } if let Some(visible) = self.visible { spec.visible = visible; } if let Some(requested_inner_size) = self.requested_inner_size { spec.requested_inner_size = requested_inner_size; } if let Some(min_inner_size) = self.min_inner_size { spec.min_inner_size = min_inner_size; } if let Some(max_inner_size) = self.max_inner_size { spec.max_inner_size = max_inner_size; } if let Some(decorations) = self.decorations { spec.decorations = decorations; } if let Some(maximized) = self.maximized { spec.maximized = maximized; } if let Some(fullscreen) = self.fullscreen { spec.fullscreen = fullscreen; } if let Some(resizable) = self.resizable { spec.resizable = resizable; } } }