zsui 0.3.0-alpha.2

Rust-first feature-gated native UI framework for Win32, AppKit, and Linux.
Documentation
use zsui::{
    list, text, Dpi, Rect, View, ViewEvent, ViewEventCx, ViewLayoutCx, ViewPaintCx, WidgetId,
};

const FIRST: WidgetId = WidgetId::new(1);
const SECOND: WidgetId = WidgetId::new(2);

#[derive(Debug, Clone, PartialEq, Eq)]
enum Msg {
    RowSelected(usize),
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut view = list([(FIRST, "First"), (SECOND, "Second")], |(id, label)| {
        text(label).id(id)
    })
    .selected_index(Some(0))
    .on_select(Msg::RowSelected);

    view.layout(&mut ViewLayoutCx::new(
        Rect {
            x: 0,
            y: 0,
            width: 320,
            height: 96,
        },
        Dpi::standard(),
    ));

    let mut events = ViewEventCx::new();
    view.event(&mut events, &ViewEvent::Click { widget: SECOND });

    let mut paint = ViewPaintCx::new(Dpi::standard());
    view.paint(&mut paint);

    println!(
        "{}",
        serde_json::to_string_pretty(&serde_json::json!({
            "messages": events.into_messages().len(),
            "draw_command_count": paint.plan().command_count(),
            "text_command_count": paint.plan().text_count()
        }))?
    );
    Ok(())
}