fix(ui): View items in the View menu, laid out like InDesign's

Rotate Spread, Proof Setup, Proof Colors, Flattener Preview, Show Tag
Markers, Separations Preview and Show/Hide Tagged Frames were at the end
of the Type menu. They are in View now, which follows InDesign's order:
Overprint Preview and proofing, zoom, Rotate Spread, Screen Mode,
Display Performance, rulers, Extras (frame edges, text threads), Grids &
Guides and Structure (tagged frames, tag markers). Show Hidden
Characters stays in Type, as in InDesign; W still toggles Preview.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
moppeeer
2026-10-11 20:25:49 +02:00
co-authored by Claude Opus 5.5
parent ca343e8985
commit e1e5c35eeb
4 changed files with 77 additions and 32 deletions
+1
View File
@@ -129,6 +129,7 @@ list) · [roadmap.md](docs/roadmap.md) (milestones, plan) · [parity-checklist.m
Newest first.
- **2026-10-11** · The View menu follows InDesign's: proofing first, then zoom, Rotate Spread, Screen Mode, Display Performance, rulers, Extras, Grids & Guides and Structure; the view items that sat at the end of the Type menu moved there. No readiness percentage change.
- **2026-10-10 (UI.4–UI.5):** Panel tabs can move into other groups, split the dock, float, resize and return to their saved locations through shared docking transactions. Layouts persist in custom workspaces; UI and control commands share the same validated action path. Shared pane geometry and widget-state theme application retain all five palettes and local fonts. Split panes send keyboard input only to the focused canvas and scope contextual toolbar IDs per pane. No readiness percentage change.
- **2026-10-10** · Version 0.6.0; releases add a Linux riscv64 tar.gz (cross-compiled, CLI
smoke-tested under QEMU).
+3
View File
@@ -2810,6 +2810,9 @@ const TABLE: &[(&str, [&str; 5])] = &[
("Paragraph Rules", ["Absatzlinien", "Filets de paragraphe", "Filetes de párrafo", "段落境界線", "段落线"]),
("Rule Below", ["Linie unterhalb", "Filet après", "Filete después", "後境界線", "下方横线"]),
("Tint:", ["Farbton:", "Teinte:", "Matiz:", "濃淡:", "色调:"]),
("Slug", ["Infobereich", "Ligne-bloc", "Indicaciones", "印刷可能領域", "辅助信息区"]),
("Presentation", ["Präsentation", "Présentation", "Presentación", "プレゼンテーション", "演示文稿"]),
("Extras", ["Extras", "Options supplémentaires", "Extras", "エクストラ", "附加"]),
("Column", ["Spalte", "Colonne", "Columna", "段", "栏"]),
];
+1
View File
@@ -1492,4 +1492,5 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Paragraph Rules", "Filetti paragrafo"),
("Rule Below", "Filetto sotto"),
("Tint:", "Tinta:"),
("Presentation", "Presentazione"),
];
+72 -32
View File
@@ -402,34 +402,6 @@ pub const MENUS: &[(&str, &[&str])] = &[
"cmd:type.sizeDown",
"-",
"ui:view.hiddenCharacters",
"ui:view.taggedFrames",
">Rotate Spread",
"ui:view.rotateSpread|90° CW|{\"angle\": 90}",
"ui:view.rotateSpread|90° CCW|{\"angle\": -90}",
"ui:view.rotateSpread|180°|{\"angle\": 180}",
"ui:view.rotateSpread|Clear Rotation|{\"angle\": 0}",
"<",
">Proof Setup",
"ui:view.proofSetup|Working CMYK|{\"target\": \"workingCmyk\"}",
"ui:view.proofSetup|Internet Standard RGB (sRGB)|{\"target\": \"srgb\"}",
"ui:view.proofSetup|Legacy Macintosh RGB|{\"target\": \"legacyMacRgb\"}",
"ui:view.proofSetup|Monitor RGB|{\"target\": \"monitorRgb\"}",
"ui:view.proofSetup|Color Blindness – Protanopia|{\"target\": \"protanopia\"}",
"ui:view.proofSetup|Color Blindness – Deuteranopia|{\"target\": \"deuteranopia\"}",
"-",
"ui:view.proofSetup|Simulate Paper Color|{\"simulatePaper\": \"toggle\"}",
"<",
"ui:view.proofColors",
"ui:view.flattenerPreview",
"ui:view.tagMarkers",
">Separations Preview",
"ui:view.separations|Off|{\"plate\": null, \"inkLimit\": null}",
"ui:view.separations|Cyan|{\"plate\": \"cyan\"}",
"ui:view.separations|Magenta|{\"plate\": \"magenta\"}",
"ui:view.separations|Yellow|{\"plate\": \"yellow\"}",
"ui:view.separations|Black|{\"plate\": \"black\"}",
"ui:view.separations|Ink Limit 300%|{\"inkLimit\": 300}",
"<",
"-",
">Hyperlinks & Cross-References",
"cmd:hyperlink.create",
@@ -619,6 +591,28 @@ pub const MENUS: &[(&str, &[&str])] = &[
(
"View",
&[
"ui:view.overprintPreview",
">Proof Setup",
"ui:view.proofSetup|Working CMYK|{\"target\": \"workingCmyk\"}",
"ui:view.proofSetup|Internet Standard RGB (sRGB)|{\"target\": \"srgb\"}",
"ui:view.proofSetup|Legacy Macintosh RGB|{\"target\": \"legacyMacRgb\"}",
"ui:view.proofSetup|Monitor RGB|{\"target\": \"monitorRgb\"}",
"ui:view.proofSetup|Color Blindness – Protanopia|{\"target\": \"protanopia\"}",
"ui:view.proofSetup|Color Blindness – Deuteranopia|{\"target\": \"deuteranopia\"}",
"-",
"ui:view.proofSetup|Simulate Paper Color|{\"simulatePaper\": \"toggle\"}",
"<",
"ui:view.proofColors",
">Separations Preview",
"ui:view.separations|Off|{\"plate\": null, \"inkLimit\": null}",
"ui:view.separations|Cyan|{\"plate\": \"cyan\"}",
"ui:view.separations|Magenta|{\"plate\": \"magenta\"}",
"ui:view.separations|Yellow|{\"plate\": \"yellow\"}",
"ui:view.separations|Black|{\"plate\": \"black\"}",
"ui:view.separations|Ink Limit 300%|{\"inkLimit\": 300}",
"<",
"ui:view.flattenerPreview",
"-",
"ui:view.zoomIn",
"ui:view.zoomOut",
"ui:view.fitPage",
@@ -627,8 +621,20 @@ pub const MENUS: &[(&str, &[&str])] = &[
"ui:view.actualSize",
"ui:view.entirePasteboard",
"-",
"ui:view.overprintPreview",
"ui:view.togglePreview",
">Rotate Spread",
"ui:view.rotateSpread|90° CW|{\"angle\": 90}",
"ui:view.rotateSpread|90° CCW|{\"angle\": -90}",
"ui:view.rotateSpread|180°|{\"angle\": 180}",
"ui:view.rotateSpread|Clear Rotation|{\"angle\": 0}",
"<",
"-",
">Screen Mode",
"ui:view.screenMode|Normal|{\"mode\": \"normal\"}",
"ui:view.screenMode|Preview|{\"mode\": \"preview\"}",
"ui:view.screenMode|Bleed|{\"mode\": \"bleed\"}",
"ui:view.screenMode|Slug|{\"mode\": \"slug\"}",
"ui:view.screenMode|Presentation|{\"mode\": \"presentation\"}",
"<",
">Display Performance",
"ui:view.fastDisplay",
"ui:view.typicalDisplay",
@@ -636,10 +642,11 @@ pub const MENUS: &[(&str, &[&str])] = &[
"<",
"-",
"ui:view.rulers",
"-",
">Extras",
"ui:view.frameEdges",
"ui:view.textThreads",
"ui:view.hiddenCharacters",
"-",
"<",
">Grids & Guides",
"ui:view.guides",
"ui:view.snapToGuides",
@@ -649,6 +656,11 @@ pub const MENUS: &[(&str, &[&str])] = &[
"-",
"ui:app.deleteAllGuides",
"<",
"-",
">Structure",
"ui:view.taggedFrames",
"ui:view.tagMarkers",
"<",
],
),
(
@@ -2274,6 +2286,34 @@ pub fn quick_apply_items(session: &designcraft_engine::Session, query: &str) ->
mod tests {
use super::*;
/// The entries (command ids) of a menu bar menu, submenus included.
fn menu_ids(title: &str) -> Vec<&'static str> {
let items = MENUS.iter().find(|(t, _)| *t == title).map(|(_, items)| *items).unwrap_or_default();
items.iter().filter_map(|e| e.split_once(':').map(|(_, rest)| rest.split('|').next().unwrap_or(rest))).collect()
}
#[test]
fn view_items_are_in_the_view_menu_as_in_indesign() {
let (view, typ) = (menu_ids("View"), menu_ids("Type"));
for id in [
"view.rotateSpread",
"view.proofSetup",
"view.proofColors",
"view.flattenerPreview",
"view.separations",
"view.taggedFrames",
"view.tagMarkers",
] {
assert!(view.contains(&id), "{id} is in View");
assert!(!typ.contains(&id), "{id} isn't in Type");
}
// Screen Mode and Extras are View submenus; Show Hidden Characters stays in Type.
assert!(view.contains(&"view.screenMode") && view.contains(&"view.frameEdges"));
assert!(typ.contains(&"view.hiddenCharacters") && !view.contains(&"view.hiddenCharacters"));
// W still toggles Normal / Preview without a menu entry.
assert_eq!(ui_label("view.togglePreview").and_then(|c| c.1), Some("W"));
}
fn walk(items: &[Item], out: &mut Vec<(String, String, Value)>) {
for it in items {
match it {