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"))
+ });
}
- });
+ }
+ });
});
});
},