From 911b147144a402f2fcca491d501a09ba31ad8b75 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 7 Nov 2023 15:28:31 +0100 Subject: [PATCH] Only have one `Memory::areas` --- crates/egui/src/memory.rs | 51 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/crates/egui/src/memory.rs b/crates/egui/src/memory.rs index 234eb8017..c0623d872 100644 --- a/crates/egui/src/memory.rs +++ b/crates/egui/src/memory.rs @@ -18,7 +18,7 @@ use crate::{ /// For this you need to enable the `persistence`. /// /// If you want to store data for your widgets, you should look at [`Memory::data`] -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] #[cfg_attr(feature = "persistence", derive(serde::Deserialize, serde::Serialize))] #[cfg_attr(feature = "persistence", serde(default))] pub struct Memory { @@ -97,10 +97,7 @@ pub struct Memory { pub(crate) drag_value: crate::widgets::drag_value::MonoState, #[cfg_attr(feature = "persistence", serde(skip))] - areas: Areas, - - #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) viewports_areas: ViewportIdMap, + areas: ViewportIdMap, /// Which popup-window is open (if any)? /// Could be a combo box, color picker, menu etc. @@ -111,6 +108,29 @@ pub struct Memory { everything_is_visible: bool, } +impl Default for Memory { + fn default() -> Self { + let mut slf = Self { + options: Default::default(), + data: Default::default(), + caches: Default::default(), + override_pixels_per_point: Default::default(), + new_font_definitions: Default::default(), + interactions: Default::default(), + interaction: Default::default(), + viewport_id: Default::default(), + window_interaction: Default::default(), + window_interactions: Default::default(), + drag_value: Default::default(), + areas: Default::default(), + popup: Default::default(), + everything_is_visible: Default::default(), + }; + slf.areas.entry(slf.viewport_id).or_default(); + slf + } +} + #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] enum FocusDirection { /// Select the widget closest above the current focused widget. @@ -536,10 +556,7 @@ impl Memory { .or_default() .begin_frame(prev_input, new_input); self.interaction = self.interactions.remove(&viewport_id).unwrap(); - self.areas = self - .viewports_areas - .remove(&viewport_id) - .unwrap_or_default(); + self.areas.entry(viewport_id).or_default(); if !prev_input.pointer.any_down() { self.window_interactions.remove(&viewport_id); @@ -554,8 +571,6 @@ impl Memory { } self.interactions .insert(viewport_id, std::mem::take(&mut self.interaction)); - self.viewports_areas - .insert(viewport_id, std::mem::take(&mut self.areas)); } pub(crate) fn end_frame( @@ -569,33 +584,29 @@ impl Memory { self.interaction.focus.end_frame(used_ids); self.interactions .insert(self.viewport_id, std::mem::take(&mut self.interaction)); - self.viewports_areas - .insert(self.viewport_id, std::mem::take(&mut self.areas)); self.drag_value.end_frame(input); self.interactions.retain(|id, _| viewports.contains(id)); - self.viewports_areas.retain(|id, _| viewports.contains(id)); + self.areas.retain(|id, _| viewports.contains(id)); self.window_interactions .retain(|id, _| viewports.contains(id)); } pub(crate) fn resume_frame(&mut self, viewport_id: ViewportId) { self.interaction = self.interactions.remove(&viewport_id).unwrap_or_default(); - self.areas = self - .viewports_areas - .remove(&viewport_id) - .unwrap_or_default(); self.viewport_id = viewport_id; self.window_interaction = self.window_interactions.remove(&viewport_id); } /// Access memory of the [`Area`](crate::containers::area::Area)s, such as `Window`s. pub fn areas(&self) -> &Areas { - &self.areas + self.areas + .get(&self.viewport_id) + .expect("Memory broken: no area for the current viewport") } /// Access memory of the [`Area`](crate::containers::area::Area)s, such as `Window`s. pub fn areas_mut(&mut self) -> &mut Areas { - &mut self.areas + self.areas.entry(self.viewport_id).or_default() } /// Top-most layer at the given position.