3
3
4
4
extern crate iui;
5
5
use iui:: prelude:: * ;
6
- use iui:: controls:: { Label , Spinbox , Slider , Entry , MultilineEntry , LayoutGrid ,
6
+ use iui:: controls:: { Label , Spinbox , Slider , PasswordEntry , Entry , MultilineEntry , LayoutGrid ,
7
7
GridAlignment , GridExpand , HorizontalSeparator , ProgressBar } ;
8
8
use std:: rc:: Rc ;
9
9
use std:: cell:: RefCell ;
@@ -13,6 +13,7 @@ struct State {
13
13
slider_val : i32 ,
14
14
spinner_val : i32 ,
15
15
entry_val : String ,
16
+ password_val : String ,
16
17
multi_val : String ,
17
18
}
18
19
@@ -21,7 +22,7 @@ fn main() {
21
22
let ui = UI :: init ( ) . unwrap ( ) ;
22
23
23
24
// Initialize the state of the application.
24
- let state = Rc :: new ( RefCell :: new ( State { slider_val : 0 , spinner_val : 0 , entry_val : "" . into ( ) , multi_val : "" . into ( ) } ) ) ;
25
+ let state = Rc :: new ( RefCell :: new ( State { slider_val : 0 , spinner_val : 0 , entry_val : "" . into ( ) , password_val : "" . into ( ) , multi_val : "" . into ( ) } ) ) ;
25
26
26
27
// Create the grid which we'll use to lay out controls
27
28
let mut grid = LayoutGrid :: new ( & ui) ;
@@ -31,12 +32,13 @@ fn main() {
31
32
// While it's not necessary to create a block for this, it makes the code a lot easier
32
33
// to read; the indentation presents a visual cue informing the reader that these
33
34
// statements are related.
34
- let ( mut slider, mut spinner, mut entry, mut multi) = {
35
+ let ( mut slider, mut spinner, mut entry, mut password , mut multi) = {
35
36
// Numerical inputs
36
37
let slider = Slider :: new ( & ui, 1 , 100 ) ;
37
38
let spinner = Spinbox :: new ( & ui, 1 , 100 ) ;
38
39
// Text inputs
39
40
let entry = Entry :: new ( & ui) ;
41
+ let password = PasswordEntry :: new ( & ui) ;
40
42
let multi = MultilineEntry :: new ( & ui) ;
41
43
// Add everything into the grid
42
44
grid. append ( & ui, slider. clone ( ) ,
@@ -51,33 +53,38 @@ fn main() {
51
53
0 , 3 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
52
54
grid. append ( & ui, entry. clone ( ) ,
53
55
0 , 4 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
56
+ grid. append ( & ui, password. clone ( ) ,
57
+ 0 , 5 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
54
58
grid. append ( & ui, multi. clone ( ) ,
55
59
// The multiline entry is at column 0, row 1, and expands vertically.
56
- 0 , 5 , 1 , 1 , GridExpand :: Vertical , GridAlignment :: Fill , GridAlignment :: Fill ) ;
57
- ( slider, spinner, entry, multi)
60
+ 0 , 6 , 1 , 1 , GridExpand :: Vertical , GridAlignment :: Fill , GridAlignment :: Fill ) ;
61
+ ( slider, spinner, entry, password , multi)
58
62
} ;
59
63
60
64
// Set up the outputs for the application. Organization is very similar to the
61
65
// previous setup.
62
- let ( add_label, sub_label, text_label, bigtext_label, progress_bar) = {
66
+ let ( add_label, sub_label, text_label, password_label , bigtext_label, progress_bar) = {
63
67
let add_label = Label :: new ( & ui, "" ) ;
64
68
let sub_label = Label :: new ( & ui, "" ) ;
65
69
let text_label = Label :: new ( & ui, "" ) ;
70
+ let password_label = Label :: new ( & ui, "" ) ;
66
71
let bigtext_label = Label :: new ( & ui, "" ) ;
67
72
let progress_bar = ProgressBar :: indeterminate ( & ui) ;
68
- grid. append ( & ui, add_label. clone ( ) ,
73
+ grid. append ( & ui, add_label. clone ( ) ,
69
74
1 , 0 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
70
75
grid. append ( & ui, sub_label. clone ( ) ,
71
76
1 , 1 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
72
77
// We skip the #2 & 3 slots so that the text labels will align with their inputs.
73
78
// This is important because the big text label can expand vertically.
74
79
grid. append ( & ui, text_label. clone ( ) ,
75
80
1 , 4 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
76
- grid. append ( & ui, bigtext_label . clone ( ) ,
81
+ grid. append ( & ui, password_label . clone ( ) ,
77
82
1 , 5 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
83
+ grid. append ( & ui, bigtext_label. clone ( ) ,
84
+ 1 , 6 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
78
85
grid. append ( & ui, progress_bar. clone ( ) ,
79
- 0 , 6 , 2 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
80
- ( add_label, sub_label, text_label, bigtext_label, progress_bar)
86
+ 0 , 7 , 2 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
87
+ ( add_label, sub_label, text_label, password_label , bigtext_label, progress_bar)
81
88
} ;
82
89
83
90
// The window allows all constituent components to be displayed.
@@ -103,6 +110,11 @@ fn main() {
103
110
move |val| { state. borrow_mut ( ) . entry_val = val; }
104
111
} ) ;
105
112
113
+ password. on_changed ( & ui, {
114
+ let state = state. clone ( ) ;
115
+ move |val| { state. borrow_mut ( ) . password_val = val; }
116
+ } ) ;
117
+
106
118
multi. on_changed ( & ui, {
107
119
let state = state. clone ( ) ;
108
120
move |val| { state. borrow_mut ( ) . multi_val = val; }
@@ -118,6 +130,7 @@ fn main() {
118
130
let mut add_label = add_label. clone ( ) ;
119
131
let mut sub_label = sub_label. clone ( ) ;
120
132
let mut text_label = text_label. clone ( ) ;
133
+ let mut password_label = password_label. clone ( ) ;
121
134
let mut bigtext_label = bigtext_label. clone ( ) ;
122
135
let mut progress_bar = progress_bar. clone ( ) ;
123
136
move || {
@@ -127,6 +140,7 @@ fn main() {
127
140
add_label. set_text ( & ui, & format ! ( "Added: {}" , state. slider_val + state. spinner_val) ) ;
128
141
sub_label. set_text ( & ui, & format ! ( "Subtracted: {}" , state. slider_val - state. spinner_val) ) ;
129
142
text_label. set_text ( & ui, & format ! ( "Text: {}" , state. entry_val) ) ;
143
+ password_label. set_text ( & ui, & format ! ( "Secret Text: {}" , state. password_val) ) ;
130
144
bigtext_label. set_text ( & ui, & format ! ( "Multiline Text: {}" , state. multi_val) ) ;
131
145
progress_bar. set_value ( & ui, ( state. slider_val + state. spinner_val ) as u32 ) ;
132
146
}
0 commit comments