feat: Grid viewer crop and mirror tools (0.4.0, issue #147) #150

Merged
ValleyGeek merged 10 commits from 0.3.6/issue-147-crop-mirror into main 2026-07-18 16:16:32 +00:00
Member

Summary

Implements issue #147: crop and horizontal mirror tools in the Grid image viewer, released as 0.4.0.

  • Dynamic toolbar when opening the viewer from Grid (thumbnail slider hidden): Rotate 90°, mirror (< >), Crop, aspect presets, rotate crop selection, Accept
  • Interactive crop overlay (corner/edge handles, dimmed exterior, directional cursors, free or fixed aspect)
  • Enter/Accept applies crop with backup under workspace .originals/ (skipped by scans); session undo/redo restores or re-applies and refreshes thumbnails/viewer
  • Settings: default crop aspect; optional purge of .originals on workspace close/exit
  • Docs: USER_GUIDE, DESIGN, TECHNICAL_OUTLINE, DR-033, CHANGELOG for 0.4.0

Test plan

  • pytest tests/test_viewer_crop_mirror.py (21 tests)
  • ruff check / ruff format --check
  • ./scripts/check-version-bump.sh origin/main
  • Manual: open image from Grid → mirror, crop free/fixed aspect, Accept, undo/redo, Esc cancel
  • Manual: crop with border near image edge; aspect None keeps selection; purge .originals setting

Closes #147

## Summary Implements issue #147: crop and horizontal mirror tools in the Grid image viewer, released as **0.4.0**. - Dynamic toolbar when opening the viewer from Grid (thumbnail slider hidden): **Rotate 90°**, mirror (`< >`), **Crop**, aspect presets, **↻** rotate crop selection, **Accept** - Interactive crop overlay (corner/edge handles, dimmed exterior, directional cursors, free or fixed aspect) - Enter/Accept applies crop with backup under workspace `.originals/` (skipped by scans); session undo/redo restores or re-applies and refreshes thumbnails/viewer - Settings: default crop aspect; optional purge of `.originals` on workspace close/exit - Docs: USER_GUIDE, DESIGN, TECHNICAL_OUTLINE, DR-033, CHANGELOG for 0.4.0 ## Test plan - [x] `pytest tests/test_viewer_crop_mirror.py` (21 tests) - [x] `ruff check` / `ruff format --check` - [x] `./scripts/check-version-bump.sh origin/main` - [ ] Manual: open image from Grid → mirror, crop free/fixed aspect, Accept, undo/redo, Esc cancel - [ ] Manual: crop with border near image edge; aspect **None** keeps selection; purge `.originals` setting Closes #147
Grok added 10 commits 2026-07-18 16:03:00 +00:00
Introduce image_edit_applier for mirror, crop, backup/restore, and combined
viewer transforms. Skip .originals during scans and add related constants.
Set development VERSION to 0.3.6-feature.147.
Hide grid thumbnail-size controls when the viewer opens from grid. Move Rotate
to the dynamic toolbar, add mirror and interactive crop with aspect modes,
Accept/Enter confirmation, crop undo, and purge-.originals preference.
tests: cover viewer crop/mirror tools and scanner .originals skip (issue #147)
All checks were successful
CI / lint (push) Successful in 20s
CI / test (push) Successful in 3m14s
CI / appimage (push) Successful in 16m53s
CI / build-appimage (push) Successful in 0s
CI / windows-exe (push) Successful in 12m46s
CI / build-windows-exe (push) Successful in 0s
95ed16db8c
ui: fix crop accept, toolbar sizing, and resize hit zones (issue #147)
All checks were successful
CI / lint (push) Successful in 15s
CI / test (push) Successful in 2m44s
CI / windows-exe (push) Successful in 10m44s
CI / build-windows-exe (push) Successful in 0s
CI / appimage (push) Successful in 14m50s
CI / build-appimage (push) Successful in 0s
72ce25428e
Route Enter through the shell shortcut to accept an active crop. Fix an
eventFilter crash on non-mouse events during crop mode that blocked Accept.
Resolve the image path directly for crop writes, shrink-fit edit toolbar
controls, and use 15px corners / 6px edge bands for crop resizing.
ui: refresh thumbnails and viewer cache on crop undo/redo (issue #147)
All checks were successful
CI / lint (push) Successful in 13s
CI / test (push) Successful in 2m41s
CI / appimage (push) Successful in 14m51s
CI / build-appimage (push) Successful in 0s
CI / windows-exe (push) Successful in 10m54s
CI / build-windows-exe (push) Successful in 0s
7d7cc9b101
Add a unified file-edit refresh path that re-reads on-disk dimensions,
clears thumbnail blobs, regenerates thumbnails, invalidates viewer caches,
reloads the active image, and updates duplicate views when the edited file
appears there.
ui: crop handle cursors and rotate-crop button (issue #147)
All checks were successful
CI / lint (push) Successful in 14s
CI / test (push) Successful in 2m48s
CI / windows-exe (push) Successful in 11m45s
CI / build-windows-exe (push) Successful in 0s
CI / appimage (push) Successful in 15m27s
CI / build-appimage (push) Successful in 0s
a60ac86d36
Show directional resize cursors over crop handles and edges, a move cursor
inside the selection, and add a toolbar control to rotate the crop area 90°
while toggling fixed aspect orientation (e.g. 16:9 <-> 9:16).
ui: clamp fixed-ratio crop at bounds and dotted border (issue #147)
All checks were successful
CI / lint (push) Successful in 15s
CI / test (push) Successful in 2m54s
CI / windows-exe (push) Successful in 11m44s
CI / build-windows-exe (push) Successful in 0s
CI / appimage (push) Successful in 15m5s
CI / build-appimage (push) Successful in 0s
a0dfab188e
When a fixed-aspect crop hits parallel image edges, constrain resize to
the largest in-bounds rectangle instead of intersecting and breaking ratio.
Draw the crop frame with dotted sides, solid corner handle spans, and a
40px solid segment at the center of each edge.
ui: fix crop handle hit-testing and free-edge resize (issue #147)
Some checks failed
CI / lint (push) Successful in 30s
CI / build-appimage (push) Has been cancelled
CI / build-windows-exe (push) Has been cancelled
CI / appimage (push) Has been cancelled
CI / windows-exe (push) Has been cancelled
CI / test (push) Has been cancelled
2cb80aca10
Top/bottom edge drags incorrectly also moved left/right from mouse X.
Resize each handle only owns its edges. Hit testing uses distance to
corner points and edge segments with larger grab radii, and allows
grabs slightly outside the image when the crop sits on a bound.
ui: keep crop selection when switching aspect to none (issue #147)
All checks were successful
CI / lint (push) Successful in 16s
CI / test (push) Successful in 6m39s
CI / windows-exe (push) Successful in 12m40s
CI / build-windows-exe (push) Successful in 0s
CI / appimage (push) Successful in 15m4s
CI / build-appimage (push) Successful in 0s
9a90a6a47f
Changing the crop preset to free aspect only updates the mode; it no
longer reactivates the overlay and resets the rectangle.
docs: PR-prep for 0.4.0 crop/mirror release (issue #147)
All checks were successful
CI / lint (push) Successful in 10s
CI / test (push) Successful in 2m7s
CI / appimage (push) Successful in 12m31s
CI / build-appimage (push) Successful in 0s
CI / windows-exe (push) Successful in 14m15s
CI / build-windows-exe (push) Successful in 0s
202d0be332
Bump VERSION to 0.4.0, document Grid viewer crop and mirror in the user
guide and product docs, record DR-033, and add the 0.4.0 changelog section.
ValleyGeek deleted branch 0.3.6/issue-147-crop-mirror 2026-07-18 16:16:33 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ai-collab/bulk-image-organizer!150
No description provided.