From 13d5645052565fb8141bb1d169fb5a6eb94b6aac Mon Sep 17 00:00:00 2001 From: bflatastic Date: Thu, 8 Oct 2026 18:17:38 +0700 Subject: [PATCH] Fix #479: Add/Delete Anchor Point tool icons drawn from the Pen tool's The two tools had hand-drawn nibs that didn't match the Pen tool's icon and read as distorted next to it. They now use Lucide's pen-tool (the Pen tool's own icon) with a plus or minus badge, so the Pen group reads as one family; the Remove Anchor Points buttons pick up the minus one. Co-Authored-By: Claude Opus 5.5 --- ASSETS.md | 4 ++-- ROADMAP.md | 2 +- assets/icons/dc-pen-add.svg | 1 - assets/icons/dc-pen-delete.svg | 1 - assets/icons/pen-tool-add.svg | 19 +++++++++++++++++++ assets/icons/pen-tool-delete.svg | 19 +++++++++++++++++++ crates/ui-egui/src/canvas.rs | 2 +- crates/ui-egui/src/chrome.rs | 2 +- crates/ui-egui/src/icon_data.rs | 4 ++-- crates/ui-egui/src/icons.rs | 4 ++-- 10 files changed, 47 insertions(+), 11 deletions(-) delete mode 100644 assets/icons/dc-pen-add.svg delete mode 100644 assets/icons/dc-pen-delete.svg create mode 100644 assets/icons/pen-tool-add.svg create mode 100644 assets/icons/pen-tool-delete.svg diff --git a/ASSETS.md b/ASSETS.md index 35d042bf..8a4799f4 100644 --- a/ASSETS.md +++ b/ASSETS.md @@ -172,8 +172,6 @@ Generated-in-code art is original and has no file to list. This covers the defau | `assets/icons/dc-para-rtl.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | | `assets/icons/dc-path-eraser.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | | `assets/icons/dc-pathfinder.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | -| `assets/icons/dc-pen-add.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | -| `assets/icons/dc-pen-delete.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | | `assets/icons/dc-perspective.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | | `assets/icons/dc-pf-crop.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | | `assets/icons/dc-pf-divide.svg` | VectorCraft contributors | Original work, drawn for VectorCraft | MIT OR Apache-2.0 | | @@ -266,6 +264,8 @@ Generated-in-code art is original and has no file to list. This covers the defau | `assets/icons/paintbrush.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | | `assets/icons/palette.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | | `assets/icons/pen-tool.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | +| `assets/icons/pen-tool-add.svg` | Lucide Icons and Contributors; badge by VectorCraft contributors | https://lucide.dev (lucide-static v1.49.0 `pen-tool`; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Lucide's pen-tool with a plus badge | +| `assets/icons/pen-tool-delete.svg` | Lucide Icons and Contributors; badge by VectorCraft contributors | https://lucide.dev (lucide-static v1.49.0 `pen-tool`; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Lucide's pen-tool with a minus badge | | `assets/icons/pencil.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | | `assets/icons/pilcrow.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | | `assets/icons/pin.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | | diff --git a/ROADMAP.md b/ROADMAP.md index a99e88be..76f9711b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,7 +4,7 @@ VectorCraft is a clean-room, open-source, pure-Rust reimplementation of the Adob This file tracks **how far we are and what's left**. Time estimates are wall-clock hours of continuous Claude Opus 5.5 agent work (including builds and the CI gate), given both for **one agent** and for **4–6 parallel agents** on disjoint crates. They are counted from the remaining work (see [Parity estimate](#parity-estimate)), calibrated against measured throughput, and updated as work lands. -_Last updated: 2026-10-08 (after M4.14–M4.98, M8.1–M8.20, M14.4–M14.7, the MCP prompts, resource templates, completions and logging, the 2026-10-07 issue fixes, the Layers panel rework and the 2026-10-08 community contributions: Pen and shape-tool modifiers, path editing, Layers, Artboards, Swatches/Brushes and dialogs, Japanese composition and PDF text, Hebrew/Arabic type, interface languages (Spanish among them), the font menu, saved selections, MCP and EPS, the missing-font export warning (#319), open paths in the Shape Builder (#374), PDF/`.ai` import keeping strokes live and hidden and nested layers (#372), per-corner Live Corners (#381), SVG type opening at the size it draws at (#396), the Wayland clipboard with copied-file paste (#398), ruler guides that can be selected, moved and deleted (#414), two batches of Preferences options that were stored but unused (#394), skeleton reads with `document.find` for large documents over MCP (#416) and anchors dragged with Direct Selection snapping to points, segments and smart guides, clipped SVG layers opening as clipping layers (#420), PDF/`.ai` layers read on pages of tens of millions of operators (#419), Document Color Mode putting RGB greys on the black plate on request and converting pattern tiles (#421) and movable dialogs with Offset Path's Joins dropdown (#423) and numeric fields scrubbed by dragging their label (#400), stroke weight presets in the stroke unit (#426), the Appearance panel's Opacity popup (#430), type on a path brackets, flip and Type on a Path Options that keep the type in place (#429), Layers rows dragged with a ghost and dropped on the trash or New Layer (#435), tool flyouts opening on a right or corner press (#436), tool flyouts torn off into floating toolbars (#437), the Shape Builder's erase mode deleting edges too (#439), installed fonts registered outside the font folders and fonts installed while the app runs listed in the font menus (#443), alike circular corners on rectangles that aren't square (#442), tool cursors as OS cursors so the pointer no longer trails over the canvas (#444), artboards copied and pasted with their art (#446), guides dragged out of the rulers snapping to the art's side midpoints and the artboards, artboard guides (#451), the toolbar's double arrow and Window › Toolbars › Double Column switching between one and two columns in any window height (#455), the Smart Guides display options and Snapping Tolerance (#394), Font Size and Leading combo boxes with preset lists in the Character and Properties panels and the Control bar (#458), screenshots pasted from the clipboard on macOS, Windows and the web (#457), the Properties panel's Fill and Stroke matching the Control bar's, Illustrator's Window menu panel keys (Shift+F7 for Align…) and Alt-wheel zoom whatever the wheel preference (Discord feedback), the point/area type widget (Discord feedback), groups in legacy Illustrator .ai files (Discord feedback), a rotating desktop log file (#465), image controls in the Control bar and Properties panel: Image Trace with its presets, Mask, Crop Image, Embed/Unembed, and an Image Trace object's preset, Expand and Release (Discord feedback), the Pen working as the Anchor Point tool with Alt held over a selected path's handles and anchors, and anchor buttons that convert, connect and cut paths at the selected anchors (Discord feedback), Japanese hanging punctuation (burasagari, #463), Escape leaving Presentation Mode with no screen mode saved across restarts, documents dropped on the desktop app opening as tabs of their own and a note that an `.ai` file's art off its artboards isn't in the part read (#472); see [Honest assessment](#honest-assessment-2026-10-05))._ +_Last updated: 2026-10-08 (after M4.14–M4.98, M8.1–M8.20, M14.4–M14.7, the MCP prompts, resource templates, completions and logging, the 2026-10-07 issue fixes, the Layers panel rework and the 2026-10-08 community contributions: Pen and shape-tool modifiers, path editing, Layers, Artboards, Swatches/Brushes and dialogs, Japanese composition and PDF text, Hebrew/Arabic type, interface languages (Spanish among them), the font menu, saved selections, MCP and EPS, the missing-font export warning (#319), open paths in the Shape Builder (#374), PDF/`.ai` import keeping strokes live and hidden and nested layers (#372), per-corner Live Corners (#381), SVG type opening at the size it draws at (#396), the Wayland clipboard with copied-file paste (#398), ruler guides that can be selected, moved and deleted (#414), two batches of Preferences options that were stored but unused (#394), skeleton reads with `document.find` for large documents over MCP (#416) and anchors dragged with Direct Selection snapping to points, segments and smart guides, clipped SVG layers opening as clipping layers (#420), PDF/`.ai` layers read on pages of tens of millions of operators (#419), Document Color Mode putting RGB greys on the black plate on request and converting pattern tiles (#421) and movable dialogs with Offset Path's Joins dropdown (#423) and numeric fields scrubbed by dragging their label (#400), stroke weight presets in the stroke unit (#426), the Appearance panel's Opacity popup (#430), type on a path brackets, flip and Type on a Path Options that keep the type in place (#429), Layers rows dragged with a ghost and dropped on the trash or New Layer (#435), tool flyouts opening on a right or corner press (#436), tool flyouts torn off into floating toolbars (#437), the Shape Builder's erase mode deleting edges too (#439), installed fonts registered outside the font folders and fonts installed while the app runs listed in the font menus (#443), alike circular corners on rectangles that aren't square (#442), tool cursors as OS cursors so the pointer no longer trails over the canvas (#444), artboards copied and pasted with their art (#446), guides dragged out of the rulers snapping to the art's side midpoints and the artboards, artboard guides (#451), the toolbar's double arrow and Window › Toolbars › Double Column switching between one and two columns in any window height (#455), the Smart Guides display options and Snapping Tolerance (#394), Font Size and Leading combo boxes with preset lists in the Character and Properties panels and the Control bar (#458), screenshots pasted from the clipboard on macOS, Windows and the web (#457), the Properties panel's Fill and Stroke matching the Control bar's, Illustrator's Window menu panel keys (Shift+F7 for Align…) and Alt-wheel zoom whatever the wheel preference (Discord feedback), the point/area type widget (Discord feedback), groups in legacy Illustrator .ai files (Discord feedback), a rotating desktop log file (#465), image controls in the Control bar and Properties panel: Image Trace with its presets, Mask, Crop Image, Embed/Unembed, and an Image Trace object's preset, Expand and Release (Discord feedback), the Pen working as the Anchor Point tool with Alt held over a selected path's handles and anchors, and anchor buttons that convert, connect and cut paths at the selected anchors (Discord feedback), Japanese hanging punctuation (burasagari, #463), Escape leaving Presentation Mode with no screen mode saved across restarts, documents dropped on the desktop app opening as tabs of their own and a note that an `.ai` file's art off its artboards isn't in the part read (#472), Add/Delete Anchor Point tool icons drawn from the Pen tool's (#479); see [Honest assessment](#honest-assessment-2026-10-05))._ ## Where we are diff --git a/assets/icons/dc-pen-add.svg b/assets/icons/dc-pen-add.svg deleted file mode 100644 index 780bbc32..00000000 --- a/assets/icons/dc-pen-add.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/assets/icons/dc-pen-delete.svg b/assets/icons/dc-pen-delete.svg deleted file mode 100644 index 601e9aea..00000000 --- a/assets/icons/dc-pen-delete.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/assets/icons/pen-tool-add.svg b/assets/icons/pen-tool-add.svg new file mode 100644 index 00000000..b2c63da2 --- /dev/null +++ b/assets/icons/pen-tool-add.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/assets/icons/pen-tool-delete.svg b/assets/icons/pen-tool-delete.svg new file mode 100644 index 00000000..614ee792 --- /dev/null +++ b/assets/icons/pen-tool-delete.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/crates/ui-egui/src/canvas.rs b/crates/ui-egui/src/canvas.rs index df2148b4..af203589 100644 --- a/crates/ui-egui/src/canvas.rs +++ b/crates/ui-egui/src/canvas.rs @@ -1615,7 +1615,7 @@ fn task_bar(app: &mut VectorcraftApp, ui: &mut Ui, xf: &Xf) { // Direct-selected anchors take the place of a path's Offset Path and Simplify. let anchors = !st.selection.anchors.is_empty(); if anchors { - items.push((tl!("Remove Anchor Points"), "dc-pen-delete", "path.removeAnchors")); + items.push((tl!("Remove Anchor Points"), "pen-tool-delete", "path.removeAnchors")); items.push((tl!("Cut Path"), "scissors", "path.cutAtAnchors")); } if n > 1 { diff --git a/crates/ui-egui/src/chrome.rs b/crates/ui-egui/src/chrome.rs index 0f51a303..c21c894d 100644 --- a/crates/ui-egui/src/chrome.rs +++ b/crates/ui-egui/src/chrome.rs @@ -125,7 +125,7 @@ pub fn anchor_buttons(app: &mut VectorcraftApp, ui: &mut Ui) { ( tl!("Anchors:"), &[ - ("dc-pen-delete", tl!("Remove Anchor Points"), "path.removeAnchors", None), + ("pen-tool-delete", tl!("Remove Anchor Points"), "path.removeAnchors", None), ("dc-join", tl!("Connect Selected End Points"), "path.join", None), ("scissors", tl!("Cut Path at Selected Anchor Points"), "path.cutAtAnchors", None), ], diff --git a/crates/ui-egui/src/icon_data.rs b/crates/ui-egui/src/icon_data.rs index 07265c06..22a22373 100644 --- a/crates/ui-egui/src/icon_data.rs +++ b/crates/ui-egui/src/icon_data.rs @@ -123,8 +123,6 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("dc-para-rtl", include_bytes!("../../../assets/icons/dc-para-rtl.svg")), ("dc-path-eraser", include_bytes!("../../../assets/icons/dc-path-eraser.svg")), ("dc-pathfinder", include_bytes!("../../../assets/icons/dc-pathfinder.svg")), - ("dc-pen-add", include_bytes!("../../../assets/icons/dc-pen-add.svg")), - ("dc-pen-delete", include_bytes!("../../../assets/icons/dc-pen-delete.svg")), ("dc-perspective", include_bytes!("../../../assets/icons/dc-perspective.svg")), ("dc-pf-crop", include_bytes!("../../../assets/icons/dc-pf-crop.svg")), ("dc-pf-divide", include_bytes!("../../../assets/icons/dc-pf-divide.svg")), @@ -217,6 +215,8 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("paintbrush", include_bytes!("../../../assets/icons/paintbrush.svg")), ("palette", include_bytes!("../../../assets/icons/palette.svg")), ("pen-tool", include_bytes!("../../../assets/icons/pen-tool.svg")), + ("pen-tool-add", include_bytes!("../../../assets/icons/pen-tool-add.svg")), + ("pen-tool-delete", include_bytes!("../../../assets/icons/pen-tool-delete.svg")), ("pencil", include_bytes!("../../../assets/icons/pencil.svg")), ("pilcrow", include_bytes!("../../../assets/icons/pilcrow.svg")), ("pin", include_bytes!("../../../assets/icons/pin.svg")), diff --git a/crates/ui-egui/src/icons.rs b/crates/ui-egui/src/icons.rs index 2cf8b6b4..be183f10 100644 --- a/crates/ui-egui/src/icons.rs +++ b/crates/ui-egui/src/icons.rs @@ -34,8 +34,8 @@ pub fn tool_icon(name: &str) -> &'static str { "tool-magic-wand" => "wand-sparkles", "tool-lasso" => "lasso", "tool-pen" => "pen-tool", - "tool-pen-add" => "dc-pen-add", - "tool-pen-delete" => "dc-pen-delete", + "tool-pen-add" => "pen-tool-add", + "tool-pen-delete" => "pen-tool-delete", "tool-anchor" => "dc-anchor", "tool-curvature" => "spline", "tool-type" => "type",