Every child gets the whole of the stack's box rather than `box_of(size)`, and `widget_at` does not resolve a rule into a box already chosen from it. Fixes half a row becoming a quarter, which no oracle can see because warm and cold shrink alike. Pinned by `a_stack_sized_by_a_child_does_not_take_that_childs_fraction_twice`. Not landed. Seed 1091 at depth 4, `shuffle-swap-for-three`, disagrees by three steps of the grid -- warm 1053.9971 against cold 1054 -- where the oracle tolerates two. Not a structural divergence: `box_of` was also making a child's placement exact, by handing it a box of exactly the length it asked for, and giving it the whole box instead puts a rounding back at each nesting level. Two nested stacks is three steps. Widening AGREE_STEPS is not the answer; finding the composition that went from exact to rounded is. Everything else is green: suite, shrinker at 400 seeds of depth 5, oracle at 1000 seeds of depth 6, and the rest of 2000 seeds at depth 4. Also carries examples/text.rs's top panel taking the full width.
69 lines
2.3 KiB
Rust
69 lines
2.3 KiB
Rust
//! Text sizing: wrapped text reads the width it is offered, fixed text does
|
|
//! not, and both report a height their container lays out around.
|
|
|
|
use iris::prelude::*;
|
|
|
|
fn main() {
|
|
DefaultApp::<State>::run();
|
|
}
|
|
|
|
#[derive(DefaultUiState)]
|
|
struct State {
|
|
ui_state: DefaultUiState,
|
|
}
|
|
|
|
const SAMPLE: &str = "Wrapping shapes one source into as many lines as its container \
|
|
leaves room for, so the height of a paragraph is an answer rather than a setting, and \
|
|
the same words in a narrower box come back taller. Resize the window and watch the \
|
|
text below reflow into a different number of lines while nothing about it changes.";
|
|
|
|
impl DefaultAppState for State {
|
|
fn new(mut ui_state: DefaultUiState, rsc: &mut DefaultRsc<Self>, _: Proxy<Self>) -> Self {
|
|
let panel = || rect(Color::WHITE.darker(0.85));
|
|
|
|
let wrapped = wtext(SAMPLE)
|
|
.size(28)
|
|
.wrap(true)
|
|
.text_align(Align::LEFT)
|
|
.pad(16)
|
|
.width(rel(1.0))
|
|
.background(panel());
|
|
|
|
// Each one takes the whole width, because `text_align` puts the
|
|
// glyphs somewhere in the box the text is given and a text that
|
|
// reports the width of its own glyphs is given exactly that.
|
|
let label = |text: &str, align| wtext(text).size(24).text_align(align).width(rel(1.0));
|
|
let aligned = (
|
|
label("left", Align::LEFT),
|
|
label("centred", Align::H_CENTER),
|
|
label("right", Align::RIGHT),
|
|
)
|
|
.span(Dir::DOWN)
|
|
.gap(8)
|
|
.pad(16)
|
|
.background(panel());
|
|
|
|
// The same words in half the width, which is a different number of
|
|
// lines and so a different height. A declared width only holds along
|
|
// a span's own axis, hence the row.
|
|
let narrow = (
|
|
wtext(SAMPLE)
|
|
.size(20)
|
|
.wrap(true)
|
|
.pad(16)
|
|
.background(panel())
|
|
.align(Align::TOP)
|
|
.width(rel(0.5)),
|
|
rect(Color::WHITE.darker(0.95)),
|
|
)
|
|
.span(Dir::RIGHT);
|
|
|
|
(wrapped, aligned, narrow)
|
|
.span(Dir::DOWN)
|
|
.gap(12)
|
|
.pad(12)
|
|
.set_root(rsc, &mut ui_state);
|
|
Self { ui_state }
|
|
}
|
|
}
|