diff --git a/src/function.rs b/src/function.rs index c14390f..f3fc48c 100644 --- a/src/function.rs +++ b/src/function.rs @@ -207,6 +207,10 @@ pub struct FunctionEntry { roots_data: Option>, autocomplete: AutoComplete, + + invalid: bool, + + test_result: Option, } impl Default for FunctionEntry { @@ -225,6 +229,8 @@ impl Default for FunctionEntry { extrema_data: None, roots_data: None, autocomplete: AutoComplete::default(), + invalid: true, + test_result: None, } } } @@ -235,6 +241,7 @@ impl FunctionEntry { pub fn auto_complete(&mut self, ui: &mut egui::Ui, string: &mut String) -> bool { self.autocomplete.ui(ui, string) } + /// Update function settings pub fn update( &mut self, raw_func_str: &str, integral: bool, derivative: bool, @@ -244,13 +251,20 @@ impl FunctionEntry { let output = crate::parsing::test_func(&processed_func); self.raw_func_str = raw_func_str.to_string(); if output.is_some() { + self.test_result = output.clone(); + self.invalid = true; return output; } + self.invalid = false; self.function = BackingFunction::new(&processed_func); self.invalidate_whole(); } + if self.invalid { + return self.test_result.clone(); + } + self.derivative = derivative; self.integral = integral; return None; @@ -345,6 +359,10 @@ impl FunctionEntry { pub fn calculate( &mut self, min_x: &f64, max_x: &f64, width_changed: bool, settings: &AppSettings, ) { + if self.invalid { + return; + } + let resolution: f64 = settings.plot_width as f64 / (max_x.abs() + min_x.abs()); let resolution_iter = resolution_helper(&settings.plot_width + 1, min_x, &resolution); @@ -459,6 +477,10 @@ impl FunctionEntry { /// Displays the function's output on PlotUI `plot_ui` with settings /// `settings`. Returns an `Option` of the calculated integral pub fn display(&self, plot_ui: &mut PlotUi, settings: &AppSettings) -> Option { + if self.invalid { + return None; + } + let derivative_str = self.function.get_derivative_str(); let step = (settings.integral_min_x - settings.integral_max_x).abs() / (settings.integral_num as f64); diff --git a/src/math_app.rs b/src/math_app.rs index e9b54b9..00e8021 100644 --- a/src/math_app.rs +++ b/src/math_app.rs @@ -506,9 +506,15 @@ impl MathApp { integral_enabled.bitxor_assign(integral_toggle); derivative_enabled.bitxor_assign(derivative_toggle); - self.func_errors[i] = function + let update_result = function .update(&self.func_strs[i], integral_enabled, derivative_enabled) .map(|error| (i, error)); + + if update_result.is_some() { + self.exists_error = true; + } + + self.func_errors[i] = update_result } // Remove function if the user requests it @@ -709,7 +715,6 @@ impl epi::App for MathApp { dyn_mut_iter(&mut self.functions) .enumerate() - .filter(|(i, _)| !self.func_strs[*i].is_empty()) .for_each(|(_, function)| { function.calculate( &minx_bounds, @@ -723,7 +728,6 @@ impl epi::App for MathApp { .functions .iter() .enumerate() - .filter(|(i, _)| !self.func_strs[*i].is_empty()) .map(|(_, function)| function.display(plot_ui, &self.settings)) .collect(); });