kui-core 0.1.0-alpha.44

kui contract: flat per-frame tree, clay-style flex layout, text stack, events as data, quad display list
Documentation
use kui_core::{Color, Core, InputEvent, NodeSpec, Size, TextStyle, Vec2};

#[test]
fn root_scroll_works() {
    let mut core = Core::new();
    let build = |core: &mut Core| {
        let mut ui = core.frame(Size::new(560.0, 360.0), 1.0);
        ui.configure_root(NodeSpec::column().fill().pad(24.0).scroll_y());
        ui.with(
            NodeSpec::column()
                .grow_width()
                .max_width(560.0)
                .pad(36.0)
                .gap(18.0)
                .bg(Color::rgb8(20, 20, 30)),
            |ui| {
                for i in 0..10 {
                    ui.text(&format!("paragraph line {i}"), TextStyle::new(24.0));
                }
            },
        );
        ui.finish();
    };
    build(&mut core);
    let (dl, _) = core.output();
    let bars = dl.quads.iter().filter(|q| q.rect.w == 4.0).count();
    let first_y = dl
        .quads
        .iter()
        .find(|q| q.kind == kui_core::QuadKind::Solid && q.rect.w > 100.0)
        .map(|q| q.rect.y);
    println!("bars={bars} card_y={first_y:?}");
    assert_eq!(bars, 1, "root scrollbar missing");

    core.handle_input(InputEvent::CursorMoved(Vec2::new(280.0, 180.0)));
    core.handle_input(InputEvent::Scroll(Vec2::new(0.0, -100.0)));
    build(&mut core);
    let (dl, _) = core.output();
    let card_y = dl
        .quads
        .iter()
        .find(|q| q.kind == kui_core::QuadKind::Solid && q.rect.w > 100.0)
        .map(|q| q.rect.y);
    println!("after scroll card_y={card_y:?}");
    assert_eq!(card_y, Some(24.0 - 100.0));
}