From 7f791f4bf9f3716efa5276af4ff9bdb6c6368835 Mon Sep 17 00:00:00 2001 From: Konkitoman Date: Thu, 3 Aug 2023 19:39:51 +0300 Subject: [PATCH] Add Window::embedded --- crates/egui/src/containers/window.rs | 29 ++++++- crates/egui/src/context.rs | 2 - examples/viewports/src/main.rs | 114 +++++++++++++++------------ 3 files changed, 89 insertions(+), 56 deletions(-) diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 1204a6686..46e3306ba 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -171,6 +171,7 @@ pub enum ViewportCommand { pub struct Window<'open> { title: WidgetText, open: Option<&'open mut bool>, + embedded: Option<&'open mut bool>, area: Area, frame: Option, resize: Resize, @@ -192,6 +193,7 @@ impl<'open> Window<'open> { window_builder: ViewportBuilder::default().with_title(title.text()), title, open: None, + embedded: None, area, frame: None, resize: Resize::default() @@ -223,6 +225,11 @@ impl<'open> Window<'open> { self } + pub fn embedded(mut self, embedded: &'open mut bool) -> Self { + self.embedded = Some(embedded); + self + } + /// If `false` the window will be grayed out and non-interactive. pub fn enabled(mut self, enabled: bool) -> Self { self.area = self.area.enabled(enabled); @@ -440,6 +447,7 @@ impl<'open> Window<'open> { let Window { title, mut open, + mut embedded, area, frame, resize, @@ -450,8 +458,18 @@ impl<'open> Window<'open> { mut window_builder, } = self; - let embedded = - ctx.data_mut(|data| *data.get_persisted_mut_or(area.id.with("_embedded"), true)); + let embedded = if let Some(embedded) = &mut embedded { + if let Some(tmp_embedded) = ctx.data_mut(|data| { + let tmp = data.get_persisted::(area.id.with("_embedded")); + data.remove::(area.id.with("_embedded")); + tmp + }) { + **embedded = tmp_embedded; + } + **embedded + } else { + true + }; let is_open = if let Some(open) = &mut open { if let Some(tmp_open) = ctx.data_mut(|data| { @@ -468,6 +486,11 @@ impl<'open> Window<'open> { let is_open = is_open || ctx.memory(|mem| mem.everything_is_visible()); + ctx.data_mut(|data| { + data.insert_persisted(area.id.with("_is_embedded"), embedded); + data.insert_persisted(area.id.with("_is_open"), is_open); + }); + if !is_open { return None; } @@ -501,7 +524,7 @@ impl<'open> Window<'open> { window_builder.max_inner_size = Some((max_size.x as u32, max_size.y as u32)); } - ctx.create_viewport_sync( + return ctx.create_viewport_sync( window_builder, move |ctx, viewport_id, parent_viewport_id| { let mut op = is_open; diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 241f0d13b..6530b6d7a 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -245,7 +245,6 @@ impl ContextImpl { // This is used to pause the last frame if !self.frame_stack.is_empty() { let viewport_id = self.get_viewport_id(); - println!("Pause: {viewport_id}"); self.memory.pause_frame(viewport_id); self.layer_rects_this_viewports.insert( @@ -1490,7 +1489,6 @@ impl Context { }); if !is_last { let viewport_id = self.get_viewport_id(); - println!("Resume: {viewport_id}"); self.write(|ctx| { ctx.layer_rects_prev_frame = ctx.layer_rects_prev_viewports.remove(&viewport_id).unwrap(); diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index 54f63a5bf..86df323f7 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -8,9 +8,13 @@ fn main() { let mut to_repair = false; + let mut show_sync = false; let mut show = false; let mut value = 0.0; + let mut embedded1 = false; + let mut embedded2 = true; + let _ = eframe::run_simple_native( "Viewports Examples", NativeOptions { @@ -25,28 +29,31 @@ fn main() { ctx.set_desktop(is_desktop); ui.checkbox(&mut to_repair, "To Repair!"); - ctx.create_viewport_sync( - ViewportBuilder::default().with_title("Sync rendering!"), - |ctx, viewport_id, parent_viewport_id| { - egui::CentralPanel::default().show(ctx, |ui| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - ui.horizontal(|ui| { - ui.label("Viewport ID: "); - ui.label(format!("{viewport_id}")) - }); - ui.horizontal(|ui| { - ui.label("Parent Viewport ID: "); - ui.label(format!("{parent_viewport_id}")) - }); - ui.checkbox(&mut show, "Show"); - ui.add( - egui::widgets::DragValue::new(&mut value) - .clamp_range(-10..=10) - .speed(0.1), - ); - }) - }, - ); + ui.checkbox(&mut show_sync, "Show Sync Viewport"); + if show_sync { + ctx.create_viewport_sync( + ViewportBuilder::default().with_title("Sync rendering!"), + |ctx, viewport_id, parent_viewport_id| { + egui::CentralPanel::default().show(ctx, |ui| { + ui.label(format!("Frame: {}", ui.ctx().frame_nr())); + ui.horizontal(|ui| { + ui.label("Viewport ID: "); + ui.label(format!("{viewport_id}")) + }); + ui.horizontal(|ui| { + ui.label("Parent Viewport ID: "); + ui.label(format!("{parent_viewport_id}")) + }); + ui.checkbox(&mut show, "Show"); + ui.add( + egui::widgets::DragValue::new(&mut value) + .clamp_range(-10..=10) + .speed(0.1), + ); + }) + }, + ); + }; if show { ui.label("Is shown!"); @@ -54,36 +61,41 @@ fn main() { } egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { - egui::Window::new("Test1").show(ctx, move |ui, id, parent_id| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - let mut embedded = ui.data_mut(|data| { - *data.get_temp_mut_or(Id::new("Test1").with("_embedded"), true) - }); - if ui.checkbox(&mut embedded, "Should embedd?").clicked() { - ui.ctx().request_repaint_viewport(parent_id); - } - ui.data_mut(|data| { - data.insert_persisted(Id::new("Test1").with("_embedded"), embedded) - }); - if to_repair { - ui.spinner(); - } - - let ctx = ui.ctx().clone(); - ui.label(format!( - "Current rendering window: {}", - ctx.get_viewport_id() - )); - if ui.button("Drag").is_pointer_button_down_on() { - if id != parent_id { - ctx.viewport_command(id, egui::window::ViewportCommand::Drag) - } else { - ctx.memory_mut(|mem| { - mem.set_dragged_id(egui::Id::new("Test1").with("frame_resize")) - }); + egui::Window::new("Test1").embedded(&mut embedded1).show( + ctx, + |ui, id, parent_id| { + ui.label(format!("Frame: {}", ui.ctx().frame_nr())); + let mut embedded = ui.data_mut(|data| { + *data.get_temp_mut_or(Id::new("Test1").with("_is_embedded"), true) + }); + if ui.checkbox(&mut embedded, "Should embedd?").clicked() { + ui.ctx().request_repaint_viewport(parent_id); } - } - }); + ui.data_mut(|data| { + data.insert_persisted(Id::new("Test1").with("_embedded"), embedded) + }); + if to_repair { + ui.spinner(); + } + + let ctx = ui.ctx().clone(); + ui.label(format!( + "Current rendering window: {}", + ctx.get_viewport_id() + )); + if ui.button("Drag").is_pointer_button_down_on() { + if id != parent_id { + ctx.viewport_command(id, egui::window::ViewportCommand::Drag) + } else { + ctx.memory_mut(|mem| { + mem.set_dragged_id( + egui::Id::new("Test1").with("frame_resize"), + ) + }); + } + } + }, + ); }); egui::CollapsingHeader::new("Shout Test2").show(ui, |ui| { egui::Window::new("Test2").show(ctx, move |ui, id, parent_id| {