1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-31 13:50:04 -04:00
This commit is contained in:
Konkitoman
2023-11-07 09:08:22 +02:00
parent 8aa14d2fae
commit 58dc7bab8b

View File

@@ -177,12 +177,10 @@ struct ContextImpl {
force_embedding: bool, force_embedding: bool,
/// Written to during the frame. /// Written to during the frame.
layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>, layer_rects_this_frame: ViewportMap<HashMap<LayerId, Vec<(Id, Rect)>>>,
layer_rects_this_viewports: ViewportMap<HashMap<LayerId, Vec<(Id, Rect)>>>,
/// Read /// Read
layer_rects_prev_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>, layer_rects_prev_frame: ViewportMap<HashMap<LayerId, Vec<(Id, Rect)>>>,
layer_rects_prev_viewports: ViewportMap<HashMap<LayerId, Vec<(Id, Rect)>>>,
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
is_accesskit_enabled: bool, is_accesskit_enabled: bool,
@@ -199,14 +197,6 @@ impl ContextImpl {
// Pause the active viewport // Pause the active viewport
self.memory.pause_frame(previous_viewport_id); self.memory.pause_frame(previous_viewport_id);
self.layer_rects_this_viewports.insert(
previous_viewport_id,
std::mem::take(&mut self.layer_rects_this_frame),
);
self.layer_rects_prev_viewports.insert(
previous_viewport_id,
std::mem::take(&mut self.layer_rects_prev_frame),
);
} }
let viewport_id = id_pair.this; let viewport_id = id_pair.this;
@@ -233,10 +223,8 @@ impl ContextImpl {
} }
} }
self.layer_rects_prev_frame = self self.layer_rects_prev_frame.entry(viewport_id).or_default();
.layer_rects_prev_viewports self.layer_rects_this_frame.entry(viewport_id).or_default();
.remove(&viewport_id)
.unwrap_or_default();
self.memory.begin_frame( self.memory.begin_frame(
self.input.get(&viewport_id).unwrap_or(&Default::default()), self.input.get(&viewport_id).unwrap_or(&Default::default()),
@@ -808,15 +796,16 @@ impl Context {
let mut show_blocking_widget = None; let mut show_blocking_widget = None;
self.write(|ctx| { self.write(|ctx| {
ctx.layer_rects_this_frame if let Some(l) = ctx.layer_rects_this_frame.get_mut(&ctx.viewport_id()) {
.entry(layer_id) l.entry(layer_id).or_default().push((id, interact_rect))
.or_default() }
.push((id, interact_rect));
if hovered { if hovered {
let pointer_pos = &ctx.input[&ctx.viewport_id()].pointer.interact_pos(); let pointer_pos = &ctx.input[&ctx.viewport_id()].pointer.interact_pos();
if let Some(pointer_pos) = pointer_pos { if let Some(pointer_pos) = pointer_pos {
if let Some(rects) = ctx.layer_rects_prev_frame.get(&layer_id) { if let Some(rects) =
ctx.layer_rects_prev_frame[&ctx.viewport_id()].get(&layer_id)
{
for &(prev_id, prev_rect) in rects.iter().rev() { for &(prev_id, prev_rect) in rects.iter().rev() {
if prev_id == id { if prev_id == id {
break; // there is no other interactive widget covering us at the pointer position. break; // there is no other interactive widget covering us at the pointer position.
@@ -1486,9 +1475,11 @@ impl Context {
crate::profile_function!(); crate::profile_function!();
let mut viewports: Vec<ViewportId> = self.write(|ctx| { let mut viewports: Vec<ViewportId> = self.write(|ctx| {
ctx.layer_rects_prev_viewports.insert( ctx.layer_rects_prev_frame.insert(
ctx.viewport_id(), ctx.viewport_id(),
std::mem::take(&mut ctx.layer_rects_this_frame), ctx.layer_rects_this_frame
.remove(&ctx.viewport_id())
.unwrap(),
); );
ctx.viewports.values().map(|vp| vp.id_pair.this).collect() ctx.viewports.values().map(|vp| vp.id_pair.this).collect()
}); });
@@ -1594,9 +1585,9 @@ impl Context {
// Context Cleanup // Context Cleanup
self.write(|ctx| { self.write(|ctx| {
ctx.input.retain(|id, _| available_viewports.contains(id)); ctx.input.retain(|id, _| available_viewports.contains(id));
ctx.layer_rects_prev_viewports ctx.layer_rects_prev_frame
.retain(|id, _| available_viewports.contains(id)); .retain(|id, _| available_viewports.contains(id));
ctx.layer_rects_this_viewports ctx.layer_rects_this_frame
.retain(|id, _| available_viewports.contains(id)); .retain(|id, _| available_viewports.contains(id));
ctx.output.retain(|id, _| available_viewports.contains(id)); ctx.output.retain(|id, _| available_viewports.contains(id));
ctx.frame_state ctx.frame_state
@@ -1607,10 +1598,6 @@ impl Context {
} else { } else {
let viewport_id = self.viewport_id(); let viewport_id = self.viewport_id();
self.write(|ctx| { self.write(|ctx| {
ctx.layer_rects_prev_frame =
ctx.layer_rects_prev_viewports.remove(&viewport_id).unwrap();
ctx.layer_rects_this_frame =
ctx.layer_rects_this_viewports.remove(&viewport_id).unwrap();
ctx.memory.resume_frame(viewport_id); ctx.memory.resume_frame(viewport_id);
}); });
} }