mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-09 18:54:57 +00:00
Merge pull request #6186 from dotCooCoo/fix/modal-dialogs-fit-content
Dialogs: New Workspace and New Toolbar fit their contents instead of opening 420 pt tall
This commit is contained in:
@@ -343,7 +343,10 @@ pub(crate) fn show_dialog(app: &mut VectorcraftApp, ctx: &egui::Context) {
|
||||
}
|
||||
});
|
||||
ui.add_space(16.0);
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
// As wide as the field and as tall as the buttons, as in `dialogs::show`: a right-to-left
|
||||
// layout would take all the height left in the window and center the buttons in it.
|
||||
let row = egui::vec2(ui.min_rect().width(), ui.spacing().interact_size.y);
|
||||
ui.allocate_ui_with_layout(row, egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
if widgets::primary_button(ui, tl!("OK")).clicked() {
|
||||
ok = true;
|
||||
}
|
||||
@@ -445,7 +448,8 @@ pub(crate) fn show_manage(app: &mut VectorcraftApp, ctx: &egui::Context) {
|
||||
}
|
||||
});
|
||||
ui.add_space(16.0);
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
let row = egui::vec2(ui.min_rect().width(), ui.spacing().interact_size.y);
|
||||
ui.allocate_ui_with_layout(row, egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
if widgets::primary_button(ui, tl!("OK")).clicked() {
|
||||
ok = true;
|
||||
}
|
||||
|
||||
@@ -463,6 +463,39 @@ fn dialogs_do_not_stretch_to_the_screen() {
|
||||
assert!(checked >= 10, "only {checked} dialogs drew in the shared frame");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn workspace_and_toolbar_dialogs_end_at_their_buttons() {
|
||||
// New Workspace, Manage Workspaces, New Toolbar and Manage Toolbars draw their own windows: each
|
||||
// ends just below its OK button, with no empty band above or below the buttons.
|
||||
for (kind, fields, window) in [
|
||||
("newWorkspace", json!({"name": "Mine"}), "dialog-workspace"),
|
||||
("manageWorkspaces", json!({"selected": "", "name": ""}), "dialog-workspace"),
|
||||
(crate::custom_toolbars::KIND, json!({"name": "Toolbar 1"}), "dialog-new-toolbar"),
|
||||
(crate::custom_toolbars::MANAGE, json!({"selected": "", "name": ""}), "dialog-manage-toolbars"),
|
||||
] {
|
||||
let mut app = app();
|
||||
open(&mut app, kind, fields);
|
||||
let ctx = egui::Context::default();
|
||||
theme::install_fonts(&ctx);
|
||||
theme::apply(&ctx, Default::default());
|
||||
let screen = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(1600.0, 1000.0));
|
||||
let mut ok = None;
|
||||
for _ in 0..4 {
|
||||
let input = egui::RawInput { screen_rect: Some(screen), ..Default::default() };
|
||||
let mut out = ctx.run_ui(input, |ui| show(&mut app, ui.ctx()));
|
||||
out.textures_delta.clear();
|
||||
ok = out.shapes.iter().find_map(|c| match &c.shape {
|
||||
egui::Shape::Text(t) if t.galley.text() == "OK" => Some(t.visual_bounding_rect()),
|
||||
_ => None,
|
||||
});
|
||||
}
|
||||
let ok = ok.unwrap_or_else(|| panic!("{kind} draws no OK button"));
|
||||
let outer = ctx.memory(|m| m.area_rect(egui::Id::unique(window))).unwrap();
|
||||
let below = outer.bottom() - ok.bottom();
|
||||
assert!(below < 40.0, "{kind}: {below} pt between OK and the bottom of its {} pt window", outer.height());
|
||||
}
|
||||
}
|
||||
|
||||
/// The dialog window of `app`'s open dialog after a few frames in a `w` × 900 window.
|
||||
fn dialog_rect(app: &mut VectorcraftApp, w: f32) -> egui::Rect {
|
||||
let ctx = egui::Context::default();
|
||||
|
||||
@@ -519,7 +519,10 @@ pub fn show(app: &mut VectorcraftApp, ctx: &egui::Context) {
|
||||
ui.label(egui::RichText::new(tl!("Saves the current bars, toolbar and panel layout.")).color(t.text_dim).size(11.0));
|
||||
}
|
||||
ui.add_space(16.0);
|
||||
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
// As wide as the fields and as tall as the buttons, as in `dialogs::show`: a right-to-left
|
||||
// layout would take all the height left in the window and center the buttons in it.
|
||||
let row = egui::vec2(ui.min_rect().width(), ui.spacing().interact_size.y);
|
||||
ui.allocate_ui_with_layout(row, egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
||||
if widgets::primary_button(ui, tl!("OK")).clicked() {
|
||||
ok = true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user