1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use cursive::view::{Nameable, Resizable};
use cursive::views::{
Dialog, EditView, LinearLayout, ListView, RadioGroup, SliderView,
};
use cursive::With;
#[derive(Clone, Debug, Default)]
struct UserData {
boolean: bool,
string: String,
number: usize,
}
// This is an example with a more complex use of user_data.
// Here we prepare some state (UserData) and make it available to be used
// elsewhere via user_data.
fn main() {
let mut siv = cursive::default();
siv.set_user_data(UserData::default());
siv.add_layer(
Dialog::text("Some stuff happens here.")
.title("Main")
.button("UserData", |s| {
let mut boolean_group: RadioGroup<bool> = RadioGroup::new();
// Get current user_data to draw the correct current status.
let current_data = s
.with_user_data(|user_data: &mut UserData| {
user_data.clone()
})
.unwrap();
s.add_layer(
Dialog::new()
.title("UserData")
.content(
ListView::new()
.child(
"String: ",
EditView::new()
.content(current_data.string.clone())
.with_name("string")
.fixed_width(18),
)
.child(
"Number: ",
SliderView::horizontal(18)
.value(current_data.number)
.with_name("number"),
)
.child(
"Boolean: ",
LinearLayout::horizontal()
.child(
boolean_group
.button(false, "False")
.fixed_width(10),
)
.child(
boolean_group
.button(true, "True")
.with_if(
current_data.boolean,
|button| {
button.select();
},
)
.fixed_width(10),
)
.with(|layout| {
if current_data.boolean {
layout
.set_focus_index(1)
.unwrap();
}
}),
),
)
.button("Done", move |s| {
// Save selected user_data as user_data
let string = s
.call_on_name(
"string",
|view: &mut EditView| view.get_content(),
)
.unwrap();
let number = s
.call_on_name(
"number",
|view: &mut SliderView| view.get_value(),
)
.unwrap();
s.with_user_data(|user_data: &mut UserData| {
user_data.boolean = *boolean_group.selection();
user_data.string = string.to_string();
user_data.number = number;
})
.unwrap();
s.pop_layer();
}),
);
}),
);
siv.run();
}