268 lines
17 KiB
Markdown
268 lines
17 KiB
Markdown
|
|
# ICED GUI Parity: Scored Migration and Vector Tool Plan
|
||
|
|
|
||
|
|
## Goal
|
||
|
|
Bring every retained user-facing ICED editor feature to **at least 9/10 relative to egui**. Work proceeds in scored cycles. A cycle is incomplete until the complete scorecard is rerun and touched features reach target without regressing earlier work.
|
||
|
|
|
||
|
|
## Constraints
|
||
|
|
- GUI changes only under `hcie-iced-app/crates/`; `hcie-engine-api` remains the sole engine entry point.
|
||
|
|
- Preserve persistent wgpu textures, dirty-region uploads, viewport mapping, nearest filtering, and the `RefCell` dirty accumulator.
|
||
|
|
- Theme changes are UI-only. They must never invoke image/viewer loading, imports, dialogs, document replacement, or pixel mutation.
|
||
|
|
- Reachable `NoOp`, static fake controls, wrong menu aliases, and materially incorrect fallbacks score at most 2/10.
|
||
|
|
- Add ICED screenshot capture first; inspect screenshots after every visual change.
|
||
|
|
- Preserve unrelated working-tree changes.
|
||
|
|
|
||
|
|
## Scoring
|
||
|
|
| Score | Meaning |
|
||
|
|
|---|---|
|
||
|
|
| 0 | Absent/unusable |
|
||
|
|
| 1-2 | Placeholder; no real action |
|
||
|
|
| 3-4 | Partial, major paths missing |
|
||
|
|
| 5-6 | Basic workflow, substantial defects |
|
||
|
|
| 7 | Main workflow works, notable gaps |
|
||
|
|
| 8 | Near parity, minor gaps |
|
||
|
|
| 9 | Production parity: correct UI/action/undo/persistence as applicable, tested and visually verified |
|
||
|
|
| 10 | No known gap under covered scenarios |
|
||
|
|
|
||
|
|
## Baseline Inventory
|
||
|
|
Scores reflect the current working tree; the old vector `2.5/10` assessment is obsolete.
|
||
|
|
|
||
|
|
### Shell, Menus, Docking
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| Shell/title/tabs/window controls | 7 | Document close is `NoOp`; title drag overlaps menu region | 9 |
|
||
|
|
| Menu typography | 5 | Dropdown labels are thin/mixed contrast | 9 |
|
||
|
|
| Dropdown placement/event capture | 4 | Character-count X estimate; shifted/click-through risk | 9 |
|
||
|
|
| Menu command coverage | 3 | Most enabled-looking commands are labels/comments | 9 |
|
||
|
|
| Theme switching | 6 | Reported image-load side effect untested; no persistence | 9 |
|
||
|
|
| Dock resize/maximize/close | 8 | Main behavior works | 9 |
|
||
|
|
| Dock relocation | 6 | Drop only swaps; directional drop regions ignored | 9 |
|
||
|
|
| Dock profile/layout persistence | 5 | Does not serialize exact split tree/order/ratios | 9 |
|
||
|
|
| Panel reopen/focus | 7 | Coarse hardcoded placement | 9 |
|
||
|
|
| Settings persistence | 6 | Theme/toolbox/exact dock state missing | 9 |
|
||
|
|
| Internationalization | 3 | Most strings bypass i18n | 9 |
|
||
|
|
| ICED screenshot harness | 1 | F12 only refreshes | 9 |
|
||
|
|
|
||
|
|
### Canvas and Tools
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| GPU canvas/checkerboard/partial upload | 9 | Protected path active | 9 |
|
||
|
|
| Pan/zoom/100% | 8 | True fit-to-area incomplete | 9 |
|
||
|
|
| Fit/navigation/pinch/space-pan | 5 | Ctrl+0 sets 1.0; missing expected navigation | 9 |
|
||
|
|
| Brush/pressure | 8 | Modifier UX/cursor footprint | 9 |
|
||
|
|
| Pen | 5 | Mostly treated as Brush unlike egui pen segments | 9 |
|
||
|
|
| Eraser | 8 | Per-tool config/cursor polish | 9 |
|
||
|
|
| Spray | 7 | Verify density/particle settings reach engine | 9 |
|
||
|
|
| Flood fill | 7 | Contiguous/AA/history validation | 9 |
|
||
|
|
| Gradient | 5 | Stroke approximation, not true linear/radial gradient | 9 |
|
||
|
|
| Eyedropper | 7 | Ctrl-click temporary pick missing | 9 |
|
||
|
|
| Brush cursor/Shift resize HUD | 3 | Fixed crosshair only | 9 |
|
||
|
|
| Canvas context menu | 5 | Cut maps to Copy; partial actions | 9 |
|
||
|
|
| Rulers/grid/guides/snap/pixel grid | 1 | Menu shells only | 9 |
|
||
|
|
| Status/coordinates/pressure | 7 | Needs live cross-theme verification | 9 |
|
||
|
|
| Retouch tools | 2 | Selectable toolbox entries, incomplete execution/options | 9 |
|
||
|
|
|
||
|
|
### Selection, Transform, Clipboard
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| Rectangle selection | 8 | Minor parity/tests | 9 |
|
||
|
|
| Lasso/polygon | 7 | Preview/edge/close behavior | 9 |
|
||
|
|
| Magic wand | 7 | AA/contiguous partially `NoOp` | 9 |
|
||
|
|
| SmartSelect/SAM | 3 | Magic-wand fallback, no real backend flow | 9 |
|
||
|
|
| VisionSelect | 3 | Rectangle fallback, no model/task flow | 9 |
|
||
|
|
| Marching ants/fill | 5 | Bounds, not irregular mask edges | 9 |
|
||
|
|
| Raster transform | 7 | Undo/aspect/handles verification | 9 |
|
||
|
|
| Crop | 8 | Minor parity/tests | 9 |
|
||
|
|
| Copy/paste | 7 | External/internal selection tests | 9 |
|
||
|
|
| Cut/clear | 2 | Cut is Copy; Clear incomplete | 9 |
|
||
|
|
| Selection modify/load/save/quick mask | 4 | Some operations exist; exposed gaps remain | 9 |
|
||
|
|
|
||
|
|
### Vector and Text
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| Creation, 15 shape types | 8 | Verify layer safety/undo | 9 |
|
||
|
|
| Accurate previews | 7 | Several shapes remain approximate | 9 |
|
||
|
|
| VectorSelect/cycling | 7 | Implemented but insufficiently tested | 9 |
|
||
|
|
| Handles/hit testing | 7 | Rotated/hover/zoom behavior needs hardening | 9 |
|
||
|
|
| Move/8-way resize/rotate | 7 | Constraints, undo, edge cases | 9 |
|
||
|
|
| Apply/Cancel/snapshot | 7 | Verify exact restoration and overlay UX | 9 |
|
||
|
|
| Flip H/V | 6 | Verify supported shapes/output | 9 |
|
||
|
|
| Delete | 8 | Main path exists | 9 |
|
||
|
|
| Geometry list/selection | 8 | Main path exists | 9 |
|
||
|
|
| Bounds/fill/stroke/opacity/hardness | 8 | Precision/sync/tests | 9 |
|
||
|
|
| Line caps | 7 | Always-expanded list, weak selector UX | 9 |
|
||
|
|
| Boolean operations | 7 | Validation/failure/undo/result selection | 9 |
|
||
|
|
| Tool↔shape sync | 6 | Properties/Geometry/toolbar can diverge | 9 |
|
||
|
|
| Text create/inline edit | 6 | Focus/multiline/existing-layer edit/cancel | 9 |
|
||
|
|
| Text properties/effects | 6 | Full egui parity missing | 9 |
|
||
|
|
|
||
|
|
### Panels and Workflows
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| Layers | 8 | Hierarchy/duplicate/masks/fill opacity verification | 9 |
|
||
|
|
| History | 7 | Every operation needs correct undo boundary | 9 |
|
||
|
|
| Brushes & Tips | 7 | Category filter `NoOp`; advanced editor gaps | 9 |
|
||
|
|
| Color/palette/recent/alpha | 7 | Continuous wheel/recent UX/vector sync | 9 |
|
||
|
|
| Filters/preview | 8 | Audit every schema/default/apply/reset | 9 |
|
||
|
|
| Properties | 7 | Duplicate state surfaces may diverge | 9 |
|
||
|
|
| Tool Settings/toolbar | 7 | AA toggles/buttons remain `NoOp` | 9 |
|
||
|
|
| Layer Styles | 8 | Add-style placeholder/undo validation | 9 |
|
||
|
|
| Layer Details | 7 | Field/action parity audit | 9 |
|
||
|
|
| Script | 8 | Diagnostics/integration tests | 9 |
|
||
|
|
| AI Chat | 7 | Cancel/error/model discovery tests | 9 |
|
||
|
|
| AI Script | 7 | Provider/error/validation robustness | 9 |
|
||
|
|
| Viewer/browser | 7 | Cache/fullscreen/error/open-edit tests | 9 |
|
||
|
|
| Dialogs | 8 | Focus/validation/modal behavior | 9 |
|
||
|
|
| Plugins/actions/channels/histogram/navigator exposed by More | 1 | Labels only | 9 |
|
||
|
|
|
||
|
|
### Files and Documents
|
||
|
|
| Feature | Current | Key gap | Target |
|
||
|
|
|---|---:|---|---:|
|
||
|
|
| New/open/recent/import | 8 | Error and format coverage | 9 |
|
||
|
|
| Save/save-as/export | 6 | Unsupported menu claims/export paths | 9 |
|
||
|
|
| Multi-document tabs/dirty close | 6 | Tab close `NoOp`; dirty coverage | 9 |
|
||
|
|
| Image/canvas size/crop/merge/flatten | 8 | Regression tests | 9 |
|
||
|
|
| Layer duplicate/group/masks/rasterize/smart object | 3 | Menu shells/TODOs | 9 |
|
||
|
|
| Print/share/file-info/automation | 1 | Menu shells | 9 |
|
||
|
|
|
||
|
|
## Score Evidence Rules
|
||
|
|
A score may rise only when:
|
||
|
|
- UI is reachable and correctly positioned.
|
||
|
|
- A semantic message and real handler exist; no `NoOp` or wrong alias.
|
||
|
|
- State/engine output is correct.
|
||
|
|
- Undo/dirty state and persistence are correct where expected.
|
||
|
|
- Automated test passes.
|
||
|
|
- Visual behavior has an inspected screenshot.
|
||
|
|
|
||
|
|
Generate after every cycle under `target/iced-audit/`: full score table, failing evidence, test output, and screenshots. Add `tests/feature_scorecard.rs` with stable feature IDs and evidence test names.
|
||
|
|
|
||
|
|
## Cycle 0: Audit and Verification Infrastructure
|
||
|
|
1. Build a canonical registry from egui panes, tools, menus, dialogs, shortcuts and canvas interactions.
|
||
|
|
2. Add tests that fail for reachable `NoOp`, Cut→Copy aliases, enabled menu items without semantic handlers, or menu definition/index drift.
|
||
|
|
3. Add ICED screenshot CLI: `--screenshot output.png` and `--screenshot-panel "Panel" output.png`; settle layout/texture then crop from measured pane bounds.
|
||
|
|
4. Capture baseline full viewport, all menus, collapsed/expanded toolbox, Geometry, Properties, Layers, Color, and selected-vector canvas.
|
||
|
|
5. Run build/tests and record baseline scores. Do not raise scores without evidence.
|
||
|
|
6. **Recheck all scores.**
|
||
|
|
|
||
|
|
## Cycle 1: Requested UX Fixes
|
||
|
|
### Menus
|
||
|
|
Files: `panels/title_bar.rs`, `panels/menus.rs`, `app.rs`.
|
||
|
|
1. Replace approximate character-width offsets with measured menu-button anchor rectangles or an overlay anchored in the same layout subtree.
|
||
|
|
2. Place each dropdown at `anchor.x/anchor.bottom`, clamp to viewport, and make its outside-click layer fill/capture the viewport.
|
||
|
|
3. Separate draggable title space from menu buttons; menu clicks must not emit `WindowDrag` or reach underlying canvas/viewer.
|
||
|
|
4. Use a bundled readable UI font and Medium/Semibold weight for dropdown labels, shortcuts and arrows; use theme contrast tokens.
|
||
|
|
5. Replace raw `(menu_idx,item_idx)` dispatch with semantic `MenuCommand` generated from the menu definition.
|
||
|
|
6. Test all nine anchors at multiple widths/DPI; screenshot every dropdown in dark/light themes.
|
||
|
|
|
||
|
|
### Theme side-effect regression
|
||
|
|
1. Make theme commands synchronous: set colors, persist preset, close menu, repaint only.
|
||
|
|
2. Instrument file/import/viewer-preview/dialog/document replacement calls.
|
||
|
|
3. Test all themes preserve document ID/path/layers/composite hash/viewer selection/recent files/file-dialog state.
|
||
|
|
4. Switch themes while drawing and with viewer active/inactive; prove no image load or texture reset.
|
||
|
|
|
||
|
|
### Movable/reconfigurable panels
|
||
|
|
Files: `dock/state.rs`, `dock/view.rs`, `app.rs`, `settings.rs`, dock-profile dialog.
|
||
|
|
1. Handle full PaneGrid drop target: center swap; left/right/top/bottom close-and-split in requested side/order.
|
||
|
|
2. Preserve exactly one Canvas and one instance per utility pane; prevent closing/moving away the last Canvas.
|
||
|
|
3. Serialize actual dock tree recursively: pane type, split axis, ratio, child order, maximized/focused state.
|
||
|
|
4. Restore defensively with dedupe, ratio clamps, unknown-pane tolerance and default fallback.
|
||
|
|
5. Save/load/rename/delete exact profile layouts; add Painting, Vector, AI and Viewer presets.
|
||
|
|
6. Test every panel move/resize/close/reopen/maximize/save/reload.
|
||
|
|
|
||
|
|
### Expandable two-column toolbox
|
||
|
|
Files: `sidebar/mod.rs`, `app.rs`, `settings.rs`.
|
||
|
|
1. Persist collapsed 36px one-column and expanded ~72px two-column mode.
|
||
|
|
2. Add accessible chevron and shortcut.
|
||
|
|
3. Short click activates last-used subtool; secondary click/long press opens subtools; outside/Escape closes.
|
||
|
|
4. Expanded mode exposes all tools via a scrollable grouped two-column grid.
|
||
|
|
5. Every selectable tool must execute a real action or be visibly disabled with explanation.
|
||
|
|
6. Verify all 15 vector shapes, VectorSelect, Smart/Vision selection and retouch tools.
|
||
|
|
7. Screenshot both modes and popups at minimum height.
|
||
|
|
|
||
|
|
### Cycle 1 gate
|
||
|
|
Recheck the complete scorecard. Do not proceed until menu readability/placement, theme isolation, docking relocation/persistence and toolbox mode are each ≥9.
|
||
|
|
|
||
|
|
## Cycle 2: Vector Completion
|
||
|
|
1. Test selection, deselection, overlap cycling and active-layer changes.
|
||
|
|
2. Make handle hit areas screen-constant across zoom/pan. Render rotated geometry handles with hover/active styles and correct cursors.
|
||
|
|
3. Test move, all eight resize handles and rotation for every shape; prevent NaN/min-size/inversion errors; add Shift aspect and Alt center constraints.
|
||
|
|
4. Use one undo transaction per drag.
|
||
|
|
5. Render viewport-clamped Apply, Cancel, Flip H/V and Delete controls. Snapshot once; Apply commits once; Cancel restores exact state.
|
||
|
|
6. Centralize `sync_tool_from_shape` and `sync_shape_from_tool` so Geometry, Properties, toolbar, Tool Settings and color picker agree.
|
||
|
|
7. Replace always-expanded Geometry selectors with pick lists/popovers; add precise numeric inputs and shape-specific controls.
|
||
|
|
8. Validate boolean operands, failures, one undo entry and result selection for Union/Intersect/Subtract/Xor.
|
||
|
|
9. Share geometry generation between live preview and committed shape for all 15 variants plus FreePath; preserve anti-alias density.
|
||
|
|
10. Verify safe auto-vector-layer creation on raster/locked layers.
|
||
|
|
11. **Recheck every vector row; none below 9.**
|
||
|
|
|
||
|
|
## Cycle 3: Canvas, Selection, Raster, Text, Clipboard
|
||
|
|
1. Extract/cache actual mask edges for marching ants and fill irregular selected pixels, not bounds.
|
||
|
|
2. Complete lasso/polygon previews, MagicWand AA/contiguous and selection modify/load/save/quick-mask.
|
||
|
|
3. Make raster transform fully undoable with aspect lock and on-canvas Apply/Cancel.
|
||
|
|
4. Implement real Cut/Clear and selection-aware internal/external clipboard.
|
||
|
|
5. Add Ctrl-click eyedropper, Shift brush resize, space-pan, true fit-to-area and actual brush footprint cursor.
|
||
|
|
6. Give Pen distinct egui behavior; prove Spray settings reach engine; implement true linear/radial gradients.
|
||
|
|
7. Complete inline text focus/multiline/live preview/rotated caret/edit-existing/Accept/Cancel/properties/effects.
|
||
|
|
8. Wire real SmartSelect/VisionSelect/retouch backends; fake fallbacks cannot score 9. Disable with explanation only as a temporary state.
|
||
|
|
9. Implement exposed rulers/grid/guides/snap/pixel-grid states and rendering.
|
||
|
|
10. **Recheck all scores; no Cycle 3 row below 9.**
|
||
|
|
|
||
|
|
## Cycle 4: Panels
|
||
|
|
1. Layers: duplicate, grouping/hierarchy, reorder, fill opacity, masks/rasterize where API exists, context actions and history.
|
||
|
|
2. Brushes: category filter, presets/editing/imports/thumbnails/per-tool isolation.
|
||
|
|
3. Color: continuous wheel/SL drag, 40 recent wrapping/collapse/right-click-background, theme style and vector sync.
|
||
|
|
4. Filters: audit every FilterType schema/default/range/reset/preview/apply/error.
|
||
|
|
5. Establish one authoritative tool/property state; remove contradictory duplicates and all reachable `NoOp`.
|
||
|
|
6. Complete Layer Styles/Details/History undo/empty/selection behavior.
|
||
|
|
7. Complete dialog validation/focus/Enter/Escape/modal capture/responsiveness.
|
||
|
|
8. Add panel UI tests/screenshots in every theme.
|
||
|
|
9. **Recheck all scores; no panel row below 9.**
|
||
|
|
|
||
|
|
## Cycle 5: Menus, Files, Viewer, Script, AI, Remaining Features
|
||
|
|
1. Derive menu labels and semantic dispatch from one source; implement every enabled item.
|
||
|
|
2. Where support truly does not exist, disable with tooltip rather than presenting an enabled no-op. Retained egui features still require implementation.
|
||
|
|
3. Complete document close/dirty prompts, recent failures, save/export format selection/errors.
|
||
|
|
4. Complete viewer cache/navigation/fullscreen/open-edit/malformed-file behavior.
|
||
|
|
5. Script/AI: cancellation, provider/model discovery, network errors, diagnostics, execution confirmation, history/refresh.
|
||
|
|
6. Add real egui-supported More panels/actions (notably Plugins and Layer Styles); remove unsupported Photopea-only claims.
|
||
|
|
7. Apply i18n keys to every visible string and persist language.
|
||
|
|
8. Ensure menu and shortcut dispatch the same semantic command.
|
||
|
|
9. **Recheck the complete inventory; repeat Cycle 5 for every row below 9.**
|
||
|
|
|
||
|
|
## Final Regression Cycle
|
||
|
|
Run:
|
||
|
|
- `cargo fmt --check`
|
||
|
|
- `cargo build -p hcie-iced-gui`
|
||
|
|
- `cargo test -p hcie-iced-gui`
|
||
|
|
- scorecard/UI/integration tests
|
||
|
|
- `cargo test -p hcie-engine-api --test visual_regression` for engine-visible pixels
|
||
|
|
- `cargo test -p hcie-engine-api --test performance_stroke_4k -- --nocapture` for stroke/canvas work
|
||
|
|
|
||
|
|
Then launch ICED, exercise every scorecard scenario, compare final screenshots to Cycle 0, prove theme composite hashes are unchanged, verify dock restart recovery, and rescore everything. **Stop only when every retained feature is ≥9/10.**
|
||
|
|
|
||
|
|
## Mandatory Scenarios
|
||
|
|
- Every menu anchor, narrow/wide viewport, DPI scales, dark/light themes.
|
||
|
|
- Six themes with active drawing and viewer active/inactive; no document mutation.
|
||
|
|
- Every pane moved to every region, resized, closed/reopened, maximized, persisted.
|
||
|
|
- Toolbox one/two columns, all subtools, minimum height, Escape/outside click.
|
||
|
|
- Every vector shape create/select/move/8-resize/rotate/apply/cancel/delete/flip/properties/boolean.
|
||
|
|
- Rect/lasso/polygon/magic/AI selection, irregular ants, transform, crop, clipboard, undo.
|
||
|
|
- Multi-document open/switch/close/dirty, import/export failures.
|
||
|
|
- 4K continuous stroke, pan/zoom, vector drag and theme switch without full-upload regressions.
|
||
|
|
|
||
|
|
## Risks
|
||
|
|
- PaneGrid may not support floating windows/tabs directly. Required acceptance is arbitrary split relocation and exact persistence; floating windows are optional unless added without state/event duplication.
|
||
|
|
- Some menu claims exceed egui/engine support. Honest disabled states are preferable to fake enabled actions, but egui parity features must be implemented.
|
||
|
|
- Document engine API gaps before any locked-crate proposal; never import internal crates into GUI.
|
||
|
|
- Re-read files before patches because the working tree has concurrent/uncommitted changes.
|
||
|
|
|
||
|
|
## Done Definition
|
||
|
|
- No retained feature below 9.
|
||
|
|
- No reachable production `NoOp` or wrong semantic alias.
|
||
|
|
- No enabled menu item without a tested handler.
|
||
|
|
- Panels relocate, resize and restore exactly.
|
||
|
|
- Menus are readable and exactly anchored.
|
||
|
|
- Theme changes cannot load/mutate images.
|
||
|
|
- Toolbox has persisted one/two-column modes and all vector tools are connected.
|
||
|
|
- Vector handles/editing are accurate, undoable and visually verified.
|
||
|
|
- Protected GPU optimizations remain intact.
|