diff options
Diffstat (limited to 'docs/roadmap.md')
| -rw-r--r-- | docs/roadmap.md | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/docs/roadmap.md b/docs/roadmap.md new file mode 100644 index 0000000..30c8693 --- /dev/null +++ b/docs/roadmap.md @@ -0,0 +1,120 @@ +# Roadmap + +Rough milestones. Each ends in something runnable. Every plain-C module +ships with unit tests; overall coverage target ≥80% (gate in M10). Run the +`auditing-code-quality` audit at each milestone boundary and before release. + +### M0 — Skeleton +- Meson build, `GtkApplication` with app ID, empty `GtkApplicationWindow`. +- Opens a file or folder from `argv`; `--version` / `--help`. +- `.desktop` stub, `meson install` lays out `/usr/bin` + `/usr/share/applications`. + +### M1 — Show one image +- GdkPixbuf backend; load and display one image via the viewer widget. +- Honor EXIF Orientation on load (upright display). +- Zoom (fit / 100% / in / out) and pan when zoomed. +- Cursor-centered zoom. + +### M2 — Walk the directory +- `navigator` lists siblings, filters by image MIME, sorts by name. +- `h`/`l` (and `←`/`→`) prev/next with wrap. +- Hide RAW sidecars by default (toggle to reveal); default sort = filename. +- Accept a **folder** arg → open the grid; file arg → open its parent folder + with that file current. +- Drag-and-drop a file or folder onto the window to open it (`GtkDropTarget`). +- `GFileMonitor` on the current dir: external adds/deletes/moves update the + listing live (debounced); removed current file falls back to nearest. +- Header bar shows `n / total` + filename. +- Cancel-in-flight load on rapid navigation. + +### M3 — Responsive + prefetch +- Decode in `GTask` thread; UI never blocks. +- Prefetch next/previous into a 2–3 slot texture LRU. +- Bounded texture cache to cap memory. + +### M4 — Fullscreen + slideshow + info +- Fullscreen toggle (`f`), auto-hiding header bar. +- Slideshow mode with configurable delay. +- Info overlay (`i`) with dimensions, format, EXIF (via libexif or GdkPixbuf). + +### M5 — Modern formats +- Loader backend dispatcher + content sniffing. +- libjxl, libavif, libheif backends (meson feature options). +- Animated GIF/WebP playback. + +### M6 — Progressive low-res preview +- libjpeg-turbo direct backend; low-res early scan shown, then refined. +- Loader streaming API finalized. + +### M7 — Thumbnail cache + grid view +- freedesktop-compliant `~/.cache/thumbnails/`. +- Shared cache across windows; verify mtime. +- `gridview`: whole-folder thumbnail overview backed by the cache. +- Resizable thumbnails (`+`/`-`); grid reflows to fit the window; size + persisted in GSettings `thumbnail-size`. +- `Enter` → large view, `Esc` → grid; cursor stays in sync. +- Dim-mark `./Trash`/deleted items; toggle to hide them. + +### M8 — Selection, move, open-external & scripts +- Mark set in navigator: `v` toggle, `V` range, `Ctrl+a` all, `Esc` clear; + shared by grid (check badge) and large (indicator). +- `mover` module + `destinations` GSettings key (`a(ss)`). +- `m` → GtkPopover listing destinations with auto-assigned hotkeys + (`1`-`9`, `0`, then `a`-`z`); press to move the marked set (or current). +- `g_file_move` with collision suffixing; `u` undoes last move (or trash). +- `opener` module + `editors` GSettings key (`a(ss)`); `e` → popup of external + programs; `GSubprocess` detached launch with `%f` expansion. +- `runner` module + `scripts` GSettings key (`a(ss)`); `!` → popup of shell + scripts; async `/bin/sh -c` with `%f`/`%d` expansion; rescan dir on exit. +- `clipboard` helpers + `Ctrl+c`: copy current image as PNG, or marked files + as `text/uri-list`, to `GdkClipboard` (paste into Katogram/GIMP/etc.). +- Preferences dialog (`,`) to edit destinations, editors, scripts, sort, + background, etc. + +### M9 — GEGL quick-enhance & export *(optional, feature-gated)* +- `enhancer` module + `enhance-presets` GSettings key (`a(ss)`); built-in + presets: auto-fix, brightness, contrast, saturation, warm/cool, white + balance, shadows, highlights, levels, curves, sharpen, denoise, clarity; + optional grayscale, sepia, vignette, softglow. Strength tunable in the + gegl-graph text. +- `a` → popup of presets (auto-assigned hotkeys); non-destructive live preview + in the viewer (apply in a `GTask` thread; off the scrub hot path). +- `s` / menu *Save enhanced copy…* → GEGL saver writes `<name>-enhanced.<ext>`; + original untouched. **No auto-save**: navigating away from an un-exported + prompt prompts Save/Discard/Cancel; window tracks a dirty flag. +- Crop (`c`, `gegl:crop`), straighten (`R`, `gegl:rotate`) and rotate 90° + (`[`/`]`, `gegl:rotate-on-center`) tools: interactive overlays or one-shot; + aspect-ratio presets, angle nudge/horizon-drag; non-destructive; compose with + presets. +- Compare: hold `Space` to view original, release for modified (before/after + to decide on `s`). +- Color-managed decode/export via GEGL/babl + ICC (closes open question G). +- meson `gegl` feature option; graceful "GEGL not built in" toast. + +### M10 — Polish & packaging +- AppStream metainfo, app icon (symbolic + full). +- `org.buetow.ggaze.desktop` registered as `image/*` handler. +- Fedora RPM spec; optional Flatpak manifest. +- Man page `ggaze(1)`. +- Settings: sort order, wrap, background, scroll behavior, slideshow delay, + hide-trashed, destinations, editors, scripts, enhance-presets. +- Trash: `d` → `./Trash` folder (local, undoable via `u`); `D` → permanent + `g_file_delete`. Menu action to empty `./Trash`. +- Persist & restore window geometry (GSettings width/height/maximized). +- **Coverage gate**: ≥80% unit-test coverage on plain-C modules (gcov/lcov); + fails the build/CI below that. +- **Quality audit**: run `auditing-code-quality` (c-best-practices + + find-code-bugs + SOLID + beyond-SOLID); resolve all HIGH/MEDIUM findings + before release. +- Keyboard-completeness audit: every GUI element has a hotkey shown on it; + mnemonics on all menu items; full keyboard traversal of dialogs. + +### Later / maybe +- Configurable keybindings UI. +- Recursive directory walking. +- RAW embedded-preview display. +- Burst grouping (collapse near-identical frames in grid + large). +- GEGL transforms: lens correction, red-eye, scale (crop, straighten & rotate + are in M9). +- GEGL artistic presets (vignette, sepia, B&W) as optional enhance entries. +- Go-to image # (count-prefix / jump).
\ No newline at end of file |
