Created
October 11, 2020 21:31
-
-
Save jcbritobr/8af426a62be2fd00dfdac05aeffd0610 to your computer and use it in GitHub Desktop.
Cursive ui, iteration and mutation of values in rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use cursive::{ | |
self, traits::Boxable, traits::Nameable, views::Button, views::Dialog, views::DummyView, | |
views::EditView, views::LinearLayout, views::SelectView, Cursive, | |
}; | |
fn main() { | |
let mut siv = cursive::default(); | |
let select = SelectView::<String>::new() | |
.on_submit(on_submit) | |
.with_name("select") | |
.fixed_size((10, 5)); | |
let buttons = LinearLayout::vertical() | |
.child(Button::new("Add new", add_name)) | |
.child(Button::new("Delete", delete_name)) | |
.child(DummyView) | |
.child(Button::new("Quit", Cursive::quit)); | |
siv.add_layer( | |
Dialog::around( | |
LinearLayout::horizontal() | |
.child(select) | |
.child(DummyView) | |
.child(buttons), | |
) | |
.title("Select a profile"), | |
); | |
siv.run(); | |
} | |
fn add_name(s: &mut Cursive) { | |
fn ok(s: &mut Cursive, name: &str) { | |
s.call_on_name("select", |view: &mut SelectView<String>| { | |
view.add_item_str(name) | |
}); | |
s.pop_layer(); | |
} | |
let edt_view = EditView::new() | |
.on_submit(ok) | |
.with_name("name") | |
.fixed_width(10); | |
let dialog = Dialog::around(edt_view) | |
.title("Enter a new name") | |
.button("Ok", |s| { | |
let name = s | |
.call_on_name("name", |view: &mut EditView| view.get_content()) | |
.unwrap(); | |
ok(s, &name); | |
}) | |
.button("Cancel", |s| { | |
s.pop_layer(); | |
}); | |
s.add_layer(dialog); | |
} | |
fn delete_name(s: &mut Cursive) { | |
let mut select = s.find_name::<SelectView<String>>("select").unwrap(); | |
match select.selected_id() { | |
None => s.add_layer(Dialog::info("No name to remove")), | |
Some(focus) => { | |
select.remove_item(focus); | |
} | |
} | |
} | |
fn on_submit(s: &mut Cursive, name: &str) { | |
s.pop_layer(); | |
let dialog = Dialog::text(format!("Name: {}\nAwesome: yes", name)) | |
.title(format!("{}'s info", name)) | |
.button("Quit", Cursive::quit); | |
s.add_layer(dialog); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment