diff --git a/crates/ui-egui/src/dialogs/artboard_options.rs b/crates/ui-egui/src/dialogs/artboard_options.rs index 47da0f401..9c0eecdc6 100644 --- a/crates/ui-egui/src/dialogs/artboard_options.rs +++ b/crates/ui-egui/src/dialogs/artboard_options.rs @@ -1,5 +1,5 @@ -//! Artboard Options (double-click with the Artboard tool, or double-click the tool): the -//! artboard's fields, sizes parsed with units. +//! Artboard Options (double-click with the Artboard tool, double-click the tool, or the Artboards +//! panel's options icon or menu): the artboard's fields, sizes parsed with units. use serde_json::{Value, json}; diff --git a/crates/ui-egui/src/dialogs/tests.rs b/crates/ui-egui/src/dialogs/tests.rs index 46b211232..acb2b6b0a 100644 --- a/crates/ui-egui/src/dialogs/tests.rs +++ b/crates/ui-egui/src/dialogs/tests.rs @@ -884,6 +884,28 @@ fn artboard_options_position_moves_art_only_with_the_tool_option_on() { } } +/// Opened while another tool is in use, as the Artboards panel opens it (#1876), Artboard Options +/// moves the art with a new X only when the Artboard tool's Move Artwork with Artboard option is +/// on. +#[test] +fn artboard_options_position_follows_the_tool_option_with_another_tool() { + for move_art in [false, true] { + let mut app = app(); + let id = app.run("shape.rectangle", json!({"x": 10, "y": 20, "width": 30, "height": 40})).unwrap()["id"].as_u64().unwrap(); + app.run("tool.setOption", json!({"tool": "artboard", "key": "moveArt", "value": move_art})).unwrap(); + app.run("tool.options", json!({"tool": "artboard"})).unwrap(); + assert_ne!(app.session.tool_id(), "artboard"); + app.ui.dialog.as_mut().unwrap().fields.insert("x".into(), json!(50)); + frame(&mut app, Default::default()); + super::confirm(&mut app).unwrap(); + assert_eq!(app.session.doc().unwrap().doc.artboards[0].rect.x0, 50.0); + assert_eq!( + app.session.doc().unwrap().doc.node(vectorcraft_doc::NodeId(id)).unwrap().geometric_bounds().unwrap().x0, + if move_art { 60.0 } else { 10.0 } + ); + } +} + /// Zig Zag's dialog has Size and Ridges per segment sliders, and Relative / Absolute and Smooth / /// Corner as radio buttons, not dropdowns (#1133). #[test] diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index f9923e337..78cf1f425 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -1280,7 +1280,6 @@ lighting Light Světlo Rectangle: Sunshine Obdélník: Sluneční svit Redefine Graphic Style “{name}” Předefinovat grafický styl „{name}“ Show Thumbnail Zobrazit miniaturu - Artboard Options: edit with the Artboard tool Možnosti pracovní plochy: upravte nástrojem Pracovní plocha Delete Artboards Odstranit pracovní plochy Delete Empty Artboards Odstranit prázdné pracovní plochy Duplicate Artboards Duplikovat pracovní plochy diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 1b6e23e5b..4e8b5d0a4 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -204,7 +204,6 @@ Art Bild Art using a deleted global swatch keeps its colour. Grafiken, die ein gelöschtes globales Farbfeld verwenden, behalten ihre Farbe. Artboard Options Zeichenflächenoptionen - Artboard Options: edit with the Artboard tool Zeichenflächenoptionen: mit dem Zeichenflächen-Werkzeug bearbeiten Artboard Options… Zeichenflächenoptionen… Artboard Tool Zeichenflächen-Werkzeug Artboard {number} Zeichenfläche {number} diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index f02f9a599..98319745d 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -222,7 +222,6 @@ Art Ilustración Art using a deleted global swatch keeps its colour. La ilustración que usa una muestra global eliminada conserva su color. Artboard Options Opciones de mesa de trabajo - Artboard Options: edit with the Artboard tool Opciones de mesa de trabajo: edita con la herramienta Mesa de trabajo Artboard Options… Opciones de mesa de trabajo… Artboard Tool Herramienta Mesa de trabajo Artboard {number} Mesa de trabajo {number} diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 21faea1a5..3e068429f 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -223,7 +223,6 @@ Art Illustration Art using a deleted global swatch keeps its colour. L’illustration qui utilise une nuance globale supprimée conserve sa couleur. Artboard Options Options du plan de travail - Artboard Options: edit with the Artboard tool Options du plan de travail : modifier avec l’outil Plan de travail Artboard Options… Options du plan de travail… Artboard Tool Outil Plan de travail Artboard {number} Plan de travail {number} diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 16a06c84c..4a372b61a 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -327,7 +327,6 @@ Art using a deleted global swatch keeps its colour. A törölt globális színmintát használó grafika megtartja a színét. Artboard Rajztábla Artboard Options Rajztábla beállításai - Artboard Options: edit with the Artboard tool Rajztábla beállításai: szerkesztés a Rajztábla eszközzel Artboard Options… Rajztábla beállításai… Artboard Tool Rajztábla Artboard {number} Rajztábla {number} diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 821b85d1b..a1176a097 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -222,7 +222,6 @@ Art Grafica Art using a deleted global swatch keeps its colour. La grafica che usa un campione globale eliminato mantiene il suo colore. Artboard Options Opzioni tavola da disegno - Artboard Options: edit with the Artboard tool Opzioni tavola da disegno: modifica con lo strumento Tavola da disegno Artboard Options… Opzioni tavola da disegno… Artboard Tool Strumento Tavola da disegno Artboard {number} Tavola da disegno {number} diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index a5d460dd3..798893b76 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -860,7 +860,6 @@ Art using a deleted global swatch keeps its colour. 削除したグローバルスウォッチを使っているアートは、そのカラーを保持します。 ArtCraft website ArtCraft の Web サイト Artboard Options アートボードオプション - Artboard Options: edit with the Artboard tool アートボードオプション: アートボードツールで編集 Artboard Options… アートボードオプション… Artboard Tool アートボードツール Artboard {number} アートボード {number} diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 869b18dc5..a5f3a7b44 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -855,7 +855,6 @@ Art using a deleted global swatch keeps its colour. 삭제된 글로벌 견본을 사용한 아트워크는 색상을 유지합니다. ArtCraft website ArtCraft 웹사이트 Artboard Options 아트보드 옵션 - Artboard Options: edit with the Artboard tool 아트보드 옵션: 아트보드 도구로 편집 Artboard Options… 아트보드 옵션… Artboard Tool 아트보드 도구 Artboard {number} 아트보드 {number} diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index a56342b50..5f9ab48e1 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -1193,7 +1193,6 @@ lighting Light Światło Rectangle: Sunshine Prostokąt: Słońce Redefine Graphic Style “{name}” Zdefiniuj ponownie styl graficzny „{name}” Show Thumbnail Pokaż miniaturę - Artboard Options: edit with the Artboard tool Opcje obszaru kompozycji: edytuj narzędziem Obszar kompozycji Delete Artboards Usuń obszary kompozycji Delete Empty Artboards Usuń puste obszary kompozycji Duplicate Artboards Powiel obszary kompozycji diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 1b245d942..8a90966de 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -228,7 +228,6 @@ ArtCraft Website Site do ArtCraft ArtCraft website Site do ArtCraft Artboard Options Opções de Mesa de Trabalho - Artboard Options: edit with the Artboard tool Opções de Mesa de Trabalho: edite com a ferramenta Mesa de Trabalho Artboard Options… Opções de Mesa de Trabalho… Artboard Tool Ferramenta Mesa de Trabalho Artboard {number} Mesa de Trabalho {number} diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 162c998e0..6a1141036 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -220,7 +220,6 @@ Art Рисунок Art using a deleted global swatch keeps its colour. Рисунок с удалённым глобальным образцом сохраняет свой цвет. Artboard Options Параметры монтажной области - Artboard Options: edit with the Artboard tool Параметры монтажной области: редактируются инструментом «Монтажная область» Artboard Options… Параметры монтажной области… Artboard Tool Инструмент «Монтажная область» Artboard {number} Монтажная область {number} diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 76c5f5973..0b073b8b4 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -216,7 +216,6 @@ Art Малюнок Art using a deleted global swatch keeps its colour. Графіка з видаленим глобальним зразком зберігає свій колір. Artboard Options Параметри монтажної області - Artboard Options: edit with the Artboard tool Параметри монтажної області: редагуються інструментом «Монтажна область» Artboard Options… Параметри монтажної області… Artboard Tool Інструмент «Монтажна область» Artboard {number} Монтажна область {number} diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index ee105f278..26d32ebb6 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -256,7 +256,6 @@ Art using a deleted global swatch keeps its colour. Tác phẩm dùng mẫu màu toàn cục đã xóa vẫn giữ màu của nó. Artboard Bảng vẽ Artboard Options Tùy chọn bảng vẽ - Artboard Options: edit with the Artboard tool Tùy chọn bảng vẽ: chỉnh sửa bằng Công cụ Bảng vẽ Artboard Options… Tùy chọn bảng vẽ… Artboard Tool Công cụ Bảng vẽ Artboard {number} Bảng vẽ {number} diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index f551b280e..cfb35d1a4 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -180,7 +180,6 @@ Art 图稿 Art using a deleted global swatch keeps its colour. 使用已删除全局色板的图稿会保留其颜色。 Artboard Options 画板选项 - Artboard Options: edit with the Artboard tool 画板选项:使用画板工具编辑 Artboard Options… 画板选项… Artboard Tool 画板工具 Artboard {number} 画板 {number} diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index f3616068a..64cfa03f2 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -191,7 +191,6 @@ Art 圖稿 Art using a deleted global swatch keeps its colour. 使用已刪除整體色票的圖稿會保留其顏色。 Artboard Options 工作區域選項 - Artboard Options: edit with the Artboard tool 工作區域選項:請使用工作區域工具編輯 Artboard Options… 工作區域選項… Artboard Tool 工作區域工具 Artboard {number} 工作區域 {number} diff --git a/crates/ui-egui/src/panels/artboards.rs b/crates/ui-egui/src/panels/artboards.rs index 9f6b86782..7f49b11f2 100644 --- a/crates/ui-egui/src/panels/artboards.rs +++ b/crates/ui-egui/src/panels/artboards.rs @@ -2,7 +2,8 @@ //! delete; a row dragged onto New Artboard duplicates its artboard (as Duplicate Artboards does, with //! its art when the Artboard tool's Move/Copy Artwork with Artboard is on). The highlighted row is the active artboard, the one the status bar's navigator shows and //! Fit Artboard in Window fits: clicking a row makes it active, double-clicking its number also -//! fits it in the window. +//! fits it in the window. The options icon at a row's right end opens Artboard Options: a click on +//! the active artboard's icon, or a double-click on another row's icon. use egui::{Sense, Ui, pos2, vec2}; use serde_json::{Value, json}; @@ -30,9 +31,10 @@ pub(crate) fn scale_art(app: &VectorcraftApp) -> bool { app.session.tool_id() == "artboard" && app.session.tool_options()["scaleArt"].as_bool().unwrap_or(false) } -/// Whether position edits take their art along, matching the Artboard tool's move option. +/// Whether position edits take their art along, matching the Artboard tool's move option. The tool +/// keeps the option while another tool is in use, as when this panel opens Artboard Options. pub(crate) fn move_art(app: &VectorcraftApp) -> bool { - app.session.tool_id() == "artboard" && app.session.tool_options()["moveArt"].as_bool().unwrap_or(true) + app.session.tool_options_of("artboard")["moveArt"].as_bool().unwrap_or(true) } /// The active artboard (of `n`). @@ -170,9 +172,14 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { let opt = egui::Rect::from_center_size(r.right_center() - vec2(14.0, 0.0), vec2(14.0, 14.0)); let oresp = ui.interact(opt, ui.id().with(("ab-opt", i)), Sense::click()); icons::paint(ui, "dc-artboard-options", opt, if oresp.hovered() { t.text_strong } else { t.icon }); - if oresp.on_hover_text(tl!("Artboard Options: edit with the Artboard tool")).clicked() { - app.select_tool("artboard"); + let oresp = oresp.on_hover_text(tl!("Artboard Options")); + // A click on the active artboard's icon opens its Artboard Options. A click on + // another row's icon makes that artboard active, so a double-click opens its options. + if oresp.clicked() { select(app, i); + if i == sel || oresp.double_clicked() { + app.run("tool.options", json!({ "tool": "artboard" })).ok(); + } } let several = ui.input(|inp| inp.modifiers.shift || inp.modifiers.command); if resp.clicked() && several && app.session.tool_id() == "artboard" { @@ -246,7 +253,7 @@ pub fn menu(app: &mut VectorcraftApp, ui: &mut Ui) { ui.separator(); menu_item(ui, tl!("Convert to Artboards"), false, false); if menu_item(ui, tl!("Artboard Options…"), n > 0, false) { - app.select_tool("artboard"); + app.run("tool.options", json!({ "tool": "artboard" })).ok(); } if menu_item(ui, tl!("Rearrange All Artboards…"), n > 1, false) { open_rearrange(app); @@ -376,9 +383,9 @@ mod tests { assert_eq!(picked(&app, 3), [0]); } - /// Double-clicking a row's number goes to its artboard and its name renames it; a row's - /// Options button edits that artboard with the Artboard tool, and the tool's artboard is the - /// active one. + /// Double-clicking a row's number goes to its artboard and its name renames it; a click on + /// another row's options icon makes that artboard the active one, and the Artboard tool's + /// artboard is the active one. #[test] fn double_clicks_go_to_or_rename_and_options_edits_the_rows_artboard() { let mut app = VectorcraftApp::new(Session::new(), Default::default()); @@ -422,9 +429,10 @@ mod tests { assert_eq!(pstate::>(&ctx, "ab-edit"), Some(1)); set_pstate::>(&ctx, "ab-edit", None); frame(&mut app, 3.0, vec![]); - // Artboard 1's Options button: the Artboard tool, editing Artboard 1. + // A click on Artboard 1's options icon makes Artboard 1 active, and the Artboard tool, + // chosen next, starts on it. frame(&mut app, 4.0, events(egui::pos2(row.right() - 14.0, row.center().y), 1)); - assert_eq!(app.session.tool_id(), "artboard"); + app.select_tool("artboard"); assert_eq!((app.view().unwrap().artboard, app.session.tool_options()["active"].clone()), (0, json!(0))); // While the Artboard tool is chosen, clicking a row moves the tool to that artboard too. frame(&mut app, 5.0, events(name, 1)); @@ -437,6 +445,88 @@ mod tests { assert_eq!((app.session.tool_options()["active"].clone(), selected(&app, 2)), (json!(0), 0)); } + /// A row's options icon opens Artboard Options for that row's artboard and leaves the tool as + /// it is (#1876): a click on the active artboard's icon, or a double-click on another row's + /// icon, whose first click only makes that artboard active. With the Artboard tool in use, the + /// tool moves to that artboard too. + #[test] + fn the_options_icon_opens_artboard_options_for_its_rows_artboard() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.session.execute("file.new", &json!({"width": 200, "height": 150})).unwrap(); + app.session.execute("artboard.new", &json!({"x": 400, "y": 300, "width": 100, "height": 50})).unwrap(); + app.view_mut().unwrap().artboard = 0; + let tool = app.session.tool_id().to_string(); + let ctx = egui::Context::default(); + let screen = Some(egui::Rect::from_min_size(egui::Pos2::ZERO, vec2(240.0, 400.0))); + let frame = |app: &mut VectorcraftApp, time: f64, events: Vec| { + let mut out = ctx.run_ui(egui::RawInput { events, time: Some(time), screen_rect: screen, ..Default::default() }, |ui| show(app, ui)); + out.textures_delta.clear(); + out.shapes + }; + // The highlighted row (Artboard 1's). The rows are 24 points apart, and each icon's + // center is 14 points in from the row's right end. + let row = frame(&mut app, 0.0, vec![]) + .iter() + .find_map(|c| match &c.shape { + egui::Shape::Rect(r) if r.fill == Tokens::get(&ctx).row_selected => Some(r.rect), + _ => None, + }) + .unwrap(); + let icon = |k: f32| egui::pos2(row.right() - 14.0, row.center().y + 24.0 * k); + let events = |at: egui::Pos2, clicks: usize| { + let button = + |pressed| egui::Event::PointerButton { pos: at, button: egui::PointerButton::Primary, pressed, modifiers: Default::default() }; + std::iter::once(egui::Event::PointerMoved(at)).chain((0..clicks).flat_map(|_| [button(true), button(false)])).collect::>() + }; + let opened = |app: &mut VectorcraftApp| app.ui.dialog.take().map(|d| (d.kind.clone(), d.f64("index", 9.0), d.f64("width", 0.0))); + // Artboard 2's icon: the first click makes it active, the second (a double-click) opens its + // options; no rename starts. + frame(&mut app, 1.0, events(icon(1.0), 1)); + assert_eq!((app.view().unwrap().artboard, opened(&mut app)), (1, None)); + frame(&mut app, 1.1, events(icon(1.0), 1)); + assert_eq!(opened(&mut app), Some(("artboardOptions".to_string(), 1.0, 100.0))); + assert_eq!((app.session.tool_id(), pstate::>(&ctx, "ab-edit")), (tool.as_str(), None)); + // The active artboard's icon: one click opens its options. + frame(&mut app, 3.0, events(icon(1.0), 1)); + assert_eq!(opened(&mut app), Some(("artboardOptions".to_string(), 1.0, 100.0))); + // With the Artboard tool, a double-click on Artboard 1's icon (both clicks in one frame) + // opens Artboard 1's options, and the tool moves to it. + app.select_tool("artboard"); + frame(&mut app, 5.0, events(icon(0.0), 2)); + assert_eq!(opened(&mut app), Some(("artboardOptions".to_string(), 0.0, 200.0))); + assert_eq!((app.session.tool_id(), app.session.tool_options()["active"].clone()), ("artboard", json!(0))); + } + + /// The panel menu's Artboard Options… opens Artboard Options for the active artboard and leaves + /// the tool as it is. + #[test] + fn the_panel_menus_artboard_options_opens_the_active_artboards_options() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.session.execute("file.new", &json!({"width": 200, "height": 150})).unwrap(); + app.session.execute("artboard.new", &json!({"x": 400, "y": 300, "width": 100, "height": 50})).unwrap(); + select(&mut app, 1); + let tool = app.session.tool_id().to_string(); + let ctx = egui::Context::default(); + let screen = Some(egui::Rect::from_min_size(egui::Pos2::ZERO, vec2(240.0, 400.0))); + let frame = |app: &mut VectorcraftApp, events: Vec| { + let mut out = ctx.run_ui(egui::RawInput { events, screen_rect: screen, ..Default::default() }, |ui| menu(app, ui)); + out.textures_delta.clear(); + out.shapes + }; + let item = frame(&mut app, vec![]) + .iter() + .find_map(|c| match &c.shape { + egui::Shape::Text(t) if t.galley.text().trim_start() == "Artboard Options…" => Some(t.visual_bounding_rect().center()), + _ => None, + }) + .unwrap(); + let button = |pressed| egui::Event::PointerButton { pos: item, button: egui::PointerButton::Primary, pressed, modifiers: Default::default() }; + frame(&mut app, vec![egui::Event::PointerMoved(item), button(true), button(false)]); + let d = app.ui.dialog.take().unwrap(); + assert_eq!((d.kind.as_str(), d.f64("index", 9.0), d.f64("x", 0.0)), ("artboardOptions", 1.0, 400.0)); + assert_eq!(app.session.tool_id(), tool); + } + /// Choosing the Artboard tool starts it on the active artboard, the one the panel highlights: /// Artboard Options shows that artboard, the pointer moving over another artboard leaves it /// active, and Delete removes it. Shift+O while the tool is in use keeps the artboards it has diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 07d2424ba..f5adf3b8f 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -493,6 +493,8 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur - **Views:** the status bar's artboard navigator (first, previous, next, last; `view.goToArtboard`) goes to an artboard, fits it and synchronizes the Artboard tool selection when that tool is active; ordinary object selection is preserved. Actual Next-button regressions cover keyboard/Properties deletion and Undo in `chrome.rs`. Fit Artboard in Window and Actual Size show the navigator's artboard. The Artboards panel highlights that active artboard: clicking a row makes it active (the Artboard tool's too, while it is chosen) as does clicking an artboard with the Artboard tool, double-clicking its number also fits it in the window and double-clicking its name renames it. Duplicate Artboards, or a row dragged onto New Artboard, copies the artboard with its art (#446). Escape leaves Presentation Mode, F from it goes back to Normal Screen Mode, and the screen mode isn't saved with the preferences: the app always starts in Normal Screen Mode with its menus and panels (#472). View › Pixel Preview shows the art as the document pixels it rasterizes to, one per point and hard-edged when magnified, turning with a rotated view (it used to draw the smooth vectors, with only the pixel grid over them). In Outline view a template layer keeps drawing in Preview, dimmed, so a picture placed to be traced stays visible under the outlines (#1505, fixes #1486). In Presentation Mode, → and ← go to the next and the previous artboard, and a click anywhere goes to the next one, as the status bar navigator's Next and Previous do (`view.goToArtboard`): on the last artboard → and a click leave the view as it is, and so does ← on the first. The arrow keys do not move the selection there, and the tool does not receive a click, so a click selects and draws nothing (behavior reference: [View artwork](https://helpx.adobe.com/illustrator/using/viewing-artwork.html)). Align to Artboard uses the active artboard, the one the Artboards panel highlights (`object.align {artboard}`). A press with a selection tool inside an artboard makes that artboard active; with the Selection tool, a Shift-click on an empty spot inside an artboard makes it active and keeps the selection. One selected object is aligned to the active artboard too, whatever Align To says (a lone object is never the key object). When an action plays, its Align to Artboard, All on Active Artboard, Paste in Place, Paste in Front and Paste in Back steps that name no artboard use the artboard that is active then. + Choosing the Artboard tool (Shift+O, its toolbar button, or Edit Artboards in Properties or Document Setup) starts it on the active artboard: the canvas outlines that artboard, and Delete, Cut, Copy, the Transform panel and Artboard Options act on it. + In the Artboards panel, a click on the active artboard's options icon, or a double-click on another row's icon, opens Artboard Options for that row's artboard, and the panel menu's Artboard Options… opens it for the active artboard (part of #1876). Both used to choose the Artboard tool instead. Opened while another tool is in use, the dialog moves the art with a new X or Y when the Artboard tool's Move Artwork with Artboard option is on. With Align to Artboard chosen, the Align panel's Distribute Objects and Distribute Spacing buttons use the active artboard (`object.distribute` and `object.distributeSpacing` with `to: "artboard"` and `artboard`). The first object's left or top edge goes to the artboard's left or top edge, and the last object's right or bottom edge goes to the artboard's right or bottom edge. Distribute Objects spaces the other objects evenly by its button's line, and two objects are enough. Distribute Spacing makes the gaps between the objects equal. With anchor points selected, the buttons space the points among themselves and do not use the artboard. When an action plays, its Distribute Objects and Distribute Spacing steps with Align to Artboard use the artboard that is active then. Choosing the Artboard tool (Shift+O, its toolbar button, Edit Artboards in Properties or Document Setup, or the Artboards panel menu's Artboard Options…) starts it on the active artboard: the canvas outlines that artboard, and Delete, Cut, Copy, the Transform panel and Artboard Options act on it. Object › Artboards › Fit to Artwork Bounds and Fit to Selected Art resize the active artboard, as the Artboards panel menu's Fit to Artwork Bounds does (`artboard.fitToArt {index}`, `artboard.fitToSelection {index}`). They used to resize artboard 1 whichever artboard was active. When an action plays, its Fit to Artwork Bounds and Fit to Selected Art steps that name no artboard resize the artboard that is active then.