//! The backend-profiling stress tree: a themed grid of text cells inside a //! scroll area, with live bindings — the shared workload for the render //! paint- and backend-caching benchmarks and correctness gates. use guiduck_core::signals::Signal; use guiduck_core::{Container, ScrollArea, Text, Theme, WidgetTree, taffy}; use guiduck_scene::paint::color::palette::css; use taffy::prelude::{length, percent}; use crate::{SAMPLE_FONT_FAMILY, sample_text_context}; /// The stress theme: themed cells with a hover rule, so pointer motion /// exercises the style pass. pub const STRESS_THEME: &str = r##" (theme Stress (tokens (ink "#20304a") (cell "#eef1f7") (hot "#cfdcf5")) (rule container :background "#ffffff") (rule (container .cell) :background cell :corner-radius 3) (rule (container .cell :hover) :background hot) (rule text :color ink :font-size 11 :font-family "DejaVu Sans")) "##; /// Build a `rows` × `cols` grid of themed text cells inside a scroll area. /// The first cell of each row binds its label to the returned signal, so /// signal churn has something real to update. pub fn stress_tree(rows: usize, cols: usize) -> (WidgetTree, Signal) { let mut tree = WidgetTree::with_text_context(sample_text_context()); tree.set_theme(Some(Theme::parse(STRESS_THEME).expect("theme parses"))); let scroll = tree.insert( ScrollArea::new(), taffy::Style { size: taffy::Size { width: percent(1.0_f32), height: percent(1.0_f32), }, flex_direction: taffy::FlexDirection::Column, ..Default::default() }, None, ); let tick = Signal::new(0); for r in 0..rows { let row = tree.insert( Container::new(), taffy::Style { size: taffy::Size { width: percent(1.0_f32), height: length(28.0_f32), }, flex_shrink: 0.0, gap: taffy::Size { width: length(4.0_f32), height: length(0.0_f32), }, padding: taffy::Rect::length(2.0_f32), ..Default::default() }, Some(scroll), ); for c in 0..cols { let cell = tree.insert( Container::new(), taffy::Style { size: taffy::Size { width: length(112.0_f32), height: percent(1.0_f32), }, padding: taffy::Rect::length(4.0_f32), ..Default::default() }, Some(row), ); tree.set_classes(cell, [String::from("cell")]); let label = tree.insert( Text::new(format!("r{r}c{c}")) .font_size(11.0) .family(SAMPLE_FONT_FAMILY) .brush(css::DARK_SLATE_GRAY), taffy::Style::default(), Some(cell), ); if c == 0 { let tick = tick; tree.bind::( label, move || format!("r{r} t{}", tick.get()), |w, v| w.set_text(v), ); } } } (tree, tick) }