From 75092e7d9fdd6e5c4b76a0943b3dacef5b601cc5 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Wed, 3 Dec 2025 03:42:51 -0500 Subject: [PATCH] don't do sketchy egui Id stuff --- src/function_manager.rs | 79 ++++++++++++++++++----------------------- src/misc.rs | 17 ++++----- 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/src/function_manager.rs b/src/function_manager.rs index 94c1071..26c850f 100644 --- a/src/function_manager.rs +++ b/src/function_manager.rs @@ -1,7 +1,7 @@ use crate::{ consts::COLORS, function_entry::FunctionEntry, - misc::{create_id, get_u64_id, random_u64}, + misc::{random_u64}, widgets::widgets_ontop, }; use egui::{Button, Id, Key, Modifiers, TextEdit, WidgetText}; @@ -22,50 +22,46 @@ impl Default for FunctionManager { fn default() -> Self { let mut vec: Functions = Vec::with_capacity(COLORS.len()); vec.push(( - create_id(11414819524356497634), // Random number here to avoid call to crate::misc::random_u64() + Id::new(11414819524356497634 as u64), // Random number here to avoid call to crate::misc::random_u64() FunctionEntry::default(), )); Self { functions: vec } } } + impl Serialize for FunctionManager { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut s = serializer.serialize_struct("FunctionManager", 1)?; - s.serialize_field( - "data", - &self - .functions - .iter() - .map(|(id, func)| (get_u64_id(*id), func.clone())) - .collect::>(), - )?; - s.end() - } + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let mut s = serializer.serialize_struct("FunctionManager", 1)?; + s.serialize_field( + "data", + &self + .functions + .iter() + .map(|(id, func)| (*id, func.clone())) + .collect::>(), + )?; + s.end() + } } impl<'de> Deserialize<'de> for FunctionManager { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - #[derive(Deserialize)] - struct Helper(Vec<(u64, FunctionEntry)>); + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + struct Helper(Vec<(Id, FunctionEntry)>); let helper = Helper::deserialize(deserializer)?; - Ok(FunctionManager { - functions: helper - .0 - .iter() - .cloned() - .map(|(id, func)| (create_id(id), func)) - .collect::>(), - }) - } + Ok(FunctionManager { + functions: helper.0.to_vec(), + }) + } } /// Function that creates button that's used with the `button_area` @@ -151,14 +147,11 @@ impl FunctionManager { if movement != Movement::Complete && let Some(hints) = function.autocomplete.hint.many() { - // Doesn't need to have a number in id as there should only be 1 autocomplete popup in the entire gui - - // hashed "autocomplete_popup" - const POPUP_ID: Id = create_id(7574801616484505465); - let mut clicked = false; - egui::popup_below_widget(ui, POPUP_ID, &re, |ui| { + let autocomplete_popup_id = Id::new("autocomplete popup"); + + egui::popup_below_widget(ui, autocomplete_popup_id.clone(), &re, |ui| { hints.iter().enumerate().for_each(|(i, candidate)| { if ui .selectable_label(i == function.autocomplete.i, *candidate) @@ -175,12 +168,9 @@ impl FunctionManager { .autocomplete .apply_hint(hints[function.autocomplete.i]); - // Don't need this here as it simply won't be display next frame - // ui.memory_mut().close_popup(); - movement = Movement::Complete; } else { - ui.memory_mut(|x| x.open_popup(POPUP_ID)); + ui.memory_mut(|x| x.open_popup(autocomplete_popup_id.clone())); } } @@ -198,7 +188,7 @@ impl FunctionManager { const BUTTONS_Y_OFFSET: f32 = 1.32; const Y_OFFSET: f32 = crate::consts::FONT_SIZE * BUTTONS_Y_OFFSET; - widgets_ontop(ui, create_id(i as u64), &re, Y_OFFSET, |ui| { + widgets_ontop(ui, Id::new(i), &re, Y_OFFSET, |ui| { ui.horizontal(|ui| { // There's more than 1 function! Functions can now be deleted if ui @@ -260,7 +250,7 @@ impl FunctionManager { /// Create and push new empty function entry pub fn push_empty(&mut self) { self.functions.push(( - create_id(random_u64().expect("unable to generate random id")), + Id::new(random_u64().expect("unable to generate random id")), FunctionEntry::default(), )); } @@ -273,6 +263,7 @@ impl FunctionManager { #[inline] pub fn len(&self) -> usize { self.functions.len() } + #[inline] pub fn get_entries_mut(&mut self) -> &mut Functions { &mut self.functions } diff --git a/src/misc.rs b/src/misc.rs index b8ee1b5..2d84973 100644 --- a/src/misc.rs +++ b/src/misc.rs @@ -1,4 +1,3 @@ -use egui::Id; use egui_plot::{Line, PlotPoint, PlotPoints, Points}; use emath::Pos2; use getrandom::getrandom; @@ -27,10 +26,14 @@ impl EguiHelper for Vec { } #[inline(always)] - fn to_line(self) -> Line { Line::new(self.to_values()) } + fn to_line(self) -> Line { + Line::new(self.to_values()) + } #[inline(always)] - fn to_points(self) -> Points { Points::new(self.to_values()) } + fn to_points(self) -> Points { + Points::new(self.to_values()) + } #[inline(always)] fn to_tuple(self) -> Vec<(f64, f64)> { @@ -59,10 +62,6 @@ impl const Offset for Pos2 { } } -pub const fn create_id(x: u64) -> Id { unsafe { std::mem::transmute::(x) } } - -pub const fn get_u64_id(id: Id) -> u64 { unsafe { std::mem::transmute::(id) } } - /* /// Rounds f64 to `n` decimal places pub fn decimal_round(x: f64, n: usize) -> f64 { @@ -198,4 +197,6 @@ pub fn random_u64() -> Result { include!(concat!(env!("OUT_DIR"), "/valid_chars.rs")); -pub fn is_valid_char(c: char) -> bool { c.is_alphanumeric() | VALID_EXTRA_CHARS.contains(&c) } +pub fn is_valid_char(c: char) -> bool { + c.is_alphanumeric() | VALID_EXTRA_CHARS.contains(&c) +}