paiagram_core/
settings.rs1use 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, 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
67fn 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}