cushy 0.4.0

A wgpu-powered graphical user interface (GUI) library with a reactive data model
Documentation
//! This example shows off how buttons are able to use any widget, including
//! buttons, as their "label". The widget hierarchy constructed for this example
//! is:
//!
//! ```text
//! ┏ Align
//! ┃ ┏ Stack
//! ┃ ┃ ┏ Button
//! ┃ ┃ ┃ ┏ Stack
//! ┃ ┃ ┃ ┃ ┏ "Yo dawg!"
//! ┃ ┃ ┃ ┃ ┣ Button
//! ┃ ┃ ┃ ┃ ┃ ┏ Stack
//! ┃ ┃ ┃ ┃ ┃ ┃ ┏ "I heard you like buttons"
//! ┃ ┃ ┃ ┃ ┃ ┃ ┣ Button
//! ┃ ┃ ┃ ┃ ┃ ┃ ┃ ╺ "So I put buttons in your buttons"
//! ┃ ┃ ┣ clicked_button Label
//! ```

use cushy::value::{Destination, Dynamic};
use cushy::widget::MakeWidget;
use cushy::widgets::button::{ButtonHoverBackground, ButtonHoverForeground};
use cushy::Run;
use kludgine::Color;

fn main() -> cushy::Result {
    let clicked_button = Dynamic::<&'static str>::default();

    let inner_button = "So I put buttons in your buttons"
        .into_button()
        .on_click({
            let clicked_button = clicked_button.clone();
            move |_| clicked_button.set("inner button clicked")
        })
        .with(&ButtonHoverBackground, Color::RED)
        .with(&ButtonHoverForeground, Color::WHITE);

    let middle_button = "I heard you like buttons"
        .and(inner_button)
        .into_rows()
        .into_button()
        .on_click({
            let clicked_button = clicked_button.clone();
            move |_| clicked_button.set("middle button clicked")
        });

    let outer_button = "Yo dawg!"
        .and(middle_button)
        .into_rows()
        .into_button()
        .on_click({
            let clicked_button = clicked_button.clone();
            move |_| clicked_button.set("outer button clicked")
        });

    outer_button
        .and(clicked_button)
        .into_rows()
        .centered()
        .run()
}