M7.3: Area Type Options — rows, columns, gutter, inset, first baseline stored on area type, laid out by the text engine; Type → Area Type Options… dialog prefilled from the selection

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Thomas
2026-10-01 10:32:58 -04:00
co-authored by Claude Opus 5.5
parent 4d1eb16424
commit f522e6bd3d
8 changed files with 171 additions and 20 deletions
+16 -2
View File
@@ -315,7 +315,14 @@ fn create_in_path(s: &mut Session, p: &Value) -> Result<Value> {
_ => 0.0,
};
let kind = if on_path { TextKind::OnPath { path: path.clone(), start } } else { TextKind::Area { frame: path.clone() } };
let mut t = TextObject { kind, xf: Affine::IDENTITY, runs: vec![TextRun { text, style }], para: Default::default(), cached_bounds: None };
let mut t = TextObject {
kind,
xf: Affine::IDENTITY,
runs: vec![TextRun { text, style }],
para: Default::default(),
area: Default::default(),
cached_bounds: None,
};
refresh_bounds(&mut t);
let id = s.edit(if on_path { "Type on a Path" } else { "Area Type" }, |d, sel| {
let (par, idx, _) = d.position(pid).ok_or(EngineError::NoNode(pid))?;
@@ -342,7 +349,14 @@ fn headline_tracking(t: &TextObject, target: f64) -> Option<f64> {
}
let head = edit::slice_runs(&t.runs, 0, end);
let measure = |tr: f64| {
let mut h = TextObject { kind: TextKind::Point, xf: Affine::IDENTITY, runs: head.clone(), para: Default::default(), cached_bounds: None };
let mut h = TextObject {
kind: TextKind::Point,
xf: Affine::IDENTITY,
runs: head.clone(),
para: Default::default(),
area: Default::default(),
cached_bounds: None,
};
for r in &mut h.runs {
r.style.tracking = tr;
}