Place: contact sheet numbers mean the document unit however they arrive

A number sent over ui.dialog.open or ui.dialog.set showed as 2 in the field but was
sent as 2 points, while a typed 2 meant the ruler unit.
This commit is contained in:
texjer committed 2026-11-05 15:58:57 -05:00
1 parent dd311b8803
commit fea50adfaf
2 files changed
+39 -2

No files matched your search

+34
View File
@@ -1124,6 +1124,40 @@ pub(crate) mod browser_import_tests {
assert_eq!(d.s("gutter"), "6pt");
}
/// A bare number in a field means the document's ruler unit, whether it was typed or came as
/// a number over `ui.dialog.open` or `ui.dialog.set`.
#[test]
fn contact_sheet_numbers_are_in_the_document_unit_however_they_came() {
let frames = |margin: Value, gutter: Value, set: bool| {
let mut app = app();
app.run("document.preferences", json!({"horizontalUnits": "inches"})).unwrap();
let request = app.import_request("place");
for name in ["one.png", "two.png"] {
app.services.inbox.as_ref().unwrap().lock().unwrap().push(ImportedFile {
request: request.clone(),
name: name.into(),
bytes: png(200),
});
}
app.drain_inbox();
let fields = json!({"columns": 2, "rows": 1, "gutter": gutter, "margin": margin});
app.ui.dialog = Some(dialogs::contact_sheet_dialog(&app, if set { json!({"columns": 2, "rows": 1}) } else { fields.clone() }));
if set {
let d = app.ui.dialog.as_mut().unwrap();
d.set_field("gutter", fields["gutter"].clone());
d.set_field("margin", fields["margin"].clone());
}
dialogs::confirm(&mut app).unwrap();
let doc = &app.session.doc().unwrap().doc;
doc.spreads.last().unwrap().items.iter().map(|item| item.bounds()).collect::<Vec<_>>()
};
let typed = frames(json!("1"), json!("0.5"), false);
assert_eq!(typed.len(), 2);
assert_eq!(frames(json!(1), json!(0.5), false), typed, "numbers over ui.dialog.open");
assert_eq!(frames(json!(1), json!(0.5), true), typed, "numbers over ui.dialog.set");
assert_eq!(frames(json!("72pt"), json!("36pt"), false), typed, "an explicit unit still says what it means");
}
#[test]
fn contact_sheet_validation_preserves_fields_and_pending_images() {
let mut app = app();
+5 -2
View File
@@ -4721,11 +4721,14 @@ fn confirm_part3(app: &mut DesignApp, d: Dialog) -> Result<Value, String> {
}
"contactSheet" => {
let result = (|| {
// A bare number means the ruler unit, as typed or as a JSON number (`Dialog::m`
// takes the latter as points).
let measure = |k: &str| parse_measure(&d.s(k), d.unit).ok();
let params = json!({
"columns": d.s("columns").trim().parse::<u64>().map_err(|_| "Columns must be a whole number")?,
"rows": d.s("rows").trim().parse::<u64>().map_err(|_| "Rows must be a whole number")?,
"gutter": d.m("gutter").ok_or("Enter a valid gutter")?,
"margin": d.m("margin").ok_or("Enter a valid margin")?,
"gutter": measure("gutter").ok_or("Enter a valid gutter")?,
"margin": measure("margin").ok_or("Enter a valid margin")?,
});
app.run("place.contactSheet", params)
})();