pixels_graphics_lib/
window_prefs.rs1use crate::prelude::*;
2use serde::{Deserialize, Serialize};
3use simple_game_utils::prelude::*;
4use winit::dpi::{PhysicalPosition, PhysicalSize};
5use winit::window::Window;
6
7const PREF_WINDOW: &str = "window.pref";
8
9#[derive(Clone, Debug)]
10pub struct WindowPreferences {
11 preferences: Preferences<WindowPref>,
12}
13
14impl WindowPreferences {
15 pub fn new(
16 qualifier: &str,
17 org: &str,
18 name: &str,
19 version: usize,
20 ) -> Result<Self, GameUtilError> {
21 let preferences = Preferences::new(
22 get_pref_dir(qualifier, org, name)?,
23 &format!("{PREF_WINDOW}{version}"),
24 );
25 Ok(WindowPreferences { preferences })
26 }
27}
28
29impl WindowPreferences {
30 pub fn load(&mut self) -> Result<(), GameUtilError> {
31 self.preferences.load()
32 }
33
34 pub fn save(&self) -> Result<(), GameUtilError> {
35 self.preferences.save()
36 }
37
38 pub fn clear(&mut self) {
39 self.preferences.clear(PREF_WINDOW);
40 }
41
42 pub fn delete_file(&self) -> bool {
43 self.preferences.delete_file()
44 }
45
46 pub fn store(&mut self, window: &Window) {
47 if let Ok(pos) = window.outer_position() {
48 let size = window.inner_size();
49 self.preferences.set(
50 PREF_WINDOW,
51 WindowPref::new(pos.x, pos.y, size.width, size.height),
52 );
53 }
54 }
55
56 pub fn restore(&self, window: &mut Window) {
57 if let Some(prefs) = self.preferences.get(PREF_WINDOW) {
58 window.set_outer_position(PhysicalPosition::new(prefs.x, prefs.y));
59
60 let _ = window.request_inner_size(PhysicalSize::new(prefs.w, prefs.h));
61 } else if let Some(monitor) = window.current_monitor() {
62 let mid_x = monitor.size().width / 2;
63 let mid_y = monitor.size().height / 2;
64 let mid_w = window.inner_size().width / 2;
65 let mid_h = window.inner_size().height / 2;
66 window.set_outer_position(PhysicalPosition::new(
67 mid_x.saturating_sub(mid_w),
68 mid_y.saturating_sub(mid_h),
69 ));
70 } else {
71 window.set_outer_position(PhysicalPosition::new(100, 100));
72 }
73 }
74}
75
76#[derive(Clone, Serialize, Deserialize, Debug)]
77struct WindowPref {
78 x: i32,
79 y: i32,
80 w: u32,
81 h: u32,
82}
83
84impl WindowPref {
85 pub fn new(x: i32, y: i32, w: u32, h: u32) -> Self {
86 WindowPref { x, y, w, h }
87 }
88}