From 162f782d81e780f384054cf481b657e9ceab3c18 Mon Sep 17 00:00:00 2001 From: pommicket Date: Wed, 25 Jan 2023 18:46:10 -0500 Subject: reload settings when settings file is changed --- src/fshader_post.glsl | 2 +- src/main.rs | 56 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/fshader_post.glsl b/src/fshader_post.glsl index 41b442f..2c26d95 100644 --- a/src/fshader_post.glsl +++ b/src/fshader_post.glsl @@ -8,7 +8,7 @@ IN vec2 uv; void main() { // amount to darken screen by when paused - float pause_darkening = 0.75; + float pause_darkening = 0.5; vec4 color = texture(u_main_texture, uv) * (1.0 - pause_darkening * u_paused); vec2 menu_uv = (uv * 2.0 - 1.0) * vec2(1.0, -1.0); menu_uv *= 1.0 / u_menu_scale; diff --git a/src/main.rs b/src/main.rs index b8f8329..c13574a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ /* @TODO: -- reload settings.txt when changed +- redraw SDF even when paused if settings or window resolution is changed - flash error on bad string (see @TODO(error handling)) - RnToRn functions (& add back in RToR) - also add PerComponent(Box,Box,Box) in R3ToR3 @@ -29,9 +29,9 @@ use nalgebra::{Matrix3, Matrix4, Rotation3, Vector3}; use sdf::ImportExport; use std::{ collections::HashMap, - fs::File, + fs::{self, File}, io::{prelude::*, BufReader, BufWriter}, - time::Instant, + time::{Instant, SystemTime} }; use win::{ColorF32, ColorGrayscaleF32, ColorU8}; @@ -190,13 +190,34 @@ const TEST_WIDTH: u16 = 100; #[derive(Default)] struct Settings { data: HashMap, + filename: String, + file_last_modified: Option, } impl Settings { - fn load(filename: &str) -> Result { - let file = File::open(filename).map_err(|e| format!("{e}"))?; + fn get_modified_time(&self) -> Option { + fs::metadata(&self.filename).ok() + .map(|m| m.modified().ok()) + .flatten() + } + + pub fn load(filename: &str) -> Result { + let mut settings = Self { + filename: filename.to_string(), + file_last_modified: None, + data: HashMap::new(), + }; + settings.reload()?; + Ok(settings) + } + + /// Reload settings from file. On failure, the settings are left unchanged. + fn reload(&mut self) -> Result<(), String> { + self.file_last_modified = self.get_modified_time(); + + let mut new_data = HashMap::new(); + let file = File::open(&self.filename).map_err(|e| format!("{e}"))?; let reader = BufReader::new(file); - let mut data = HashMap::new(); for line in reader.lines() { let full_line = line.map_err(|e| format!("{e}"))?; let line = full_line.trim(); @@ -210,10 +231,27 @@ impl Settings { let key = parts[0].trim(); let value = parts[1].trim(); let value: f64 = value.parse().map_err(|_| format!("bad number: {value}"))?; - data.insert(key.to_string(), value); + new_data.insert(key.to_string(), value); } } - Ok(Self { data }) + + self.data = new_data; + Ok(()) + } + + /// reload settings if the settings file was changed. + /// returns true if the settings were changed. + pub fn reload_if_modified(&mut self) -> bool { + if self.get_modified_time() != self.file_last_modified { + if self.reload().is_err() { + // we'll just keep the old settings. + false + } else { + true + } + } else { + false + } } fn get_f64(&self, key: &str) -> Option { @@ -601,6 +639,8 @@ impl State { // returns false if we should quit fn frame(&mut self) -> bool { + self.settings.reload_if_modified(); + if let Some(max_framerate) = self.settings.get_f32("max-framerate") { if max_framerate > 0.0 { let dt = self.frame_time.elapsed().as_secs_f32(); -- cgit v1.2.3