tuix_widgets 0.2.0

Widgets for tuix
Documentation
use crate::common::*;
use crate::widgets::{Label, Slider, SliderEvent, Textbox, TextboxEvent};

use crate::state::style::*;

#[derive(Clone)]
pub struct ValueSlider {
    pub slider: Entity,
    pub value: Entity,
    pub label: Entity,
    label_text: String,
}

impl ValueSlider {
    pub fn new(label_txt: &str) -> Self {
        ValueSlider {
            slider: Entity::null(),
            value: Entity::null(),
            label: Entity::null(),
            label_text: label_txt.to_string(),
        }
    }
}

impl Widget for ValueSlider {
    type Ret = Entity;
    fn on_build(&mut self, state: &mut State, entity: Entity) -> Self::Ret {
        entity
            .set_display(state, Display::Flexbox)
            .set_flex_direction(state, FlexDirection::Row);

        self.slider = Slider::new().build(state, entity, |builder| {
            builder.set_flex_grow(1.0).class("custom2")
        });
        self.value = Textbox::new("0.5").build(state, entity, |builder| {
            builder
                .set_flex_grow(0.0)
                .set_flex_basis(Units::Pixels(50.0))
                .set_margin_left(Units::Pixels(5.0))
        });
        self.label = Label::new(&self.label_text).build(state, self.slider, |builder| {
            builder
                .set_width(Units::Percentage(1.0))
                .set_height(Units::Percentage(1.0))
                .set_position(Position::Absolute)
                .set_text(&self.label_text)
                .set_padding_left(Units::Pixels(5.0))
                .set_hoverable(false)
        });

        state.style.insert_element(entity, "value_slider");

        entity
    }

    fn on_event(&mut self, state: &mut State, _entity: Entity, event: &mut Event) {
        if let Some(slider_event) = event.message.downcast::<SliderEvent>() {
            match slider_event {
                SliderEvent::ValueChanged(val) => {
                    if event.target == self.slider {
                        let val_str = format!("{:.*}", 5, &val.to_string());
                        state.insert_event(
                            Event::new(TextboxEvent::SetValue(val_str))
                                .target(self.value)
                                .propagate(Propagation::Direct),
                        );
                    }
                }

                _ => {}
            }
        }

        if let Some(textbox_event) = event.message.downcast::<TextboxEvent>() {
            match textbox_event {
                TextboxEvent::ValueChanged(text) => {
                    if event.target == self.value {
                        if let Ok(value) = text.parse::<f32>() {
                            let mut val = value;
                            if val <= 0.0 {
                                val = 0.0;
                            }
                            if val >= 1.0 {
                                val = 1.0;
                            }

                            let val_str = format!("{:.*}", 5, &val.to_string());
                            state.insert_event(
                                Event::new(TextboxEvent::SetValue(val_str))
                                    .target(self.value)
                                    .propagate(Propagation::Direct),
                            );

                            state.insert_event(
                                Event::new(SliderEvent::SetValue(val))
                                    .target(self.slider)
                                    .propagate(Propagation::Direct),
                            );
                        } else {
                            state.insert_event(
                                Event::new(TextboxEvent::ResetValue)
                                    .target(self.value)
                                    .propagate(Propagation::Direct),
                            );
                        }
                    }
                }

                _ => {}
            }
        }
    }
}