Skip to content
Merged

Test #40

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ test_report*.log
test_results.txt
smoke_test_output.txt
verify_result.txt
faststack/*fail*.txt
faststack/*final*.txt

# Same junk when produced inside the package dir
faststack/debug_*.txt
Expand Down
55 changes: 54 additions & 1 deletion ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,59 @@
# ChangeLog

Todo: Make it work on Linux / Mac. Create Windows .exe. Write better documentation / help. Add splash screen / icon.
Todo: Make it work on Linux / Mac. Create Windows .exe. Write better documentation / help. Add splash screen / icon. Fix raw image support.

# Changelog

## 1.5.5 (2026-02-07)

### Changed
- Image save behavior in the editor is now navigation-aware:
- Only clear editor state / close editor UI when the user is still on the same image.
- Only perform a full list refresh + re-select logic when the user is still on the same image.
- If the user navigated away, preserve their selection and only invalidate the saved image’s cache entry.

- Recycle/delete of JPG+RAW pairs is now more atomic and robust:
- Check RAW existence **before** any moves to avoid post-move existence ambiguity.
- Move JPG first; only attempt RAW move if JPG succeeds and RAW existed.
- If RAW move fails after JPG succeeds, roll back the JPG move to keep pairs consistent.
- Track `raw_moved` based on whether RAW existed and whether it was moved successfully.

- Cache invalidation after edits is now targeted instead of global:
- Replace multiple `image_cache.clear()` calls after save/export with `image_cache.pop_path(saved_path)` to invalidate only the edited file.

- Keep internal path→index lookup consistent:
- Rebuild the path-to-index map after operations that mutate the image list, including after recycle/rollback flows.

### Fixed
- Rotation/autocrop and straighten edge handling:
- Use `floor()` instead of `round()` in inscribed-rectangle and crop coordinate math to reduce off-by-one drift.
- Skip inset trimming for exact 90° rotations to preserve full dimensions and avoid unnecessary cropping.

## 1.5.4 (2026-02-04)

### Fixed
- Image rotation fixed - no more black wedges on the edges of the image.
- Prevented “undo delete” from resurrecting files when recycle/rollback fails: if a JPG can’t be restored after a partial delete, it’s marked as deleted (`jpg_moved=True`), a warning is shown, and a `recycled_jpg_path` breadcrumb is stored for potential cleanup.
- Improved crop behavior when straightening/rotating with `expand=True` by transforming crop coordinates from original image space into the expanded canvas.
- Prevented exporting with stale preview-resolution blur caches by validating cached array shapes against the current Y channel dimensions.
- Improved highlight recovery by switching to an adaptive rational compression shoulder (new `k` parameter) and added tests for identity-at-zero, pivot invariance, and increasing compression with higher amount.
- Fixed QML empty-state message timing by only showing “No images in this folder” after the folder has been scanned at least once.
- Improved Escape key reliability during crop/rotation by explicitly re-focusing the loupe view.

### Changed
- Refactored deletion into a unified core deletion engine (`_delete_indices`) shared by loupe, grid cursor, grid selection, and batch deletion paths.
- Deletion now uses an optimistic UI update for instant feedback, with deferred/coalesced disk refresh to avoid flicker and “deleted items reappear” issues.
- Grid deletion now supports multi-selection and cursor deletion through a single entry point, rebuilding the path→index mapping for reliable lookup.
- Image saving is now offloaded to a background thread to keep the UI responsive:
- Added an `isSaving` state to disable Save actions and show “Saving…” feedback.
- Prevented “surprise close” by only auto-closing the editor if the user is still on the same image when the save completes.
- Improved recycle-bin cleanup on quit:
- Replaced the simple message dialog with a richer dialog showing per-bin counts (JPG/RAW/other) and an optional detailed file list.

### UI
- Resized the Image Editor dialog to accommodate the saving state/controls.
- Enhanced recycle bin cleanup dialog layout and interaction (expandable detailed list, clearer button actions).


## 1.5.3 (2026-01-27)

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# FastStack

# Version 1.5 - January 1, 2026
# Version 1.5.4 - February 4, 2026
# By Alan Rockefeller

Ultra-fast, caching JPG viewer designed for culling and selecting RAW or JPG files for focus stacking and website upload.
Expand Down
Binary file added faststack/all_verification_results.txt
Binary file not shown.
19 changes: 19 additions & 0 deletions faststack/all_verification_results_utf8.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
============================= test session starts =============================
platform win32 -- Python 3.12.10, pytest-9.0.2, pluggy-1.6.0 -- C:\code\faststack\faststack\verify_venv\Scripts\python.exe
rootdir: C:\code\faststack
configfile: pyproject.toml
collecting ... collected 14 items

tests\test_editor_rotation.py::test_rotated_rect_edge_cases PASSED [ 7%]
tests\test_editor_rotation.py::test_rotated_rect_calculation_branches[100-100-0] PASSED [ 14%]
tests\test_editor_rotation.py::test_rotated_rect_calculation_branches[200-100-45] PASSED [ 21%]
tests\test_editor_rotation.py::test_rotated_rect_calculation_branches[1000-500-15] PASSED [ 28%]
tests\test_editor_rotation.py::test_rotated_rect_calculation_branches[500-1000-15] PASSED [ 35%]
tests\test_editor_rotation.py::test_rotate_autocrop_rgb_behavior PASSED [ 42%]
tests\test_editor_rotation.py::test_boundary_clamping PASSED [ 50%]
tests\test_editor_rotation.py::test_integration_straighten_modes FAILED [ 57%]
tests\test_editor_rotation.py::test_rotate_cw PASSED [ 64%]
tests\test_editor_rotation.py::test_rotate_ccw PASSED [ 71%]
tests\test_rotation_unittest.py::TestEditorRotation::test_rotate_cw PASSED [ 78%]
tests\test_rotation_unittest.py::TestEditorRotation::test_straighten_angle PASSED [ 85%]
tests\test_editor_integration.py::TestEditorIntegration::test_missing_methods
Loading