src/ui/preferences.ui is an AdwPreferencesDialog whose rows are libadwaita's own -- AdwEntryRow, AdwSpinRow, AdwSwitchRow, AdwComboRow, AdwButtonRow -- instead of a label and a bare GtkEntry in a GtkBox. There is no Apply button: a row applies as it changes, which is what those widgets are designed around, and [prefs-probe] reads the settings file back after every change. The folder chooser is cancellable now, so a picker still open when the dialog closes cannot write into a row that is gone; the cancellable is also how the probe takes the cancel path without a mouse. Two traps cost a run each and are recorded in docs/claude/invariants-gtk-and-chrome.md: an AdwDialog is not a GtkWindow (it cannot parent a GtkFileDialog, and in floating mode it adds a native surface to gtk_window_get_toplevels() that is neither a widget nor a window), and a .ui that is not listed in the GResource is a Gtk-ERROR at runtime rather than a build failure -- which is exactly what the probe opening every window is for.
32 lines
4.6 KiB
Markdown
32 lines
4.6 KiB
Markdown
- [x] (1) fix vertical lines to small to be seen: in some cases (e.g. rect waveform in @mock_upstreamer.py) the vertical lines are to thin to be visible (sometime they glitch in and out of existence):
|
|
1. the antialisaing strategy with phosphore effect should be applied with more stregth
|
|
2. the lines should be more tick
|
|
3. the sample points should be bigger
|
|
- [x] (2) ~~relative timing~~ **done**: `--relative-time`; see README and SPECS.md for the measured history cost.
|
|
- in order to avoid problem with time jitter user can decide to go in relative time mode
|
|
- in this mode absolute signal time is only use for export
|
|
- the plot time depends just on signal sample rate and frame number, e.g.:
|
|
- user is acquiring a signal with 1MSps and 100_000 samples per udp frame
|
|
- last frame as number <N> and previous <N-2> in this case a 100_000 indexes must be skipped
|
|
- time is simply: `((<N_frame> - <N_last>) * <n_samples_per_frame> - <sample_index>) / <sample rate>` (or something like that)
|
|
- [x] (3) ~~named configurations~~ **done**: one directory per source holding `<name>.toml` per configuration plus `active`; a configuration carries a note and the startup settings (`buffer_mb`, `relative_time`, `capture_packets`); the chooser lists them and the menu's _Configurations…_ opens/saves/deletes them.
|
|
- [x] (4) ~~optional udp frame storage for debugging of strange behaviours~~ **done**: `--capture-packets N`; see README and the design note in `docs/superpowers/specs/` for the ring file, the popover toggle and `tools/capture_to_pcap.py`.
|
|
- [x] (5) ~~open exported binary waveforms to view/analyse~~ **done**: `--open FILE` and the chooser's **Waveforms** page (the files opened before, newest first, plus _Open…_); the `.npy`'s dtype names the columns, so a load restores the signals, the samples and the axis the export had, and every instrument works on it — see README and `docs/claude/invariants-data-path.md`.
|
|
- [x] (6) ~~imporve right click menu on the plots~~ **done**: the plot's context menu uses the main menu's row style (`menu_button` + `.udpscope-menu`, asserted by `UDPSCOPE_PROBE_ROWMENU_MS`: uniform `label_x=26`, `h=18`, the shortcut flush right), and deleting a signal is a **Remove signal** submenu listing that plot's traces plus _All traces on this plot_.
|
|
- [ ] (7) in layout edit mode add the option to drag plot border to resize them (sizing should be persistant between sessesions as the layout)
|
|
- [x] (8) ~~add option to automatic save the last <N> triggered acquisitions in a cache folder and let the user replay them~~ **done**: every latch is written to `<cache>/<source>/events/` as a `.npy` (the export format), a `.txt` sidecar and a `.bmp` preview drawn from the samples; the **events pane** (revealed with trigger mode, switchable) lists them with time, duration, signals and rate, shows the preview, replays one through the `--open` loader and has _Live_ to go back -- see README and `docs/claude/invariants-trigger-and-pinning.md`.
|
|
- [x] (9) ~~preferences dialog~~ **done**: `src/settings.{hpp,cpp}` (the store: load/save/defaults, GTK-free) + `src/ui_prefs.cpp` (the dialog, opened from the overflow menu); the cache directory and keep count reach `EventStore`, the cache directory (one `events/` directory for every source, each source a folder inside) and the keep count reach `EventStore`, and relative time is a start-up default; whether anything is cached at all stays the trigger pane's own switch. The same dialog opens from the **host selection dialog** too (a `PrefsForm` has no owner, so both windows hold one), where a change still reaches the run about to start.
|
|
- user can choose evnt cache directory (default <home>/.cache/udpscope/<source>/events/)
|
|
- maximum number of events to cache
|
|
- disable completly the events storage option
|
|
- enable/disable relative time mode
|
|
- interface dark/light/auto color
|
|
- defaults
|
|
- other parameters
|
|
|
|
10. [ ] move the interface into `.ui` resources, and to current GTK4/libadwaita widgets while doing it:
|
|
- the shortcut overview is **done** (`src/ui/shortcuts.ui`, with the mouse gestures drawn as icons, and `[help]`'s `ui=` against `tables=` as the guard)
|
|
- the preferences are **done** (`src/ui/preferences.ui`: `AdwPreferencesDialog` with `AdwEntryRow`/`AdwSpinRow`/`AdwSwitchRow`/`AdwComboRow`, applying as they change, no Apply button)
|
|
- next: the preferences (`AdwPreferencesDialog` + `AdwEntryRow`/`AdwSpinRow`/`AdwSwitchRow`), the help window's chrome, the source chooser and its host form, then the main window's skeleton
|
|
- plan, conventions and acceptance for each slice: `docs/superpowers/plans/2026-10-11-ui-files-and-gtk4-practice.md`
|