From 72d77bc50451d67be67229d0a64c7443a0c297c8 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 7 Nov 2023 15:33:04 +0100 Subject: [PATCH] Only one Memory window interaction --- crates/egui/src/containers/window.rs | 4 +-- crates/egui/src/context.rs | 2 +- crates/egui/src/memory.rs | 42 ++++++++++++++++------------ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 4eaa3539a..f19736849 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -640,7 +640,7 @@ fn window_interaction( } } - let mut window_interaction = ctx.memory(|mem| mem.window_interaction); + let mut window_interaction = ctx.memory(|mem| mem.window_interaction()); if window_interaction.is_none() { if let Some(hover_window_interaction) = resize_hover(ctx, possible, area_layer_id, rect) { @@ -650,7 +650,7 @@ fn window_interaction( mem.interaction.drag_id = Some(id); mem.interaction.drag_is_window = true; window_interaction = Some(hover_window_interaction); - mem.window_interaction = window_interaction; + mem.set_window_interaction(window_interaction); }); } } diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 2fa144cce..65d3068ab 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -945,7 +945,7 @@ impl Context { // potential start of a drag memory.interaction.drag_id = Some(id); memory.interaction.drag_is_window = false; - memory.window_interaction = None; // HACK: stop moving windows (if any) + memory.set_window_interaction(None); // HACK: stop moving windows (if any) response.is_pointer_button_down_on = true; response.dragged = true; } diff --git a/crates/egui/src/memory.rs b/crates/egui/src/memory.rs index c0623d872..fcff2d5f7 100644 --- a/crates/egui/src/memory.rs +++ b/crates/egui/src/memory.rs @@ -3,8 +3,9 @@ use epaint::{emath::Rangef, vec2, Vec2}; use crate::{ - area, window, EventFilter, Id, IdMap, InputState, LayerId, Pos2, Rect, Style, ViewportId, - ViewportIdMap, + area, + window::{self, WindowInteraction}, + EventFilter, Id, IdMap, InputState, LayerId, Pos2, Rect, Style, ViewportId, ViewportIdMap, }; // ---------------------------------------------------------------------------- @@ -87,18 +88,9 @@ pub struct Memory { #[cfg_attr(feature = "persistence", serde(skip))] pub(crate) viewport_id: ViewportId, - #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) window_interaction: Option, - - #[cfg_attr(feature = "persistence", serde(skip))] - pub(crate) window_interactions: ViewportIdMap, - #[cfg_attr(feature = "persistence", serde(skip))] pub(crate) drag_value: crate::widgets::drag_value::MonoState, - #[cfg_attr(feature = "persistence", serde(skip))] - areas: ViewportIdMap, - /// Which popup-window is open (if any)? /// Could be a combo box, color picker, menu etc. #[cfg_attr(feature = "persistence", serde(skip))] @@ -106,6 +98,15 @@ pub struct Memory { #[cfg_attr(feature = "persistence", serde(skip))] everything_is_visible: bool, + + // ------------------------------------------------- + + // Per-viewport: + #[cfg_attr(feature = "persistence", serde(skip))] + areas: ViewportIdMap, + + #[cfg_attr(feature = "persistence", serde(skip))] + window_interactions: ViewportIdMap, } impl Default for Memory { @@ -119,7 +120,6 @@ impl Default for Memory { 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(), @@ -560,15 +560,10 @@ impl Memory { if !prev_input.pointer.any_down() { self.window_interactions.remove(&viewport_id); - self.window_interaction = None; } } pub(crate) fn pause_frame(&mut self, viewport_id: ViewportId) { - if let Some(window_interaction) = self.window_interaction { - self.window_interactions - .insert(viewport_id, window_interaction); - } self.interactions .insert(viewport_id, std::mem::take(&mut self.interaction)); } @@ -594,7 +589,6 @@ impl Memory { pub(crate) fn resume_frame(&mut self, viewport_id: ViewportId) { self.interaction = self.interactions.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. @@ -748,6 +742,18 @@ impl Memory { pub fn area_rect(&self, id: impl Into) -> Option { self.areas().get(id.into()).map(|state| state.rect()) } + + pub(crate) fn window_interaction(&self) -> Option { + self.window_interactions.get(&self.viewport_id).copied() + } + + pub(crate) fn set_window_interaction(&mut self, wi: Option) { + if let Some(wi) = wi { + self.window_interactions.insert(self.viewport_id, wi); + } else { + self.window_interactions.remove(&self.viewport_id); + } + } } /// ## Popups