On some keymaps the R key resolves to a different logical key (observed on a Turkish remote-desktop setup: the R key arrives as logical T), so the Ctrl+R shortcut never fired even though the key events reached the app. The shortcut now matches PhysicalKeyboardKey.keyR as well; a regression test covers the wrong-layout case.
119 lines
4.5 KiB
Markdown
119 lines
4.5 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to imajViewer are documented in this file.
|
||
|
||
## [Unreleased]
|
||
|
||
## [1.6.1] - 2026-10-14
|
||
|
||
### Fixed
|
||
- Horizontal flip shortcut (`Ctrl+R`) never fired when the keyboard layout resolves the R key to a
|
||
different logical key (reported with a Turkish/remote-desktop setup where the R key arrives as
|
||
logical `T`). The shortcut now matches the physical R key position as well.
|
||
|
||
## [1.6.0] - 2026-10-14
|
||
|
||
### Added
|
||
- Horizontal flip (`Ctrl+R`): mirrors the image left-right about the viewport centre and clears
|
||
the active effects (same reset as double right click); pressing `Ctrl+R` again restores the
|
||
original orientation. Zoom/pan are kept.
|
||
- Crop save (`Ctrl+S`) now bakes the flip into the output as well, so the saved JPEG matches
|
||
the mirrored view (also in combination with rotation).
|
||
|
||
## [1.5.0] - 2026-10-12
|
||
|
||
### Added
|
||
- Fill/fit mode (double-click) is now persisted in `window.json` and restored on the next launch
|
||
and when switching images, instead of always resetting to fill.
|
||
|
||
## [1.4.2] - 2026-10-12
|
||
|
||
### Fixed
|
||
- Crop save dropped the blue channel's brightness/contrast offset (matrix index `m[13]`, the
|
||
alpha coefficient, instead of `m[14]`), so saved JPEGs came out with a color cast whenever
|
||
brightness or contrast was applied. Saturation/rotate were unaffected.
|
||
|
||
## [1.4.1] - 2026-10-11
|
||
|
||
### Fixed
|
||
- Crop save always writes JPEG (previously kept the source extension, e.g. PNG) — quality 93
|
||
- Crop save with rotation now saves the rotated view 1:1 instead of an unrotated bounding box
|
||
|
||
## [1.4.0] - 2026-10-11
|
||
|
||
### Added
|
||
- Crop save: saves the visible area at original resolution as JPEG quality 90 — title bar save button or Ctrl+S
|
||
- Output name: original name + `_HHmmss` time suffix (e.g. `photo.jpg` → `photo_143025.jpg`)
|
||
- If a file with the same name exists, nothing is written and a warning is shown
|
||
- Active color effects (contrast/saturation/brightness) are baked into the output
|
||
- With rotation active, the bounding box around the visible area is saved
|
||
|
||
## [1.3.2] - 2026-08-28
|
||
|
||
### Fixed
|
||
- Window position/size persistence under Wayland — forces X11 backend (XWayland) when an X server is available
|
||
|
||
## [1.3.1] - 2026-08-14
|
||
|
||
### Fixed
|
||
- Aspect ratio distortion on image switch — downsample now uses `ResizeImagePolicy.fit` (was `exact`, which forced 2048×2048 square and stretched non-square images)
|
||
|
||
## [1.3.0] - 2026-08-14
|
||
|
||
### Fixed
|
||
- `_imageSize` now resets on image switch (wrong swap threshold on navigation)
|
||
- Downsample now caps both dimensions, not just width (tall images no longer full-res decode)
|
||
- Image size listener leak in `loadingBuilder` — replaced with single `_readImageSize`
|
||
- Old downsample provider now evicted on full-res swap
|
||
- Removed `imageCache.clear()` that also dropped the live image (gallery flash)
|
||
|
||
## [1.2.0] - 2026-08-14
|
||
|
||
### Added
|
||
- Downsampling: large images decode at max 2048px on first load (RAM ~1.6MB)
|
||
- Full-res swap: zooming in past 1.5x stretch swaps to original resolution
|
||
- Internationalization: Turkish + English, auto-detected from system locale
|
||
- Zoom decodes at original resolution while zooming in (crisp details)
|
||
- Max zoom increased to 20x
|
||
|
||
### Fixed
|
||
- RAM leak on image switch — old providers now evicted + `ImageCache.evict()`
|
||
- Black screen flash during zoom (gapless playback)
|
||
|
||
### Changed
|
||
- App ID `com.example.imajviewer` → `com.softmediadesign.imajviewer`
|
||
- CI now runs `flutter analyze` and `flutter test` on every push
|
||
- `pubspec.yaml` description in English (open-source ready)
|
||
|
||
## [1.1.0] - 2026-08-06
|
||
|
||
### Fixed
|
||
- `Ctrl+Q` now closes the window reliably (`onKeyEvent` rework)
|
||
- Pan freeze regression on effect-applied images (root cause analysis)
|
||
|
||
### Added
|
||
- Navigation arrows (visible on hover)
|
||
- Settings window: folder sorting by time/name, print, shortcut info
|
||
- Print support (printing package, A4 fit)
|
||
- Title bar hover transparency
|
||
- Shader warmup — right-click effects no longer stutter on first use
|
||
|
||
## [1.0.1] - 2026-07-27
|
||
|
||
### Fixed
|
||
- Zoom/pan issues on large images
|
||
- Image provider memoize — repeated opens no longer reload from disk
|
||
|
||
### Changed
|
||
- Version now sourced from `pubspec.yaml` (single source of truth)
|
||
|
||
## [1.0.0] - 2026-07-22
|
||
|
||
### Added
|
||
- Initial release: ultra-lightweight image viewer
|
||
- Formats: PNG, JPEG, JFIF, WebP, BMP, GIF, WBMP
|
||
- Pan (left drag), zoom (wheel, cursor-centered), fill/fit toggle (double click)
|
||
- Contrast / saturation / brightness / rotate gestures
|
||
- Drag & drop, window position memory, set-as-default-viewer
|
||
- Linux (.deb) and Windows (setup.exe) installers
|