From 1a7c4700fdc0b6936382f0265d1eba456b5ff452 Mon Sep 17 00:00:00 2001 From: Konkitoman Date: Tue, 8 Aug 2023 21:18:03 +0300 Subject: [PATCH] Now embedded is stored on window, and fix crash when we set a window size to 0 --- crates/egui-winit/src/lib.rs | 2 + crates/egui/src/containers/window.rs | 126 ++++++--------------------- examples/viewports/src/main.rs | 96 +++++++++----------- 3 files changed, 70 insertions(+), 154 deletions(-) diff --git a/crates/egui-winit/src/lib.rs b/crates/egui-winit/src/lib.rs index 193b35f19..496e214af 100644 --- a/crates/egui-winit/src/lib.rs +++ b/crates/egui-winit/src/lib.rs @@ -925,6 +925,8 @@ pub fn process_viewport_commands( } } egui::ViewportCommand::InnerSize(width, height) => { + let width = width.max(1); + let height = height.max(1); win.set_inner_size(PhysicalSize::new(width, height)); } egui::ViewportCommand::Resize(top, bottom, right, left) => { diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 3ba8adffe..9100f2b98 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -26,13 +26,13 @@ use super::*; pub struct Window<'open> { title: WidgetText, open: Option<&'open mut bool>, - embedded: Option<&'open mut bool>, area: Area, frame: Option, resize: Resize, scroll: ScrollArea, collapsible: bool, default_open: bool, + default_embedded: bool, with_title_bar: bool, window_builder: ViewportBuilder, } @@ -48,7 +48,6 @@ impl<'open> Window<'open> { window_builder: ViewportBuilder::default().with_title(title.text()), title, open: None, - embedded: None, area, frame: None, resize: Resize::default() @@ -61,6 +60,7 @@ impl<'open> Window<'open> { collapsible: true, default_open: true, with_title_bar: true, + default_embedded: true, } } @@ -80,8 +80,8 @@ impl<'open> Window<'open> { self } - pub fn embedded(mut self, embedded: &'open mut bool) -> Self { - self.embedded = Some(embedded); + pub fn default_embedded(mut self, embedded: bool) -> Self { + self.default_embedded = embedded; self } @@ -307,7 +307,6 @@ impl<'open> Window<'open> { let Window { title, mut open, - mut embedded, area, frame, resize, @@ -316,22 +315,12 @@ impl<'open> Window<'open> { default_open, with_title_bar, mut window_builder, + default_embedded, } = self; - let has_embedded = embedded.is_some(); - - let is_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_embedded = ctx.data_mut(|data| { + *data.get_persisted_mut_or(area.id.with("_embedded"), default_embedded) + }); let is_open = if let Some(open) = &mut open { if let Some(tmp_open) = ctx.data_mut(|data| { @@ -349,7 +338,6 @@ 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"), is_embedded); data.insert_persisted(area.id.with("_is_open"), is_open); }); @@ -504,18 +492,13 @@ impl<'open> Window<'open> { let title_bar = if with_title_bar { let mut tmp_embedded = is_embedded; - let embedded = if has_embedded { - Some(&mut tmp_embedded) - } else { - None - }; let title_bar = show_title_bar( &mut frame.content_ui, title, show_close_button, &mut collapsing, collapsible, - embedded, + area_id, ); if tmp_embedded != is_embedded { @@ -706,25 +689,15 @@ impl<'open> Window<'open> { let title_bar = if with_title_bar { let mut tmp_embedded = is_embedded; - let embedded = if has_embedded { - Some(&mut tmp_embedded) - } else { - None - }; let title_bar = show_title_bar( &mut frame.content_ui, title, show_close_button, &mut collapsing, collapsible, - embedded, + area_id, ); - if tmp_embedded != is_embedded { - area_content_ui.data_mut(|data| { - data.insert_persisted(area_id.with("_embedded"), tmp_embedded) - }); - } resize.min_size.x = resize.min_size.x.at_least(title_bar.rect.width()); // Prevent making window smaller than title bar width Some(title_bar) } else { @@ -809,7 +782,6 @@ impl<'open> Window<'open> { let Window { title, mut open, - mut embedded, area, frame, resize, @@ -818,22 +790,12 @@ impl<'open> Window<'open> { default_open, with_title_bar, mut window_builder, + default_embedded, } = self; - let has_embedded = embedded.is_some(); - - let is_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_embedded = ctx.data_mut(|data| { + *data.get_persisted_mut_or(area.id.with("_embedded"), default_embedded) + }); let is_open = if let Some(open) = &mut open { if let Some(tmp_open) = ctx.data_mut(|data| { @@ -851,7 +813,6 @@ 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"), is_embedded); data.insert_persisted(area.id.with("_is_open"), is_open); }); @@ -1004,36 +965,15 @@ impl<'open> Window<'open> { let mut frame = frame.begin(&mut area_content_ui); let title_bar = if with_title_bar { - let is_embedded: bool = area_content_ui.data_mut(|data| { - data.get_persisted::(area_id.with("_is_embedded")) - .unwrap() - }); - - let mut tmp_embedded = is_embedded; - - let embedded = if has_embedded { - Some(&mut tmp_embedded) - } else { - None - }; let title_bar = show_title_bar( &mut frame.content_ui, title, show_close_button, &mut collapsing, collapsible, - embedded, + area_id, ); - if tmp_embedded != is_embedded { - area_content_ui.data_mut(|data| { - data.insert_persisted( - area_id.with("_embedded"), - tmp_embedded, - ) - }); - ctx.request_repaint_viewport(ctx.get_parent_viewport_id()); - } resize.min_size.x = resize.min_size.x.at_least(title_bar.rect.width()); // Prevent making window smaller than title bar width Some(title_bar) @@ -1207,33 +1147,15 @@ impl<'open> Window<'open> { let mut frame = frame.begin(&mut area_content_ui); let title_bar = if with_title_bar { - let is_embedded: bool = area_content_ui.data_mut(|data| { - data.get_persisted::(area_id.with("_is_embedded")) - .unwrap() - }); - - let mut tmp_embedded = is_embedded; - - let embedded = if has_embedded { - Some(&mut tmp_embedded) - } else { - None - }; let title_bar = show_title_bar( &mut frame.content_ui, title, show_close_button, &mut collapsing, collapsible, - embedded, + area_id, ); - if tmp_embedded != is_embedded { - area_content_ui.data_mut(|data| { - data.insert_persisted(area_id.with("_embedded"), tmp_embedded) - }); - ctx.request_repaint_viewport(ctx.get_parent_viewport_id()); - } resize.min_size.x = resize.min_size.x.at_least(title_bar.rect.width()); // Prevent making window smaller than title bar width Some(title_bar) } else { @@ -1686,7 +1608,7 @@ fn show_title_bar( show_close_button: bool, collapsing: &mut CollapsingState, collapsible: bool, - embedded: Option<&mut bool>, + id: Id, ) -> TitleBar { let inner_response = ui.horizontal(|ui| { let height = ui @@ -1704,11 +1626,15 @@ fn show_title_bar( collapsing.show_default_button_with_size(ui, button_size); } - if let Some(embedded) = embedded { - ui.add_space(pad); - let c = if *embedded { "^" } else { "-" }; + { + let embedded = + ui.data_mut(|data| data.get_persisted::(id.with("_embedded")).unwrap()); + let c = if embedded { "^" } else { "-" }; if ui.button(c).clicked() { - *embedded = !*embedded; + ui.data_mut(|data| data.insert_persisted(id.with("_embedded"), !embedded)); + // If the window is native to be embedded need for the parent to redraw + ui.ctx() + .request_repaint_viewport(ui.ctx().get_parent_viewport_id()); } } @@ -1718,7 +1644,7 @@ fn show_title_bar( // If at least one button is shown we make room for both buttons (since title is centered): 2.0 * (pad + button_size.x + item_spacing.x) + title_galley.size().x } else { - pad + title_galley.size().x + pad + pad + pad + title_galley.size().x + pad }; let min_rect = Rect::from_min_size(ui.min_rect().min, vec2(minimum_width, height)); let id = ui.advance_cursor_after_rect(min_rect); diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index d9e962a9e..1f723f143 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -18,10 +18,6 @@ fn main() { let mut value = 0.0; let mut debug = false; - let mut embedded1 = false; - let mut embedded2 = true; - let mut embedded3 = true; - let _ = eframe::run_simple_native( "Viewports Examples", NativeOptions { @@ -72,7 +68,7 @@ fn main() { egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { egui::Window::new("Test1") - .embedded(&mut embedded1) + .default_embedded(false) .show(ctx, |ui| { ui.label(format!("Frame: {}", ui.ctx().frame_nr())); let mut embedded = ui.data_mut(|data| { @@ -123,62 +119,54 @@ fn main() { }); }); egui::CollapsingHeader::new("Async Test2").show(ui, |ui| { - egui::Window::new("Test2") - .embedded(&mut embedded2) - .show_async(ctx, move |ui| { - ui.label(format!("Frame: {}", ui.ctx().frame_nr())); + 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 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"), - ) - }); - } + 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") - .embedded(&mut embedded3) - .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() - )); + 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"), - ) - }); - } + 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")) + }); } - }); + } + }); }); }); },