From cb09e630a24adb691b77cd7a6c71e41081ea244a Mon Sep 17 00:00:00 2001 From: Konkitoman Date: Tue, 25 Jul 2023 16:40:03 +0300 Subject: [PATCH] Add a new example and change how embedding is stored --- Cargo.lock | 8 ++ crates/eframe/src/epi/mod.rs | 2 +- crates/eframe/src/native/epi_integration.rs | 6 +- crates/eframe/src/native/run.rs | 7 +- crates/egui/src/containers/window.rs | 11 +-- examples/hello_world_simple/src/main.rs | 82 +-------------------- examples/viewports/Cargo.toml | 13 ++++ examples/viewports/src/main.rs | 72 ++++++++++++++++++ 8 files changed, 105 insertions(+), 96 deletions(-) create mode 100644 examples/viewports/Cargo.toml create mode 100644 examples/viewports/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index c781b851b..78f414bb7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3821,6 +3821,14 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "viewports" +version = "0.1.0" +dependencies = [ + "eframe", + "env_logger", +] + [[package]] name = "waker-fn" version = "1.1.0" diff --git a/crates/eframe/src/epi/mod.rs b/crates/eframe/src/epi/mod.rs index 3b931ceeb..b27defddb 100644 --- a/crates/eframe/src/epi/mod.rs +++ b/crates/eframe/src/epi/mod.rs @@ -214,7 +214,7 @@ pub trait App { // NOTE: a bright gray makes the shadows of the windows look weird. // We use a bit of transparency so that if the user switches on the // `transparent()` option they get immediate results. - egui::Color32::from_rgba_unmultiplied(12, 12, 12, 180).to_normalized_gamma_f32() + egui::Color32::from_rgba_unmultiplied(12, 12, 12, 0).to_normalized_gamma_f32() // _visuals.window_fill() would also be a natural choice } diff --git a/crates/eframe/src/native/epi_integration.rs b/crates/eframe/src/native/epi_integration.rs index dd631621e..bf595aa36 100644 --- a/crates/eframe/src/native/epi_integration.rs +++ b/crates/eframe/src/native/epi_integration.rs @@ -517,11 +517,7 @@ impl EpiIntegration { // Run user code: let full_output = self.egui_ctx.run(raw_input, |egui_ctx| { crate::profile_scope!("App::update"); - if let Some(render) = render { - (render.as_ref())(egui_ctx, viewport_id, parent_id) - } else { - app.update(egui_ctx, &mut self.frame, render.as_ref().map(|r| &***r)); - } + app.update(egui_ctx, &mut self.frame, render.as_ref().map(|r| &***r)); }); self.pending_full_output.append(full_output); diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index 6f7d5c2b2..02938f788 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -1065,7 +1065,12 @@ mod glow_integration { let screen_size_in_pixels: [u32; 2] = win.window.as_ref().unwrap().inner_size().into(); - egui_glow::painter::clear(&gl, screen_size_in_pixels, [0.0, 0.0, 0.0, 0.0]); + win.window.as_mut().unwrap().set_transparent(true); + egui_glow::painter::clear( + &gl, + screen_size_in_pixels, + app.clear_color(&integration.egui_ctx.style().visuals), + ); integration.egui_ctx.set_current_viewport_id(win.window_id); egui::FullOutput { diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 396d0a5dd..1cde8a076 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -175,7 +175,6 @@ pub struct Window<'open> { collapsible: bool, default_open: bool, with_title_bar: bool, - embedded: bool, window_builder: ViewportBuilder, } @@ -200,7 +199,6 @@ impl<'open> Window<'open> { collapsible: true, default_open: true, with_title_bar: true, - embedded: false, } } @@ -415,11 +413,6 @@ impl<'open> Window<'open> { self.area = self.area.drag_bounds(bounds); self } - - pub fn embedded(mut self, value: bool) -> Self { - self.embedded = value; - self - } } impl<'open> Window<'open> { @@ -449,10 +442,12 @@ impl<'open> Window<'open> { collapsible, default_open, with_title_bar, - embedded, mut window_builder, } = self; + let embedded = + ctx.data_mut(|data| *data.get_persisted_mut_or(area.id.with("_embedded"), false)); + let is_open = if let Some(open) = &mut open { if let Some(tmp_open) = ctx.data_mut(|data| { let tmp = data.get_persisted::(area.id.with("_open")); diff --git a/examples/hello_world_simple/src/main.rs b/examples/hello_world_simple/src/main.rs index 1c707bd70..268fd48c7 100644 --- a/examples/hello_world_simple/src/main.rs +++ b/examples/hello_world_simple/src/main.rs @@ -1,8 +1,6 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release -use std::sync::{Arc, RwLock}; - -use eframe::egui::{self, window::ViewportBuilder}; +use eframe::egui::{self}; fn main() -> Result<(), eframe::Error> { env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). @@ -16,9 +14,6 @@ fn main() -> Result<(), eframe::Error> { let mut name = "Arthur".to_owned(); let mut age = 42; - let mut window1_embedded = Arc::new(RwLock::new(true)); - let mut window2_embedded = Arc::new(RwLock::new(true)); - eframe::run_simple_native("My egui App", options, move |ctx, _frame| { egui::CentralPanel::default().show(ctx, |ui| { ui.label(format!( @@ -36,81 +31,6 @@ fn main() -> Result<(), eframe::Error> { age += 1; } ui.label(format!("Hello '{name}', age {age}")); - let mut is_desktop = ctx.is_desktop(); - ui.checkbox(&mut is_desktop, "Is Desktop"); - ctx.set_desktop(is_desktop); - - ctx.create_viewport( - ViewportBuilder::default() - .with_inner_size((50, 30)) - .with_decorations(false) - .with_transparent(true) - .with_resizable(false), - |ctx, _, _| { - let size = egui::Rect::from_min_size( - egui::Pos2::new(0.0, 0.0), - egui::Vec2::new(50.0, 50.0), - ); - let mut ui = egui::Ui::new( - ctx.clone(), - egui::LayerId::background(), - "Viewport Popup".into(), - size, - size, - ); - egui::Frame::popup(&ctx.style()).show(&mut ui, |ui| { - ui.label("Popup"); - }); - }, - ); - - let clone = window1_embedded.clone(); - let embedded = *window1_embedded.read().unwrap(); - egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { - egui::Window::new("Test1").embedded(embedded).show( - ctx, - move |ui, id, parent_id| { - if ui - .checkbox(&mut *clone.write().unwrap(), "Should embedd?") - .clicked() - { - ui.ctx().request_repaint_viewport(parent_id); - } - let ctx = ui.ctx().clone(); - ui.label(format!( - "Current rendering window: {}", - ctx.current_rendering_viewport() - )); - if ui.button("Drag").is_pointer_button_down_on() { - ctx.viewport_command(id, egui::window::ViewportCommand::Drag) - } - }, - ); - }); - let clone = window2_embedded.clone(); - let embedded = *window2_embedded.read().unwrap(); - egui::CollapsingHeader::new("Shout Test2").show(ui, |ui| { - egui::Window::new("Test2").embedded(embedded).show( - ctx, - move |ui, id, parent_id| { - if ui - .checkbox(&mut *clone.write().unwrap(), "Should embedd?") - .clicked() - { - ui.ctx().request_repaint_viewport(parent_id); - } - let ctx = ui.ctx().clone(); - ui.label(format!( - "Current rendering window: {}", - ctx.current_rendering_viewport() - )); - - if ui.button("Drag").is_pointer_button_down_on() { - ctx.viewport_command(id, egui::window::ViewportCommand::Drag) - } - }, - ); - }); }); }) } diff --git a/examples/viewports/Cargo.toml b/examples/viewports/Cargo.toml new file mode 100644 index 000000000..9a5200441 --- /dev/null +++ b/examples/viewports/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "viewports" +version = "0.1.0" +authors = ["konkitoman"] +license = "MIT OR Apache-2.0" +edition = "2021" +rust-version = "1.65" +publish = false + + +[dependencies] +eframe = { path = "../../crates/eframe" } +env_logger = "0.10" diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs new file mode 100644 index 000000000..1044297b8 --- /dev/null +++ b/examples/viewports/src/main.rs @@ -0,0 +1,72 @@ +use eframe::egui; +use eframe::egui::Id; +use eframe::NativeOptions; + +use std::sync::{Arc, RwLock}; + +fn main() { + env_logger::init(); // Use `RUST_LOG=debug` to see logs. + + eframe::run_simple_native( + "Viewports Examples", + NativeOptions::default(), + move |ctx, _frame| { + egui::CentralPanel::default().show(ctx, |ui| { + let mut is_desktop = ctx.is_desktop(); + ui.checkbox(&mut is_desktop, "Is Desktop"); + ctx.set_desktop(is_desktop); + + egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { + egui::Window::new("Test1").show(ctx, move |ui, id, parent_id| { + 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) + }); + + let ctx = ui.ctx().clone(); + ui.label(format!( + "Current rendering window: {}", + ctx.current_rendering_viewport() + )); + 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| { + let mut embedded = ui.data_mut(|data| { + *data.get_temp_mut_or(Id::new("Test2").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("Test2").with("_embedded"), embedded) + }); + let ctx = ui.ctx().clone(); + ui.label(format!( + "Current rendering window: {}", + ctx.current_rendering_viewport() + )); + + if ui.button("Drag").is_pointer_button_down_on() { + ctx.viewport_command(id, egui::window::ViewportCommand::Drag) + } + }); + }); + }); + }, + ); +}