diff --git a/ROADMAP.md b/ROADMAP.md index d219a0d1a..37afe5f6a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -458,6 +458,7 @@ Newest first. - 2026-10-15: A page scrolled or jumped to shows its paper while its render is on its way, as in InDesign, instead of the black of its shadow. - 2026-10-15: Tab, Shift+Tab and Presentation hide the icon column's panel flyout and the classic floating panels too, as InDesign hides floating panels. - 2026-10-15: Layers panel: an object's row is renamed with a slow double-click (a second click on the selected row), as in InDesign; a quick double-click only selects it. +- **2026-10-15** · New Workspace is InDesign's: Name, and Capture › Panel Locations and Menu Customization (the items hidden with Edit › Menus), both on by default; a workspace saved without panel locations leaves the panels where they are. No readiness percentage change. - **2026-10-14** · The Type tool draws a new text frame over a locked empty frame, as InDesign does, instead of turning the locked frame into a text frame. No readiness percentage change. - **2026-10-14** · 100% black shows as pure black on screen by default, as InDesign's Appearance of Black does out of the box (Display All Blacks as Rich Black); Preferences › Appearance of Black › Display All Blacks Accurately still shows it as the dark grey it prints, and a saved choice is kept. No readiness percentage change. - **2026-10-14** · Pathfinder keeps the frontmost object, as InDesign does: a photo placed over shapes and intersected with them shows through the shapes (it was dropped, and the shapes kept their black fill); Add, Exclude Overlap and Minus Back take the front object's fill too, Subtract still keeps the back one. No readiness percentage change. diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index 7d9e135e2..bf2548bfb 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -2036,7 +2036,7 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) { let available = (ctx.content_rect().size() - frame_margin - egui::vec2(16.0, 16.0)).max(egui::Vec2::splat(1.0)); let preferred_width: f32 = match d.id.as_str() { "alert" => 440.0, - "closeDocument" | "updateLink" | "deletePages" => 380.0, + "closeDocument" | "updateLink" | "deletePages" | "newWorkspace" => 380.0, "newDocument" => 960.0, "numberingSection" => 560.0, crate::effects_dialog::ID => 720.0, @@ -2534,10 +2534,10 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) { crate::rtl::label(ui, crate::i18n::tr(&app.ui.language, "Name:")); text_field(ui, &mut d, "name", 220.0); }); - crate::rtl::label( - ui, - egui::RichText::new(crate::i18n::tr(&app.ui.language, "Saves which bars show and where the panels are.")).size(10.5), - ); + ui.add_space(6.0); + crate::rtl::label(ui, egui::RichText::new(crate::i18n::tr(&app.ui.language, "Capture")).font(semibold(12.0))); + check(ui, &mut d, "panelLocations", crate::i18n::tr(&app.ui.language, "Panel Locations")); + check(ui, &mut d, "menuCustomization", crate::i18n::tr(&app.ui.language, "Menu Customization")); } "fittingOptions" => { check(ui, &mut d, "autoFit", crate::i18n::tr(&app.ui.language, "Auto-Fit")); @@ -3327,7 +3327,10 @@ pub fn confirm(app: &mut DesignApp) -> Result { doc["glyphFallback"] = json!(d.b("glyphFallback")); app.run("document.preferences", doc) } - "newWorkspace" => app.run("window.newWorkspace", json!({"name": d.s("name")})), + "newWorkspace" => app.run( + "window.newWorkspace", + json!({"name": d.s("name"), "panelLocations": d.b("panelLocations"), "menuCustomization": d.b("menuCustomization")}), + ), "deletePages" => { if d.b("dontShowAgain") { app.ui.skip_delete_pages_warning = true; diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index bd6b9e293..81a0ba738 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -119,6 +119,8 @@ const TABLE: &[(&str, [&str; 5])] = &[ "受影响的页面包含对象。仍要删除这些页面吗?", ], ), + ("Capture", ["Erfassen", "Capturer", "Capturar", "取り込み", "捕捉"]), + ("Panel Locations", ["Bedienfeldpositionen", "Emplacements des panneaux", "Ubicaciones de paneles", "パネルの位置", "面板位置"]), ( "Bulleted & Numbered Lists", [ diff --git a/crates/ui-egui/src/i18n/ar.rs b/crates/ui-egui/src/i18n/ar.rs index 674805b98..525d41271 100644 --- a/crates/ui-egui/src/i18n/ar.rs +++ b/crates/ui-egui/src/i18n/ar.rs @@ -52,6 +52,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "عدم الإظهار مرة أخرى"), ("The affected page contains objects. Delete the page anyway?", "تحتوي الصفحة المعنية على كائنات. هل تريد حذف الصفحة على أي حال؟"), ("The affected pages contain objects. Delete the pages anyway?", "تحتوي الصفحات المعنية على كائنات. هل تريد حذف الصفحات على أي حال؟"), + ("Capture", "التقاط"), + ("Panel Locations", "مواضع اللوحات"), ("Bulleted & Numbered Lists", "القوائم ذات التعداد النقطي والرقمي"), ("Current Page Number", "رقم الصفحة الحالية"), ("Apply Color (,)", "تطبيق اللون (,)"), diff --git a/crates/ui-egui/src/i18n/de.rs b/crates/ui-egui/src/i18n/de.rs index 26df93b91..36956f59a 100644 --- a/crates/ui-egui/src/i18n/de.rs +++ b/crates/ui-egui/src/i18n/de.rs @@ -37,6 +37,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "Nicht mehr anzeigen"), ("The affected page contains objects. Delete the page anyway?", "Die betroffene Seite enthält Objekte. Seite trotzdem löschen?"), ("The affected pages contain objects. Delete the pages anyway?", "Die betroffenen Seiten enthalten Objekte. Seiten trotzdem löschen?"), + ("Capture", "Erfassen"), + ("Panel Locations", "Bedienfeldpositionen"), ("Clear", "Löschen"), ("Duplicate", "Duplizieren"), ("Select All", "Alles auswählen"), diff --git a/crates/ui-egui/src/i18n/it.rs b/crates/ui-egui/src/i18n/it.rs index ad9ec1b7e..dfbc2b348 100644 --- a/crates/ui-egui/src/i18n/it.rs +++ b/crates/ui-egui/src/i18n/it.rs @@ -51,6 +51,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "Non mostrare più"), ("The affected page contains objects. Delete the page anyway?", "La pagina interessata contiene oggetti. Eliminarla comunque?"), ("The affected pages contain objects. Delete the pages anyway?", "Le pagine interessate contengono oggetti. Eliminarle comunque?"), + ("Capture", "Acquisisci"), + ("Panel Locations", "Posizioni pannelli"), ("Bulleted & Numbered Lists", "Elenchi puntati e numerati"), ("Current Page Number", "Numero di pagina corrente"), ("Apply Color (,)", "Applica colore (,)"), diff --git a/crates/ui-egui/src/i18n/ja.rs b/crates/ui-egui/src/i18n/ja.rs index 6752c08ed..e3d85e931 100644 --- a/crates/ui-egui/src/i18n/ja.rs +++ b/crates/ui-egui/src/i18n/ja.rs @@ -54,6 +54,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "今後表示しない"), ("The affected page contains objects. Delete the page anyway?", "対象のページにはオブジェクトが含まれています。ページを削除しますか?"), ("The affected pages contain objects. Delete the pages anyway?", "対象のページにはオブジェクトが含まれています。ページを削除しますか?"), + ("Capture", "取り込み"), + ("Panel Locations", "パネルの位置"), ("Bulleted & Numbered Lists", "箇条書き"), ("Apply Color (,)", "カラーを適用 (,)"), ("Apply Gradient (.)", "グラデーションを適用 (.)"), diff --git a/crates/ui-egui/src/i18n/ka.rs b/crates/ui-egui/src/i18n/ka.rs index b5ec7b260..51040d0d0 100644 --- a/crates/ui-egui/src/i18n/ka.rs +++ b/crates/ui-egui/src/i18n/ka.rs @@ -37,6 +37,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "აღარ აჩვენო"), ("The affected page contains objects. Delete the page anyway?", "გვერდი შეიცავს ობიექტებს. მაინც წავშალო გვერდი?"), ("The affected pages contain objects. Delete the pages anyway?", "გვერდები შეიცავს ობიექტებს. მაინც წავშალო გვერდები?"), + ("Capture", "შენახვა"), + ("Panel Locations", "პანელების მდებარეობა"), ("Reverse Path", "ტრაექტორიის შებრუნება"), ("Set Anchor", "საყრდენი წერტილის დაყენება"), ("Clear", "გასუფთავება"), diff --git a/crates/ui-egui/src/i18n/pt_br.rs b/crates/ui-egui/src/i18n/pt_br.rs index 52cb2c554..d84e2457b 100644 --- a/crates/ui-egui/src/i18n/pt_br.rs +++ b/crates/ui-egui/src/i18n/pt_br.rs @@ -54,6 +54,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "Não mostrar novamente"), ("The affected page contains objects. Delete the page anyway?", "A página afetada contém objetos. Excluir a página mesmo assim?"), ("The affected pages contain objects. Delete the pages anyway?", "As páginas afetadas contêm objetos. Excluir as páginas mesmo assim?"), + ("Capture", "Capturar"), + ("Panel Locations", "Locais dos painéis"), ("Bulleted & Numbered Lists", "Listas com marcadores e numeradas"), ("Show Hidden Characters", "Mostrar caracteres ocultos"), ("Current Page Number", "Número da página atual"), diff --git a/crates/ui-egui/src/i18n/uk.rs b/crates/ui-egui/src/i18n/uk.rs index 8e48e74f4..5a5bd56f3 100644 --- a/crates/ui-egui/src/i18n/uk.rs +++ b/crates/ui-egui/src/i18n/uk.rs @@ -52,6 +52,8 @@ pub(super) const TABLE: &[(&str, &str)] = &[ ("Don't show again", "Більше не показувати"), ("The affected page contains objects. Delete the page anyway?", "Сторінка містить об’єкти. Усе одно видалити сторінку?"), ("The affected pages contain objects. Delete the pages anyway?", "Сторінки містять об’єкти. Усе одно видалити сторінки?"), + ("Capture", "Зберегти"), + ("Panel Locations", "Розташування панелей"), ("Bulleted & Numbered Lists", "Марковані й нумеровані списки"), ("Current Page Number", "Номер поточної сторінки"), ("Apply Color (,)", "Застосувати колір (,)"), diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index 145e23db7..e6e9f4e29 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -119,6 +119,13 @@ pub struct SavedWorkspace { /// The workspace's own icon column (see [`UiState::icon_groups`]). #[serde(default, skip_serializing_if = "Option::is_none")] pub icon_groups: Option>>, + /// Saved with New Workspace › Capture › Panel Locations off: choosing the workspace leaves the + /// bars and panels where they are. + #[serde(default, skip_serializing_if = "std::ops::Not::not")] + pub keep_panels: bool, + /// New Workspace › Capture › Menu Customization: the menu items hidden with Edit › Menus. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub hidden_menu_items: Option>, } /// A missing on-by-default bool stays on. `bool::default` is false. diff --git a/crates/ui-egui/src/menus.rs b/crates/ui-egui/src/menus.rs index 75e85221c..bd049dd15 100644 --- a/crates/ui-egui/src/menus.rs +++ b/crates/ui-egui/src/menus.rs @@ -289,7 +289,12 @@ pub const UI_COMMANDS: &[(&str, &str, Option<&str>, &str)] = &[ None, "{name: Advanced|Book|Digital Publishing|Essentials|Essentials Classic|Interactive for PDF|Printing and Proofing|Typography or a saved workspace}", ), - ("window.newWorkspace", "New Workspace…", None, "{name} — saves the current bars and panel arrangement"), + ( + "window.newWorkspace", + "New Workspace…", + None, + "{name, panelLocations?: bool (default true: the bars and panels), menuCustomization?: bool (default true: the menu items hidden with Edit › Menus)} — saves the workspace", + ), ("window.deleteWorkspace", "Delete Workspace…", None, "{name}"), ("window.resetWorkspace", "Reset Workspace", None, "{} — back to the current workspace as saved (or its defaults)"), ("window.brightness", "Interface Color Theme", None, "{brightness: dark|mediumDark|mediumLight|light|highContrast}"), @@ -1775,7 +1780,8 @@ fn run_ui_inner(app: &mut DesignApp, id: &str, p: &Value) -> Option flag(&mut app.ui.tools_double_column), "window.newWorkspace" => { let Some(name) = p.get("name").and_then(Value::as_str).map(str::trim).filter(|n| !n.is_empty()) else { - app.ui.dialog = Some(crate::dialogs::Dialog::new("newWorkspace", json!({"name": ""}))); + app.ui.dialog = + Some(crate::dialogs::Dialog::new("newWorkspace", json!({"name": "", "panelLocations": true, "menuCustomization": true}))); return Some(Ok(Value::Null)); }; let u = &app.ui; @@ -1792,6 +1798,8 @@ fn run_ui_inner(app: &mut DesignApp, id: &str, p: &Value) -> Option Option