M7: area type vertical alignment

Area Type Options > Align: Top / Center / Bottom / Justify (AreaOptions.verticalAlign,
LayoutOptions.vertical_align). Each row/column cell is aligned on its own; rectangular
cells shift their lines, other frames and text wrap reflow until settled without
losing text. Justify shares the leftover space equally between line gaps. Area Type Options
shows Align and First Baseline as dropdowns (the parameter dialog's choices table).
This commit is contained in:
haven
2026-10-08 14:28:02 -07:00
parent 8d0cede84a
commit d2bb95daab
13 changed files with 524 additions and 13 deletions
+25
View File
@@ -43,6 +43,31 @@ fn opts(version: u32, compress: bool) -> SaveOptions {
SaveOptions { version, compress, ..SaveOptions::default() }
}
#[test]
fn area_type_vertical_alignment_round_trips() {
let d = rich_doc();
let text = String::from_utf8(save(&d, false)).unwrap();
assert!(text.contains("\"verticalAlign\":\"center\""), "the fixture's area type is centred");
let back = load(text.as_bytes()).unwrap();
assert_eq!(doc_json(&back), doc_json(&d));
let area = |d: &Document| {
let mut found = None;
d.walk(|n| {
if let NodeKind::Text(t) = &n.kind
&& matches!(t.kind, vectorcraft_doc::TextKind::Area { .. })
{
found = Some(t.area.vertical_align);
}
});
found.unwrap()
};
assert_eq!(area(&back), vectorcraft_doc::VerticalAlign::Center);
// Files from before the option open top-aligned.
let old = text.replacen("\"verticalAlign\":\"center\",", "", 1).replacen(",\"verticalAlign\":\"center\"", "", 1);
assert!(!old.contains("verticalAlign"));
assert_eq!(area(&load(old.as_bytes()).unwrap()), vectorcraft_doc::VerticalAlign::Top);
}
#[test]
fn compressed_files_load() {
let d = rich_doc();