feat: Phase O Windows-native integration + settings search

- Taskbar progress bar: renderer pushes summarizeQueue aggregate over a new
  taskbar:progress channel (App store subscription); setProgressBar normal/error
- System tray (src/main/tray.ts) + minimize-to-tray (Settings.minimizeToTray);
  close hides to tray, isQuitting guards real exits; icon via getAppIconPath()
  (build/icon.ico added to extraResources)
- Jump list: app.setUserTasks "Open AeroFetch" (thumbnail toolbar deferred)
- Settings search: filters the ~11 SettingsView cards live by text match

Overlay badge deferred (needs a drawn NativeImage). typecheck + test (192) +
build all clean. Roadmap: Phase O COMPLETE.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 11:20:28 -04:00
parent da37690b42
commit 20ee913394
12 changed files with 222 additions and 25 deletions
+19 -14
View File
@@ -368,23 +368,28 @@ per-item `options`) but not the surfaces. typecheck + test + `npm run build` cle
(filter, ↑/↓, Enter, Esc) opened with Ctrl/Cmd+K from `App.tsx`; actions = navigate tabs,
new download (focuses the `aerofetch-url` input), toggle theme.*
## Phase O — Windows-native integration & discoverability
## Phase O — Windows-native integration & discoverability ✅ COMPLETE
Grepping `src/main` confirms none of these exist yet (no `setProgressBar`, `Tray`,
`setThumbarButtons`, `setJumpList`, `globalShortcut`). All live in the main process, mostly in
`src/main/index.ts`.
All in the main process. typecheck + test + `npm run build` clean.
- [ ] **Taskbar progress bar.** `win.setProgressBar(fraction)` driven by Phase M's aggregate
progress. ~20 lines, very high perceived-quality return.
- [ ] **System tray + minimize-to-tray.** A `Tray` with show/quit/pause-all. This is also the
coherent home for the **watched-source background sync** (Phase J), which today just
"launches the normal window unobtrusively."
- [ ] **Thumbnail toolbar buttons** (`win.setThumbarButtons`) — pause/cancel from the taskbar
preview — and a **jump list** (`app.setJumpList`) with "Paste & download."
- [x] **Taskbar progress bar.** *Done: renderer pushes the `summarizeQueue` aggregate over a new
`taskbar:progress` channel (App-level store subscription, no re-render);
`mainWindow.setProgressBar` with `mode: 'normal' | 'error'` (red when any failed) and `-1`
to clear when idle.*
- [x] **System tray + minimize-to-tray.** *Done: `src/main/tray.ts` builds a `Tray` (icon resolved
via `getAppIconPath()`; `build/icon.ico` added to electron-builder `extraResources` for
prod) with Show / Quit. A new `Settings.minimizeToTray` (Settings → Appearance) makes the
window's `close` hide to tray instead of quitting; `before-quit`/tray-Quit set an
`isQuitting` flag so real exits still work.*
- [x] **Jump list.** *Done: `app.setUserTasks` adds an "Open AeroFetch" task (focuses the
single instance). **Thumbnail toolbar buttons deferred** — they need per-button `NativeImage`
assets this repo doesn't have tooling to generate here.*
- [ ] **Taskbar overlay badge** (`win.setOverlayIcon`) showing active-download count / error state.
- [ ] **Settings discoverability.** `src/renderer/src/components/SettingsView.tsx` is ~1,000
lines across ~10 cards. Add a **settings search box** or a **Basic / Advanced split** so
first-time users aren't faced with the full power-user wall.
*Deferred: a numeric/status badge needs a drawn `NativeImage` (no canvas in main); the
taskbar progress bar's `error` mode already signals failures.*
- [x] **Settings discoverability.** *Done: a search box atop `SettingsView` filters the ~11 cards
live by matching each card's text (DOM `display` toggle keyed off the root's children — no
per-card refactor), with a "no settings match" hint.*
## Phase P — Reliability, longevity & trust