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()
}
}