comments and refactoring

This commit is contained in:
Simon Gardling 2022-03-10 12:44:41 -05:00
parent 3d16b269c0
commit 5ff8bc2d92
2 changed files with 42 additions and 27 deletions

View File

@ -23,7 +23,6 @@ lto = false
[dependencies] [dependencies]
eframe = { git = "https://github.com/emilk/egui", default-features = false, features = ["egui_glow"] } eframe = { git = "https://github.com/emilk/egui", default-features = false, features = ["egui_glow"] }
# include-flate = { git = "https://github.com/Titaniumtown/include-flate.git" }
shadow-rs = { version = "0.9", default-features = false } shadow-rs = { version = "0.9", default-features = false }
const_format = { version = "0.2.22", default-features = false, features = ["fmt"] } const_format = { version = "0.2.22", default-features = false, features = ["fmt"] }
cfg-if = "1.0.0" cfg-if = "1.0.0"

View File

@ -264,8 +264,10 @@ struct AppSettings {
// Stores whether or not dark mode is enabled // Stores whether or not dark mode is enabled
pub dark_mode: bool, pub dark_mode: bool,
// Stores whether or not displaying extrema is enabled
pub extrema: bool, pub extrema: bool,
// Stores whether or not displaying roots is enabled
pub roots: bool, pub roots: bool,
} }
@ -299,7 +301,7 @@ pub struct MathApp {
// Contains the list of Areas calculated (the vector of f64) and time it took for the last frame (the Duration). Stored in a Tuple. // Contains the list of Areas calculated (the vector of f64) and time it took for the last frame (the Duration). Stored in a Tuple.
last_info: (Vec<f64>, Duration), last_info: (Vec<f64>, Duration),
// Stores Settings (pretty self explanatory) // Stores Settings (pretty self-explanatory)
settings: AppSettings, settings: AppSettings,
} }
@ -321,6 +323,7 @@ impl MathApp {
SidePanel::left("side_panel") SidePanel::left("side_panel")
.resizable(false) .resizable(false)
.show(ctx, |ui| { .show(ctx, |ui| {
// ComboBox for selecting what Riemann sum type to use
ComboBox::from_label("Riemann Sum Type") ComboBox::from_label("Riemann Sum Type")
.selected_text(self.settings.sum.to_string()) .selected_text(self.settings.sum.to_string())
.show_ui(ui, |ui| { .show_ui(ui, |ui| {
@ -329,6 +332,7 @@ impl MathApp {
ui.selectable_value(&mut self.settings.sum, RiemannSum::Right, "Right"); ui.selectable_value(&mut self.settings.sum, RiemannSum::Right, "Right");
}); });
// Config options for Extrema and roots
let mut extrema_toggled: bool = false; let mut extrema_toggled: bool = false;
let mut roots_toggled: bool = false; let mut roots_toggled: bool = false;
ui.horizontal(|ui| { ui.horizontal(|ui| {
@ -349,6 +353,7 @@ impl MathApp {
.clicked(); .clicked();
}); });
// If options toggled, flip the boolean
self.settings.extrema.bitxor_assign(extrema_toggled); self.settings.extrema.bitxor_assign(extrema_toggled);
self.settings.roots.bitxor_assign(roots_toggled); self.settings.roots.bitxor_assign(roots_toggled);
@ -368,7 +373,7 @@ impl MathApp {
) )
.changed(); .changed();
// Checks bounds, and if they are invalid, fix them // Checks integral bounds, and if they are invalid, fix them
if self.settings.integral_min_x >= self.settings.integral_max_x { if self.settings.integral_min_x >= self.settings.integral_max_x {
if max_x_changed { if max_x_changed {
self.settings.integral_max_x = max_x_old; self.settings.integral_max_x = max_x_old;
@ -381,6 +386,7 @@ impl MathApp {
} }
} }
// Number of Rectangles for Riemann sum
let integral_num_changed = ui let integral_num_changed = ui
.add( .add(
Slider::new(&mut self.settings.integral_num, INTEGRAL_NUM_RANGE) Slider::new(&mut self.settings.integral_num, INTEGRAL_NUM_RANGE)
@ -388,6 +394,7 @@ impl MathApp {
) )
.changed(); .changed();
// Stores whether global config options changed
let configs_changed = max_x_changed let configs_changed = max_x_changed
| min_x_changed | integral_num_changed | min_x_changed | integral_num_changed
| roots_toggled | extrema_toggled; | roots_toggled | extrema_toggled;
@ -395,8 +402,9 @@ impl MathApp {
let functions_len = self.functions.len(); let functions_len = self.functions.len();
let mut remove_i: Option<usize> = None; let mut remove_i: Option<usize> = None;
for (i, function) in self.functions.iter_mut().enumerate() { for (i, function) in self.functions.iter_mut().enumerate() {
let integral_enabled = function.integral; let mut integral_enabled = function.integral;
let derivative_enabled = function.derivative; let mut derivative_enabled = function.derivative;
let mut derivative_toggle: bool = false; let mut derivative_toggle: bool = false;
let mut integral_toggle: bool = false; let mut integral_toggle: bool = false;
@ -418,6 +426,7 @@ impl MathApp {
ui.add_enabled(false, Button::new("X")); ui.add_enabled(false, Button::new("X"));
} }
// Toggle integral being enabled or not
integral_toggle = ui integral_toggle = ui
.add(Button::new("")) .add(Button::new(""))
.on_hover_text(match integral_enabled { .on_hover_text(match integral_enabled {
@ -426,6 +435,7 @@ impl MathApp {
}) })
.clicked(); .clicked();
// Toggle showing the derivative (even though it's already calculated, this option just toggles if it's displayed or not)
derivative_toggle = ui derivative_toggle = ui
.add(Button::new("d/dx")) .add(Button::new("d/dx"))
.on_hover_text(match derivative_enabled { .on_hover_text(match derivative_enabled {
@ -434,6 +444,7 @@ impl MathApp {
}) })
.clicked(); .clicked();
// Contains the function string in a text box that the user can edit
ui.text_edit_singleline(&mut self.func_strs[i]); ui.text_edit_singleline(&mut self.func_strs[i]);
}); });
@ -443,23 +454,16 @@ impl MathApp {
| (proc_func_str != function.get_func_str()) | (proc_func_str != function.get_func_str())
| self.last_error.iter().any(|ele| ele.0 == i) | self.last_error.iter().any(|ele| ele.0 == i)
{ {
// let proc_func_str = self.func_strs[i].clone(); integral_enabled.bitxor_assign(integral_toggle);
let func_test_output = test_func(&proc_func_str); derivative_enabled.bitxor_assign(derivative_toggle);
if let Some(test_output_value) = func_test_output {
if let Some(test_output_value) = test_func(&proc_func_str) {
self.last_error.push((i, test_output_value)); self.last_error.push((i, test_output_value));
} else { } else {
function.update( function.update(
proc_func_str, proc_func_str,
if integral_toggle { integral_enabled,
!integral_enabled derivative_enabled,
} else {
integral_enabled
},
if derivative_toggle {
!derivative_enabled
} else {
derivative_enabled
},
Some(self.settings.integral_min_x), Some(self.settings.integral_min_x),
Some(self.settings.integral_max_x), Some(self.settings.integral_max_x),
Some(self.settings.integral_num), Some(self.settings.integral_num),
@ -475,11 +479,10 @@ impl MathApp {
} }
} }
if self.functions.len() > 1 { // Remove function if the user requests it
if let Some(remove_i_unwrap) = remove_i { if let Some(remove_i_unwrap) = remove_i {
self.functions.remove(remove_i_unwrap); self.functions.remove(remove_i_unwrap);
self.func_strs.remove(remove_i_unwrap); self.func_strs.remove(remove_i_unwrap);
}
} }
// Open Source and Licensing information // Open Source and Licensing information
@ -506,6 +509,8 @@ impl epi::App for MathApp {
#[inline(always)] #[inline(always)]
fn update(&mut self, ctx: &Context, _frame: &Frame) { fn update(&mut self, ctx: &Context, _frame: &Frame) {
let start = instant::Instant::now(); let start = instant::Instant::now();
// Set dark/light mode depending on the variable `self.settings.dark_mode`
ctx.set_visuals(match self.settings.dark_mode { ctx.set_visuals(match self.settings.dark_mode {
true => Visuals::dark(), true => Visuals::dark(),
false => Visuals::light(), false => Visuals::light(),
@ -516,6 +521,7 @@ impl epi::App for MathApp {
// Creates Top bar that contains some general options // Creates Top bar that contains some general options
TopBottomPanel::top("top_bar").show(ctx, |ui| { TopBottomPanel::top("top_bar").show(ctx, |ui| {
ui.horizontal(|ui| { ui.horizontal(|ui| {
// Button in top bar to toggle showing the side panel
self.settings.show_side_panel.bitxor_assign( self.settings.show_side_panel.bitxor_assign(
ui.add(Button::new("Panel")) ui.add(Button::new("Panel"))
.on_hover_text(match self.settings.show_side_panel { .on_hover_text(match self.settings.show_side_panel {
@ -525,6 +531,7 @@ impl epi::App for MathApp {
.clicked(), .clicked(),
); );
// Button to add a new function
if ui if ui
.add(Button::new("Add Function")) .add(Button::new("Add Function"))
.on_hover_text("Create and graph new function") .on_hover_text("Create and graph new function")
@ -538,6 +545,7 @@ impl epi::App for MathApp {
self.func_strs.push(String::new()); self.func_strs.push(String::new());
} }
// Toggles opening the Help window
self.settings.help_open.bitxor_assign( self.settings.help_open.bitxor_assign(
ui.add(Button::new("Help")) ui.add(Button::new("Help"))
.on_hover_text(match self.settings.help_open { .on_hover_text(match self.settings.help_open {
@ -547,6 +555,7 @@ impl epi::App for MathApp {
.clicked(), .clicked(),
); );
// Toggles opening the Info window
self.settings.info_open.bitxor_assign( self.settings.info_open.bitxor_assign(
ui.add(Button::new("Info")) ui.add(Button::new("Info"))
.on_hover_text(match self.settings.info_open { .on_hover_text(match self.settings.info_open {
@ -556,6 +565,7 @@ impl epi::App for MathApp {
.clicked(), .clicked(),
); );
// Toggles dark/light mode
self.settings.dark_mode.bitxor_assign( self.settings.dark_mode.bitxor_assign(
ui.add(Button::new(match self.settings.dark_mode { ui.add(Button::new(match self.settings.dark_mode {
true => "🌞", true => "🌞",
@ -568,6 +578,7 @@ impl epi::App for MathApp {
.clicked(), .clicked(),
); );
// Display Area and time of last frame
ui.label(format!( ui.label(format!(
"Area: {:?} Took: {:?}", "Area: {:?} Took: {:?}",
self.last_info.0, self.last_info.1 self.last_info.0, self.last_info.1
@ -605,7 +616,7 @@ impl epi::App for MathApp {
}); });
}); });
// Window with Misc Information // Window with information about the build and current commit
Window::new("Info") Window::new("Info")
.default_pos([200.0, 200.0]) .default_pos([200.0, 200.0])
.open(&mut self.settings.info_open) .open(&mut self.settings.info_open)
@ -620,8 +631,11 @@ impl epi::App for MathApp {
self.side_panel(ctx); self.side_panel(ctx);
} }
let mut area_list: Vec<f64> = Vec::new(); // Referenced in plotting code, but needs to be here so it can be later referenced when storing `last_info`
// Central panel which contains the central plot (or an error created when parsing) // Central panel which contains the central plot (or an error created when parsing)
CentralPanel::default().show(ctx, |ui| { CentralPanel::default().show(ctx, |ui| {
// Display an error if it exists
if !self.last_error.is_empty() { if !self.last_error.is_empty() {
ui.centered_and_justified(|ui| { ui.centered_and_justified(|ui| {
self.last_error.iter().for_each(|ele| { self.last_error.iter().for_each(|ele| {
@ -631,7 +645,9 @@ impl epi::App for MathApp {
return; return;
} }
let available_width: usize = ui.available_width() as usize; let available_width: usize = ui.available_width() as usize; // Used in later logic
// Create and setup plot
Plot::new("plot") Plot::new("plot")
.set_margin_fraction(Vec2::ZERO) .set_margin_fraction(Vec2::ZERO)
.data_aspect(1.0) .data_aspect(1.0)
@ -641,7 +657,7 @@ impl epi::App for MathApp {
let minx_bounds: f64 = bounds.min()[0]; let minx_bounds: f64 = bounds.min()[0];
let maxx_bounds: f64 = bounds.max()[0]; let maxx_bounds: f64 = bounds.max()[0];
let area_list: Vec<f64> = self area_list = self
.functions .functions
.iter_mut() .iter_mut()
.enumerate() .enumerate()
@ -660,9 +676,9 @@ impl epi::App for MathApp {
) )
}) })
.collect(); .collect();
self.last_info = (area_list, start.elapsed());
}); });
}); });
self.last_info = (area_list, start.elapsed()); // Store list of functions' areas along with the time it took to process.
} }
// Uncaps max canvas size. This was capped in egui due to a bug in Firefox. But it's fixed now. // Uncaps max canvas size. This was capped in egui due to a bug in Firefox. But it's fixed now.