From c68908a6a8de7070a1e5306850ff54d1f66a4d1f Mon Sep 17 00:00:00 2001 From: Konkitoman Date: Tue, 8 Aug 2023 17:19:54 +0300 Subject: [PATCH] Add embedd button on window is only a button with character - or ^ --- crates/egui/src/containers/window.rs | 105 +++++++++++++++++++++++++-- examples/viewports/src/main.rs | 37 ++++------ 2 files changed, 112 insertions(+), 30 deletions(-) diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 735eae5e4..3ba8adffe 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -318,7 +318,9 @@ impl<'open> Window<'open> { mut window_builder, } = self; - let embedded = if let Some(embedded) = &mut embedded { + 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")); @@ -347,7 +349,7 @@ 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_embedded"), is_embedded); data.insert_persisted(area.id.with("_is_open"), is_open); }); @@ -358,7 +360,7 @@ impl<'open> Window<'open> { let show_close_button = open.is_some(); 'create_viewport: { - if !embedded && ctx.is_desktop() { + if !is_embedded && ctx.is_desktop() { if let Some(size) = ctx.data(|data| data.get_temp::(area.id.with("size"))) { let size = size.round() + ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point(); @@ -500,13 +502,30 @@ impl<'open> Window<'open> { let mut frame = frame.begin(&mut area_content_ui); 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, ); + + 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) @@ -685,13 +704,27 @@ impl<'open> Window<'open> { let mut frame = frame.begin(&mut area_content_ui); 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, ); + + 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 { @@ -787,7 +820,9 @@ impl<'open> Window<'open> { mut window_builder, } = self; - let embedded = if let Some(embedded) = &mut embedded { + 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")); @@ -816,7 +851,7 @@ 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_embedded"), is_embedded); data.insert_persisted(area.id.with("_is_open"), is_open); }); @@ -827,7 +862,7 @@ impl<'open> Window<'open> { let show_close_button = open.is_some(); 'create_viewport: { - if !embedded && ctx.is_desktop() { + if !is_embedded && ctx.is_desktop() { if let Some(size) = ctx.data(|data| data.get_temp::(area.id.with("size"))) { let size = size.round() + ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point(); @@ -969,13 +1004,36 @@ 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, ); + + 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) @@ -1149,13 +1207,33 @@ 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, ); + + 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 { @@ -1608,6 +1686,7 @@ fn show_title_bar( show_close_button: bool, collapsing: &mut CollapsingState, collapsible: bool, + embedded: Option<&mut bool>, ) -> TitleBar { let inner_response = ui.horizontal(|ui| { let height = ui @@ -1625,6 +1704,14 @@ 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 { "-" }; + if ui.button(c).clicked() { + *embedded = !*embedded; + } + } + let title_galley = title.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Heading); let minimum_width = if collapsible || show_close_button { @@ -1706,7 +1793,11 @@ impl TitleBar { } // Don't cover the close- and collapse buttons: - let double_click_rect = self.rect.shrink2(vec2(32.0, 0.0)); + // After 32 is used for a temporary embedd button! + let double_click_rect = self.rect.shrink2(vec2( + 32.0 + ui.style().visuals.text_cursor_width + ui.style().spacing.icon_width, + 0.0, + )); let res = ui.interact(double_click_rect, self.id, Sense::click()); diff --git a/examples/viewports/src/main.rs b/examples/viewports/src/main.rs index 7c3180176..d9e962a9e 100644 --- a/examples/viewports/src/main.rs +++ b/examples/viewports/src/main.rs @@ -16,6 +16,7 @@ fn main() { let mut show_sync = false; let mut show = false; let mut value = 0.0; + let mut debug = false; let mut embedded1 = false; let mut embedded2 = true; @@ -35,6 +36,9 @@ fn main() { 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( @@ -74,13 +78,19 @@ fn main() { 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()); } - ui.data_mut(|data| { - data.insert_persisted(Id::new("Test1").with("_embedded"), embedded) - }); + if embedded_tmp != embedded { + ui.data_mut(|data| { + data.insert_persisted( + Id::new("Test1").with("_embedded"), + embedded, + ) + }); + } if to_repair { ui.spinner(); } @@ -117,16 +127,7 @@ fn main() { .embedded(&mut embedded2) .show_async(ctx, move |ui| { ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - let mut embedded = ui.data_mut(|data| { - *data.get_temp_mut_or(Id::new("Test2").with("_is_embedded"), true) - }); - if ui.checkbox(&mut embedded, "Should embedd?").clicked() { - ui.ctx() - .request_repaint_viewport(ui.ctx().get_parent_viewport_id()); - } - ui.data_mut(|data| { - data.insert_persisted(Id::new("Test2").with("_embedded"), embedded) - }); + if to_repair { ui.spinner(); } @@ -157,16 +158,6 @@ fn main() { .embedded(&mut embedded3) .show_async(ctx, move |ui| { ui.label(format!("Frame: {}", ui.ctx().frame_nr())); - let mut embedded = ui.data_mut(|data| { - *data.get_temp_mut_or(Id::new("Test3").with("_is_embedded"), true) - }); - if ui.checkbox(&mut embedded, "Should embedd?").clicked() { - ui.ctx() - .request_repaint_viewport(ui.ctx().get_parent_viewport_id()); - } - ui.data_mut(|data| { - data.insert_persisted(Id::new("Test3").with("_embedded"), embedded) - }); let ctx = ui.ctx().clone(); ui.label(format!( "Current rendering window: {}",