From 48646ef5214823eec1a727994e5bd125156028fc Mon Sep 17 00:00:00 2001 From: Konkitoman Date: Wed, 9 Aug 2023 20:16:35 +0300 Subject: [PATCH] Update viewports example, and added documentation for Window::default_embedded --- crates/egui/src/containers/window.rs | 3 + examples/viewports/src/main.rs | 294 +++++++++++++-------------- 2 files changed, 139 insertions(+), 158 deletions(-) diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index efbb0e3a4..d4c930381 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -80,6 +80,9 @@ impl<'open> Window<'open> { self } + /// This will only be used on window creation! + /// If embedded is false the window will be a native window, if is possibile + /// Look at `Context::is_desktop` to see if is possible to create a native window! pub fn default_embedded(mut self, embedded: bool) -> Self { self.default_embedded = embedded; self diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index 81fb5d786..593862e57 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -1,5 +1,7 @@ +use std::sync::Arc; +use std::sync::RwLock; + use eframe::egui; -use eframe::egui::Id; use eframe::egui::ViewportBuilder; use eframe::NativeOptions; @@ -8,169 +10,145 @@ const RENDERER: eframe::Renderer = eframe::Renderer::Wgpu; #[cfg(not(feature = "wgpu"))] const RENDERER: eframe::Renderer = eframe::Renderer::Glow; +#[derive(Default)] +pub struct App { + show_async_viewport: bool, + show_sync_viewport: bool, + show_async_window: bool, + show_sync_window: bool, + + async_viewport_state: Arc>, + sync_viewport_state: usize, + async_window_state: Arc>, + sync_window_state: usize, +} + +impl eframe::App for App { + fn update( + &mut self, + ctx: &egui::Context, + _frame: &mut eframe::Frame, + render_function: Option<&egui::ViewportRender>, + ) { + // This needs to be like this to be able to show stuf on a async viewport + if let Some(render) = render_function { + // This is the render function for the current async viewport + render(ctx); + return; + } + + egui::CentralPanel::default().show(ctx, |ui| { + ui.label(format!("Frame: {}", ctx.frame_nr())); + ui.label(format!("Current Viewport Id: {}", ctx.get_viewport_id())); + ui.label(format!( + "Current Parent Viewport Id: {}", + ctx.get_viewport_id() + )); + ui.label("Look at the \"Frame: \" will tell you, what viewport is rendering!"); + { + let mut desktop = ctx.is_desktop(); + ui.checkbox(&mut desktop, "Desktop"); + ctx.set_desktop(desktop) + } + ui.checkbox(&mut self.show_async_viewport, "Show Async Viewport"); + ui.checkbox(&mut self.show_sync_viewport, "Show Sync Viewport"); + ui.checkbox(&mut self.show_async_window, "Show Async Window"); + ui.checkbox(&mut self.show_sync_window, "Show Sync Window"); + + let ctx = ui.ctx(); + // Showing Async Viewport + if self.show_async_viewport { + let state = self.async_viewport_state.clone(); + ctx.create_viewport( + ViewportBuilder::default().with_title("Async Viewport"), + move |ctx| { + let mut state = state.write().unwrap(); + egui::CentralPanel::default().show(ctx, |ui| { + ui.label(format!("Frame: {}", ctx.frame_nr())); + ui.label(format!("Current Viewport Id: {}", ctx.get_viewport_id())); + ui.label(format!( + "Current Parent Viewport Id: {}", + ctx.get_viewport_id() + )); + ui.label(format!("Count: {state}")); + if ui.button("Add").clicked() { + *state += 1; + } + }); + }, + ) + } + + // Showing Sync Viewport + if self.show_sync_viewport { + ctx.create_viewport_sync( + ViewportBuilder::default().with_title("Sync Viewport"), + |ctx| { + egui::CentralPanel::default().show(ctx, |ui| { + ui.label(format!("Frame: {}", ctx.frame_nr())); + ui.label(format!("Current Viewport Id: {}", ctx.get_viewport_id())); + ui.label(format!( + "Current Parent Viewport Id: {}", + ctx.get_viewport_id() + )); + ui.label(format!("Count: {}", self.sync_viewport_state)); + if ui.button("Add").clicked() { + self.sync_viewport_state += 1; + } + }); + }, + ); + } + + // Showing Async Window + if self.show_async_window { + let state = self.async_window_state.clone(); + egui::Window::new("Async Window") + .default_embedded(false) + .show_async(ctx, move |ui| { + let ctx = ui.ctx().clone(); + let mut state = state.write().unwrap(); + ui.label(format!("Frame: {}", ctx.frame_nr())); + ui.label(format!("Current Viewport Id: {}", ctx.get_viewport_id())); + ui.label(format!( + "Current Parent Viewport Id: {}", + ctx.get_viewport_id() + )); + ui.label(format!("Count: {state}")); + if ui.button("Add").clicked() { + *state += 1; + } + }); + } + + // Showing Sync Window + if self.show_sync_window { + egui::Window::new("Sync Window") + .default_embedded(false) + .show(ctx, |ui| { + ui.label(format!("Frame: {}", ui.ctx().frame_nr())); + ui.label(format!("Frame: {}", ctx.frame_nr())); + ui.label(format!("Current Viewport Id: {}", ctx.get_viewport_id())); + ui.label(format!("Count: {}", self.sync_window_state)); + if ui.button("Add").clicked() { + self.sync_window_state += 1; + } + }); + } + }); + } +} + fn main() { env_logger::init(); // Use `RUST_LOG=debug` to see logs. - let mut to_repair = false; - - let mut show_sync = false; - let mut show = false; - let mut value = 0.0; - let mut debug = false; - - let _ = eframe::run_simple_native( - "Viewports Examples", + let _ = eframe::run_native( + "Viewports", NativeOptions { renderer: RENDERER, + initial_window_size: Some(egui::Vec2::new(400.0, 200.0)), ..NativeOptions::default() }, - move |ctx, _frame| { - egui::CentralPanel::default().show(ctx, |ui| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - let mut is_desktop = ctx.is_desktop(); - ui.checkbox(&mut is_desktop, "Is Desktop"); - ctx.set_desktop(is_desktop); - ui.checkbox(&mut to_repair, "To Repair!"); - - ui.checkbox(&mut debug, "Debug"); - ctx.set_debug_on_hover(debug); - - ui.checkbox(&mut show_sync, "Show Sync Viewport"); - if show_sync { - ctx.create_viewport_sync( - ViewportBuilder::default().with_title("Sync rendering!"), - |ctx| { - let viewport_id = ctx.get_viewport_id(); - let parent_viewport_id = ctx.get_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!"); - ui.label(format!("Value: {value}")); - } - - egui::CollapsingHeader::new("Show Test1").show(ui, |_ui| { - egui::Window::new("Test1") - .default_embedded(false) - .show(ctx, |ui| { - 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) - }); - let embedded_tmp = embedded; - if ui.checkbox(&mut embedded, "Should embedd?").clicked() { - ui.ctx() - .request_repaint_viewport(ui.ctx().get_parent_viewport_id()); - } - if embedded_tmp != embedded { - 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 ctx.get_viewport_id() != ctx.get_parent_viewport_id() { - ctx.viewport_command( - ctx.get_viewport_id(), - egui::ViewportCommand::Drag, - ); - } else { - ctx.memory_mut(|mem| { - mem.set_dragged_id( - egui::Id::new("Test1").with("frame_resize"), - ); - }); - } - } - - ui.add( - egui::widgets::DragValue::new(&mut value) - .clamp_range(-10..=10) - .speed(0.1), - ); - }); - }); - egui::CollapsingHeader::new("Async Test2").show(ui, |_ui| { - egui::Window::new("Test2").show_async(ctx, move |ui| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - - 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 ctx.get_viewport_id() != ctx.get_parent_viewport_id() { - ctx.viewport_command( - ctx.get_viewport_id(), - egui::ViewportCommand::Drag, - ); - } else { - ctx.memory_mut(|mem| { - mem.set_dragged_id(egui::Id::new("Test2").with("frame_resize")); - }); - } - } - }); - }); - egui::CollapsingHeader::new("Async Test3").show(ui, |_ui| { - egui::Window::new("Test3").show_async(ctx, move |ui| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - 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 ctx.get_viewport_id() != ctx.get_parent_viewport_id() { - ctx.viewport_command( - ctx.get_viewport_id(), - egui::ViewportCommand::Drag, - ); - } else { - ctx.memory_mut(|mem| { - mem.set_dragged_id(egui::Id::new("Test3").with("frame_resize")); - }); - } - } - }); - }); - }); - }, + Box::new(|_| Box::new(App::default())), ); }