1use atk_sys;
6use glib;
7use glib::object::Cast;
8use glib::object::IsA;
9use glib::signal::connect_raw;
10use glib::signal::SignalHandlerId;
11use glib::translate::*;
12use glib::GString;
13use glib_sys;
14use libc;
15use std::boxed::Box as Box_;
16use std::fmt;
17use std::mem;
18use std::mem::transmute;
19use std::ptr;
20use Range;
21
22glib_wrapper! {
23 pub struct Value(Interface<atk_sys::AtkValue>);
24
25 match fn {
26 get_type => || atk_sys::atk_value_get_type(),
27 }
28}
29
30pub const NONE_VALUE: Option<&Value> = None;
31
32pub trait ValueExt: 'static {
33 fn get_current_value(&self) -> glib::Value;
34
35 fn get_increment(&self) -> f64;
36
37 fn get_maximum_value(&self) -> glib::Value;
38
39 fn get_minimum_increment(&self) -> glib::Value;
40
41 fn get_minimum_value(&self) -> glib::Value;
42
43 fn get_range(&self) -> Option<Range>;
44
45 fn get_sub_ranges(&self) -> Vec<Range>;
46
47 fn get_value_and_text(&self) -> (f64, GString);
48
49 fn set_current_value(&self, value: &glib::Value) -> bool;
50
51 fn set_value(&self, new_value: f64);
52
53 fn connect_value_changed<F: Fn(&Self, f64, &str) + 'static>(&self, f: F) -> SignalHandlerId;
54}
55
56impl<O: IsA<Value>> ValueExt for O {
57 fn get_current_value(&self) -> glib::Value {
58 unsafe {
59 let mut value = glib::Value::uninitialized();
60 atk_sys::atk_value_get_current_value(
61 self.as_ref().to_glib_none().0,
62 value.to_glib_none_mut().0,
63 );
64 value
65 }
66 }
67
68 fn get_increment(&self) -> f64 {
69 unsafe { atk_sys::atk_value_get_increment(self.as_ref().to_glib_none().0) }
70 }
71
72 fn get_maximum_value(&self) -> glib::Value {
73 unsafe {
74 let mut value = glib::Value::uninitialized();
75 atk_sys::atk_value_get_maximum_value(
76 self.as_ref().to_glib_none().0,
77 value.to_glib_none_mut().0,
78 );
79 value
80 }
81 }
82
83 fn get_minimum_increment(&self) -> glib::Value {
84 unsafe {
85 let mut value = glib::Value::uninitialized();
86 atk_sys::atk_value_get_minimum_increment(
87 self.as_ref().to_glib_none().0,
88 value.to_glib_none_mut().0,
89 );
90 value
91 }
92 }
93
94 fn get_minimum_value(&self) -> glib::Value {
95 unsafe {
96 let mut value = glib::Value::uninitialized();
97 atk_sys::atk_value_get_minimum_value(
98 self.as_ref().to_glib_none().0,
99 value.to_glib_none_mut().0,
100 );
101 value
102 }
103 }
104
105 fn get_range(&self) -> Option<Range> {
106 unsafe { from_glib_full(atk_sys::atk_value_get_range(self.as_ref().to_glib_none().0)) }
107 }
108
109 fn get_sub_ranges(&self) -> Vec<Range> {
110 unsafe {
111 FromGlibPtrContainer::from_glib_full(atk_sys::atk_value_get_sub_ranges(
112 self.as_ref().to_glib_none().0,
113 ))
114 }
115 }
116
117 fn get_value_and_text(&self) -> (f64, GString) {
118 unsafe {
119 let mut value = mem::uninitialized();
120 let mut text = ptr::null_mut();
121 atk_sys::atk_value_get_value_and_text(
122 self.as_ref().to_glib_none().0,
123 &mut value,
124 &mut text,
125 );
126 (value, from_glib_full(text))
127 }
128 }
129
130 fn set_current_value(&self, value: &glib::Value) -> bool {
131 unsafe {
132 from_glib(atk_sys::atk_value_set_current_value(
133 self.as_ref().to_glib_none().0,
134 value.to_glib_none().0,
135 ))
136 }
137 }
138
139 fn set_value(&self, new_value: f64) {
140 unsafe {
141 atk_sys::atk_value_set_value(self.as_ref().to_glib_none().0, new_value);
142 }
143 }
144
145 fn connect_value_changed<F: Fn(&Self, f64, &str) + 'static>(&self, f: F) -> SignalHandlerId {
146 unsafe extern "C" fn value_changed_trampoline<P, F: Fn(&P, f64, &str) + 'static>(
147 this: *mut atk_sys::AtkValue,
148 value: libc::c_double,
149 text: *mut libc::c_char,
150 f: glib_sys::gpointer,
151 ) where
152 P: IsA<Value>,
153 {
154 let f: &F = &*(f as *const F);
155 f(
156 &Value::from_glib_borrow(this).unsafe_cast(),
157 value,
158 &GString::from_glib_borrow(text),
159 )
160 }
161 unsafe {
162 let f: Box_<F> = Box_::new(f);
163 connect_raw(
164 self.as_ptr() as *mut _,
165 b"value-changed\0".as_ptr() as *const _,
166 Some(transmute(value_changed_trampoline::<Self, F> as usize)),
167 Box_::into_raw(f),
168 )
169 }
170 }
171}
172
173impl fmt::Display for Value {
174 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
175 write!(f, "Value")
176 }
177}