2
2
//! Using the UIGrid function for a prettier interface.
3
3
4
4
extern crate iui;
5
+ use iui:: controls:: {
6
+ Entry , GridAlignment , GridExpand , HorizontalSeparator , Label , LayoutGrid , MultilineEntry ,
7
+ PasswordEntry , ProgressBar , Slider , Spinbox ,
8
+ } ;
5
9
use iui:: prelude:: * ;
6
- use iui:: controls:: { Label , Spinbox , Slider , PasswordEntry , Entry , MultilineEntry , LayoutGrid ,
7
- GridAlignment , GridExpand , HorizontalSeparator , ProgressBar } ;
8
- use std:: rc:: Rc ;
9
10
use std:: cell:: RefCell ;
11
+ use std:: rc:: Rc ;
10
12
11
13
/// This struct will hold the values that multiple callbacks will need to access.
12
14
struct State {
@@ -22,7 +24,13 @@ fn main() {
22
24
let ui =UI :: init ( ) . unwrap ( ) ;
23
25
24
26
// Initialize the state of the application.
25
- let state =Rc :: new ( RefCell :: new ( State { slider_val : 1 , spinner_val : 1 , entry_val : "" . into ( ) , password_val : "" . into ( ) , multi_val : "" . into ( ) } ) ) ;
27
+ let state =Rc :: new ( RefCell :: new ( State {
28
+ slider_val : 1 ,
29
+ spinner_val : 1 ,
30
+ entry_val : "" . into ( ) ,
31
+ password_val : "" . into ( ) ,
32
+ multi_val : "" . into ( ) ,
33
+ } ) ) ;
26
34
27
35
// Create the grid which we'll use to lay out controls
28
36
let mut grid =LayoutGrid :: new ( & ui) ;
@@ -41,23 +49,77 @@ fn main() {
41
49
let password =PasswordEntry :: new ( & ui) ;
42
50
let multi =MultilineEntry :: new ( & ui) ;
43
51
// Add everything into the grid
44
- grid. append ( & ui, slider. clone ( ) ,
52
+ grid. append (
53
+ & ui,
54
+ slider. clone ( ) ,
45
55
// This is position (by slot) and size, expansion, and alignment.
46
56
// In this case, row 0, col 0, 1 by 1, compress as much as possible,
47
57
// and align to the fill.
48
- 0 , 0 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
49
- grid. append ( & ui, spinner. clone ( ) ,
58
+ 0 ,
59
+ 0 ,
60
+ 1 ,
61
+ 1 ,
62
+ GridExpand :: Neither ,
63
+ GridAlignment :: Fill ,
64
+ GridAlignment :: Fill ,
65
+ ) ;
66
+ grid. append (
67
+ & ui,
68
+ spinner. clone ( ) ,
50
69
// This one is at column zero, row 1.
51
- 0 , 1 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
52
- grid. append ( & ui, HorizontalSeparator :: new ( & ui) ,
53
- 0 , 3 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
54
- grid. append ( & ui, entry. clone ( ) ,
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 ) ;
58
- grid. append ( & ui, multi. clone ( ) ,
70
+ 0 ,
71
+ 1 ,
72
+ 1 ,
73
+ 1 ,
74
+ GridExpand :: Neither ,
75
+ GridAlignment :: Fill ,
76
+ GridAlignment :: Fill ,
77
+ ) ;
78
+ grid. append (
79
+ & ui,
80
+ HorizontalSeparator :: new ( & ui) ,
81
+ 0 ,
82
+ 3 ,
83
+ 1 ,
84
+ 1 ,
85
+ GridExpand :: Neither ,
86
+ GridAlignment :: Fill ,
87
+ GridAlignment :: Fill ,
88
+ ) ;
89
+ grid. append (
90
+ & ui,
91
+ entry. clone ( ) ,
92
+ 0 ,
93
+ 4 ,
94
+ 1 ,
95
+ 1 ,
96
+ GridExpand :: Neither ,
97
+ GridAlignment :: Fill ,
98
+ GridAlignment :: Fill ,
99
+ ) ;
100
+ grid. append (
101
+ & ui,
102
+ password. clone ( ) ,
103
+ 0 ,
104
+ 5 ,
105
+ 1 ,
106
+ 1 ,
107
+ GridExpand :: Neither ,
108
+ GridAlignment :: Fill ,
109
+ GridAlignment :: Fill ,
110
+ ) ;
111
+ grid. append (
112
+ & ui,
113
+ multi. clone ( ) ,
59
114
// The multiline entry is at column 0, row 1, and expands vertically.
60
- 0 , 6 , 1 , 1 , GridExpand :: Vertical , GridAlignment :: Fill , GridAlignment :: Fill ) ;
115
+ 0 ,
116
+ 6 ,
117
+ 1 ,
118
+ 1 ,
119
+ GridExpand :: Vertical ,
120
+ GridAlignment :: Fill ,
121
+ GridAlignment :: Fill ,
122
+ ) ;
61
123
( slider, spinner, entry, password, multi)
62
124
} ;
63
125
@@ -70,21 +132,82 @@ fn main() {
70
132
let password_label =Label :: new ( & ui, "" ) ;
71
133
let bigtext_label =Label :: new ( & ui, "" ) ;
72
134
let progress_bar =ProgressBar :: indeterminate ( & ui) ;
73
- grid. append ( & ui, add_label. clone ( ) ,
74
- 1 , 0 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
75
- grid. append ( & ui, sub_label. clone ( ) ,
76
- 1 , 1 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
135
+ grid. append (
136
+ & ui,
137
+ add_label. clone ( ) ,
138
+ 1 ,
139
+ 0 ,
140
+ 1 ,
141
+ 1 ,
142
+ GridExpand :: Neither ,
143
+ GridAlignment :: Fill ,
144
+ GridAlignment :: Fill ,
145
+ ) ;
146
+ grid. append (
147
+ & ui,
148
+ sub_label. clone ( ) ,
149
+ 1 ,
150
+ 1 ,
151
+ 1 ,
152
+ 1 ,
153
+ GridExpand :: Neither ,
154
+ GridAlignment :: Fill ,
155
+ GridAlignment :: Fill ,
156
+ ) ;
77
157
// We skip the #2 & 3 slots so that the text labels will align with their inputs.
78
158
// This is important because the big text label can expand vertically.
79
- grid. append ( & ui, text_label. clone ( ) ,
80
- 1 , 4 , 1 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
81
- grid. append ( & ui, password_label. clone ( ) ,
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 ) ;
85
- grid. append ( & ui, progress_bar. clone ( ) ,
86
- 0 , 7 , 2 , 1 , GridExpand :: Neither , GridAlignment :: Fill , GridAlignment :: Fill ) ;
87
- ( add_label, sub_label, text_label, password_label, bigtext_label, progress_bar)
159
+ grid. append (
160
+ & ui,
161
+ text_label. clone ( ) ,
162
+ 1 ,
163
+ 4 ,
164
+ 1 ,
165
+ 1 ,
166
+ GridExpand :: Neither ,
167
+ GridAlignment :: Fill ,
168
+ GridAlignment :: Fill ,
169
+ ) ;
170
+ grid. append (
171
+ & ui,
172
+ password_label. clone ( ) ,
173
+ 1 ,
174
+ 5 ,
175
+ 1 ,
176
+ 1 ,
177
+ GridExpand :: Neither ,
178
+ GridAlignment :: Fill ,
179
+ GridAlignment :: Fill ,
180
+ ) ;
181
+ grid. append (
182
+ & ui,
183
+ bigtext_label. clone ( ) ,
184
+ 1 ,
185
+ 6 ,
186
+ 1 ,
187
+ 1 ,
188
+ GridExpand :: Neither ,
189
+ GridAlignment :: Fill ,
190
+ GridAlignment :: Fill ,
191
+ ) ;
192
+ grid. append (
193
+ & ui,
194
+ progress_bar. clone ( ) ,
195
+ 0 ,
196
+ 7 ,
197
+ 2 ,
198
+ 1 ,
199
+ GridExpand :: Neither ,
200
+ GridAlignment :: Fill ,
201
+ GridAlignment :: Fill ,
202
+ ) ;
203
+ (
204
+ add_label,
205
+ sub_label,
206
+ text_label,
207
+ password_label,
208
+ bigtext_label,
209
+ progress_bar,
210
+ )
88
211
} ;
89
212
90
213
// The window allows all constituent components to be displayed.
@@ -97,30 +220,39 @@ fn main() {
97
220
98
221
slider. on_changed ( & ui, {
99
222
let state = state. clone ( ) ;
100
- move |val|{ state. borrow_mut ( ) . slider_val = val; }
223
+ move |val|{
224
+ state. borrow_mut ( ) . slider_val = val;
225
+ }
101
226
} ) ;
102
227
103
228
spinner. on_changed ( & ui, {
104
229
let state = state. clone ( ) ;
105
- move |val|{ state. borrow_mut ( ) . spinner_val = val; }
230
+ move |val|{
231
+ state. borrow_mut ( ) . spinner_val = val;
232
+ }
106
233
} ) ;
107
234
108
235
entry. on_changed ( & ui, {
109
236
let state = state. clone ( ) ;
110
- move |val|{ state. borrow_mut ( ) . entry_val = val; }
237
+ move |val|{
238
+ state. borrow_mut ( ) . entry_val = val;
239
+ }
111
240
} ) ;
112
241
113
242
password. on_changed ( & ui, {
114
243
let state = state. clone ( ) ;
115
- move |val|{ state. borrow_mut ( ) . password_val = val; }
244
+ move |val|{
245
+ state. borrow_mut ( ) . password_val = val;
246
+ }
116
247
} ) ;
117
248
118
249
multi. on_changed ( & ui, {
119
250
let state = state. clone ( ) ;
120
- move |val|{ state. borrow_mut ( ) . multi_val = val; }
251
+ move |val|{
252
+ state. borrow_mut ( ) . multi_val = val;
253
+ }
121
254
} ) ;
122
255
123
-
124
256
// Rather than just invoking ui.run(), using EventLoop gives a lot more control
125
257
// over the user interface event loop.
126
258
// Here, the on_tick() callback is used to update the view against the state.
@@ -137,8 +269,14 @@ fn main() {
137
269
let state = state. borrow ( ) ;
138
270
139
271
// Update all the outputs
140
- add_label. set_text ( & ui, & format ! ( "Added: {}" , state. slider_val + state. spinner_val) ) ;
141
- sub_label. set_text ( & ui, & format ! ( "Subtracted: {}" , state. slider_val - state. spinner_val) ) ;
272
+ add_label. set_text (
273
+ & ui,
274
+ & format ! ( "Added: {}" , state. slider_val + state. spinner_val) ,
275
+ ) ;
276
+ sub_label. set_text (
277
+ & ui,
278
+ & format ! ( "Subtracted: {}" , state. slider_val - state. spinner_val) ,
279
+ ) ;
142
280
text_label. set_text ( & ui, & format ! ( "Text: {}" , state. entry_val) ) ;
143
281
password_label. set_text ( & ui, & format ! ( "Secret Text: {}" , state. password_val) ) ;
144
282
bigtext_label. set_text ( & ui, & format ! ( "Multiline Text: {}" , state. multi_val) ) ;