Skip to main content

rustapi/
configeditor.rs

1use theframework::prelude::*;
2pub struct ConfigEditor {
3    pub target_fps: i32,
4    pub game_tick_ms: i32,
5    pub viewport: Vec2<i32>,
6    pub grid_size: i32,
7}
8
9use crate::editor::CONFIG;
10
11#[allow(clippy::new_without_default)]
12impl ConfigEditor {
13    pub fn new() -> Self {
14        Self {
15            target_fps: 30,
16            game_tick_ms: 250,
17            viewport: Vec2::new(800, 600),
18            grid_size: 32,
19        }
20    }
21
22    pub fn build(&self) -> TheCanvas {
23        let mut center = TheCanvas::new();
24
25        let mut textedit = TheTextAreaEdit::new(TheId::named("ConfigEdit"));
26        if let Some(bytes) = crate::Embedded::get("parser/TOML.sublime-syntax") {
27            if let Ok(source) = std::str::from_utf8(bytes.data.as_ref()) {
28                textedit.add_syntax_from_string(source);
29                textedit.set_code_type("TOML");
30            }
31        }
32        textedit.set_continuous(true);
33        textedit.display_line_number(true);
34        textedit.set_code_theme("base16-eighties.dark");
35        textedit.use_global_statusbar(true);
36        textedit.set_font_size(14.0);
37        center.set_widget(textedit);
38
39        center
40    }
41
42    pub fn get_i32_default(&self, table: &str, key: &str, default: i32) -> i32 {
43        let tab = CONFIG.read().unwrap();
44        if let Some(game) = tab.get(table).and_then(toml::Value::as_table) {
45            if let Some(value) = game.get(key) {
46                if let Some(v) = value.as_integer() {
47                    return v as i32;
48                }
49            }
50        }
51        default
52    }
53
54    pub fn get_f32_default(&self, table: &str, key: &str, default: f32) -> f32 {
55        let tab = CONFIG.read().unwrap();
56        if let Some(game) = tab.get(table).and_then(toml::Value::as_table) {
57            if let Some(value) = game.get(key) {
58                if let Some(v) = value.as_float() {
59                    return v as f32;
60                }
61            }
62        }
63        default
64    }
65
66    pub fn get_bool_default(&self, table: &str, key: &str, default: bool) -> bool {
67        let tab = CONFIG.read().unwrap();
68        if let Some(game) = tab.get(table).and_then(toml::Value::as_table) {
69            if let Some(value) = game.get(key) {
70                if let Some(v) = value.as_bool() {
71                    return v;
72                }
73            }
74        }
75        default
76    }
77
78    pub fn get_string_default(&self, table: &str, key: &str, default: &str) -> String {
79        let tab = CONFIG.read().unwrap();
80        if let Some(game) = tab.get(table).and_then(toml::Value::as_table) {
81            if let Some(value) = game.get(key) {
82                if let Some(v) = value.as_str() {
83                    return v.to_string();
84                }
85            }
86        }
87        default.to_string()
88    }
89
90    pub fn read_defaults(&mut self) {
91        self.target_fps = self.get_i32_default("game", "target_fps", 30).clamp(1, 60);
92        self.game_tick_ms = self.get_i32_default("game", "game_tick_ms", 250);
93        self.viewport.x = self.get_i32_default("viewport", "width", 800);
94        self.viewport.y = self.get_i32_default("viewport", "height", 600);
95        self.grid_size = self.get_i32_default("viewport", "grid_size", 32);
96    }
97}