better Opened window handling

This commit is contained in:
Simon Gardling 2022-04-04 10:43:08 -04:00
parent dce98d333a
commit ae154195b5

View File

@ -7,8 +7,8 @@ use egui::{
FontFamily, Key, RichText, SidePanel, Slider, TopBottomPanel, Vec2, Visuals, Window, FontFamily, Key, RichText, SidePanel, Slider, TopBottomPanel, Vec2, Visuals, Window,
}; };
use instant::Duration; use instant::Duration;
use std::collections::HashMap; use std::collections::{BTreeMap, HashMap};
use std::{collections::BTreeMap, io::Read, ops::BitXorAssign, str}; use std::{collections::BTreeSet, io::Read, ops::BitXorAssign, str};
#[cfg(threading)] #[cfg(threading)]
use rayon::iter::{IndexedParallelIterator, ParallelIterator}; use rayon::iter::{IndexedParallelIterator, ParallelIterator};
@ -272,6 +272,22 @@ impl Default for AppSettings {
} }
} }
struct Opened {
pub help: bool,
pub info: bool,
pub side_panel: bool,
}
impl Default for Opened {
fn default() -> Opened {
Self {
help: true,
info: true,
side_panel: true,
}
}
}
/// The actual application /// The actual application
pub struct MathApp { pub struct MathApp {
/// Stores vector of functions /// Stores vector of functions
@ -299,7 +315,7 @@ pub struct MathApp {
text_boxes_focused: bool, text_boxes_focused: bool,
/// Stores opened windows/elements for later reference /// Stores opened windows/elements for later reference
opened: HashMap<&'static str, bool>, opened: Opened,
/// Stores settings (pretty self-explanatory) /// Stores settings (pretty self-explanatory)
settings: AppSettings, settings: AppSettings,
@ -315,7 +331,7 @@ impl Default for MathApp {
last_info: (vec![None], Duration::ZERO), last_info: (vec![None], Duration::ZERO),
dark_mode: true, dark_mode: true,
text_boxes_focused: false, text_boxes_focused: false,
opened: HashMap::from([("help", true), ("info", false), ("side_panel", true)]), opened: Opened::default(),
settings: AppSettings::default(), settings: AppSettings::default(),
} }
} }
@ -349,10 +365,6 @@ impl MathApp {
Self::default() // initialize `MathApp` Self::default() // initialize `MathApp`
} }
fn get_opened_mut(&mut self, id: &str) -> &mut bool { self.opened.get_mut(id).unwrap() }
fn get_opened(&self, id: &str) -> bool { *self.opened.get(id).unwrap() }
/// Creates SidePanel which contains configuration options /// Creates SidePanel which contains configuration options
fn side_panel(&mut self, ctx: &Context) { fn side_panel(&mut self, ctx: &Context) {
// Side Panel which contains vital options to the operation of the application // Side Panel which contains vital options to the operation of the application
@ -552,7 +564,8 @@ impl epi::App for MathApp {
// this is behind this check as if it wasn't, it would trigger if the user // this is behind this check as if it wasn't, it would trigger if the user
// presses the h key in a text box as well // presses the h key in a text box as well
if !self.text_boxes_focused { if !self.text_boxes_focused {
self.get_opened_mut("side_panel") self.opened
.side_panel
.bitxor_assign(ctx.input().key_down(Key::H)); .bitxor_assign(ctx.input().key_down(Key::H));
} }
@ -563,10 +576,9 @@ impl epi::App for MathApp {
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 // Button in top bar to toggle showing the side panel
let side_curr_open = self.get_opened("help"); self.opened.side_panel.bitxor_assign(
self.get_opened_mut("side_panel").bitxor_assign(
ui.add(Button::new("Panel")) ui.add(Button::new("Panel"))
.on_hover_text(match side_curr_open { .on_hover_text(match self.opened.side_panel {
true => "Hide Side Panel", true => "Hide Side Panel",
false => "Show Side Panel", false => "Show Side Panel",
}) })
@ -585,10 +597,9 @@ impl epi::App for MathApp {
} }
// Toggles opening the Help window // Toggles opening the Help window
let help_curr_open = self.get_opened("help"); self.opened.help.bitxor_assign(
self.get_opened_mut("help").bitxor_assign(
ui.add(Button::new("Help")) ui.add(Button::new("Help"))
.on_hover_text(match help_curr_open { .on_hover_text(match self.opened.help {
true => "Close Help Window", true => "Close Help Window",
false => "Open Help Window", false => "Open Help Window",
}) })
@ -596,10 +607,9 @@ impl epi::App for MathApp {
); );
// Toggles opening the Info window // Toggles opening the Info window
let info_curr_open = self.get_opened("info"); self.opened.info.bitxor_assign(
self.get_opened_mut("info").bitxor_assign(
ui.add(Button::new("Info")) ui.add(Button::new("Info"))
.on_hover_text(match info_curr_open { .on_hover_text(match self.opened.info {
true => "Close Info Window", true => "Close Info Window",
false => "Open Info Window", false => "Open Info Window",
}) })
@ -631,7 +641,7 @@ impl epi::App for MathApp {
// Help window with information for users // Help window with information for users
Window::new("Help") Window::new("Help")
.default_pos([200.0, 200.0]) .default_pos([200.0, 200.0])
.open(self.get_opened_mut("help")) .open(&mut self.opened.help)
.resizable(false) .resizable(false)
.collapsible(false) .collapsible(false)
.show(ctx, |ui| { .show(ctx, |ui| {
@ -661,7 +671,7 @@ impl epi::App for MathApp {
// Window with information about the build and current commit // 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(self.get_opened_mut("info")) .open(&mut self.opened.info)
.resizable(false) .resizable(false)
.collapsible(false) .collapsible(false)
.show(ctx, |ui| { .show(ctx, |ui| {
@ -669,7 +679,7 @@ impl epi::App for MathApp {
}); });
// If side panel is enabled, show it. // If side panel is enabled, show it.
if self.get_opened("side_panel") { if self.opened.side_panel {
self.side_panel(ctx); self.side_panel(ctx);
} else { } else {
self.text_boxes_focused = false; self.text_boxes_focused = false;