Button

Counter example

The button widget is probably one of the most essential things in all of the UI making world.

They have an on_pressed callback that is called when the button is pressed.

Buttons can be used like this:

#![allow(unused)]
fn main() {
Button::new(
    Text::new("Increase".to_string())
).with_on_pressed(
    MaybeSignal::signal(
        context.use_signal(
            EvalSignal::new(move || {
                println!("Pressed");
                Update::DRAW
            })
        )
    ),
)
}

For a more complex example, see the counter example:

use maycoon::core::app::context::AppContext;
use maycoon::core::app::update::Update;
use maycoon::core::app::Application;
use maycoon::core::config::MayConfig;
use maycoon::core::layout::{AlignItems, Dimension, FlexDirection, LayoutStyle};
use maycoon::core::reference::Ref;
use maycoon::core::signal::eval::EvalSignal;
use maycoon::core::signal::state::StateSignal;
use maycoon::core::signal::{MaybeSignal, Signal};
use maycoon::core::widget::{Widget, WidgetLayoutExt};
use maycoon::math::Vector2;
use maycoon::theme::theme::celeste::CelesteTheme;
use maycoon::widgets::button::Button;
use maycoon::widgets::container::Container;
use maycoon::widgets::text::Text;

struct MyApp;

impl Application for MyApp {
    type Theme = CelesteTheme;

    fn build(context: AppContext) -> impl Widget {
        let counter = context.use_signal(StateSignal::new(0));

        Container::new(vec![
            {
                let counter = counter.clone();

                Box::new(
                    Button::new(Text::new("Increase".to_string())).with_on_pressed(
                        MaybeSignal::signal(context.use_signal(EvalSignal::new(move || {
                            counter.set(*counter.get() + 1);

                            Update::DRAW
                        }))),
                    ),
                )
            },
            {
                let counter = counter.clone();

                Box::new(
                    Button::new(Text::new("Decrease".to_string())).with_on_pressed(
                        MaybeSignal::signal(context.use_signal(EvalSignal::new(move || {
                            counter.set(*counter.get() - 1);

                            Update::DRAW
                        }))),
                    ),
                )
            },
            {
                let counter = counter.clone();
                Box::new(Text::new(counter.map(|i| Ref::Owned(i.to_string()))))
            },
        ])
        .with_layout_style(LayoutStyle {
            size: Vector2::<Dimension>::new(Dimension::percent(1.0), Dimension::percent(1.0)),
            flex_direction: FlexDirection::Column,
            align_items: Some(AlignItems::Center),
            ..Default::default()
        })
    }

    fn config(&self) -> MayConfig<Self::Theme> {
        MayConfig::default()
    }
}

fn main() {
    MyApp.run()
}