1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-30 05:10:03 -04:00

Add embedd button on window is only a button with character - or ^

This commit is contained in:
Konkitoman
2023-08-08 17:19:54 +03:00
parent d45fc14a13
commit c68908a6a8
2 changed files with 112 additions and 30 deletions

View File

@@ -318,7 +318,9 @@ impl<'open> Window<'open> {
mut window_builder,
} = 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| {
let tmp = data.get_persisted::<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());
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);
});
@@ -358,7 +360,7 @@ impl<'open> Window<'open> {
let show_close_button = open.is_some();
'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"))) {
let size = size.round()
+ 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 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,
);
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)
@@ -685,13 +704,27 @@ impl<'open> Window<'open> {
let mut frame = frame.begin(&mut area_content_ui);
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,
);
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 {
@@ -787,7 +820,9 @@ impl<'open> Window<'open> {
mut window_builder,
} = 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| {
let tmp = data.get_persisted::<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());
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);
});
@@ -827,7 +862,7 @@ impl<'open> Window<'open> {
let show_close_button = open.is_some();
'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"))) {
let size = size.round()
+ 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 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,
);
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)
@@ -1149,13 +1207,33 @@ 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,
);
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 {
@@ -1608,6 +1686,7 @@ fn show_title_bar(
show_close_button: bool,
collapsing: &mut CollapsingState,
collapsible: bool,
embedded: Option<&mut bool>,
) -> TitleBar {
let inner_response = ui.horizontal(|ui| {
let height = ui
@@ -1625,6 +1704,14 @@ 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 { "-" };
if ui.button(c).clicked() {
*embedded = !*embedded;
}
}
let title_galley = title.into_galley(ui, Some(false), f32::INFINITY, TextStyle::Heading);
let minimum_width = if collapsible || show_close_button {
@@ -1706,7 +1793,11 @@ impl TitleBar {
}
// 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());

View File

@@ -16,6 +16,7 @@ fn main() {
let mut show_sync = false;
let mut show = false;
let mut value = 0.0;
let mut debug = false;
let mut embedded1 = false;
let mut embedded2 = true;
@@ -35,6 +36,9 @@ fn main() {
ctx.set_desktop(is_desktop);
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");
if show_sync {
ctx.create_viewport_sync(
@@ -74,13 +78,19 @@ fn main() {
let mut embedded = ui.data_mut(|data| {
*data.get_temp_mut_or(Id::new("Test1").with("_is_embedded"), true)
});
let embedded_tmp = embedded;
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("Test1").with("_embedded"), embedded)
});
if embedded_tmp != embedded {
ui.data_mut(|data| {
data.insert_persisted(
Id::new("Test1").with("_embedded"),
embedded,
)
});
}
if to_repair {
ui.spinner();
}
@@ -117,16 +127,7 @@ fn main() {
.embedded(&mut embedded2)
.show_async(ctx, move |ui| {
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 {
ui.spinner();
}
@@ -157,16 +158,6 @@ fn main() {
.embedded(&mut embedded3)
.show_async(ctx, move |ui| {
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();
ui.label(format!(
"Current rendering window: {}",