Package: name every font left out when no dialog is shown

A package written in the background that finished while another dialog
was open showed no Package created dialog, but its status line still cut
the list of fonts left out at 500 bytes, so the fonts past the cut were
named nowhere. The status line now cuts the list only when the dialog is
shown.
This commit is contained in:
dotCooCoo
2026-11-05 01:22:06 +07:00
committed by bflatastic
parent 487808cea6
commit bfe81407bc
2 changed files with 31 additions and 6 deletions
+10 -6
View File
@@ -164,8 +164,12 @@ fn packaged(app: &mut VectorcraftApp, r: Result<Value, String>, web: bool, later
return Ok(r);
}
let folder = r["folder"].as_str().unwrap_or_default().to_string();
// The dialog names every font left out, so the status line may cut the list short.
app.status(package_status(n, Some(&folder), &package_status_note(missing, &status_fonts(&fonts))));
// A dialog open now (another one, after a package written in the background) stays, and no
// dialog names the fonts left out, so the status line names every one of them. Otherwise the
// dialog names them all, and the status line may cut the list short.
let asks = app.ui.dialog.is_none();
let listed = if asks { status_fonts(&fonts) } else { fonts.clone() };
app.status(package_status(n, Some(&folder), &package_status_note(missing, &listed)));
let shown_note = package_dialog_note(missing, &fonts);
let detail = if shown_note.is_empty() {
crate::i18n::fmt(
@@ -178,7 +182,7 @@ fn packaged(app: &mut VectorcraftApp, r: Result<Value, String>, web: bool, later
&[("folder", &folder), ("note", &shown_note)],
)
};
if app.ui.dialog.is_none() {
if asks {
ask(app, tl!("Package created"), &detail, "file.showPackage", json!({ "folder": folder }));
}
Ok(r)
@@ -212,9 +216,9 @@ pub(super) fn package_status_note(missing: usize, fonts: &str) -> String {
/// The most bytes of font names a package status lists next to the dialog that names them all.
const STATUS_FONTS: usize = 500;
/// `fonts` (names joined with `, `) as the desktop's status line lists them: whole, or the names
/// that fit in [`STATUS_FONTS`] bytes followed by `, …`, so the line stays short enough for the
/// status bar to translate it.
/// `fonts` (names joined with `, `) as the desktop's status line lists them while the Package
/// created dialog names them all: whole, or the names that fit in [`STATUS_FONTS`] bytes followed
/// by `, …`, so the line stays short enough for the status bar to translate it.
pub(super) fn status_fonts(fonts: &str) -> String {
if fonts.len() <= STATUS_FONTS {
return fonts.to_string();
@@ -342,6 +342,27 @@ fn a_long_list_of_fonts_left_out_is_cut_short_in_the_status() {
assert!(package::package_dialog_note(0, &fonts).contains("Family 199 Regular"));
}
/// A package written in the background while another dialog is open shows no dialog, so its
/// status line names every font left out, however long the list.
#[test]
fn a_background_package_behind_another_dialog_names_every_font_in_the_status() {
let dir = Folder::new("fonts-behind");
let gate = Gate::default();
let (mut app, _files) = saved_with_worker(&dir, &gate);
for i in 0..30 {
app.run("text.create", json!({"x": 10, "y": 40 + i, "text": "Gone", "font": format!("No Such Font Family {i}")})).unwrap();
}
package_dialog(&mut app, &dir.path("out"));
assert_eq!(confirm(&mut app).unwrap()["background"], true);
app.run("ui.packageDialog", json!({})).unwrap();
gate.open();
background::wait_all(&mut app);
assert_eq!(app.ui.dialog.as_ref().map(|d| d.kind.as_str()), Some("package"), "the other dialog stays");
let status = &app.ui.status;
assert!(status.contains("No Such Font Family 0 Regular") && status.contains("No Such Font Family 29 Regular"), "{status}");
assert!(!status.contains('…'), "{status}");
}
/// A package status written in English, for one file or several, with or without a folder and a
/// note, is translated by every catalog when the status bar shows it after a language switch, in
/// the form the language's plural rule picks for the count, and a folder whose name has a space or