feat(plot): a figure can keep an empty band to the right of its data
`layout_.axes` reached the viewport's right edge, so the rightmost x tick label -- centred on its tick -- had half of itself outside the plot, and the newest sample's ink landed on the frame. `Plot::set_right_gutter()` reserves a band there, out of the same `1 - kMinAxesShare` allowance the label and title strips are served from, so it can no more squeeze `axes` below the half-viewport floor than they can. `Figure` sets one value on every row, the left gutter's reason: the rows' axes have to end on a common column as well as start on one. Nothing is drawn in the band, so unlike the strips it is a want and never a measurement: no measuring pass, and it cannot feed the layout's fixed point. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
58473db384
commit
bee318870f
5 files changed
+93
-1
No files matched your search
@@ -88,6 +88,11 @@ struct PlotLayout {
|
||||
/// no text backend there is no title to lay out at all and both stay 0.0f.
|
||||
f32 y_title_width = 0.0f;
|
||||
f32 x_title_height = 0.0f;
|
||||
/// The empty band kept between `axes`' right edge and the viewport's, 0.0f unless a
|
||||
/// caller asked for one (see `Plot::set_right_gutter()`). Reported because it is
|
||||
/// clamped by the same cap as the strips above, so what was asked for and what was
|
||||
/// reserved are not always the same number.
|
||||
f32 right_gutter = 0.0f;
|
||||
/// The measured legend: inside `axes`, never reserving any part of it, and empty
|
||||
/// when there is nothing to draw. It is measured with the same text backend the
|
||||
/// strips above are, and against the same `axes` rect the caller reads back, so
|
||||
@@ -640,6 +645,20 @@ class Plot {
|
||||
}
|
||||
f32 min_y_gutter() const noexcept { return min_y_gutter_; }
|
||||
|
||||
/// An empty band reserved between `axes`' right edge and the viewport's, in device
|
||||
/// pixels. 0.0 -- the default -- is what the layout has always done: `axes` reaches
|
||||
/// the viewport's right edge, which leaves the rightmost x tick label, *centred* on
|
||||
/// that edge, half of it to be drawn in and nothing to draw it in -- and puts the
|
||||
/// newest sample's ink on the frame. It is the mirror of the left gutter in purpose
|
||||
/// and not in kind: nothing is drawn here, so there is nothing to measure and the
|
||||
/// value is the caller's to choose. Reserved inside the same cap as the label and
|
||||
/// title strips, so it can no more squeeze `axes` below the half-viewport floor than
|
||||
/// they can. Negative values are clamped to 0.
|
||||
void set_right_gutter(f32 device_px) noexcept {
|
||||
right_gutter_ = device_px > 0.0f ? device_px : 0.0f;
|
||||
}
|
||||
f32 right_gutter() const noexcept { return right_gutter_; }
|
||||
|
||||
/// Grid segments for the primary axis pair (x axis 0, y axis 0), in data space.
|
||||
const Grid& grid() const noexcept { return grid_; }
|
||||
|
||||
@@ -867,6 +886,9 @@ class Plot {
|
||||
/// The floor a figure imposes on the left gutter; see set_min_y_gutter(). 0.0 means
|
||||
/// none, which is what a plot standing on its own keeps.
|
||||
f32 min_y_gutter_ = 0.0f;
|
||||
/// The empty band kept to the right of `axes`; see set_right_gutter(). 0.0 means none,
|
||||
/// which is what the layout did before the setter existed.
|
||||
f32 right_gutter_ = 0.0f;
|
||||
/// Which handles a pointer is on, published by the input layer (see HotHandles).
|
||||
HotHandles hot_{};
|
||||
|
||||
|
||||
Reference in new issue
Block a user