Skip to main content

paiagram_core/
settings.rs

1//! User preferences and project settings.
2
3use bevy::prelude::*;
4
5use crate::i18n::Language;
6use crate::units::time::Duration;
7
8#[derive(Default, Reflect, Copy, Clone, Debug, PartialEq, Eq)]
9pub enum AntialiasingMode {
10    #[default]
11    On,
12    Off,
13}
14
15#[derive(Reflect, Copy, Clone, Debug, PartialEq, Eq, Default)]
16pub enum LevelOfDetailMode {
17    #[default]
18    Off,
19    Lod2,
20    Lod4,
21}
22
23impl LevelOfDetailMode {
24    pub fn as_u8(self) -> u8 {
25        match self {
26            Self::Off => 1,
27            Self::Lod2 => 2,
28            Self::Lod4 => 4,
29        }
30    }
31}
32
33pub struct SettingsPlugin;
34impl Plugin for SettingsPlugin {
35    fn build(&self, app: &mut App) {
36        app.init_resource::<UserPreferences>()
37            .init_resource::<ProjectSettings>()
38            .add_systems(
39                Update,
40                sync_preferences.run_if(resource_changed::<UserPreferences>),
41            );
42    }
43}
44
45#[derive(Reflect, Resource)]
46#[reflect(Resource)]
47pub struct UserPreferences {
48    pub lang: Language,
49    pub dark_mode: bool, // TODO: this should be handled by egui instead.
50    pub developer_mode: bool,
51    pub antialiasing_mode: AntialiasingMode,
52    pub level_of_detail_mode: LevelOfDetailMode,
53}
54
55impl Default for UserPreferences {
56    fn default() -> Self {
57        Self {
58            lang: Language::EnCA,
59            dark_mode: false,
60            developer_mode: cfg!(debug_assertions),
61            antialiasing_mode: AntialiasingMode::default(),
62            level_of_detail_mode: LevelOfDetailMode::default(),
63        }
64    }
65}
66
67/// Only run when the preferences change
68fn sync_preferences(preferences: Res<UserPreferences>) {
69    egui_i18n::set_language(preferences.lang.identifier());
70}
71
72#[derive(Reflect, Resource)]
73#[reflect(Resource)]
74pub struct ProjectSettings {
75    pub remarks: String,
76    pub authors: Vec<String>,
77    pub repeat_frequency: Duration,
78}
79
80impl Default for ProjectSettings {
81    fn default() -> Self {
82        Self {
83            remarks: String::new(),
84            authors: Vec::new(),
85            repeat_frequency: Duration::from_secs(86400),
86        }
87    }
88}