1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-02 06:40:06 -04:00

Now embedded is stored on window, and fix crash when we set a window size to 0

This commit is contained in:
Konkitoman
2023-08-08 21:18:03 +03:00
parent 0198b6ae45
commit 1a7c4700fd
3 changed files with 70 additions and 154 deletions

View File

@@ -925,6 +925,8 @@ pub fn process_viewport_commands(
} }
} }
egui::ViewportCommand::InnerSize(width, height) => { egui::ViewportCommand::InnerSize(width, height) => {
let width = width.max(1);
let height = height.max(1);
win.set_inner_size(PhysicalSize::new(width, height)); win.set_inner_size(PhysicalSize::new(width, height));
} }
egui::ViewportCommand::Resize(top, bottom, right, left) => { egui::ViewportCommand::Resize(top, bottom, right, left) => {

View File

@@ -26,13 +26,13 @@ use super::*;
pub struct Window<'open> { pub struct Window<'open> {
title: WidgetText, title: WidgetText,
open: Option<&'open mut bool>, open: Option<&'open mut bool>,
embedded: Option<&'open mut bool>,
area: Area, area: Area,
frame: Option<Frame>, frame: Option<Frame>,
resize: Resize, resize: Resize,
scroll: ScrollArea, scroll: ScrollArea,
collapsible: bool, collapsible: bool,
default_open: bool, default_open: bool,
default_embedded: bool,
with_title_bar: bool, with_title_bar: bool,
window_builder: ViewportBuilder, window_builder: ViewportBuilder,
} }
@@ -48,7 +48,6 @@ impl<'open> Window<'open> {
window_builder: ViewportBuilder::default().with_title(title.text()), window_builder: ViewportBuilder::default().with_title(title.text()),
title, title,
open: None, open: None,
embedded: None,
area, area,
frame: None, frame: None,
resize: Resize::default() resize: Resize::default()
@@ -61,6 +60,7 @@ impl<'open> Window<'open> {
collapsible: true, collapsible: true,
default_open: true, default_open: true,
with_title_bar: true, with_title_bar: true,
default_embedded: true,
} }
} }
@@ -80,8 +80,8 @@ impl<'open> Window<'open> {
self self
} }
pub fn embedded(mut self, embedded: &'open mut bool) -> Self { pub fn default_embedded(mut self, embedded: bool) -> Self {
self.embedded = Some(embedded); self.default_embedded = embedded;
self self
} }
@@ -307,7 +307,6 @@ impl<'open> Window<'open> {
let Window { let Window {
title, title,
mut open, mut open,
mut embedded,
area, area,
frame, frame,
resize, resize,
@@ -316,22 +315,12 @@ impl<'open> Window<'open> {
default_open, default_open,
with_title_bar, with_title_bar,
mut window_builder, mut window_builder,
default_embedded,
} = self; } = self;
let has_embedded = embedded.is_some(); let is_embedded = ctx.data_mut(|data| {
*data.get_persisted_mut_or(area.id.with("_embedded"), default_embedded)
let is_embedded = if let Some(embedded) = &mut embedded { });
if let Some(tmp_embedded) = ctx.data_mut(|data| {
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
data.remove::<bool>(area.id.with("_embedded"));
tmp
}) {
**embedded = tmp_embedded;
}
**embedded
} else {
true
};
let is_open = if let Some(open) = &mut open { let is_open = if let Some(open) = &mut open {
if let Some(tmp_open) = ctx.data_mut(|data| { 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()); let is_open = is_open || ctx.memory(|mem| mem.everything_is_visible());
ctx.data_mut(|data| { ctx.data_mut(|data| {
data.insert_persisted(area.id.with("_is_embedded"), is_embedded);
data.insert_persisted(area.id.with("_is_open"), is_open); 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 title_bar = if with_title_bar {
let mut tmp_embedded = is_embedded; let mut tmp_embedded = is_embedded;
let embedded = if has_embedded {
Some(&mut tmp_embedded)
} else {
None
};
let title_bar = show_title_bar( let title_bar = show_title_bar(
&mut frame.content_ui, &mut frame.content_ui,
title, title,
show_close_button, show_close_button,
&mut collapsing, &mut collapsing,
collapsible, collapsible,
embedded, area_id,
); );
if tmp_embedded != is_embedded { if tmp_embedded != is_embedded {
@@ -706,25 +689,15 @@ impl<'open> Window<'open> {
let title_bar = if with_title_bar { let title_bar = if with_title_bar {
let mut tmp_embedded = is_embedded; let mut tmp_embedded = is_embedded;
let embedded = if has_embedded {
Some(&mut tmp_embedded)
} else {
None
};
let title_bar = show_title_bar( let title_bar = show_title_bar(
&mut frame.content_ui, &mut frame.content_ui,
title, title,
show_close_button, show_close_button,
&mut collapsing, &mut collapsing,
collapsible, 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 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) Some(title_bar)
} else { } else {
@@ -809,7 +782,6 @@ impl<'open> Window<'open> {
let Window { let Window {
title, title,
mut open, mut open,
mut embedded,
area, area,
frame, frame,
resize, resize,
@@ -818,22 +790,12 @@ impl<'open> Window<'open> {
default_open, default_open,
with_title_bar, with_title_bar,
mut window_builder, mut window_builder,
default_embedded,
} = self; } = self;
let has_embedded = embedded.is_some(); let is_embedded = ctx.data_mut(|data| {
*data.get_persisted_mut_or(area.id.with("_embedded"), default_embedded)
let is_embedded = if let Some(embedded) = &mut embedded { });
if let Some(tmp_embedded) = ctx.data_mut(|data| {
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
data.remove::<bool>(area.id.with("_embedded"));
tmp
}) {
**embedded = tmp_embedded;
}
**embedded
} else {
true
};
let is_open = if let Some(open) = &mut open { let is_open = if let Some(open) = &mut open {
if let Some(tmp_open) = ctx.data_mut(|data| { 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()); let is_open = is_open || ctx.memory(|mem| mem.everything_is_visible());
ctx.data_mut(|data| { ctx.data_mut(|data| {
data.insert_persisted(area.id.with("_is_embedded"), is_embedded);
data.insert_persisted(area.id.with("_is_open"), is_open); 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 mut frame = frame.begin(&mut area_content_ui);
let title_bar = if with_title_bar { let title_bar = if with_title_bar {
let is_embedded: bool = area_content_ui.data_mut(|data| {
data.get_persisted::<bool>(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( let title_bar = show_title_bar(
&mut frame.content_ui, &mut frame.content_ui,
title, title,
show_close_button, show_close_button,
&mut collapsing, &mut collapsing,
collapsible, 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 =
resize.min_size.x.at_least(title_bar.rect.width()); // Prevent making window smaller than title bar width resize.min_size.x.at_least(title_bar.rect.width()); // Prevent making window smaller than title bar width
Some(title_bar) Some(title_bar)
@@ -1207,33 +1147,15 @@ impl<'open> Window<'open> {
let mut frame = frame.begin(&mut area_content_ui); let mut frame = frame.begin(&mut area_content_ui);
let title_bar = if with_title_bar { let title_bar = if with_title_bar {
let is_embedded: bool = area_content_ui.data_mut(|data| {
data.get_persisted::<bool>(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( let title_bar = show_title_bar(
&mut frame.content_ui, &mut frame.content_ui,
title, title,
show_close_button, show_close_button,
&mut collapsing, &mut collapsing,
collapsible, 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 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) Some(title_bar)
} else { } else {
@@ -1686,7 +1608,7 @@ fn show_title_bar(
show_close_button: bool, show_close_button: bool,
collapsing: &mut CollapsingState, collapsing: &mut CollapsingState,
collapsible: bool, collapsible: bool,
embedded: Option<&mut bool>, id: Id,
) -> TitleBar { ) -> TitleBar {
let inner_response = ui.horizontal(|ui| { let inner_response = ui.horizontal(|ui| {
let height = ui let height = ui
@@ -1704,11 +1626,15 @@ fn show_title_bar(
collapsing.show_default_button_with_size(ui, button_size); collapsing.show_default_button_with_size(ui, button_size);
} }
if let Some(embedded) = embedded { {
ui.add_space(pad); let embedded =
let c = if *embedded { "^" } else { "-" }; ui.data_mut(|data| data.get_persisted::<bool>(id.with("_embedded")).unwrap());
let c = if embedded { "^" } else { "-" };
if ui.button(c).clicked() { 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): // 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 2.0 * (pad + button_size.x + item_spacing.x) + title_galley.size().x
} else { } 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 min_rect = Rect::from_min_size(ui.min_rect().min, vec2(minimum_width, height));
let id = ui.advance_cursor_after_rect(min_rect); let id = ui.advance_cursor_after_rect(min_rect);

View File

@@ -18,10 +18,6 @@ fn main() {
let mut value = 0.0; let mut value = 0.0;
let mut debug = false; let mut debug = false;
let mut embedded1 = false;
let mut embedded2 = true;
let mut embedded3 = true;
let _ = eframe::run_simple_native( let _ = eframe::run_simple_native(
"Viewports Examples", "Viewports Examples",
NativeOptions { NativeOptions {
@@ -72,7 +68,7 @@ fn main() {
egui::CollapsingHeader::new("Show Test1").show(ui, |ui| { egui::CollapsingHeader::new("Show Test1").show(ui, |ui| {
egui::Window::new("Test1") egui::Window::new("Test1")
.embedded(&mut embedded1) .default_embedded(false)
.show(ctx, |ui| { .show(ctx, |ui| {
ui.label(format!("Frame: {}", ui.ctx().frame_nr())); ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
let mut embedded = ui.data_mut(|data| { let mut embedded = ui.data_mut(|data| {
@@ -123,62 +119,54 @@ fn main() {
}); });
}); });
egui::CollapsingHeader::new("Async Test2").show(ui, |ui| { egui::CollapsingHeader::new("Async Test2").show(ui, |ui| {
egui::Window::new("Test2") egui::Window::new("Test2").show_async(ctx, move |ui| {
.embedded(&mut embedded2) ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
.show_async(ctx, move |ui| {
ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
if to_repair { if to_repair {
ui.spinner(); ui.spinner();
} }
let ctx = ui.ctx().clone(); let ctx = ui.ctx().clone();
ui.label(format!( ui.label(format!(
"Current rendering window: {}", "Current rendering window: {}",
ctx.get_viewport_id() ctx.get_viewport_id()
)); ));
if ui.button("Drag").is_pointer_button_down_on() { if ui.button("Drag").is_pointer_button_down_on() {
if ctx.get_viewport_id() != ctx.get_parent_viewport_id() { if ctx.get_viewport_id() != ctx.get_parent_viewport_id() {
ctx.viewport_command( ctx.viewport_command(
ctx.get_viewport_id(), ctx.get_viewport_id(),
egui::ViewportCommand::Drag, egui::ViewportCommand::Drag,
) )
} else { } else {
ctx.memory_mut(|mem| { ctx.memory_mut(|mem| {
mem.set_dragged_id( mem.set_dragged_id(egui::Id::new("Test2").with("frame_resize"))
egui::Id::new("Test2").with("frame_resize"), });
)
});
}
} }
}); }
});
}); });
egui::CollapsingHeader::new("Async Test3").show(ui, |ui| { egui::CollapsingHeader::new("Async Test3").show(ui, |ui| {
egui::Window::new("Test3") egui::Window::new("Test3").show_async(ctx, move |ui| {
.embedded(&mut embedded3) ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
.show_async(ctx, move |ui| { let ctx = ui.ctx().clone();
ui.label(format!("Frame: {}", ui.ctx().frame_nr())); ui.label(format!(
let ctx = ui.ctx().clone(); "Current rendering window: {}",
ui.label(format!( ctx.get_viewport_id()
"Current rendering window: {}", ));
ctx.get_viewport_id()
));
if ui.button("Drag").is_pointer_button_down_on() { if ui.button("Drag").is_pointer_button_down_on() {
if ctx.get_viewport_id() != ctx.get_parent_viewport_id() { if ctx.get_viewport_id() != ctx.get_parent_viewport_id() {
ctx.viewport_command( ctx.viewport_command(
ctx.get_viewport_id(), ctx.get_viewport_id(),
egui::ViewportCommand::Drag, egui::ViewportCommand::Drag,
) )
} else { } else {
ctx.memory_mut(|mem| { ctx.memory_mut(|mem| {
mem.set_dragged_id( mem.set_dragged_id(egui::Id::new("Test3").with("frame_resize"))
egui::Id::new("Test3").with("frame_resize"), });
)
});
}
} }
}); }
});
}); });
}); });
}, },