summaryrefslogtreecommitdiff
path: root/docs/roadmap.md
blob: 30c8693a377b78e8c6ab2c08e067c7d98996b88d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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).