pixels_graphics_lib/
window_prefs.rs

1use 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}