src/ui/main-window.ui holds the window, its two panes, the plot column with the status line under it, and the sidebar's scroller. What stays in code is what depends on the stream: the events pane, the two plot areas, the sidebar's panels and the status popover, each put into a slot by id. The header bar is deliberately not in the file. It is the window's own titlebar, every button on it is wired to an action, and an AdwApplicationWindow refuses a titlebar outright -- a fatal Adwaita-ERROR rather than a warning that leaves the window merely ugly -- so the window is a GtkApplicationWindow and the header bar stays where it was. gtk_paned_set_position() is the other thing that had to stay in code, and the reason is order rather than shape: it clamps against its children *now*, so stating it before the sidebar's panels exist moved the plot column by ~180 px. The layout, events and box-zoom probes read what they read before this change, and the header reads window_button_w=130 bar_w=756 as it always has -- checked by building the previous commit and running the same probe against it, because the layout numbers in the notes turned out to be stale from an earlier session. Five UI files now.
5.0 KiB
5.0 KiB
- (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):
- the antialisaing strategy with phosphore effect should be applied with more stregth
- the lines should be more tick
- the sample points should be bigger
- (2)
relative timingdone:--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 and previous 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)
- (3)
named configurationsdone: one directory per source holding<name>.tomlper configuration plusactive; 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. - (4)
optional udp frame storage for debugging of strange behavioursdone:--capture-packets N; see README and the design note indocs/superpowers/specs/for the ring file, the popover toggle andtools/capture_to_pcap.py. - (5)
open exported binary waveforms to view/analysedone:--open FILEand 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 anddocs/claude/invariants-data-path.md. - (6)
imporve right click menu on the plotsdone: the plot's context menu uses the main menu's row style (menu_button+.udpscope-menu, asserted byUDPSCOPE_PROBE_ROWMENU_MS: uniformlabel_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)
- (8)
add option to automatic save the last triggered acquisitions in a cache folder and let the user replay themdone: every latch is written to<cache>/<source>/events/as a.npy(the export format), a.txtsidecar and a.bmppreview 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--openloader and has Live to go back -- see README anddocs/claude/invariants-trigger-and-pinning.md. - (9)
preferences dialogdone: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 reachEventStore, the cache directory (oneevents/directory for every source, each source a folder inside) and the keep count reachEventStore, 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 (aPrefsFormhas no owner, so both windows hold one), where a change still reaches the run about to start.- user can choose evnt cache directory (default /.cache/udpscope//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
- move the interface into
.uiresources, 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]'sui=againsttables=as the guard) - the preferences are done (
src/ui/preferences.ui:AdwPreferencesDialogwithAdwEntryRow/AdwSpinRow/AdwSwitchRow/AdwComboRow, applying as they change, no Apply button) - the help window's chrome is done (
src/ui/help.ui:AdwWindow+ header bar +AdwNavigationSplitView) - the host form is done (
src/ui/source-form.ui); the source chooser's own window is next - the main window's skeleton is done (
src/ui/main-window.ui: the window, the two panes, the plot column and the status line, the sidebar's scroller); the panels inside it are the next slices - 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