use aetna_core::prelude::*;
use aetna_core::{UiState, layout};
const ROW_COUNT: usize = 10_000;
const ROW_HEIGHT: f32 = 44.0;
fn build_row(i: usize) -> El {
let badge_el = match i % 5 {
0 => badge("info").muted(),
1 => badge("warn").warning(),
2 => badge("ok").success(),
3 => badge("err").destructive(),
_ => spacer(),
};
row([
text(format!("#{i:05}")).mono(),
spacer(),
text(format!("entry {i}")),
spacer(),
badge_el,
])
.key(format!("row-{i}"))
.gap(tokens::SPACE_MD)
.padding(Sides::xy(tokens::SPACE_MD, tokens::SPACE_SM))
.height(Size::Fixed(ROW_HEIGHT))
}
fn fixture() -> El {
column([
h1("Virtualized list"),
paragraph(format!(
"{ROW_COUNT} rows × {ROW_HEIGHT}px in a windowed viewport. \
Only the rows intersecting the viewport are realized — see \
`tree.txt` for proof."
))
.muted(),
virtual_list(ROW_COUNT, ROW_HEIGHT, build_row)
.key("entries")
.height(Size::Fill(1.0)),
])
.gap(tokens::SPACE_LG)
.padding(tokens::SPACE_XL)
}
fn find_id(node: &El, key: &str) -> Option<String> {
if node.key.as_deref() == Some(key) {
return Some(node.computed_id.clone());
}
for c in &node.children {
if let Some(id) = find_id(c, key) {
return Some(id);
}
}
None
}
fn main() -> std::io::Result<()> {
let mut root = fixture();
layout::assign_ids(&mut root);
let list_id = find_id(&root, "entries").expect("virtual_list id");
let mut ui_state = UiState::new();
ui_state.set_scroll_offset(list_id, 5000.0 * ROW_HEIGHT);
let viewport = Rect::new(0.0, 0.0, 540.0, 540.0);
let bundle = render_bundle_with(
&mut root,
&mut ui_state,
viewport,
Some("crates/aetna-core/src"),
);
let out_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("out");
let written = write_bundle(&bundle, &out_dir, "virtual_list")?;
for p in &written {
println!("wrote {}", p.display());
}
if !bundle.lint.findings.is_empty() {
eprintln!("\nlint findings ({}):", bundle.lint.findings.len());
eprint!("{}", bundle.lint.text());
}
Ok(())
}