Instantly share code, notes, and snippets.

@abienz /main.rs Secret
Created Jan 3, 2019

Embed
What would you like to do?
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