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:
@@ -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) => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"))
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user