use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use winit::{
dpi::Size,
window::{WindowAttributes, WindowBuilder},
};
use crate::{config::scion_config::ScionConfig, core::components::color::Color};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct WindowConfig {
pub(crate) fullscreen: bool,
pub(crate) dimensions: Option<(u32, u32)>,
pub(crate) min_dimensions: Option<(u32, u32)>,
pub(crate) max_dimensions: Option<(u32, u32)>,
pub(crate) visibility: bool,
pub(crate) icon: Option<PathBuf>,
pub(crate) always_on_top: bool,
pub(crate) decorations: bool,
pub(crate) maximized: bool,
pub(crate) resizable: bool,
pub(crate) transparent: bool,
pub(crate) default_background_color: Option<Color>,
}
impl Default for WindowConfig {
fn default() -> Self {
Self {
fullscreen: false,
dimensions: Some((1024, 768)),
min_dimensions: Some((384, 336)),
max_dimensions: None,
visibility: true,
icon: None,
always_on_top: false,
decorations: true,
maximized: false,
resizable: true,
transparent: false,
default_background_color: None,
}
}
}
impl WindowConfig {
pub(crate) fn into(self, scion_config: &ScionConfig) -> WindowBuilder {
let mut builder = WindowBuilder::new();
builder.window = WindowAttributes {
title: scion_config.app_name.clone(),
fullscreen: None,
inner_size: self.dimensions.map(|d| d.into()).map(Size::Logical),
min_inner_size: self.min_dimensions.map(|d| d.into()).map(Size::Logical),
max_inner_size: self.max_dimensions.map(|d| d.into()).map(Size::Logical),
visible: self.visibility,
window_icon: None,
always_on_top: self.always_on_top,
decorations: self.decorations,
maximized: self.maximized,
resizable: self.resizable,
transparent: self.transparent,
position: None,
};
builder
}
}
pub struct WindowConfigBuilder {
config: WindowConfig,
}
impl WindowConfigBuilder {
pub fn new() -> Self {
Self { config: Default::default() }
}
pub fn with_dimensions(mut self, dimensions: (u32, u32)) -> Self {
self.config.dimensions = Some(dimensions);
self
}
pub fn with_resizable(mut self, resizable: bool) -> Self {
self.config.resizable = resizable;
self
}
pub fn with_default_background_color(mut self, color: Option<Color>) -> Self {
self.config.default_background_color = color;
self
}
pub fn get(self) -> WindowConfig {
self.config
}
}