Feature/source plugins #1

Merged
martino merged 130 commits from feature/source-plugins into main 2026-11-04 07:35:21 +01:00
5 changed files with 26 additions and 10 deletions
Showing only changes of commit 0c228c4822 - Show all commits

No files matched your search

+1 -1
+2 -2
View File
@@ -90,8 +90,8 @@ Every plot shares **one time window**: panning or zooming in any of them moves t
sits at the same time in each, and the vertical cursors are the same two times in each. The plots of a split sits at the same time in each, and the vertical cursors are the same two times in each. The plots of a split
row also share **one y range**: the y labels are drawn at the left of the first plot only, the row also share **one y range**: the y labels are drawn at the left of the first plot only, the
horizontal rulers are the same two values in every plot, and a y zoom, pan, fit or fixed range in any of horizontal rulers are the same two values in every plot, and a y zoom, pan, fit or fixed range in any of
them applies to the whole row. Only the bottom row shows the time them applies to the whole row. The time labels sit under the bottom row, and
labels. A plot of a split row is named by its row and a letter, `2a` to `2d`: that is what the signals under any row above it whose columns differ from the row below. A plot of a split row is named by its row and a letter, `2a` to `2d`: that is what the signals
page's **Plot on** buttons and the status line call it, and a signal dragged page's **Plot on** buttons and the status line call it, and a signal dragged
from its badge goes onto the plot under the pointer. The arrangement is saved per source, and a session from its badge goes onto the plot under the pointer. The arrangement is saved per source, and a session
saved before rows could be split opens with one plot per row, as it was. saved before rows could be split opens with one plot per row, as it was.
+11 -2
View File
@@ -279,8 +279,12 @@ number of *figure rows* (the host's `RowSet::row_count()` is the plot count, `fi
rows). `plot(i)`, `link_x()` and the crosshair's hovered index all take the **flattened** plot index. rows). `plot(i)`, `link_x()` and the crosshair's hovered index all take the **flattened** plot index.
Cell widths use the height scheme: a floor of **64 px logical** per cell, the weights share the rest, Cell widths use the height scheme: a floor of **64 px logical** per cell, the weights share the rest,
the last cell closes the row exactly, and a figure too narrow for the floors shrinks the cells the last cell closes the row exactly, and a figure too narrow for the floors shrinks the cells
proportionally and drops the column gap. Only the bottom row's cells carry x labels and the x title proportionally and drops the column gap. The x labels and title follow the **column structure**: a row
(every other plot gets `XStrip::None`), and the left y gutter stays one maximum over the whole figure. hides its x strip (`XStrip::None`) only when the row directly below has the *same columns* (same cell
count, same normalised cell weights within 1e-4, empty weights = equal), so `[1][2]/[3][4]` has an axis
under 3 and 4 only while `[1][2]/[3]` has one under 1, 2 and 3; the rule is structural, transitive down a
chain and decided before the measurement pass (`same_columns()` in `figure.cpp`); `set_x_labels_only_on_bottom(false)`
labels every row. The left y gutter stays one maximum over the whole figure.
The cells of a figure row can **share one y range**, symmetric to the x link The cells of a figure row can **share one y range**, symmetric to the x link
(`docs/superpowers/specs/2026-11-03-split-shared-y-design.md`): (`docs/superpowers/specs/2026-11-03-split-shared-y-design.md`):
@@ -303,6 +307,11 @@ The cells of a figure row can **share one y range**, symmetric to the x link
share the rest by the existing `floor + extra * w / total` rule, the floors applying to plot widths. share the rest by the existing `floor + extra * w / total` rule, the floors applying to plot widths.
Equal weights give equal plot areas; the first cell's rect is gutter plus its plot width and the rects Equal weights give equal plot areas; the first cell's rect is gutter plus its plot width and the rects
still tile the row exactly. still tile the row exactly.
- **The right gutter belongs to the last cell.** In a shared-y split row only the last cell gets
`set_right_gutter()`; it is taken off the row beside the y gutter (capped so both fit in half the row
and never beyond the figure's right gutter) and the last cell's rect grows right by it. The gap between
two plot frames is then exactly `col_gap` rather than `col_gap` plus a gutter; unsplit rows and rows
with sharing off lay out as before (`figure_split_row_gap_*`, `figure_row_gutter_without_sharing_is_the_old_layout`).
In the GTK4 and GLFW adapters the pointer is routed by **cell rect** (`row_in(rows, x, y)`: the In the GTK4 and GLFW adapters the pointer is routed by **cell rect** (`row_in(rows, x, y)`: the
containing cell, else the nearest by squared distance), one `input::Controller` per plot. The tests are containing cell, else the nearest by squared distance), one `input::Controller` per plot. The tests are
+10 -3
View File
@@ -134,9 +134,16 @@ Part of [CLAUDE.md](../../CLAUDE.md). These are rules that cost a defect to lear
per figure row**: `row N` with N the 1-based figure row for a split row, and the 0-based plot index per figure row**: `row N` with N the 1-based figure row for a split row, and the 0-based plot index
for an unsplit row (the pane read that before splitting existed). Readouts and measurements stay per for an unsplit row (the pane read that before splitting existed). Readouts and measurements stay per
trace and per plot index; only the axis is shared. trace and per plot index; only the axis is shared.
- **Bottom-row x labels only.** The plotter gives every plot that is not in the last figure row - **The x axis is the bottom row's for every run of rows with the same columns.** A figure row gets
`XStrip::None`; the cells of the bottom row each keep their strip, so a middle-drag on the axis `XStrip::None` only if the row directly below has the same columns (same cell count and same
works in any of them. The `t0` caption goes on those cells too. normalised cell weights); a row whose columns differ keeps its own strip under each of its cells
(`[1][2]/[3]` has axes on 1, 2 and 3), because the axis below is at another width and scale. The
rule is structural and transitive, never a function of content. Every cell that carries a strip is
a place a middle-drag on the axis works. The `t0` caption belongs on every cell that carries a strip,
not only the last figure row's.
- **The right gutter is the last cell's.** In a split row with a shared y the plotter gives
`right_gutter` to the last cell alone and takes it off the row like the y gutter, so the visible gap
between two plots is `col_gap` and equal weights give equal axes widths.
- **One left gutter, on the first cell only.** The y gutter is one maximum for the whole figure with the - **One left gutter, on the first cell only.** The y gutter is one maximum for the whole figure with the
same reserved floor as before (`Figure::set_min_y_gutter()`). It is carried by the first cell of each same reserved floor as before (`Figure::set_min_y_gutter()`). It is carried by the first cell of each
row alone: `Figure::layout` gives every other cell `YStrip::None` from its column index (structurally, row alone: `Figure::layout` gives every other cell `YStrip::None` from its column index (structurally,
+2 -2
View File
@@ -59,8 +59,8 @@
panning along time in any of them moves all of them, and the vertical cursors are drawn in panning along time in any of them moves all of them, and the vertical cursors are drawn in
every plot. The plots of a split row also share one y range: the y labels are drawn at the every plot. The plots of a split row also share one y range: the y labels are drawn at the
left of the first plot only, the horizontal cursors sit at the same values in every plot, and a left of the first plot only, the horizontal cursors sit at the same values in every plot, and a
zoom, pan, fit or fixed range in any of them applies to the whole row. Only the zoom, pan, fit or fixed range in any of them applies to the whole row. The time labels
bottom row carries the time labels. A row holds at most 4 plots and the figure at most 8 sit under the bottom row, and under any row above it whose columns differ from the row below. A row holds at most 4 plots and the figure at most 8
in total; the <gui>+</gui> buttons go grey at the limit.</p> in total; the <gui>+</gui> buttons go grey at the limit.</p>
</section> </section>