Keep typed font sizes accessible and within the current panel layout

Use a named compact preset arrow beside the field, retain the row alignment/width assertions for the editable control, and open the current colour flyout in the saved-text regression. No accessibility or layout checks are disabled.
This commit is contained in:
FredApps
2026-10-30 09:29:42 +01:00
parent ee82cf1a72
commit 4b319bb383
3 changed files with 35 additions and 25 deletions
+31 -23
View File
@@ -320,32 +320,40 @@ fn colour_button(ui: &mut egui::Ui, t: &Tokens, color: [f64; 3]) -> egui::Respon
/// Commit a typed size once (Enter or leaving the field), rather than one undo step per key.
/// The bounds match AddedText validation, so the panel also accepts coloured text below 8 pt.
fn font_size_input(ui: &mut egui::Ui, size: &mut f64) {
let id = ui.make_persistent_id("font-size-input");
let (previous, mut text) = ui.data(|d| d.get_temp::<(u64, String)>(id)).unwrap_or_else(|| (size.to_bits(), size.to_string()));
if previous != size.to_bits() {
text = size.to_string();
}
let response = ui.add(egui::TextEdit::singleline(&mut text).id(id).desired_width(44.0)).accessible_name(tl!("Font size:"));
let cancel = (response.has_focus() || response.lost_focus()) && ui.input(|i| i.key_pressed(egui::Key::Escape));
if cancel {
text = size.to_string();
response.surrender_focus();
} else if response.lost_focus() || (response.has_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter))) {
if let Some(value) = typed_font_size(&text) {
*size = value;
ui.scope(|ui| {
ui.spacing_mut().item_spacing.x = 2.0;
let id = ui.make_persistent_id("font-size-input");
let (previous, mut text) = ui.data(|d| d.get_temp::<(u64, String)>(id)).unwrap_or_else(|| (size.to_bits(), size.to_string()));
if previous != size.to_bits() {
text = size.to_string();
}
text = size.to_string();
}
let before = *size;
craft_ui::ComboBox::from_id_salt("font-size").selected_text("pt").width(28.0).show_ui(ui, |ui| {
for value in SIZES {
ui.selectable_value(size, value, format!("{value} pt"));
let field = egui::TextEdit::singleline(&mut text).id(id).desired_width(40.0);
let response = ui.add_sized([40.0, ui.spacing().interact_size.y], field).accessible_name(tl!("Font size:"));
let cancel = (response.has_focus() || response.lost_focus()) && ui.input(|i| i.key_pressed(egui::Key::Escape));
if cancel {
text = size.to_string();
response.surrender_focus();
} else if response.lost_focus() || (response.has_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter))) {
if let Some(value) = typed_font_size(&text) {
*size = value;
}
text = size.to_string();
}
let before = *size;
let list = icons::button(ui, "chevron-down", PRESET_LIST, false, tl!("Font size"));
egui::Popup::menu(&list).show(|ui| {
for value in SIZES {
if ui.selectable_label(*size == value, format!("{value} pt")).clicked() {
*size = value;
ui.close();
}
}
});
if *size != before {
text = size.to_string();
}
ui.data_mut(|d| d.insert_temp(id, (size.to_bits(), text)));
});
if *size != before {
text = size.to_string();
}
ui.data_mut(|d| d.insert_temp(id, (size.to_bits(), text)));
}
fn typed_font_size(text: &str) -> Option<f64> {
+2 -2
View File
@@ -699,7 +699,7 @@ fn format_text_rows_line_up_and_fit_the_panel() {
let combo = |h: &Harness<'static, PdfCraftApp>, value: &str| {
h.query_all_by_role(Role::ComboBox).find(|n| n.value().as_deref() == Some(value)).map(|n| n.rect()).expect(value)
};
let (font, size) = (combo(&h, "Helvetica"), combo(&h, "12"));
let (font, size) = (combo(&h, "Helvetica"), h.get_by_label("Font size:").rect());
let middle = |r: egui::Rect| r.center().y;
for label in ["Colour", "Alignment"] {
let other = h.get_by_label(label).rect();
@@ -716,7 +716,7 @@ fn format_text_rows_line_up_and_fit_the_panel() {
for r in &scale_row {
assert!((middle(*r) - middle(scale_row[0])).abs() < 0.5, "{scale_row:?}");
}
for r in h.query_all_by_role(Role::ComboBox).map(|n| n.rect()).chain(scale_row) {
for r in h.query_all_by_role(Role::ComboBox).map(|n| n.rect()).chain(scale_row).chain([size, h.get_by_label("Font size").rect()]) {
assert!(r.right() <= font.right() + 0.5, "{r:?} reaches past the panel ({font:?})");
}
}
+2
View File
@@ -4166,6 +4166,8 @@ fn typed_small_coloured_text_size_survives_save_and_reopen() {
h.event(egui::Event::Text("6.5".into()));
h.key_press(Key::Enter);
h.run_steps(4);
h.get_by_label("Colour").click();
h.run_steps(2);
h.get_by_label("Blue").click();
h.run_steps(4);
let id = h.state().views[0].id;