ui_guessing_game
| use rand::Rng; | |
| use std::cell::RefCell; | |
| use std::cmp::Ordering; | |
| use std::rc::Rc; | |
| extern crate iui; | |
| use iui::controls::{Button, Entry, Label, VerticalBox}; | |
| use iui::prelude::*; | |
| struct State { | |
| entry_val: String, | |
| } | |
| fn main() { | |
| let ui = UI::init().expect("Couldn't initialize UI library"); | |
| let state = Rc::new(RefCell::new(State { | |
| entry_val: "".into(), | |
| })); | |
| let mut win = Window::new(&ui, "Guess the number", 200, 200, WindowType::NoMenubar); | |
| let secret_number = rand::thread_rng().gen_range(1, 101); | |
| let label_text = String::from("Guess the number!"); | |
| let label = Label::new(&ui, &label_text); | |
| let result_label_text = String::from("Please input your guess"); | |
| let result_label = Label::new(&ui, &result_label_text); | |
| let conclusion_label_text = String::from("..."); | |
| let conclusion_label = Label::new(&ui, &conclusion_label_text); | |
| let mut entry = Entry::new(&ui); | |
| entry.on_changed(&ui, { | |
| let state = state.clone(); | |
| move |val| { | |
| state.borrow_mut().entry_val = val; | |
| } | |
| }); | |
| let mut button = Button::new(&ui, "Submit"); | |
| button.on_clicked(&ui, { | |
| let ui = ui.clone(); | |
| let _guess = String::new(); | |
| let mut result_label = result_label.clone(); | |
| let mut conclusion_label = conclusion_label.clone(); | |
| move |_| { | |
| let state = state.borrow(); | |
| let guess: u32 = match state.entry_val.trim().parse() { | |
| Ok(num) => num, | |
| Err(_) => return, | |
| }; | |
| result_label.set_text(&ui, &format!("You guessed {}", guess)); | |
| match guess.cmp(&secret_number) { | |
| Ordering::Less => conclusion_label.set_text(&ui, "Too small!"), | |
| Ordering::Greater => conclusion_label.set_text(&ui, "Too big!"), | |
| Ordering::Equal => conclusion_label.set_text(&ui, "You win!"), | |
| } | |
| } | |
| }); | |
| let mut exit_button = Button::new(&ui, "Exit"); | |
| exit_button.on_clicked(&ui, { | |
| let ui = ui.clone(); | |
| move |_| { | |
| ui.quit(); | |
| } | |
| }); | |
| let mut vbox = VerticalBox::new(&ui); | |
| vbox.set_padded(&ui, true); | |
| vbox.append(&ui, label, LayoutStrategy::Stretchy); | |
| vbox.append(&ui, result_label, LayoutStrategy::Stretchy); | |
| vbox.append(&ui, conclusion_label, LayoutStrategy::Stretchy); | |
| vbox.append(&ui, entry, LayoutStrategy::Compact); | |
| vbox.append(&ui, button, LayoutStrategy::Compact); | |
| vbox.append(&ui, exit_button, LayoutStrategy::Compact); | |
| win.set_child(&ui, vbox); | |
| win.show(&ui); | |
| ui.main(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment