1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module atk.ValueT;
26 
27 public  import atk.Range;
28 public  import glib.ListSG;
29 public  import glib.Str;
30 public  import gobject.ObjectG;
31 public  import gobject.Signals;
32 public  import gobject.Value;
33 public  import gtkc.atk;
34 public  import gtkc.atktypes;
35 public  import gtkc.gdktypes;
36 
37 
38 /**
39  * #AtkValue should be implemented for components which either display
40  * a value from a bounded range, or which allow the user to specify a
41  * value from a bounded range, or both. For instance, most sliders and
42  * range controls, as well as dials, should have #AtkObject
43  * representations which implement #AtkValue on the component's
44  * behalf. #AtKValues may be read-only, in which case attempts to
45  * alter the value return would fail.
46  * 
47  * <refsect1 id="current-value-text">
48  * <title>On the subject of current value text</title>
49  * <para>
50  * In addition to providing the current value, implementors can
51  * optionally provide an end-user-consumable textual description
52  * associated with this value. This description should be included
53  * when the numeric value fails to convey the full, on-screen
54  * representation seen by users.
55  * </para>
56  * 
57  * <example>
58  * <title>Password strength</title>
59  * A password strength meter whose value changes as the user types
60  * their new password. Red is used for values less than 4.0, yellow
61  * for values between 4.0 and 7.0, and green for values greater than
62  * 7.0. In this instance, value text should be provided by the
63  * implementor. Appropriate value text would be "weak", "acceptable,"
64  * and "strong" respectively.
65  * </example>
66  * 
67  * A level bar whose value changes to reflect the battery charge. The
68  * color remains the same regardless of the charge and there is no
69  * on-screen text reflecting the fullness of the battery. In this
70  * case, because the position within the bar is the only indication
71  * the user has of the current charge, value text should not be
72  * provided by the implementor.
73  * 
74  * <refsect2 id="implementor-notes">
75  * <title>Implementor Notes</title>
76  * <para>
77  * Implementors should bear in mind that assistive technologies will
78  * likely prefer the value text provided over the numeric value when
79  * presenting a widget's value. As a result, strings not intended for
80  * end users should not be exposed in the value text, and strings
81  * which are exposed should be localized. In the case of widgets which
82  * display value text on screen, for instance through a separate label
83  * in close proximity to the value-displaying widget, it is still
84  * expected that implementors will expose the value text using the
85  * above API.
86  * </para>
87  * 
88  * <para>
89  * #AtkValue should NOT be implemented for widgets whose displayed
90  * value is not reflective of a meaningful amount. For instance, a
91  * progress pulse indicator whose value alternates between 0.0 and 1.0
92  * to indicate that some process is still taking place should not
93  * implement #AtkValue because the current value does not reflect
94  * progress towards completion.
95  * </para>
96  * </refsect2>
97  * </refsect1>
98  * 
99  * <refsect1 id="ranges">
100  * <title>On the subject of ranges</title>
101  * <para>
102  * In addition to providing the minimum and maximum values,
103  * implementors can optionally provide details about subranges
104  * associated with the widget. These details should be provided by the
105  * implementor when both of the following are communicated visually to
106  * the end user:
107  * </para>
108  * <itemizedlist>
109  * <listitem>The existence of distinct ranges such as "weak",
110  * "acceptable", and "strong" indicated by color, bar tick marks,
111  * and/or on-screen text.</listitem>
112  * <listitem>Where the current value stands within a given subrange,
113  * for instance illustrating progression from very "weak" towards
114  * nearly "acceptable" through changes in shade and/or position on
115  * the bar within the "weak" subrange.</listitem>
116  * </itemizedlist>
117  * <para>
118  * If both of the above do not apply to the widget, it should be
119  * sufficient to expose the numeric value, along with the value text
120  * if appropriate, to make the widget accessible.
121  * </para>
122  * 
123  * <refsect2 id="ranges-implementor-notes">
124  * <title>Implementor Notes</title>
125  * <para>
126  * If providing subrange details is deemed necessary, all possible
127  * values of the widget are expected to fall within one of the
128  * subranges defined by the implementor.
129  * </para>
130  * </refsect2>
131  * </refsect1>
132  * 
133  * <refsect1 id="localization">
134  * <title>On the subject of localization of end-user-consumable text
135  * values</title>
136  * <para>
137  * Because value text and subrange descriptors are human-consumable,
138  * implementors are expected to provide localized strings which can be
139  * directly presented to end users via their assistive technology. In
140  * order to simplify this for implementors, implementors can use
141  * atk_value_type_get_localized_name() with the following
142  * already-localized constants for commonly-needed values can be used:
143  * </para>
144  * 
145  * <itemizedlist>
146  * <listitem>ATK_VALUE_VERY_WEAK</listitem>
147  * <listitem>ATK_VALUE_WEAK</listitem>
148  * <listitem>ATK_VALUE_ACCEPTABLE</listitem>
149  * <listitem>ATK_VALUE_STRONG</listitem>
150  * <listitem>ATK_VALUE_VERY_STRONG</listitem>
151  * <listitem>ATK_VALUE_VERY_LOW</listitem>
152  * <listitem>ATK_VALUE_LOW</listitem>
153  * <listitem>ATK_VALUE_MEDIUM</listitem>
154  * <listitem>ATK_VALUE_HIGH</listitem>
155  * <listitem>ATK_VALUE_VERY_HIGH</listitem>
156  * <listitem>ATK_VALUE_VERY_BAD</listitem>
157  * <listitem>ATK_VALUE_BAD</listitem>
158  * <listitem>ATK_VALUE_GOOD</listitem>
159  * <listitem>ATK_VALUE_VERY_GOOD</listitem>
160  * <listitem>ATK_VALUE_BEST</listitem>
161  * <listitem>ATK_VALUE_SUBSUBOPTIMAL</listitem>
162  * <listitem>ATK_VALUE_SUBOPTIMAL</listitem>
163  * <listitem>ATK_VALUE_OPTIMAL</listitem>
164  * </itemizedlist>
165  * <para>
166  * Proposals for additional constants, along with their use cases,
167  * should be submitted to the GNOME Accessibility Team.
168  * </para>
169  * </refsect1>
170  * 
171  * <refsect1 id="changes">
172  * <title>On the subject of changes</title>
173  * <para>
174  * Note that if there is a textual description associated with the new
175  * numeric value, that description should be included regardless of
176  * whether or not it has also changed.
177  * </para>
178  * </refsect1>
179  */
180 public template ValueT(TStruct)
181 {
182 	/** Get the main Gtk struct */
183 	public AtkValue* getValueStruct()
184 	{
185 		return cast(AtkValue*)getStruct();
186 	}
187 
188 	/**
189 	 */
190 
191 	/**
192 	 * Gets the value of this object.
193 	 *
194 	 * Deprecated: Since 2.12. Use atk_value_get_value_and_text()
195 	 * instead.
196 	 *
197 	 * Params:
198 	 *     value = a #GValue representing the current accessible value
199 	 */
200 	public void getCurrentValue(Value value)
201 	{
202 		atk_value_get_current_value(getValueStruct(), (value is null) ? null : value.getValueStruct());
203 	}
204 
205 	/**
206 	 * Gets the minimum increment by which the value of this object may be
207 	 * changed.  If zero, the minimum increment is undefined, which may
208 	 * mean that it is limited only by the floating point precision of the
209 	 * platform.
210 	 *
211 	 * Return: the minimum increment by which the value of this
212 	 *     object may be changed. zero if undefined.
213 	 *
214 	 * Since: 2.12
215 	 */
216 	public double getIncrement()
217 	{
218 		return atk_value_get_increment(getValueStruct());
219 	}
220 
221 	/**
222 	 * Gets the maximum value of this object.
223 	 *
224 	 * Deprecated: Since 2.12. Use atk_value_get_range() instead.
225 	 *
226 	 * Params:
227 	 *     value = a #GValue representing the maximum accessible value
228 	 */
229 	public void getMaximumValue(Value value)
230 	{
231 		atk_value_get_maximum_value(getValueStruct(), (value is null) ? null : value.getValueStruct());
232 	}
233 
234 	/**
235 	 * Gets the minimum increment by which the value of this object may be changed.  If zero,
236 	 * the minimum increment is undefined, which may mean that it is limited only by the
237 	 * floating point precision of the platform.
238 	 *
239 	 * Deprecated: Since 2.12. Use atk_value_get_increment() instead.
240 	 *
241 	 * Params:
242 	 *     value = a #GValue representing the minimum increment by which the accessible value may be changed
243 	 *
244 	 * Since: 1.12
245 	 */
246 	public void getMinimumIncrement(Value value)
247 	{
248 		atk_value_get_minimum_increment(getValueStruct(), (value is null) ? null : value.getValueStruct());
249 	}
250 
251 	/**
252 	 * Gets the minimum value of this object.
253 	 *
254 	 * Deprecated: Since 2.12. Use atk_value_get_range() instead.
255 	 *
256 	 * Params:
257 	 *     value = a #GValue representing the minimum accessible value
258 	 */
259 	public void getMinimumValue(Value value)
260 	{
261 		atk_value_get_minimum_value(getValueStruct(), (value is null) ? null : value.getValueStruct());
262 	}
263 
264 	/**
265 	 * Gets the range of this object.
266 	 *
267 	 * Return: a newly allocated #AtkRange
268 	 *     that represents the minimum, maximum and descriptor (if available)
269 	 *     of @obj. NULL if that range is not defined.
270 	 *
271 	 * Since: 2.12
272 	 */
273 	public Range getRange()
274 	{
275 		auto p = atk_value_get_range(getValueStruct());
276 		
277 		if(p is null)
278 		{
279 			return null;
280 		}
281 		
282 		return ObjectG.getDObject!(Range)(cast(AtkRange*) p);
283 	}
284 
285 	/**
286 	 * Gets the list of subranges defined for this object. See #AtkValue
287 	 * introduction for examples of subranges and when to expose them.
288 	 *
289 	 * Return: an #GSList of
290 	 *     #AtkRange which each of the subranges defined for this object. Free
291 	 *     the returns list with g_slist_free().
292 	 *
293 	 * Since: 2.12
294 	 */
295 	public ListSG getSubRanges()
296 	{
297 		auto p = atk_value_get_sub_ranges(getValueStruct());
298 		
299 		if(p is null)
300 		{
301 			return null;
302 		}
303 		
304 		return new ListSG(cast(GSList*) p);
305 	}
306 
307 	/**
308 	 * Gets the current value and the human readable text alternative of
309 	 * @obj. @text is a newly created string, that must be freed by the
310 	 * caller. Can be NULL if not descriptor is available.
311 	 *
312 	 * Params:
313 	 *     value = address of #gdouble to put the current value of @obj
314 	 *     text = address of #gchar to put the human
315 	 *         readable text alternative for @value
316 	 *
317 	 * Since: 2.12
318 	 */
319 	public void getValueAndText(out double value, out string text)
320 	{
321 		char* outtext = null;
322 		
323 		atk_value_get_value_and_text(getValueStruct(), &value, &outtext);
324 		
325 		text = Str.toString(outtext);
326 	}
327 
328 	/**
329 	 * Sets the value of this object.
330 	 *
331 	 * Deprecated: Since 2.12. Use atk_value_set_value() instead.
332 	 *
333 	 * Params:
334 	 *     value = a #GValue which is the desired new accessible value.
335 	 *
336 	 * Return: %TRUE if new value is successfully set, %FALSE otherwise.
337 	 */
338 	public bool setCurrentValue(Value value)
339 	{
340 		return atk_value_set_current_value(getValueStruct(), (value is null) ? null : value.getValueStruct()) != 0;
341 	}
342 
343 	/**
344 	 * Sets the value of this object.
345 	 *
346 	 * This method is intended to provide a way to change the value of the
347 	 * object. In any case, it is possible that the value can't be
348 	 * modified (ie: a read-only component). If the value changes due this
349 	 * call, it is possible that the text could change, and will trigger
350 	 * an #AtkValue::value-changed signal emission.
351 	 *
352 	 * Note for implementors: the deprecated atk_value_set_current_value()
353 	 * method returned TRUE or FALSE depending if the value was assigned
354 	 * or not. In the practice several implementors were not able to
355 	 * decide it, and returned TRUE in any case. For that reason it is not
356 	 * required anymore to return if the value was properly assigned or
357 	 * not.
358 	 *
359 	 * Params:
360 	 *     newValue = a double which is the desired new accessible value.
361 	 *
362 	 * Since: 2.12
363 	 */
364 	public void setValue(double newValue)
365 	{
366 		atk_value_set_value(getValueStruct(), newValue);
367 	}
368 
369 	int[string] connectedSignals;
370 
371 	void delegate(double, string, ValueIF)[] _onValueChangedListeners;
372 	@property void delegate(double, string, ValueIF)[] onValueChangedListeners()
373 	{
374 		return _onValueChangedListeners;
375 	}
376 	/**
377 	 * The 'value-changed' signal is emitted when the current value
378 	 * that represent the object changes. @value is the numerical
379 	 * representation of this new value.  @text is the human
380 	 * readable text alternative of @value, and can be NULL if it is
381 	 * not available. Note that if there is a textual description
382 	 * associated with the new numeric value, that description
383 	 * should be included regardless of whether or not it has also
384 	 * changed.
385 	 *
386 	 * Example: a password meter whose value changes as the user
387 	 * types their new password. Appropiate value text would be
388 	 * "weak", "acceptable" and "strong".
389 	 *
390 	 * Params:
391 	 *     value = the new value in a numerical form.
392 	 *     text = human readable text alternative (also called
393 	 *         description) of this object. NULL if not available.
394 	 *
395 	 * Since: 2.12
396 	 */
397 	void addOnValueChanged(void delegate(double, string, ValueIF) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
398 	{
399 		if ( "value-changed" !in connectedSignals )
400 		{
401 			Signals.connectData(
402 				this,
403 				"value-changed",
404 				cast(GCallback)&callBackValueChanged,
405 				cast(void*)cast(ValueIF)this,
406 				null,
407 				connectFlags);
408 			connectedSignals["value-changed"] = 1;
409 		}
410 		_onValueChangedListeners ~= dlg;
411 	}
412 	extern(C) static void callBackValueChanged(AtkValue* valueStruct, double value, char* text, ValueIF _value)
413 	{
414 		foreach ( void delegate(double, string, ValueIF) dlg; _value.onValueChangedListeners )
415 		{
416 			dlg(value, Str.toString(text), _value);
417 		}
418 	}
419 }