use winit::{self, dpi::LogicalSize, WindowBuilder};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DisplayConfig {
#[serde(default = "default_title")]
pub title: String,
#[serde(default)]
pub fullscreen: bool,
#[serde(default)]
pub dimensions: Option<(u32, u32)>,
#[serde(default)]
pub min_dimensions: Option<(u32, u32)>,
#[serde(default)]
pub max_dimensions: Option<(u32, u32)>,
#[serde(default = "default_vsync")]
pub vsync: bool,
#[serde(default = "default_multisampling")]
pub multisampling: u16,
#[serde(default = "default_visibility")]
pub visibility: bool,
}
impl Default for DisplayConfig {
fn default() -> Self {
DisplayConfig {
title: default_title(),
fullscreen: false,
dimensions: None,
min_dimensions: None,
max_dimensions: None,
vsync: default_vsync(),
multisampling: default_multisampling(),
visibility: default_visibility(),
}
}
}
fn default_title() -> String {
"Amethyst game".to_string()
}
fn default_vsync() -> bool {
true
}
fn default_multisampling() -> u16 {
1
}
fn default_visibility() -> bool {
true
}
impl DisplayConfig {
pub fn to_windowbuilder(self, el: winit::EventsLoop) -> WindowBuilder {
use winit::WindowAttributes;
let attrs = WindowAttributes {
dimensions: self.dimensions.map(into_logical_size),
max_dimensions: self.max_dimensions.map(into_logical_size),
min_dimensions: self.min_dimensions.map(into_logical_size),
title: self.title,
visible: self.visibility,
..Default::default()
};
let mut builder = WindowBuilder::new();
builder.window = attrs;
if self.fullscreen {
builder = builder.with_fullscreen(Some(el.get_primary_monitor()));
}
builder
}
}
impl From<WindowBuilder> for DisplayConfig {
fn from(wb: WindowBuilder) -> Self {
DisplayConfig {
title: wb.window.title,
fullscreen: wb.window.fullscreen.is_some(),
dimensions: wb.window.dimensions.map(into_dimensions),
max_dimensions: wb.window.max_dimensions.map(into_dimensions),
min_dimensions: wb.window.min_dimensions.map(into_dimensions),
visibility: wb.window.visible,
..Default::default()
}
}
}
fn into_logical_size<D: Into<LogicalSize>>(dimensions: D) -> LogicalSize {
dimensions.into()
}
fn into_dimensions<S: Into<(u32, u32)>>(size: S) -> (u32, u32) {
size.into()
}