1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-28 07:23:13 -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) => {
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) => {

View File

@@ -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<Frame>,
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::<bool>(area.id.with("_embedded"));
data.remove::<bool>(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::<bool>(area.id.with("_embedded"));
data.remove::<bool>(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::<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(
&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::<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(
&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::<bool>(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);

View File

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