mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 06:40:06 -04:00
Only one Memory window interaction
This commit is contained in:
@@ -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 window_interaction.is_none() {
|
||||||
if let Some(hover_window_interaction) = resize_hover(ctx, possible, area_layer_id, rect) {
|
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_id = Some(id);
|
||||||
mem.interaction.drag_is_window = true;
|
mem.interaction.drag_is_window = true;
|
||||||
window_interaction = Some(hover_window_interaction);
|
window_interaction = Some(hover_window_interaction);
|
||||||
mem.window_interaction = window_interaction;
|
mem.set_window_interaction(window_interaction);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -945,7 +945,7 @@ impl Context {
|
|||||||
// potential start of a drag
|
// potential start of a drag
|
||||||
memory.interaction.drag_id = Some(id);
|
memory.interaction.drag_id = Some(id);
|
||||||
memory.interaction.drag_is_window = false;
|
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.is_pointer_button_down_on = true;
|
||||||
response.dragged = true;
|
response.dragged = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
use epaint::{emath::Rangef, vec2, Vec2};
|
use epaint::{emath::Rangef, vec2, Vec2};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
area, window, EventFilter, Id, IdMap, InputState, LayerId, Pos2, Rect, Style, ViewportId,
|
area,
|
||||||
ViewportIdMap,
|
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))]
|
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||||
pub(crate) viewport_id: ViewportId,
|
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))]
|
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||||
pub(crate) drag_value: crate::widgets::drag_value::MonoState,
|
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)?
|
/// Which popup-window is open (if any)?
|
||||||
/// Could be a combo box, color picker, menu etc.
|
/// Could be a combo box, color picker, menu etc.
|
||||||
#[cfg_attr(feature = "persistence", serde(skip))]
|
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||||
@@ -106,6 +98,15 @@ pub struct Memory {
|
|||||||
|
|
||||||
#[cfg_attr(feature = "persistence", serde(skip))]
|
#[cfg_attr(feature = "persistence", serde(skip))]
|
||||||
everything_is_visible: bool,
|
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 {
|
impl Default for Memory {
|
||||||
@@ -119,7 +120,6 @@ impl Default for Memory {
|
|||||||
interactions: Default::default(),
|
interactions: Default::default(),
|
||||||
interaction: Default::default(),
|
interaction: Default::default(),
|
||||||
viewport_id: Default::default(),
|
viewport_id: Default::default(),
|
||||||
window_interaction: Default::default(),
|
|
||||||
window_interactions: Default::default(),
|
window_interactions: Default::default(),
|
||||||
drag_value: Default::default(),
|
drag_value: Default::default(),
|
||||||
areas: Default::default(),
|
areas: Default::default(),
|
||||||
@@ -560,15 +560,10 @@ impl Memory {
|
|||||||
|
|
||||||
if !prev_input.pointer.any_down() {
|
if !prev_input.pointer.any_down() {
|
||||||
self.window_interactions.remove(&viewport_id);
|
self.window_interactions.remove(&viewport_id);
|
||||||
self.window_interaction = None;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn pause_frame(&mut self, viewport_id: ViewportId) {
|
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
|
self.interactions
|
||||||
.insert(viewport_id, std::mem::take(&mut self.interaction));
|
.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) {
|
pub(crate) fn resume_frame(&mut self, viewport_id: ViewportId) {
|
||||||
self.interaction = self.interactions.remove(&viewport_id).unwrap_or_default();
|
self.interaction = self.interactions.remove(&viewport_id).unwrap_or_default();
|
||||||
self.viewport_id = viewport_id;
|
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.
|
/// 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> {
|
pub fn area_rect(&self, id: impl Into<Id>) -> Option<Rect> {
|
||||||
self.areas().get(id.into()).map(|state| state.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
|
/// ## Popups
|
||||||
|
|||||||
Reference in New Issue
Block a user