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}