diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/main.rs b/src/main.rs index 2c1fa85..4c6cf43 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,45 +1,38 @@ use iced::{ - widget::{column, row, text, text_input}, + widget::{column, pick_list, row, text, text_input}, Element, Sandbox, Settings, }; -use volute::volume::{CubicMetre, Volume}; +use volute::volume::{self, CubicMetre}; pub fn main() -> iced::Result { App::run(Settings::default()) } +#[derive(Default)] struct App { - displacement: Box<dyn Volume>, + displacement: CubicMetre, ui: UI, } #[derive(Default)] struct UI { displacement: String, + displacement_unit: volume::Unit, } impl App { fn set_displacement(&mut self, displacement: &str) { if displacement.len() == 0 { - self.displacement.set(0.0); + self.displacement.0 = 0.0; self.ui.displacement = "".to_string(); - } else if let Ok(d) = displacement.parse::<f64>() { - self.displacement.set(d); + } else if let Ok(val) = displacement.parse::<f64>() { + self.displacement = CubicMetre::from_unit(self.ui.displacement_unit, val); 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; @@ -53,17 +46,32 @@ impl Sandbox for App { fn update(&mut self, message: Message) { match message { - Message::DisplacementChanged(displacement) => { + Message::Displacement(displacement) => { self.set_displacement(&displacement); } + Message::DisplacementUnit(unit) => { + self.ui.displacement = format!( + "{:.2}", + volume::convert( + self.ui.displacement.parse::<f64>().unwrap(), + self.ui.displacement_unit, + unit, + ) + ); + self.ui.displacement_unit = unit; + } } } fn view(&self) -> Element<Self::Message> { column![row![ text("Displacement:"), - text_input("2.0", &self.ui.displacement, Message::DisplacementChanged), - text(self.displacement.unit()), + text_input("2.0", &self.ui.displacement, Message::Displacement), + pick_list( + &volume::Unit::ALL[..], + Some(self.ui.displacement_unit), + Message::DisplacementUnit, + ), ]] .into() } @@ -71,5 +79,6 @@ impl Sandbox for App { #[derive(Debug, Clone)] pub enum Message { - DisplacementChanged(String), + Displacement(String), + DisplacementUnit(volume::Unit), } |