1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 15:13:12 -04:00

Only one Memory window interaction

This commit is contained in:
Emil Ernerfeldt
2023-11-07 15:33:04 +01:00
parent 911b147144
commit 72d77bc504
3 changed files with 27 additions and 21 deletions

View File

@@ -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);
});
}
}

View File

@@ -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;
}

View File

@@ -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<window::WindowInteraction>,
#[cfg_attr(feature = "persistence", serde(skip))]
pub(crate) window_interactions: ViewportIdMap<window::WindowInteraction>,
#[cfg_attr(feature = "persistence", serde(skip))]
pub(crate) drag_value: crate::widgets::drag_value::MonoState,
#[cfg_attr(feature = "persistence", serde(skip))]
areas: ViewportIdMap<Areas>,
/// 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<Areas>,
#[cfg_attr(feature = "persistence", serde(skip))]
window_interactions: ViewportIdMap<window::WindowInteraction>,
}
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<Id>) -> Option<Rect> {
self.areas().get(id.into()).map(|state| state.rect())
}
pub(crate) fn window_interaction(&self) -> Option<WindowInteraction> {
self.window_interactions.get(&self.viewport_id).copied()
}
pub(crate) fn set_window_interaction(&mut self, wi: Option<WindowInteraction>) {
if let Some(wi) = wi {
self.window_interactions.insert(self.viewport_id, wi);
} else {
self.window_interactions.remove(&self.viewport_id);
}
}
}
/// ## Popups