280 lines
12 KiB
TOML
280 lines
12 KiB
TOML
# Scorecard checklist: tools (#213 painting and retouching, #214 selection, transform, drawing).
|
||
# An item is done when it has a command, a UI and tests.
|
||
# Statuses must be true on main. Verified against 4b53f62 on 2026-10-05.
|
||
area = "tools"
|
||
title = "Tools"
|
||
order = 3
|
||
|
||
[[item]]
|
||
id = "TOOL-213-1"
|
||
target = "Pencil tool: aliased 1 px painting, square pixel-aligned cursor"
|
||
status = "done"
|
||
issue = 213
|
||
note = "Tool::Pencil (B group): live aliased strokes on the pixel grid, square cursor, Auto Erase; pencil_tests.rs"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-2"
|
||
target = "Mixer Brush tool on the toolbar"
|
||
status = "done"
|
||
issue = 213
|
||
note = "Tool::MixerBrush in the Brush (B) flyout; Wet/Load/Mix/Flow/Sample All Layers options, command/control dispatch and selection-clipping tests"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-3"
|
||
target = "Patch tool with a live preview of the patched area"
|
||
status = "done"
|
||
issue = 213
|
||
note = "paint.patch (retouch_cmds/patch.rs, source/destination) + Tool::Patch (J group: lasso, then drag the selection); the drag shows the heal live (patch_preview.rs, coarse colour fit: 1000x1000 in 52 ms)"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-4"
|
||
target = "Content-Aware Move tool reusing inpaint completion"
|
||
status = "partial"
|
||
issue = 213
|
||
note = "paint.contentAwareMove (retouch_cmds/content_aware_move.rs: move/extend, Structure 1-7, Color 0-10, Sample All Layers; background job) + Tool::ContentAwareMove (J group: lasso, then drag). Missing: Transform On Drop, a live preview of the result (the drag shows the outline only)"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-5"
|
||
target = "Painting a type/shape/smart/fill layer offers to rasterize, then continues the stroke"
|
||
status = "done"
|
||
issue = 213
|
||
note = "rasterize_prompt.rs: OK rasterizes then paints (two history states), Cancel does nothing; drivable via ui.dialog.confirm"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-6"
|
||
target = "Fill dialog: contents, blend, opacity, preserve transparency; remembered; Shift+Backspace"
|
||
status = "done"
|
||
issue = 213
|
||
note = "fill_ui.rs dialog over edit.fill (fill_cmds.rs): all contents, mode, opacity, preserve; remembered in prefs; Shift+F5 / Shift+Backspace"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-7"
|
||
target = "Live stroke preview for every brush-based retouch tool"
|
||
status = "partial"
|
||
issue = 213
|
||
note = "Live (canvas.rs strokes_live): Brush, Pencil, Eraser, Blur, Sharpen, Smudge, Dodge, Burn, Sponge, Clone Stamp, Healing Brush, History Brush (#1026, #1040); the release commits the live stroke's pixels (P32). Not yet live: Spot Healing Brush, Mixer Brush, Background Eraser, Pattern Stamp"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-8"
|
||
target = "Clone Source: W/H link, drawn overlay (opacity/blend/clip/auto-hide), Alt target cursor"
|
||
status = "partial"
|
||
issue = 213
|
||
note = "Clone Source overlay drawn with opacity, inversion, circular clipping and auto-hide; W/H link, custom-tip clipping and overlay blend modes remain missing"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-9"
|
||
target = "Eyedropper comparison ring (new colour above, current below) while sampling"
|
||
status = "done"
|
||
issue = 213
|
||
note = "eyedropper_ring (canvas.rs): the sampled colour on the upper arc, the foreground below, drawn for the Eyedropper and Alt-sampling while the button is held; the Precise-cursor preference keeps the crosshair"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-10"
|
||
target = "Ctrl+Alt drag resizes brush size/hardness with an on-canvas readout"
|
||
status = "done"
|
||
issue = 213
|
||
note = "brush_resize.rs: ⌃⌥-drag (and ⌥-right-drag) sets diameter horizontally and hardness vertically with the circle and readout beside the pointer, never painting (#271; tests ctrl_alt_drag_resizes_every_brush_tool_without_painting_or_history, canvas_drag_shows_the_circle_and_readout)"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-11"
|
||
target = "Editable pressure curve, global and per control"
|
||
status = "missing"
|
||
issue = 213
|
||
note = "No pressure curve in engine, paint or ui-egui"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-12"
|
||
target = "Import an image file as a brush tip"
|
||
status = "missing"
|
||
issue = 213
|
||
note = "Only brush.defineFromSelection and brush.presets.importAbr"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-13"
|
||
target = "Brush regression tests: no seams, hard edge, zero-scatter defaults, ABR never black"
|
||
status = "done"
|
||
issue = 213
|
||
note = "Seam, hard-edge and zero-scatter tests in brush_tests.rs; ABR tip colour test in abr_map/tests.rs"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-14"
|
||
target = "Tablet: no OS arrow cursor over the canvas on macOS, Windows and Linux"
|
||
status = "partial"
|
||
issue = 213
|
||
note = "Brush tools set CursorIcon::None (canvas.rs:1259-1275); not verified per OS"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-18"
|
||
target = "Pattern Stamp tool: sibling of Clone Stamp in the S flyout"
|
||
status = "done"
|
||
issue = 213
|
||
note = "Tool::PatternStamp in the S group; paint.patternStamp stamps the Patterns-panel tile with Aligned and Impressionist (an approximation: it jitters each dab's tile phase, not Photoshop's smeared impressionist look); engine tests cover depths, seams, hostile input"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-1"
|
||
target = "Select and Mask workspace: view modes, Refine Edge brush, 6 outputs"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Opens the generic select.refineEdge dialog (menus.rs:308)"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-2"
|
||
target = "Marquee: Shift square, Alt from centre, live W x H readout"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "marquee_end supports shift (chrome_ui.rs:167) but canvas.rs passes false (#208)"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-3"
|
||
target = "Color Range test: Sampled Colors at Fuzziness 0 selects the exact match only"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Fuzziness-0 tests cover midtones/shadows only (selection_cmds.rs:444-447)"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-4"
|
||
target = "Move tool: box-select layers, Auto-Select hover outline, double-click fit, drag to a tab"
|
||
status = "missing"
|
||
issue = 214
|
||
note = "move_mods.rs covers Shift/Alt/arrows only"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-5"
|
||
target = "Right-click menu during Free Transform (scale, rotate, skew, warp, flip, rotate 90/180)"
|
||
status = "missing"
|
||
issue = 214
|
||
note = "No context menu in canvas.rs or transform_tool.rs"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-6"
|
||
target = "Puppet Warp mesh follows the object outline (constrained triangulation)"
|
||
status = "missing"
|
||
issue = 214
|
||
note = "algo/puppet.rs:136 builds a block-grid mesh"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-7"
|
||
target = "Content-Aware Scale through the Free Transform box with a live proxy preview"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "edit.contentAwareScale (edit_menu_cmds.rs:899) behind a parameter dialog"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-8"
|
||
target = "A measured ruler angle prefills Image Rotation > Arbitrary (0.01 deg)"
|
||
status = "missing"
|
||
issue = 214
|
||
note = "Arbitrary rotation is a generic dialog; ruler only feeds straighten"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-9"
|
||
target = "Crop: W x H x Resolution with units, saved crop presets, Straighten in the options bar"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Ratio dropdown and fields, Straighten (TOOL-214-21); no W x H x Resolution with units or saved presets"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-10"
|
||
target = "Pen: Alt breaks a handle, Shift 45 deg, Ctrl direct-selects, Backspace, close-drag handle"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Ctrl/Cmd = Direct Selection and Alt = Convert Point on existing paths (direct_select.rs, #790); no Shift 45 deg, Backspace or Alt while drawing"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-11"
|
||
target = "Stroke Path dialog: pick any brush-based tool, Simulate Pressure"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "path.stroke brush, pencil, eraser (vector_cmds.rs:1170); brush-only button, no dialog"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-12"
|
||
target = "Shapes: on-canvas corner radius handles, shape feather, selection to shape with tolerance"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "select.convertToShape with tolerance (vector_cmds.rs:1256); radius as a field only"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-13"
|
||
target = "Mask Properties: Density and Feather controls"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Vector-mask density/feather in the engine (vector_cmds.rs:948); no UI controls"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-14"
|
||
target = "Vanishing Point window: draw and edit planes, paste, clone in perspective"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "filter.vanishingPoint (vp_cmds.rs:15) behind a parameter dialog"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-15"
|
||
target = "Content-Aware Fill workspace: paint the sampling area, preview, rotate/scale/mirror, new layer"
|
||
status = "partial"
|
||
issue = 214
|
||
note = "Engine sampling auto, rect, custom (edit_menu_cmds.rs:324); generic dialog"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-16"
|
||
target = "Liquify: redo (Cmd+Shift+Z)"
|
||
status = "done"
|
||
issue = 214
|
||
note = "liquify_ui.rs supports bounded redo through Cmd+Shift+Z and the control channel; new strokes clear redo"
|
||
|
||
[[item]]
|
||
id = "TOOL-213-17"
|
||
target = "Red Eye tool: click a pupil to neutralize the red reflection"
|
||
status = "done"
|
||
issue = 213
|
||
note = "paint.redEye (redeye_cmds.rs) + Tool::RedEye in the J flyout; Pupil Size and Darken Amount; catchlights kept; a miss is an error"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-17"
|
||
target = "Rotate View tool: drag to turn the view, Reset View, Match Rotation copies the angle"
|
||
status = "done"
|
||
issue = 214
|
||
note = "Tool::RotateView in the Hand flyout; view.rotateView / view.resetView; Match Rotation copies views[].rotation; enhanced_controls.rotate_view_with_trackpad is read"
|
||
|
||
[[item]]
|
||
id = "TOOL-1649-1"
|
||
target = "Eyedropper Sample Size (Point, 3×3 … 101×101 Average), Sample layers, Show Sampling Ring"
|
||
status = "done"
|
||
issue = 1649
|
||
note = "document.sampleColor (sample_cmds.rs): average of the square clipped to the canvas, in the document's model and depth; eyedropper_ui.rs options bar; shared with Alt-click, dialog eyedroppers and the Info panel; ui.set eyedropperSampleSize/eyedropperSample/eyedropperRing. Color Sampler tool still missing"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-20"
|
||
target = "Crop overlay options: Rule of Thirds, Grid, Diagonal, Triangle, Golden Ratio, Golden Spiral; Auto / Always / Never Show Overlay; O cycles the overlay, Shift+O its orientation"
|
||
status = "done"
|
||
issue = 1919
|
||
note = "crop_overlay.rs: unit-square guides shared by upright and turned frames (canvas.rs), options-bar menu, O / Shift+O ahead of the tool keys in shortcuts.rs; ToolOptions crop_overlay / crop_overlay_show / crop_overlay_orientation, ui.set cropOverlay / cropOverlayShow / cropOverlayOrientation"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-18"
|
||
target = "Crop: drag outside the frame to rotate it (Shift 15 deg steps, angle readout); Enter rotates and crops in one step"
|
||
status = "done"
|
||
issue = 1792
|
||
note = "image.crop angle param (image_cmds.rs: Image Rotation > Arbitrary + crop, one undo step); crop_ui.rs turns, moves and resizes the frame along its axes (Classic Mode visuals); UiState.crop_angle"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-19"
|
||
target = "Crop: arrow keys nudge the crop box (Shift 10 px), X swaps portrait/landscape, W x H readout while drawing or resizing"
|
||
status = "done"
|
||
issue = 1919
|
||
note = "crop_ui.rs keys/nudge/swap_orientation (ahead of the selection nudge and tools.swapColors in shortcuts.rs; X also swaps the options-bar ratio) and sizing (canvas.rs draws it with the marquee readout); turned frames included"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-21"
|
||
target = "Crop: Straighten button in the options bar and Cmd/Ctrl-drag draw a line; the frame turns so the line ends up level (or plumb when nearer vertical), with an angle readout"
|
||
status = "done"
|
||
issue = 1919
|
||
note = "crop_straighten.rs: one-shot options-bar button, Cmd/Ctrl held is a temporary Straighten (ui.pointer command flag); the Ruler's straighten_angle convention; the frame is fitted to the largest of its proportions inside the image (Classic Mode); a pending edit committed by Enter"
|
||
|
||
[[item]]
|
||
id = "TOOL-214-22"
|
||
target = "Crop gear menu: Show Cropped Area (H), Enable Crop Shield with Match Canvas / custom colour, opacity and Auto Adjust Opacity"
|
||
status = "done"
|
||
issue = 1919
|
||
note = "crop_shield.rs: fill() resolves the shield (canvas.rs paints it around upright and turned frames), gear popup in the options bar, H ahead of the Hand key in shortcuts.rs, Custom… opens the Color Picker; ToolOptions crop_shield, ui.set cropShield. No Classic Mode / Auto Center Preview (PhotoCraft is always Classic Mode)"
|