1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 14:20:04 -04:00

Fix interactions for sync viewport

This commit is contained in:
Konkitoman
2023-08-03 19:00:26 +03:00
parent 70b9d8f1c5
commit 9e1e0a55a5
2 changed files with 23 additions and 9 deletions

View File

@@ -190,7 +190,7 @@ struct ContextImpl {
// The output of a frame: // The output of a frame:
graphics: HashMap<u64, GraphicLayers>, graphics: HashMap<u64, GraphicLayers>,
output: PlatformOutput, output: HashMap<u64, PlatformOutput>,
paint_stats: PaintStats, paint_stats: PaintStats,
@@ -223,6 +223,7 @@ struct ContextImpl {
/// Written to during the frame. /// Written to during the frame.
layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>, layer_rects_this_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>,
layer_rects_this_viewports: HashMap<u64, HashMap<LayerId, Vec<(Id, Rect)>>>,
/// Read /// Read
layer_rects_prev_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>, layer_rects_prev_frame: ahash::HashMap<LayerId, Vec<(Id, Rect)>>,
@@ -245,14 +246,20 @@ impl ContextImpl {
if !self.frame_stack.is_empty() { if !self.frame_stack.is_empty() {
let viewport_id = self.get_viewport_id(); let viewport_id = self.get_viewport_id();
println!("Pause: {viewport_id}"); println!("Pause: {viewport_id}");
self.layer_rects_prev_viewports.insert(
self.memory.pause_frame(viewport_id);
self.layer_rects_this_viewports.insert(
viewport_id, viewport_id,
std::mem::take(&mut self.layer_rects_this_frame), std::mem::take(&mut self.layer_rects_this_frame),
); );
self.memory.pause_frame(viewport_id); self.layer_rects_prev_viewports.insert(
viewport_id,
std::mem::take(&mut self.layer_rects_prev_frame),
);
} }
self.frame_stack.push((viewport_id, parent_viewport_id)); self.frame_stack.push((viewport_id, parent_viewport_id));
self.output.entry(self.get_viewport_id()).or_default();
self.repaint.start_frame(self.get_viewport_id()); self.repaint.start_frame(self.get_viewport_id());
if let Some(new_pixels_per_point) = self.memory.new_pixels_per_point.take() { if let Some(new_pixels_per_point) = self.memory.new_pixels_per_point.take() {
@@ -605,13 +612,19 @@ impl Context {
/// ``` /// ```
#[inline] #[inline]
pub fn output<R>(&self, reader: impl FnOnce(&PlatformOutput) -> R) -> R { pub fn output<R>(&self, reader: impl FnOnce(&PlatformOutput) -> R) -> R {
self.read(move |ctx| reader(&ctx.output)) self.read(move |ctx| {
reader(
ctx.output
.get(&ctx.get_viewport_id())
.unwrap_or(&Default::default()),
)
})
} }
/// Read-write access to [`PlatformOutput`]. /// Read-write access to [`PlatformOutput`].
#[inline] #[inline]
pub fn output_mut<R>(&self, writer: impl FnOnce(&mut PlatformOutput) -> R) -> R { pub fn output_mut<R>(&self, writer: impl FnOnce(&mut PlatformOutput) -> R) -> R {
self.write(move |ctx| writer(&mut ctx.output)) self.write(move |ctx| writer(ctx.output.entry(ctx.get_viewport_id()).or_default()))
} }
/// Read-only access to [`FrameState`]. /// Read-only access to [`FrameState`].
@@ -1479,10 +1492,10 @@ impl Context {
let viewport_id = self.get_viewport_id(); let viewport_id = self.get_viewport_id();
println!("Resume: {viewport_id}"); println!("Resume: {viewport_id}");
self.write(|ctx| { self.write(|ctx| {
ctx.layer_rects_prev_frame = ctx ctx.layer_rects_prev_frame =
.layer_rects_prev_viewports ctx.layer_rects_prev_viewports.remove(&viewport_id).unwrap();
.remove(&viewport_id) ctx.layer_rects_this_frame =
.unwrap_or_default(); ctx.layer_rects_this_viewports.remove(&viewport_id).unwrap();
ctx.memory.resume_frame(viewport_id) ctx.memory.resume_frame(viewport_id)
}); });
} }

View File

@@ -413,6 +413,7 @@ impl Memory {
pub(crate) fn resume_frame(&mut self, viewport_id: u64) { pub(crate) fn resume_frame(&mut self, viewport_id: u64) {
self.interaction = self.interactions.remove(&viewport_id).unwrap(); self.interaction = self.interactions.remove(&viewport_id).unwrap();
self.areas = self.viewports_areas.remove(&viewport_id).unwrap(); self.areas = self.viewports_areas.remove(&viewport_id).unwrap();
self.viewport_id = viewport_id;
} }
/// Top-most layer at the given position. /// Top-most layer at the given position.