extern crate libui;
use libui::controls::{
Entry, Group, HorizontalBox, HorizontalSeparator, Label, MultilineEntry, PasswordEntry,
ProgressBar, Slider, Spacer, Spinbox, VerticalBox,
};
use libui::prelude::*;
use std::cell::RefCell;
use std::rc::Rc;
struct State {
slider_val: i32,
spinner_val: i32,
entry_val: String,
password_val: String,
multi_val: String,
}
fn main() {
let ui = UI::init().unwrap();
let state = Rc::new(RefCell::new(State {
slider_val: 1,
spinner_val: 1,
entry_val: "".into(),
password_val: "".into(),
multi_val: "".into(),
}));
let (input_group, mut slider, mut spinner, mut entry, mut password, mut multi) = {
let mut input_group = Group::new("Inputs");
let mut input_vbox = VerticalBox::new();
input_vbox.set_padded(true);
let slider = Slider::new(1, 100);
let spinner = Spinbox::new(1, 100);
let entry = Entry::new();
let password = PasswordEntry::new();
let multi = MultilineEntry::new();
input_vbox.append(slider.clone(), LayoutStrategy::Compact);
input_vbox.append(spinner.clone(), LayoutStrategy::Compact);
input_vbox.append(Spacer::new(), LayoutStrategy::Compact);
input_vbox.append(HorizontalSeparator::new(), LayoutStrategy::Compact);
input_vbox.append(Spacer::new(), LayoutStrategy::Compact);
input_vbox.append(entry.clone(), LayoutStrategy::Compact);
input_vbox.append(password.clone(), LayoutStrategy::Compact);
input_vbox.append(multi.clone(), LayoutStrategy::Stretchy);
input_group.set_child(input_vbox);
(input_group, slider, spinner, entry, password, multi)
};
let (
output_group,
add_label,
sub_label,
text_label,
password_label,
bigtext_label,
progress_bar,
) = {
let mut output_group = Group::new("Outputs");
let mut output_vbox = VerticalBox::new();
let add_label = Label::new("");
let sub_label = Label::new("");
let text_label = Label::new("");
let password_label = Label::new("");
let bigtext_label = Label::new("");
let progress_bar = ProgressBar::indeterminate();
output_vbox.append(add_label.clone(), LayoutStrategy::Compact);
output_vbox.append(sub_label.clone(), LayoutStrategy::Compact);
output_vbox.append(progress_bar.clone(), LayoutStrategy::Compact);
output_vbox.append(text_label.clone(), LayoutStrategy::Compact);
output_vbox.append(password_label.clone(), LayoutStrategy::Compact);
output_vbox.append(bigtext_label.clone(), LayoutStrategy::Stretchy);
output_group.set_child(output_vbox);
(
output_group,
add_label,
sub_label,
text_label,
password_label,
bigtext_label,
progress_bar,
)
};
let mut hbox = HorizontalBox::new();
hbox.append(input_group, LayoutStrategy::Stretchy);
hbox.append(output_group, LayoutStrategy::Stretchy);
let mut window = Window::new(
&ui.clone(),
"Input Output Test",
300,
150,
WindowType::NoMenubar,
);
window.set_child(hbox);
window.show();
slider.on_changed({
let state = state.clone();
move |val| {
state.borrow_mut().slider_val = val;
}
});
spinner.on_changed({
let state = state.clone();
move |val| {
state.borrow_mut().spinner_val = val;
}
});
entry.on_changed({
let state = state.clone();
move |val| {
state.borrow_mut().entry_val = val;
}
});
password.on_changed({
let state = state.clone();
move |val| {
state.borrow_mut().password_val = val;
}
});
multi.on_changed({
let state = state.clone();
move |val| {
state.borrow_mut().multi_val = val;
}
});
let mut event_loop = ui.event_loop();
event_loop.on_tick({
let mut add_label = add_label.clone();
let mut sub_label = sub_label.clone();
let mut text_label = text_label.clone();
let mut password_label = password_label.clone();
let mut bigtext_label = bigtext_label.clone();
let mut progress_bar = progress_bar.clone();
move || {
let state = state.borrow();
add_label.set_text(&format!("Added: {}", state.slider_val + state.spinner_val));
sub_label.set_text(&format!(
"Subtracted: {}",
state.slider_val - state.spinner_val
));
text_label.set_text(&format!("Text: {}", state.entry_val));
password_label.set_text(&format!("Secret Text: {}", state.password_val));
bigtext_label.set_text(&format!("Multiline Text: {}", state.multi_val));
progress_bar.set_value((state.slider_val + state.spinner_val) as u32)
}
});
event_loop.run();
}