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