fix error handling

This commit is contained in:
Simon Gardling 2022-04-01 02:48:00 -04:00
parent 06d5a32d09
commit 0cbf4b5dc7
2 changed files with 29 additions and 3 deletions

View File

@ -207,6 +207,10 @@ pub struct FunctionEntry {
roots_data: Option<Vec<Value>>,
autocomplete: AutoComplete,
invalid: bool,
test_result: Option<String>,
}
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<f64>` of the calculated integral
pub fn display(&self, plot_ui: &mut PlotUi, settings: &AppSettings) -> Option<f64> {
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);

View File

@ -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();
});