mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-11-02 22:41:47 -06:00
fix(ui): the added-text editor keeps the box's alignment
Opening a centred or right-aligned Add text box drew its text at the left edge, a layout the box never had, and Ctrl+Z inside the box (which goes to the text, not the document) left it showing that way. The editor now lays the text out with the box's alignment. Justified text is still shown left-aligned while editing (TextEdit can't justify).
This commit is contained in:
@@ -560,6 +560,13 @@ pub(crate) fn editor(ctx: &egui::Context, view: &mut DocView, info: &DocInfo, ad
|
||||
// The box is white in every theme, so the caret must not follow the theme (pale in dark mode) (#655).
|
||||
ui.visuals_mut().text_cursor.stroke.color = crate::edit_text_ui::caret_color_on(Color32::WHITE);
|
||||
let [cr, cg, cb] = t.style.color.map(|v| (v.clamp(0.0, 1.0) * 255.0) as u8);
|
||||
// Laid out as the page draws it, so opening the box doesn't show it realigned.
|
||||
// shortcut: justified text is shown left-aligned here (TextEdit can't justify), until the editor gets its own layouter.
|
||||
let halign = match t.style.align {
|
||||
pdfcraft_engine::TextAlign::Center => egui::Align::Center,
|
||||
pdfcraft_engine::TextAlign::Right => egui::Align::Max,
|
||||
pdfcraft_engine::TextAlign::Left | pdfcraft_engine::TextAlign::Justify => egui::Align::Min,
|
||||
};
|
||||
ui.horizontal_top(|ui| {
|
||||
ui.spacing_mut().item_spacing.x = 4.0;
|
||||
let resp = ui.add(
|
||||
@@ -567,6 +574,7 @@ pub(crate) fn editor(ctx: &egui::Context, view: &mut DocView, info: &DocInfo, ad
|
||||
.font(font)
|
||||
.desired_width(r.width().max(60.0))
|
||||
.desired_rows(1)
|
||||
.horizontal_align(halign)
|
||||
.background_color(if background_ready { Color32::TRANSPARENT } else { Color32::WHITE })
|
||||
.text_color(Color32::from_rgb(cr, cg, cb))
|
||||
.hint_text(tl!("Type text"))
|
||||
|
||||
@@ -715,6 +715,28 @@ fn format_text_panel_sets_alignment_and_lists_planned_controls_disabled() {
|
||||
}
|
||||
|
||||
/// Where a mode bar tab is, by its label.
|
||||
/// Opening right-aligned added text to edit it shows it right-aligned, as the page does, not at
|
||||
/// the box's left edge, where it never was.
|
||||
#[test]
|
||||
fn the_text_editor_keeps_the_boxs_alignment() {
|
||||
let _gpu = gpu();
|
||||
let mut h = harness();
|
||||
let rect = [40.0, 195.0, 240.0, 210.0];
|
||||
let text = pdfcraft_engine::AddedText { rect, text: "Hi".into(), align: pdfcraft_engine::TextAlign::Right, ..Default::default() };
|
||||
assert!(h.state_mut().apply_edit(pdfcraft_engine::Edit::AddText { page: 0, text }));
|
||||
assert!(h.state_mut().execute("edit.text"));
|
||||
h.run_steps(3);
|
||||
let point = at(&h, 200.0, 195.0);
|
||||
click(&mut h, point);
|
||||
assert_eq!(h.state().views[0].content.draft.as_ref().and_then(|d| d.index), Some(0), "the editor opened on the text");
|
||||
h.run_steps(3);
|
||||
let r = item_on_screen(&h, rect);
|
||||
let pixels = h.render().unwrap();
|
||||
let left = ink(&pixels, egui::Rect::from_min_max(r.min, pos2(r.center().x, r.max.y)));
|
||||
let right = ink(&pixels, egui::Rect::from_min_max(pos2(r.center().x, r.min.y), r.max));
|
||||
assert!(left == 0 && right > 20, "the text is drawn at the right ({left} dark pixels left, {right} right)");
|
||||
}
|
||||
|
||||
fn mode_tab(h: &Harness<'static, PdfCraftApp>, label: &str) -> egui::Rect {
|
||||
h.get_all_by_role_and_label(egui::accesskit::Role::Button, label).map(|n| n.rect()).find(|r| r.bottom() < 120.0).expect("a mode tab")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user