1
1
//! User input mechanisms: numbers, colors, and text in various forms.
2
2
3
3
use super :: Control ;
4
- use std:: os:: raw:: c_void;
5
4
use std:: ffi:: { CStr , CString } ;
6
5
use std:: i32;
7
6
use std:: mem;
7
+ use std:: os:: raw:: c_void;
8
8
use ui:: UI ;
9
9
use ui_sys:: {
10
- self , uiCheckbox, uiCombobox, uiControl, uiEntry, uiMultilineEntry, uiSlider, uiSpinbox,
10
+ self , uiCheckbox, uiCombobox, uiControl, uiEntry, uiMultilineEntry, uiRadioButtons, uiSlider,
11
+ uiSpinbox,
11
12
} ;
12
13
13
14
pub trait NumericEntry {
@@ -22,15 +23,15 @@ pub trait TextEntry {
22
23
fn on_changed < ' ctx , F : FnMut ( String ) + ' ctx > ( & mut self , ctx : & ' ctx UI , callback : F ) ;
23
24
}
24
25
25
- define_control ! {
26
+ define_control ! {
26
27
/// Numerical entry control which allows users to set any value in a range by typing or incrementing/decrementing.
27
- rust_type: Spinbox ,
28
+ rust_type: Spinbox ,
28
29
sys_type: uiSpinbox
29
30
}
30
31
31
- define_control ! {
32
+ define_control ! {
32
33
/// Numerical entry which allows users to select a value by picking a location along a line.
33
- rust_type: Slider ,
34
+ rust_type: Slider ,
34
35
sys_type: uiSlider
35
36
}
36
37
@@ -227,6 +228,11 @@ impl Combobox {
227
228
}
228
229
}
229
230
231
+ /// Returns the index of the currently selected option.
232
+ pub fn selected ( & self , _ctx : & UI ) -> i32 {
233
+ unsafe { ui_sys:: uiComboboxSelected ( self . uiCombobox ) }
234
+ }
235
+
230
236
pub fn set_selected ( & mut self , _ctx : & UI , value : i32 ) {
231
237
unsafe { ui_sys:: uiComboboxSetSelected ( self . uiCombobox , value) }
232
238
}
@@ -291,3 +297,47 @@ impl Checkbox {
291
297
}
292
298
}
293
299
}
300
+
301
+ define_control ! {
302
+ /// A set of toggles; only one can be selected at a time.
303
+ rust_type: RadioButtons ,
304
+ sys_type: uiRadioButtons
305
+ }
306
+
307
+ impl RadioButtons {
308
+ pub fn new ( _ctx : & UI ) -> Self {
309
+ unsafe { RadioButtons :: from_raw ( ui_sys:: uiNewRadioButtons ( ) ) }
310
+ }
311
+
312
+ pub fn append ( & self , _ctx : & UI , name : & str ) {
313
+ let c_string = CString :: new ( name. as_bytes ( ) . to_vec ( ) ) . unwrap ( ) ;
314
+ unsafe { ui_sys:: uiRadioButtonsAppend ( self . uiRadioButtons , c_string. as_ptr ( ) ) ; }
315
+ }
316
+
317
+ pub fn selected ( & self , _ctx : & UI ) -> i32 {
318
+ unsafe { ui_sys:: uiRadioButtonsSelected ( self . uiRadioButtons ) }
319
+ }
320
+
321
+ pub fn set_selected ( & mut self , _ctx : & UI , idx : i32 ) {
322
+ unsafe { ui_sys:: uiRadioButtonsSetSelected ( self . uiRadioButtons , idx) ; }
323
+ }
324
+
325
+ pub fn on_selected < ' ctx , F : FnMut ( i32 ) + ' ctx > ( & self , _ctx : & ' ctx UI , callback : F ) {
326
+ unsafe {
327
+ let mut data: Box < Box < FnMut ( i32 ) > > = Box :: new ( Box :: new ( callback) ) ;
328
+ ui_sys:: uiRadioButtonsOnSelected (
329
+ self . uiRadioButtons ,
330
+ Some ( c_callback) ,
331
+ & mut * data as * mut Box < FnMut ( i32 ) > as * mut c_void ,
332
+ ) ;
333
+ mem:: forget ( data) ;
334
+ }
335
+
336
+ extern "C" fn c_callback ( radio_buttons : * mut uiRadioButtons , data : * mut c_void ) {
337
+ unsafe {
338
+ let val = ui_sys:: uiRadioButtonsSelected ( radio_buttons) ;
339
+ mem:: transmute :: < * mut c_void , & mut Box < FnMut ( i32 ) > > ( data) ( val) ;
340
+ }
341
+ }
342
+ }
343
+ }
0 commit comments