use iced::{ widget::{column, row, text, text_input}, Element, Sandbox, Settings, }; use volute::volume::{CubicMetre, Volume}; pub fn main() -> iced::Result { App::run(Settings::default()) } struct App { displacement: Box, ui: UI, } #[derive(Default)] struct UI { displacement: String, } impl App { fn set_displacement(&mut self, displacement: &str) { if displacement.len() == 0 { self.displacement.set(0.0); self.ui.displacement = "".to_string(); } else if let Ok(d) = displacement.parse::() { self.displacement.set(d); self.ui.displacement = String::from(displacement); } } } impl Default for App { fn default() -> Self { Self { displacement: Box::new(CubicMetre::default()), ui: UI::default(), } } } impl Sandbox for App { type Message = Message; fn new() -> Self { Self::default() } fn title(&self) -> String { String::from("volute") } fn update(&mut self, message: Message) { match message { Message::DisplacementChanged(displacement) => { self.set_displacement(&displacement); } } } fn view(&self) -> Element { column![row![ text("Displacement:"), text_input("2.0", &self.ui.displacement, Message::DisplacementChanged), text(self.displacement.unit()), ]] .into() } } #[derive(Debug, Clone)] pub enum Message { DisplacementChanged(String), }