docs: split rows share one y axis
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
b8177cc25a
commit
fa9f0c6da9
8 files changed
+86
-40
No files matched your search
@@ -281,6 +281,28 @@ Cell widths use the height scheme: a floor of **64 px logical** per cell, the we
|
||||
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
|
||||
(every other plot gets `XStrip::None`), and 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
|
||||
(`docs/superpowers/specs/2026-11-03-split-shared-y-design.md`):
|
||||
|
||||
- `Figure::set_share_row_y(bool)`, default off so every existing figure and `tests/test_figure.cpp`
|
||||
read as before; the host turns it on in `RowSet::rebuild_all()` before the cells are populated. When
|
||||
on, the cells of each figure row form an implicit y link group, rebuilt with the cells.
|
||||
- Link semantics: `layout()` runs a `sync_y_links()` that adopts a member's changed `y_range` as the
|
||||
group's and pushes it to the others, so a wheel, pan, box zoom or axis drag (all `set_y_range`) needs
|
||||
no controller change; a manual `set_y_range` on a member clears the group's auto flag. A member's own
|
||||
autoscale is suppressed and the group owns the flag: it fits to the union of its members' visible
|
||||
traces (cells with no trace are ignored; a log axis takes the union in axis space), and `fit_all` and
|
||||
a double-click fit the group, not one cell. The group only follows on a laid-out frame, so a caller
|
||||
that sets a range or a fit and reads it back needs one `layout()` in between.
|
||||
- `YStrip {Both, None}` and `Plot::set_y_strip_mode`, mirroring `XStrip`: `None` forces the y label
|
||||
width, title width and reserved floor to 0. `Figure::layout` sets `None` on every cell but the first
|
||||
of its row, structurally from the column index and never from content, and skips `None` cells in the
|
||||
common-gutter maximum. A y axis drag can therefore start only in the leftmost cell.
|
||||
- **Cell placement is by plot width**: the row's y gutter comes off the row width first, then the cells
|
||||
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
|
||||
still tile the row exactly.
|
||||
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
|
||||
the `figure_cell*` cases in `tests/test_figure.cpp` and `glfw_host_routes_by_cell`.
|
||||
|
||||
Reference in new issue
Block a user