diff --git a/README.md b/README.md
index b421921..87a8011 100644
--- a/README.md
+++ b/README.md
@@ -1277,7 +1277,7 @@ same reason: a frame can arrive between two layout passes, and a hole that empti
the spotlight and the card jump. The card goes under the target, over it, or in the column beside it
-- whichever has room -- and only takes the bottom corner when the target *is* the whole content,
which is what happens to the plot step in the documented headless run (a 640x480 Xvfb screen gives
-the window its 756x894 minimum, and at that width the split view overlays the side panel instead of
+the window its 756x894 minimum, and at that width the split view overlays the dock instead of
putting it beside the plot). The probe prints the two rectangles (`spot=`, `card=`) rather than
asserting a placement, so that case reads as the geometry it is.
@@ -3048,11 +3048,13 @@ now — they are listed so they are not mistaken for anything else:
trigger mode and the block would grey itself under the click that started it. (8) The **dock's event rows carry no
thumbnails** (the page's do) and show a **hollow marker on the members of the group on screen**, which the page's
rows do not. (9) The dock lists at most 24 events; the page lists them all.
- The signal badges, the signal pages and the drag (step 2) are done. Still to come, in the spec's
- order: `USER-GUIDE.md` and the manual's figures (4). The events section in the dock and the `events`
- page are done, and the left events pane, its divider and the header's Events toggle are deleted. Until
- the manual is swept, it (which still describes the side panel's tabs, and the cursors, measurements
- and events as panes of it) still describes the previous layout.
+ The signal badges, the signal pages and the drag (step 2) are done, and so are the events block in the
+ dock and the `events` page (the left events pane, its divider and the header's Events toggle are
+ deleted), the Mallard manual, `USER-GUIDE.md` and the two figures that show the window
+ (`main-window.png`, `trigger-capture.png`, regenerated with `tools/make-help-shots.sh`). The
+ manual's `math-editor.png` is the editor's own window and was not regenerated.
+ The main-window figure shows `'sine' is off: 1 trace left the plots` in the status bar and no sine
+ badge: the headless enable-all probe that drives the scene ends that way, and the figure records it.
- **A plot holds at most eight signals** (`RowSet::kSlotsPerRow`), because a `Plot`
cannot give up a trace and the slots are therefore created up front.
- **One toggle drives both cursor orientations.** The vertical markers and the
@@ -3187,7 +3189,7 @@ silence timeout and then resumes, which is the EMI case end to end.
- **The tour card can cover its own target, and in the documented headless run it
does.** The card is placed under, over or beside the hole whenever one of those has
room; when the target covers the whole content -- which is what the plot does at the
- window's 756 px minimum, because the split view overlays the side panel rather than
+ window's 756 px minimum, because the split view overlays the dock rather than
putting it beside the plot -- no placement can avoid it, and the card takes the
bottom corner. The probe prints both rectangles instead of asserting a placement,
so the case reads as a measurement.
diff --git a/docs/USER-GUIDE.md b/docs/USER-GUIDE.md
index 81451dd..0e80b76 100644
--- a/docs/USER-GUIDE.md
+++ b/docs/USER-GUIDE.md
@@ -6,9 +6,22 @@ what was built and why, and `SPECS.md` is the requirement document.

-*The main window with a source streaming: the signal panel on the right, the plot in the middle, the
-status line directly under it, and the toolbar above. The window control — `2 s` — is the first thing
-on the left.*
+*The main window with a source streaming: the header bar above (the window control — `2 s` — first on
+the left), the plot, the badge bar under it with one badge per signal, the status line at the foot, and
+the dock on the right with the cursor and measurement readouts and the events block.*
+
+The window is a plot with three things around it:
+
+- the **badge bar** under the plot: a badge for each signal you have switched on, a `+` to add one
+ (past six they fold into one `N signals` badge), and, on the right, **Trigger** and — only for a
+ source with controls of its own — **Source**;
+- the **side panel**, which a badge opens over the plot's right edge, one page at a time: the trigger,
+ a signal, the list of signals to add, the cursors, the measurements, the events, or a source's own
+ controls. A second click on the badge, `Esc`, **Close** or a click on the plot closes it, and it
+ never resizes the plot;
+- the **dock** on the right, which the dock button in the header bar (`s`) shows and hides: read-only
+ **Readouts** of the cursors and of the measurements, each with an **Edit** button that opens its
+ page, and an **Events** block.
## 1. Connecting
@@ -30,7 +43,7 @@ Every launch is its own process, so running two scopes side by side is fine.
## 2. The status line
-Directly under the plot, it reads `● · · `, and the ⓘ beside it opens the
+At the foot of the window, under the badge bar, it reads `● · · `, and the ⓘ beside it opens the
detail: packets, frames, gaps, per-channel sample counts, the buffer's span and its decimation.
- **The state word is one word** from a fixed set: `live`, `paused`, `armed`, `capturing`,
@@ -44,14 +57,16 @@ detail: packets, frames, gaps, per-channel sample counts, the buffer's span and
## 3. Signals
-The signal panel lists every signal the CONFIG described, with a switch each. **Signals start
-disabled — enabling one is what starts acquiring it**, and a signal nobody enables costs nothing.
-Drag a signal from the panel onto a plot row to add a trace; drag it again to another row to plot the
-same signal twice. The colour is per *signal*, so the same signal is the same colour wherever it
-appears.
+The **`+` badge** (or `g`) opens the **Signals** page, which lists what can be added: the signals the
+CONFIG described that are not acquired yet, each with a tick. **Signals start disabled — ticking one
+is what starts acquiring it**, and a signal nobody enables costs nothing. Its badge then appears in
+the badge bar. Drag the badge onto a plot row to add a trace; drag it again to another row to plot
+the same signal twice, or onto another badge to reorder the badges. The colour is per *signal*, so
+the same signal is the same colour wherever it appears.
-The panel also holds the per-signal calibration: gain and offset, applied at ingest, so the
-measurements and the export carry the same numbers the plot shows.
+Clicking a signal's badge opens its own page: the colour, **Plot on** buttons for the rows, and
+**Calibrate** — gain and offset, applied at ingest, so the measurements and the export carry the same
+numbers the plot shows.
## 4. The window and navigation
@@ -83,8 +98,9 @@ should look like.
*Single mode with a capture held: the axis is the event's own `[-pre, +post]`, the trigger marker
sits at the edge, and the status line reads `event held`.*
-The trigger panel has the edge, the pre/post split (as a share of the event span), Normal or Single,
-and Arm/Disarm. Selecting a signal for the trigger enables it.
+The trigger button in the header bar (`t`) turns trigger mode on. The **Trigger** badge opens the
+trigger page, which has the signal, the condition, the edge, the pre/post split (as a share of the
+event span), Normal or Single, and Arm/Disarm. Selecting a signal for the trigger enables it.
- **While a capture fills** the plot keeps drawing live data on the event's clock, so the post side
fills in view; the axis does not move.
@@ -94,6 +110,10 @@ and Arm/Disarm. Selecting a signal for the trigger enables it.
when you disarm is the picture you keep.
- The event window is counted in **stream seconds** end to end, so a source whose clock advances in
jumps still gets the window it asked for.
+- **Events.** With *record events* on (trigger page), each latch is stored. The dock's **Events** block
+ lists them newest first and **one click replays** one; **Manage** opens the full list as a page,
+ where a click selects, a double click replays, and **Compare**, **Accumulate** and **Live** act on
+ the selection or go back to the stream. The block is dimmed until something is recorded.
## 6. Pause
@@ -104,22 +124,24 @@ does not walk it off its snapshot.
## 7. Cursors
-The cursors toolbar toggle switches on two instruments per row:
+The cursors toggle in the header bar (`c`) switches on two instruments per row:
- **vertical** — two times, shared by every row;
- **horizontal** — two rulers per row;
- **both** — the two together;
- **mix** — the two times, read off each *trace* where they cross it.
-The pane beside it reports each trace's values at the markers, and **Reset** puts them back at the
-window's edges. Values read `--` when a marker is past the newest sample and `partial` when only one
+The dock reports each trace's values at the markers; **Edit** beside **Cursors** opens the page with
+the mode and **Reset**, which puts them back at the window's edges. Values read `--` when a marker is past the newest sample and `partial` when only one
marker is over data.
## 8. Measurements
-The measurements pane computes statistics of the **visible window** of a signal: average, top,
-bottom, min, max, peak to peak, amplitude, pulse duration, period and frequency. `+` adds one, the
-row's pencil edits it, and **show on plot** draws its result as a ruler (levels) or markers (times).
+A measurement is a statistic of the **visible window** of a signal: average, top, bottom, min, max,
+peak to peak, amplitude, pulse duration, period and frequency. `m`, or **Edit** beside
+**Measurements** in the dock, opens the page; its `+` adds one, a click on a row (in the page or in
+the dock) edits it, and **show on plot** draws its result as a ruler (levels) or markers (times).
+The dock shows each measurement's value.
`top` and `bottom` take a *split* as a share of the window's own range — the percentage travels
between signals where a threshold in volts would not. `period` and `frequency` deliberately have no
@@ -127,7 +149,7 @@ split: they count rising crossings of the mid level, one edge per cycle, and a s
setting you can only get wrong.
The values are refreshed on a cadence — at most every 100 ms while the window is scrolling, once when
-it stops, and once per mode change — so a live view cannot cost you frames. The pane's cost is
+it stops, and once per mode change — so a live view cannot cost you frames. The cost is
reported in the exit dump with the app's self-check.
## 9. Math channels
@@ -139,13 +161,14 @@ the square on the right. The orange dot marks the node that carries the channel'
A math channel is derived from the others and is then an ordinary channel: enable it and it is
acquired, plotted, measured and exported like a streamed signal, and another math channel can use it
-as a source.
+as a source. The **Signals** page lists them under a `MATH` heading whose `+` creates one; a math
+channel's own page has **Edit graph** and **Delete**.
Operations: `channel` (a source), `gain + offset`, `abs`, `sqrt`, `clamp`, `low pass`, `high pass`,
`band pass` (biquads, corner in Hz against the stored rate), `sum`, `difference`, `product`, `ratio`.
- **Click** a node to select it; its parameters appear in the form beside the canvas.
-- **Click an output square, then an input square**, to wire them. An input is only offered the nodes
+- **Drag from an output square to an input square** to wire them. An input is only offered the nodes
above it — the graph is a list walked in order, so a cycle cannot be drawn.
- **Drag** a box to move it. **add node**, **delete node** and **set as output** are below the form.
- The **output is the last node** of a graph you build top to bottom, and the orange dot says which;
diff --git a/docs/img/main-window.png b/docs/img/main-window.png
index c8fa754..f626603 100644
Binary files a/docs/img/main-window.png and b/docs/img/main-window.png differ
diff --git a/docs/img/trigger-capture.png b/docs/img/trigger-capture.png
index 5159e8f..cf2c563 100644
Binary files a/docs/img/trigger-capture.png and b/docs/img/trigger-capture.png differ
diff --git a/help/C/org.udpscope.app/cursors.page b/help/C/org.udpscope.app/cursors.page
index 6d51f0b..b02eb20 100644
--- a/help/C/org.udpscope.app/cursors.page
+++ b/help/C/org.udpscope.app/cursors.page
@@ -22,12 +22,13 @@
How to reach it
-
Press the cursors button in the toolbar, or c.
+
Press the cursors button in the header bar, or c. It switches the cursors on
+ and off.
-
The readings are in the side panel (a read-only copy) and in the cursors panel, which
- Edit beside Cursors opens over the plot and which owns a
- Reset button. Drag a marker to move it.
+
The readings are in the dock (a read-only copy) and on the Cursors page, which
+ Edit beside Cursors opens over the plot and which owns the mode
+ and a Reset button. Drag a marker to move it.
The mode dropdown offers four modes: vertical (the shared time pair),
diff --git a/help/C/org.udpscope.app/figures/main-window.png b/help/C/org.udpscope.app/figures/main-window.png
index 449791c..f626603 100644
Binary files a/help/C/org.udpscope.app/figures/main-window.png and b/help/C/org.udpscope.app/figures/main-window.png differ
diff --git a/help/C/org.udpscope.app/figures/trigger-capture.png b/help/C/org.udpscope.app/figures/trigger-capture.png
index 299392e..cf2c563 100644
Binary files a/help/C/org.udpscope.app/figures/trigger-capture.png and b/help/C/org.udpscope.app/figures/trigger-capture.png differ
diff --git a/help/C/org.udpscope.app/math.page b/help/C/org.udpscope.app/math.page
index 0e207ec..8f7cbd5 100644
--- a/help/C/org.udpscope.app/math.page
+++ b/help/C/org.udpscope.app/math.page
@@ -22,10 +22,12 @@
How to reach it
-
Press the math button in the toolbar, or g.
+
Open the Signals page (the + badge, or g). Math channels
+ are listed under a MATH heading.
-
The pane's + adds a channel, and opening one shows the graph editor:
+
The heading's + adds a channel. Edit graph, on a channel's page,
+ shows the graph editor:
nodes as boxes, click a box to select it and edit its parameters beside the canvas.
@@ -53,7 +55,7 @@
above it. A wire drawn right to left re-sorts the list silently so the graph
stays valid. A cycle is unrepresentable: the connection is refused rather than created,
and the line beneath the form says why — a loop, or a node asked to read itself.
-
A derived channel is a channel. It appears in the signal panel, can be
+
A derived channel is a channel. It is listed with the signals, gets a badge once computed, can be
plotted, measured, exported, and used as a source for another math channel.
The math runs on the stored samples — decimated and averaged — so a
cutoff you type in Hz means the rate the filter will actually run at. Change the window
diff --git a/help/C/org.udpscope.app/measurements.page b/help/C/org.udpscope.app/measurements.page
index 5f0add6..c6f19e0 100644
--- a/help/C/org.udpscope.app/measurements.page
+++ b/help/C/org.udpscope.app/measurements.page
@@ -28,10 +28,12 @@
How to reach it
-
Press m, or Edit beside Measurements in the side panel.
+
Press m, or Edit beside Measurements in the dock. Either opens the
+ Measurements page over the plot; the dock itself shows each measurement's value,
+ and a click on one opens its dialog.
-
The panel's + adds one; clicking a row opens the dialog where the signal,
+
The page's + adds one; clicking a row opens the dialog where the signal,
the type, the threshold share or shares and the on-plot marks are set, with
Save and Delete.
diff --git a/help/C/org.udpscope.app/overview.page b/help/C/org.udpscope.app/overview.page
index de4e796..0d35572 100644
--- a/help/C/org.udpscope.app/overview.page
+++ b/help/C/org.udpscope.app/overview.page
@@ -4,7 +4,7 @@
- What udpscope plots, the four parts of the window, and one pass through the
+ What udpscope plots, the parts of the window, and one pass through the
application from connecting to saving.Martino Ferrari
@@ -34,11 +34,12 @@
The udpscope window
- The header bar above the plots, the side panel on the right, and the status bar
- along the bottom.
+ The header bar above the plots, the badge bar and the status bar under them, and
+ the dock on the right.
-
One figure of three rows with four signals enabled, the Measure tab open in the
- side panel, and the status bar reading live.
+
One figure of three rows with three signals plotted, a badge for each in the badge
+ bar, the dock with its readouts and its events block, and the status bar reading
+ live.
@@ -55,7 +56,7 @@
The signals arrive disabled. Nothing is acquired until you turn one on in the
signal list, and enabling is what starts acquisition — so a freshly opened scope with an
- idle side panel is working correctly, not failing to connect. For the same reason a start
+ empty badge bar is working correctly, not failing to connect. For the same reason a start
that has enabled nothing prints no buffer allocated: line on stderr.
@@ -81,32 +82,48 @@
The header bar
-
Left to right: the time window (2 s), the trigger and the pause, the
- events, cursors and side-panel switches, and the menu, which holds
- Fit to data, the Layout editor, Export,
- Keyboard shortcuts, Help and About.
-
-
- The side panel
-
A read-only copy of the cursors and of the measurements; the Edit button
- beside each heading opens that instrument's full panel over the plot. The channel
- list and the trigger are panels of their own, opened from the badge bar and the
- toolbar, where a math channel is a row of the one list under a MATH
- heading whose + creates one. One row per channel: its colour, an enable
- switch, its name and its unit. A channel's badge in the badge bar is dragged onto a
- plot row.
+
Left to right: the time window (2 s), the trigger and the pause; then, on
+ the right, the cursors switch, the dock switch and the menu, which holds
+ Fit to data, the Layout editor, Export visible range,
+ Configurations, Help, Preferences and
+ About. The trigger button turns trigger mode on and off; the trigger's
+ settings are in the panel its badge opens.
The plot
Up to eight rows, each with its own y axis and up to four traces, all on one shared
time axis. Right-click a row for its own menu (fit, add a signal, remove a trace).
+
+ The badge bar
+
The strip under the plot. On the left, one badge for each signal you have switched
+ on, then a +; past six signals they fold into a single N signals
+ badge. On the right, Trigger, which names the trigger's state, and Source, which is there only when the
+ source has controls of its own. A badge opens its page in the panel described next;
+ a signal's badge is also what you drag onto a row.
+
+
+ The side panel over the plot
+
One panel, 360 px wide, slides over the plot's right edge and shows one page at a
+ time: the trigger, a signal's colour, calibration and rows, the list of signals to
+ add, the cursors, the measurements, the events, or a source's own controls. It closes
+ with a second click on the badge that opened it, with Esc, with
+ Close, or with a click on the plot, and it never resizes the plot.
+
+
+ The dock
+
The column on the right, which the dock button in the header bar (s)
+ shows and hides. Its Readouts are a read-only copy of the cursors and of
+ every measurement; Edit beside each heading opens that instrument's full
+ page. Under them, Events lists the captured events, newest first; a click
+ replays one and Manage opens the full list.
+ The status bar
-
Directly above the plot's bottom edge — the state word, the stored sample rate and
+
The last line, under the badge bar — the state word, the stored sample rate and
the window, and the ⓘ beside it for packets, gaps and the buffer's own figures. The
- second screenshot below is what a held capture looks like: event held, the
- axis pinned to the event, and the trigger marker at the edge.
+ second screenshot below is what a capture looks like: the trigger marker at the edge
+ and the axis pinned to the event.
@@ -129,12 +146,12 @@
and port.
-
Enable a signal in the Add a signal page (the + badge). The plot stays empty for the first
+
Enable a signal in the Signals page (the + badge, or g). The plot stays empty for the first
fraction of a second while the first window fills — the buffer holds only what has
arrived.
-
Drag it onto a row. Drop a second signal on another row, or the same
+
Drag its badge onto a row. Drop a second signal on another row, or the same
signal again for a second view of it. The colour is per signal, so it is the same one
wherever it appears.
@@ -154,8 +171,10 @@
got.
-
Measure it — the measurements pane computes a statistic of the visible
- window, and show on plot marks it as a ruler or a pair of markers.
+
Measure it — press m, or Edit beside
+ Measurements in the dock. A measurement is a statistic of the visible
+ window, its value is shown in the dock, and show on plot marks it as a
+ ruler or a pair of markers.
Save the data with Export visible range, which writes the
diff --git a/help/C/org.udpscope.app/pause.page b/help/C/org.udpscope.app/pause.page
index 9f8dbe3..5659e70 100644
--- a/help/C/org.udpscope.app/pause.page
+++ b/help/C/org.udpscope.app/pause.page
@@ -22,7 +22,7 @@
How to reach it
-
Press the pause button in the toolbar, or Space.
+
Press the pause button in the header bar, or Space.
Press it again to resume, which rebinds the live ring and puts the window back on
diff --git a/help/C/org.udpscope.app/sessions.page b/help/C/org.udpscope.app/sessions.page
index 5a37359..615b52a 100644
--- a/help/C/org.udpscope.app/sessions.page
+++ b/help/C/org.udpscope.app/sessions.page
@@ -57,7 +57,7 @@
What a configuration persists: the time window, the rows and each row's slot
signals, the calibration, the trace colours, which signals were enabled, the math
- channels with their graphs, the measurements pane — and the startup settings: samples
+ channels with their graphs, the measurements — and the startup settings: samples
per signal, relative time and the packet capture's ring size.
Signal identity is the name throughout, because a new CONFIG renumbers
the channels.
diff --git a/help/C/org.udpscope.app/signals.page b/help/C/org.udpscope.app/signals.page
index 5ca7b67..500af40 100644
--- a/help/C/org.udpscope.app/signals.page
+++ b/help/C/org.udpscope.app/signals.page
@@ -23,11 +23,15 @@
How to reach it
-
Open the side panel (s), which lists every signal with a switch.
+
Click the + badge in the badge bar, or press g. The
+ Signals page lists what can be added — the signals the source declares that
+ are not acquired yet, each with a tick that acquires it. Past six acquired signals the
+ badges fold into one N signals badge, and the page then lists every signal.
-
The Signal list item in the overflow menu opens the editor where the
- unit and the calibration live.
+
Once a signal is acquired its badge appears. Click it to open that signal's page: its
+ colour, Plot on buttons for the rows, and Information and
+ Calibrate, where the signal's details and its calibration live.
@@ -38,7 +42,7 @@
Signals start disabled, and enabling one is what starts acquiring it. A trigger
on a signal nobody acquires can never fire, so arming a trigger enables its signal for
you.
-
Calibrate in a signal's row menu opens the gain and offset it is
+
Calibrate on a signal's page opens the gain and offset it is
currently drawn through, so a trace already scaled by a gain of 2 shows 2 —
pressing Apply confirms it rather than resetting it. A signal nobody
calibrated shows the identity, 1 and 0.
@@ -51,12 +55,12 @@
refuses to put it in a row rather than binding a trace that would read nothing for
ever.
A signal's colour follows the signal, not the slot, so the same signal
- on two rows is one colour and the side panel's chip identifies it unambiguously. A
- signal on no row gets a grey chip rather than none, so the panel's rows keep their
- height.
-
Click a coloured chip to change that signal's colour. A grey chip
- names no trace, so it is not clickable. The colour is saved with the session;
- Default colour in the signal's ⋯ menu gives the palette entry back.
+ on two rows is one colour, and the dot on its badge shows it. A signal on no row gets a
+ grey dot rather than none.
+
Change a signal's colour with Change colour on its page; a
+ signal on no row has no trace to colour, so the button is dimmed. The colour is saved
+ with the session; Default colour on the same page gives the palette entry
+ back.
diff --git a/help/C/org.udpscope.app/status.page b/help/C/org.udpscope.app/status.page
index 5a0ad46..3360273 100644
--- a/help/C/org.udpscope.app/status.page
+++ b/help/C/org.udpscope.app/status.page
@@ -18,7 +18,7 @@
How to reach it
-
The bar is always visible under the plot. Click ⓘ for the detail popover.
+
The bar is always visible at the foot of the window, under the badge bar. Click ⓘ for the detail popover.
diff --git a/help/C/org.udpscope.app/trigger.page b/help/C/org.udpscope.app/trigger.page
index 60f0f75..60bf4e6 100644
--- a/help/C/org.udpscope.app/trigger.page
+++ b/help/C/org.udpscope.app/trigger.page
@@ -23,15 +23,16 @@
How to reach it
-
The trigger button in the toolbar (t) reveals the trigger panel: the
- signal, the level, the shape, the edge (rising, falling, either), the mode (Normal or
- Single) and the pre-trigger share.
+
Click the Trigger badge at the right of the badge bar to open the
+ trigger page: the signal, the level, the shape, the edge (rising, falling, either), the
+ mode (Normal or Single) and the pre-trigger share. The trigger button in the header bar
+ (t) turns trigger mode on and off; it does not open the page.
Arm starts watching; a arms and disarms from the keyboard.
- When the pane is locked with its [edit] button — so that it states what the
+ When the page is locked with its edit button — so that it states what the
trigger is set to instead of showing the controls — Arm/Disarm is in its
- heading, and the trigger can be armed or disarmed without unfolding the panel. It is
+ heading, and the trigger can be armed or disarmed without unfolding the page. It is
offered only while trigger mode is on, because a trigger that is off has no engine to
arm.
@@ -170,29 +171,32 @@
Every triggered acquisition is kept. Latches are written to the event cache
(~/.cache/udpscope/events/<source>/) as a .npy of the
event, a .txt of what it was, and a .bmp picture drawn from the
- samples. The Events pane on the left — opened from the toolbar's
- event-history button, which appears while recording is enabled, and collapsed until you
- ask for it — lists the last 32 newest first (time, duration, signals, rate), each row with
- its own picture beside the numbers.
+ samples. The Events block at the foot of the dock lists them, newest first, one
+ short row each: a marker for the event on screen, its title and its number. It is dimmed
+ until recording is on, an event is stored or one is being replayed. Manage
+ beside its heading opens the Events page over the plot, which keeps the last 32
+ (time, duration, signals, rate), each row with its own picture beside the numbers.
-
Clicking a row replays it: the stored event is loaded exactly like an exported
+
Clicking a row in the dock replays it: the stored event is loaded exactly like an exported
file, without changing the layout — the rows, the colours, the window, the
cursors and the measurements stay where they are and read the stored data instead. A
- replay leaves trigger mode, because a file has no edge to wait for, and the pane stays
- open. Drag the pane's edge to resize it. Live goes back to the stream; the
- status bar names the file until you do.
+ replay leaves trigger mode, because a file has no edge to wait for. Live, on the
+ Events page, goes back to the stream; the status bar names the file until
+ you do.
-
Select two or more events in the list and the two buttons under the header act on them:
+
On the Events page, select two or more events in the list and the two buttons
+ under its header act on them:
Compare puts two events in two plots side by side, keeping the layout you have
— one plot per event, the axes synchronised, so zooming a row in one zooms the same row in
the other — and Accumulate overlays up to four of them in the same traces,
translucent, so where they agree the trace is brighter. Your own traces stay where they
- are in both. They need events with the same signals and the same length. A single click
- selects, a double click replays.
+ are in both. They need events with the same signals and the same length. On this page a
+ single click selects and a double click replays.
-
Record events, in the trigger panel with the trigger's other options, is
+
Record events, on the trigger page with the trigger's other options, is
what decides whether anything is kept. It is off by default — nothing is written
- to disk until you ask — and with it off the history button goes with it.
+ to disk until you ask — and with it off, and nothing stored, the dock's events block and
+ the page stay dimmed.
diff --git a/tools/make-help-shots.sh b/tools/make-help-shots.sh
index 6b49ec3..411a7ea 100755
--- a/tools/make-help-shots.sh
+++ b/tools/make-help-shots.sh
@@ -18,9 +18,9 @@
# * `xdotool search --name udpscope` finds nothing: GTK4 sets no WM_NAME on the X window it
# creates, so windows are found by their geometry, not their name.
#
-# Box provenance: the sidebar width is read from the app's own probe dump (`side=NNNx`), so the
-# side-panel box tracks the real widget; the header and status bands are the table in
-# `window_boxes` below, each named where it is used, because the dump reports neither.
+# Box provenance: the dock's width is read from the app's own probe dump (`side=NNNx`), so the
+# dock box tracks the real widget; the header, badge-bar and status bands are the table below,
+# each named where it is used, because the dump reports none of them.
#
# Usage: tools/make-help-shots.sh [OUTPUT_DIR] (default help/C//figures)
set -euo pipefail
@@ -41,23 +41,29 @@ done
mkdir -p "$out"
# --- the window's own geometry, and the boxes it is annotated with -------------
-# main-window.ui asks for 1280x800, and the sidebar is a fixed 320 px
-# (sidebar-width-unit=px, min=max=320). The header bar is the window's titlebar and the status
-# row sits at the foot of the plot column; neither reports a pixel height, so their bands are
-# the third measurement -- a pixel scan of a grab, 51 px and 43 px on the current theme -- and
-# are refreshed by re-measuring if the styling changes.
+# main-window.ui asks for 1280x800, and the dock is a fixed 280 px (the split view's sidebar,
+# min=max=280), leaving a 1000 px plot column. The header bar is the window's titlebar, and the
+# badge bar and the status row sit at the foot of the plot column, the badge bar over the status
+# row; none of them reports a pixel height, so their bands are a pixel scan of a grab -- 51 px,
+# 36 px and 43 px on the current theme -- and are refreshed by re-measuring if the styling
+# changes. The plot is what is left between the header and the badge bar.
WIN_W=1280
WIN_H=800
HEADER_H=51
+BADGES_H=36
STATUS_H=43
-PLOT_W=952
+PLOT_W=1000
+PLOT_H=$((WIN_H - HEADER_H - BADGES_H - STATUS_H))
+BADGES_Y=$((HEADER_H + PLOT_H))
+STATUS_Y=$((BADGES_Y + BADGES_H))
boxes_main="header bar:0:0:$WIN_W:$HEADER_H
-side panel:SIDE_X:$HEADER_H:SIDE_W:706
-plot:0:$HEADER_H:$PLOT_W:706
-status bar:0:757:$PLOT_W:$STATUS_H"
-boxes_trigger="event held, axis pinned to the event:0:757:$PLOT_W:$STATUS_H
-the trigger marker at x = 0:0:$HEADER_H:$PLOT_W:706"
+plot:0:$HEADER_H:$PLOT_W:$PLOT_H
+badge bar:0:$BADGES_Y:$PLOT_W:$BADGES_H
+dock:SIDE_X:$HEADER_H:SIDE_W:$((WIN_H - HEADER_H))
+status bar:0:$STATUS_Y:$PLOT_W:$STATUS_H"
+boxes_trigger="event held, axis pinned to the event:0:$STATUS_Y:$PLOT_W:$STATUS_H
+the trigger marker at x = 0:0:$HEADER_H:$PLOT_W:$PLOT_H"
boxes_math="the graph editor:8:8:EW-24:EH-24"
display=
@@ -88,6 +94,10 @@ export GDK_BACKEND=x11 GSK_RENDERER=cairo LIBGL_ALWAYS_SOFTWARE=1
tmp=$(mktemp -d)
trap 'cleanup; rm -rf "$tmp"' EXIT
export XDG_CONFIG_HOME="$tmp/config" XDG_CACHE_HOME="$tmp/cache" XDG_DATA_HOME="$tmp/data"
+# A first run starts the guided tour 1.5 s in, and a tour card over the plot is not what the figures
+# show: say the tour has been offered, the way a second run of the app would find it.
+mkdir -p "$XDG_CONFIG_HOME/udpscope"
+printf 'tour_seen = true\n' >"$XDG_CONFIG_HOME/udpscope/settings.toml"
python3 "$mock" --port "$port" --rate 10000 --batch 100 >"$tmp/mock.log" 2>&1 &
mock_pid=$!
@@ -136,14 +146,14 @@ stop_app() {
app_pid=
}
-side_of_dump() { # LOGFILE -> the sidebar width the app reports, else the table's 320
+side_of_dump() { # LOGFILE -> the dock width the app reports, else the table's 280
local s
s=$(grep -o 'side=[0-9]*x' "$1" 2>/dev/null | head -1 | grep -o '[0-9]*' || true)
- echo "${s:-320}"
+ echo "${s:-280}"
}
# annotate NAME RAW LOG BOXES W H -> the figure, with a numbered box per line of BOXES.
-# A box is `label:x:y:w:h`; `SIDE_X`/`SIDE_W` are the sidebar's own numbers, `EW`/`EH` the
+# A box is `label:x:y:w:h`; `SIDE_X`/`SIDE_W` are the dock's own numbers, `EW`/`EH` the
# grabbed window's width and height.
annotate() {
local name=$1 raw=$2 log=$3 boxes=$4 win_w=$5 win_h=$6