tuix 0.2.0

Cross-platform GUI toolkit
Documentation
use tuix::*;

const STYLE: &str = r#"
textbox {
    border-color: #9e9e9e;
    color: black;
    border-width: 1px;
    width: 100px;
    height: 30px;
    border-radius: 3px;
    child-space: 1s;
    child-left: 5px;
    top: 1s;
    bottom: 1s;
}

textbox:hover {
    border-color: black;
}

label {
    width: 50px;
    height: 30px;
    child-space: 1s;
    child-left: 5px;
    top: 1s;
    bottom: 1s;
    left: 0px;
    right: 1s;
    color: black;
}
"#;

#[derive(Debug, Clone, PartialEq)]
enum AppEvent {
    SetCelcius(f32),
    SetFahrenheit(f32),
}

#[derive(Default, Lens)]
pub struct AppData {
    pub temperature_celcius: f32,
}

impl Model for AppData {
    fn on_event(&mut self, state: &mut State, entity: Entity, event: &mut Event) {
        if let Some(custom_event) = event.message.downcast() {
            match custom_event {
                AppEvent::SetCelcius(temp) => {
                    self.temperature_celcius = *temp;
                    entity.emit(state, BindEvent::Update);
                }

                AppEvent::SetFahrenheit(temp) => {
                    self.temperature_celcius = (*temp - 32.0) * 5.0/9.0; 
                    entity.emit(state, BindEvent::Update);
                }
            }
        }
    }
}


fn main() {
    let window_description = WindowDescription::new().with_title("Temperature Converter").with_inner_size(400, 100);
    let app = Application::new(window_description, |state, window|{
        
        state.add_theme(STYLE);
        
        let app_data = AppData::default().build(state, window);

        let row = Row::new().build(state, app_data, |builder| 
            builder

                .set_child_space(Stretch(1.0))
        );

        Textbox::new("test")
            .on_submit(|data, state, textbox|{
                if let Ok(temp) = data.text.parse::<f32>() {
                    textbox.emit(state, AppEvent::SetCelcius(temp));
                }
            })
            .bind(AppData::temperature_celcius, |temp| temp.to_string())
            .build(state, row, |builder| builder);
        
        Label::new("°C").build(state, row, |builder| builder);

        Textbox::new("test")
            .on_submit(|data, state, textbox|{
                if let Ok(temp) = data.text.parse::<f32>() {
                    let temp_celcius = (temp - 32.0) * 5.0/9.0;
                    textbox.emit(state, AppEvent::SetCelcius(temp_celcius));
                }
            })
            .bind(AppData::temperature_celcius, |temp| ((*temp * 9.0/5.0) + 32.0).to_string())
            .build(state, row, |builder| builder);

        Label::new("°F").build(state, row, |builder| builder);

    });

    app.run();
}