rae 0.1.14

Renderer-neutral Rust design catalog for desktop widgets, layouts, sanitized output, and GLSL shader primitives.
Documentation
use iced::widget::{button, column, container, row, text, text_input};
use iced::{Element, Fill, Task};
use rae::TextEditModel;

pub fn main() -> iced::Result {
    iced::application("rae text input", Composer::update, Composer::view)
        .run_with(|| (Composer::default(), Task::none()))
}

struct Composer {
    input: TextEditModel,
    submitted: Vec<String>,
}

impl Default for Composer {
    fn default() -> Self {
        Self {
            input: TextEditModel::new("").with_placeholder("Message"),
            submitted: Vec::new(),
        }
    }
}

#[derive(Debug, Clone)]
enum Message {
    InputChanged(String),
    Submit,
    Clear,
}

impl Composer {
    fn update(&mut self, message: Message) {
        match message {
            Message::InputChanged(value) => {
                self.input = TextEditModel::new(value).with_placeholder("Message");
            }
            Message::Submit => {
                let text = self.input.value.as_str().trim();

                if !text.is_empty() {
                    self.submitted.push(text.to_string());
                    self.input = TextEditModel::new("").with_placeholder("Message");
                }
            }
            Message::Clear => {
                self.input = TextEditModel::new("").with_placeholder("Message");
            }
        }
    }

    fn view(&self) -> Element<'_, Message> {
        let input = text_input(&self.input.placeholder, self.input.value.as_str())
            .on_input(Message::InputChanged)
            .on_submit(Message::Submit)
            .padding(10)
            .size(18);

        let controls = row![
            input,
            button("Send").on_press(Message::Submit),
            button("Clear").on_press(Message::Clear),
        ]
        .spacing(8);

        let history = self.submitted.iter().fold(
            column![text("Submitted messages").size(22)].spacing(8),
            |history, message| history.push(text(message)),
        );

        container(column![controls, history].spacing(16).padding(16))
            .width(Fill)
            .into()
    }
}