use fltk::{enums::*, prelude::*, *}; fn main() { MyApp::new().run() } #[derive(Copy, Clone)] pub enum Message { CelciusChanged, FahrenheitChanged, } fn make_label(label: &str) -> frame::Frame { let mut f = frame::Frame::default() .with_label(label) .with_align(Align::Inside | Align::Bottom); f.set_label_type(LabelType::Engraved); f } fn c_to_f(val: f64) -> f64 { (val * 9.0 / 5.0) + 32.0 } fn f_to_c(val: f64) -> f64 { (val - 32.0) * 5.0 / 9.0 } struct MyApp { a: app::App, inp1: input::FloatInput, inp2: input::FloatInput, r: app::Receiver, } impl MyApp { pub fn new() -> Self { let a = app::App::default(); MyApp::init_styles(); let (s, r) = app::channel(); let (inp1, inp2) = { let mut win = window::Window::default().with_size(150, 200); let mut flex = group::Flex::default() .with_size(130, 180) .center_of(&win) .column(); make_label("Celcius"); let mut inp1 = input::FloatInput::default().with_size(0, 40); make_label("Fahrenheit"); let mut inp2 = input::FloatInput::default().with_size(0, 40); flex.fixed(&inp1, 30); flex.fixed(&inp2, 30); flex.end(); win.end(); win.make_resizable(true); win.show(); inp1.set_value(&format!("{}", 0.0)); inp2.set_value(&format!("{}", 32.0)); inp1.set_trigger(CallbackTrigger::Changed); inp2.set_trigger(CallbackTrigger::Changed); inp1.emit(s, Message::CelciusChanged); inp2.emit(s, Message::FahrenheitChanged); (inp1, inp2) }; Self { a, inp1, inp2, r } } fn init_styles() { app::set_scheme(app::Scheme::Gleam); app::set_background_color(170, 189, 206); app::set_background2_color(255, 255, 255); app::set_foreground_color(0, 0, 0); app::set_selection_color(255, 160, 63); app::set_inactive_color(130, 149, 166); app::set_font_size(16); } pub fn run(&mut self) { while self.a.wait() { if let Some(msg) = self.r.recv() { match msg { Message::CelciusChanged => { self.inp2.set_value(&format!( "{:.4}", c_to_f(self.inp1.value().parse().unwrap_or(0.0)) )); } Message::FahrenheitChanged => { self.inp1.set_value(&format!( "{:.4}", f_to_c(self.inp2.value().parse().unwrap_or(0.0)) )); } } } } } }