mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 14:50:03 -04:00
Add embedd button on window is only a button with character - or ^
This commit is contained in:
@@ -318,7 +318,9 @@ impl<'open> Window<'open> {
|
|||||||
mut window_builder,
|
mut window_builder,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
let embedded = if let Some(embedded) = &mut embedded {
|
let has_embedded = embedded.is_some();
|
||||||
|
|
||||||
|
let is_embedded = if let Some(embedded) = &mut embedded {
|
||||||
if let Some(tmp_embedded) = ctx.data_mut(|data| {
|
if let Some(tmp_embedded) = ctx.data_mut(|data| {
|
||||||
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
|
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
|
||||||
data.remove::<bool>(area.id.with("_embedded"));
|
data.remove::<bool>(area.id.with("_embedded"));
|
||||||
@@ -347,7 +349,7 @@ 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"), embedded);
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -358,7 +360,7 @@ impl<'open> Window<'open> {
|
|||||||
let show_close_button = open.is_some();
|
let show_close_button = open.is_some();
|
||||||
|
|
||||||
'create_viewport: {
|
'create_viewport: {
|
||||||
if !embedded && ctx.is_desktop() {
|
if !is_embedded && ctx.is_desktop() {
|
||||||
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||||
let size = size.round()
|
let size = size.round()
|
||||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
||||||
@@ -500,13 +502,30 @@ 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 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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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 =
|
||||||
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)
|
||||||
@@ -685,13 +704,27 @@ 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 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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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 {
|
||||||
@@ -787,7 +820,9 @@ impl<'open> Window<'open> {
|
|||||||
mut window_builder,
|
mut window_builder,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
let embedded = if let Some(embedded) = &mut embedded {
|
let has_embedded = embedded.is_some();
|
||||||
|
|
||||||
|
let is_embedded = if let Some(embedded) = &mut embedded {
|
||||||
if let Some(tmp_embedded) = ctx.data_mut(|data| {
|
if let Some(tmp_embedded) = ctx.data_mut(|data| {
|
||||||
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
|
let tmp = data.get_persisted::<bool>(area.id.with("_embedded"));
|
||||||
data.remove::<bool>(area.id.with("_embedded"));
|
data.remove::<bool>(area.id.with("_embedded"));
|
||||||
@@ -816,7 +851,7 @@ 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"), embedded);
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -827,7 +862,7 @@ impl<'open> Window<'open> {
|
|||||||
let show_close_button = open.is_some();
|
let show_close_button = open.is_some();
|
||||||
|
|
||||||
'create_viewport: {
|
'create_viewport: {
|
||||||
if !embedded && ctx.is_desktop() {
|
if !is_embedded && ctx.is_desktop() {
|
||||||
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
if let Some(size) = ctx.data(|data| data.get_temp::<Vec2>(area.id.with("size"))) {
|
||||||
let size = size.round()
|
let size = size.round()
|
||||||
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
+ ctx.style().spacing.window_margin.sum() * ctx.pixels_per_point();
|
||||||
@@ -969,13 +1004,36 @@ 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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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)
|
||||||
@@ -1149,13 +1207,33 @@ 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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
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 {
|
||||||
@@ -1608,6 +1686,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>,
|
||||||
) -> TitleBar {
|
) -> TitleBar {
|
||||||
let inner_response = ui.horizontal(|ui| {
|
let inner_response = ui.horizontal(|ui| {
|
||||||
let height = ui
|
let height = ui
|
||||||
@@ -1625,6 +1704,14 @@ 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 c = if *embedded { "^" } else { "-" };
|
||||||
|
if ui.button(c).clicked() {
|
||||||
|
*embedded = !*embedded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let title_galley = title.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Heading);
|
let title_galley = title.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Heading);
|
||||||
|
|
||||||
let minimum_width = if collapsible || show_close_button {
|
let minimum_width = if collapsible || show_close_button {
|
||||||
@@ -1706,7 +1793,11 @@ impl TitleBar {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't cover the close- and collapse buttons:
|
// Don't cover the close- and collapse buttons:
|
||||||
let double_click_rect = self.rect.shrink2(vec2(32.0, 0.0));
|
// After 32 is used for a temporary embedd button!
|
||||||
|
let double_click_rect = self.rect.shrink2(vec2(
|
||||||
|
32.0 + ui.style().visuals.text_cursor_width + ui.style().spacing.icon_width,
|
||||||
|
0.0,
|
||||||
|
));
|
||||||
|
|
||||||
let res = ui.interact(double_click_rect, self.id, Sense::click());
|
let res = ui.interact(double_click_rect, self.id, Sense::click());
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ fn main() {
|
|||||||
let mut show_sync = false;
|
let mut show_sync = false;
|
||||||
let mut show = false;
|
let mut show = false;
|
||||||
let mut value = 0.0;
|
let mut value = 0.0;
|
||||||
|
let mut debug = false;
|
||||||
|
|
||||||
let mut embedded1 = false;
|
let mut embedded1 = false;
|
||||||
let mut embedded2 = true;
|
let mut embedded2 = true;
|
||||||
@@ -35,6 +36,9 @@ fn main() {
|
|||||||
ctx.set_desktop(is_desktop);
|
ctx.set_desktop(is_desktop);
|
||||||
ui.checkbox(&mut to_repair, "To Repair!");
|
ui.checkbox(&mut to_repair, "To Repair!");
|
||||||
|
|
||||||
|
ui.checkbox(&mut debug, "Debug");
|
||||||
|
ctx.set_debug_on_hover(debug);
|
||||||
|
|
||||||
ui.checkbox(&mut show_sync, "Show Sync Viewport");
|
ui.checkbox(&mut show_sync, "Show Sync Viewport");
|
||||||
if show_sync {
|
if show_sync {
|
||||||
ctx.create_viewport_sync(
|
ctx.create_viewport_sync(
|
||||||
@@ -74,13 +78,19 @@ fn main() {
|
|||||||
let mut embedded = ui.data_mut(|data| {
|
let mut embedded = ui.data_mut(|data| {
|
||||||
*data.get_temp_mut_or(Id::new("Test1").with("_is_embedded"), true)
|
*data.get_temp_mut_or(Id::new("Test1").with("_is_embedded"), true)
|
||||||
});
|
});
|
||||||
|
let embedded_tmp = embedded;
|
||||||
if ui.checkbox(&mut embedded, "Should embedd?").clicked() {
|
if ui.checkbox(&mut embedded, "Should embedd?").clicked() {
|
||||||
ui.ctx()
|
ui.ctx()
|
||||||
.request_repaint_viewport(ui.ctx().get_parent_viewport_id());
|
.request_repaint_viewport(ui.ctx().get_parent_viewport_id());
|
||||||
}
|
}
|
||||||
ui.data_mut(|data| {
|
if embedded_tmp != embedded {
|
||||||
data.insert_persisted(Id::new("Test1").with("_embedded"), embedded)
|
ui.data_mut(|data| {
|
||||||
});
|
data.insert_persisted(
|
||||||
|
Id::new("Test1").with("_embedded"),
|
||||||
|
embedded,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
if to_repair {
|
if to_repair {
|
||||||
ui.spinner();
|
ui.spinner();
|
||||||
}
|
}
|
||||||
@@ -117,16 +127,7 @@ fn main() {
|
|||||||
.embedded(&mut embedded2)
|
.embedded(&mut embedded2)
|
||||||
.show_async(ctx, move |ui| {
|
.show_async(ctx, move |ui| {
|
||||||
ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
|
ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
|
||||||
let mut embedded = ui.data_mut(|data| {
|
|
||||||
*data.get_temp_mut_or(Id::new("Test2").with("_is_embedded"), true)
|
|
||||||
});
|
|
||||||
if ui.checkbox(&mut embedded, "Should embedd?").clicked() {
|
|
||||||
ui.ctx()
|
|
||||||
.request_repaint_viewport(ui.ctx().get_parent_viewport_id());
|
|
||||||
}
|
|
||||||
ui.data_mut(|data| {
|
|
||||||
data.insert_persisted(Id::new("Test2").with("_embedded"), embedded)
|
|
||||||
});
|
|
||||||
if to_repair {
|
if to_repair {
|
||||||
ui.spinner();
|
ui.spinner();
|
||||||
}
|
}
|
||||||
@@ -157,16 +158,6 @@ fn main() {
|
|||||||
.embedded(&mut embedded3)
|
.embedded(&mut embedded3)
|
||||||
.show_async(ctx, move |ui| {
|
.show_async(ctx, move |ui| {
|
||||||
ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
|
ui.label(format!("Frame: {}", ui.ctx().frame_nr()));
|
||||||
let mut embedded = ui.data_mut(|data| {
|
|
||||||
*data.get_temp_mut_or(Id::new("Test3").with("_is_embedded"), true)
|
|
||||||
});
|
|
||||||
if ui.checkbox(&mut embedded, "Should embedd?").clicked() {
|
|
||||||
ui.ctx()
|
|
||||||
.request_repaint_viewport(ui.ctx().get_parent_viewport_id());
|
|
||||||
}
|
|
||||||
ui.data_mut(|data| {
|
|
||||||
data.insert_persisted(Id::new("Test3").with("_embedded"), embedded)
|
|
||||||
});
|
|
||||||
let ctx = ui.ctx().clone();
|
let ctx = ui.ctx().clone();
|
||||||
ui.label(format!(
|
ui.label(format!(
|
||||||
"Current rendering window: {}",
|
"Current rendering window: {}",
|
||||||
|
|||||||
Reference in New Issue
Block a user