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 gtk.ToggleButton;
26 
27 private import glib.ConstructionException;
28 private import glib.Str;
29 private import gobject.ObjectG;
30 private import gobject.Signals;
31 private import gtk.Button;
32 private import gtk.Widget;
33 private import gtkc.gtk;
34 public  import gtkc.gtktypes;
35 private import std.algorithm;
36 
37 
38 /**
39  * A #GtkToggleButton is a #GtkButton which will remain “pressed-in” when
40  * clicked. Clicking again will cause the toggle button to return to its
41  * normal state.
42  * 
43  * A toggle button is created by calling either gtk_toggle_button_new() or
44  * gtk_toggle_button_new_with_label(). If using the former, it is advisable to
45  * pack a widget, (such as a #GtkLabel and/or a #GtkImage), into the toggle
46  * button’s container. (See #GtkButton for more information).
47  * 
48  * The state of a #GtkToggleButton can be set specifically using
49  * gtk_toggle_button_set_active(), and retrieved using
50  * gtk_toggle_button_get_active().
51  * 
52  * To simply switch the state of a toggle button, use gtk_toggle_button_toggled().
53  * 
54  * # CSS nodes
55  * 
56  * GtkToggleButton has a single CSS node with name button. To differentiate
57  * it from a plain #GtkButton, it gets the .toggle style class.
58  * 
59  * ## Creating two #GtkToggleButton widgets.
60  * 
61  * |[<!-- language="C" -->
62  * void make_toggles (void) {
63  * GtkWidget *dialog, *toggle1, *toggle2;
64  * GtkWidget *content_area;
65  * const char *text;
66  * 
67  * dialog = gtk_dialog_new (text);
68  * content_area = gtk_dialog_get_content_area ();
69  * 
70  * text = "Hi, i’m a toggle button.";
71  * toggle1 = gtk_toggle_button_new_with_label (text);
72  * 
73  * // Makes this toggle button invisible
74  * gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (toggle1),
75  * TRUE);
76  * 
77  * g_signal_connect (toggle1, "toggled",
78  * G_CALLBACK (output_state),
79  * NULL);
80  * gtk_box_pack_start (GTK_BOX (content_area),
81  * toggle1, FALSE, FALSE, 2);
82  * 
83  * text = "Hi, i’m a toggle button.";
84  * toggle2 = gtk_toggle_button_new_with_label (text);
85  * gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (toggle2),
86  * FALSE);
87  * g_signal_connect (toggle2, "toggled",
88  * G_CALLBACK (output_state),
89  * NULL);
90  * gtk_box_pack_start (GTK_BOX (content_area),
91  * toggle2, FALSE, FALSE, 2);
92  * 
93  * gtk_widget_show_all (dialog);
94  * }
95  * ]|
96  */
97 public class ToggleButton : Button
98 {
99 	/** the main Gtk struct */
100 	protected GtkToggleButton* gtkToggleButton;
101 
102 	/** Get the main Gtk struct */
103 	public GtkToggleButton* getToggleButtonStruct(bool transferOwnership = false)
104 	{
105 		if (transferOwnership)
106 			ownedRef = false;
107 		return gtkToggleButton;
108 	}
109 
110 	/** the main Gtk struct as a void* */
111 	protected override void* getStruct()
112 	{
113 		return cast(void*)gtkToggleButton;
114 	}
115 
116 	protected override void setStruct(GObject* obj)
117 	{
118 		gtkToggleButton = cast(GtkToggleButton*)obj;
119 		super.setStruct(obj);
120 	}
121 
122 	/**
123 	 * Sets our main struct and passes it to the parent class.
124 	 */
125 	public this (GtkToggleButton* gtkToggleButton, bool ownedRef = false)
126 	{
127 		this.gtkToggleButton = gtkToggleButton;
128 		super(cast(GtkButton*)gtkToggleButton, ownedRef);
129 	}
130 
131 	/**
132 	 * Creates a new toggle button with a text label.
133 	 * Params:
134 	 *  label = a string containing the message to be placed in the toggle button.
135 	 *  mnemonic =  if true the label
136 	 *  will be created using gtk_label_new_with_mnemonic(), so underscores
137 	 *  in label indicate the mnemonic for the button.
138 	 * Throws: ConstructionException GTK+ fails to create the object.
139 	 */
140 	public this (string label, bool mnemonic=true)
141 	{
142 		GtkToggleButton* p;
143 		
144 		if ( mnemonic )
145 		{
146 			// GtkWidget* gtk_toggle_button_new_with_mnemonic  (const gchar *label);
147 			p = cast(GtkToggleButton*)gtk_toggle_button_new_with_mnemonic(Str.toStringz(label));
148 		}
149 		else
150 		{
151 			// GtkWidget* gtk_toggle_button_new_with_label  (const gchar *label);
152 			p = cast(GtkToggleButton*)gtk_toggle_button_new_with_label(Str.toStringz(label));
153 		}
154 		
155 		if(p is null)
156 		{
157 			throw new ConstructionException("null returned by gtk_toggle_button_new_");
158 		}
159 		
160 		this(p);
161 	}
162 
163 	/**
164 	 */
165 
166 	/** */
167 	public static GType getType()
168 	{
169 		return gtk_toggle_button_get_type();
170 	}
171 
172 	/**
173 	 * Creates a new toggle button. A widget should be packed into the button, as in gtk_button_new().
174 	 *
175 	 * Returns: a new toggle button.
176 	 *
177 	 * Throws: ConstructionException GTK+ fails to create the object.
178 	 */
179 	public this()
180 	{
181 		auto p = gtk_toggle_button_new();
182 		
183 		if(p is null)
184 		{
185 			throw new ConstructionException("null returned by new");
186 		}
187 		
188 		this(cast(GtkToggleButton*) p);
189 	}
190 
191 	/**
192 	 * Queries a #GtkToggleButton and returns its current state. Returns %TRUE if
193 	 * the toggle button is pressed in and %FALSE if it is raised.
194 	 *
195 	 * Returns: a #gboolean value.
196 	 */
197 	public bool getActive()
198 	{
199 		return gtk_toggle_button_get_active(gtkToggleButton) != 0;
200 	}
201 
202 	/**
203 	 * Gets the value set by gtk_toggle_button_set_inconsistent().
204 	 *
205 	 * Returns: %TRUE if the button is displayed as inconsistent, %FALSE otherwise
206 	 */
207 	public bool getInconsistent()
208 	{
209 		return gtk_toggle_button_get_inconsistent(gtkToggleButton) != 0;
210 	}
211 
212 	/**
213 	 * Retrieves whether the button is displayed as a separate indicator
214 	 * and label. See gtk_toggle_button_set_mode().
215 	 *
216 	 * Returns: %TRUE if the togglebutton is drawn as a separate indicator
217 	 *     and label.
218 	 */
219 	public bool getMode()
220 	{
221 		return gtk_toggle_button_get_mode(gtkToggleButton) != 0;
222 	}
223 
224 	/**
225 	 * Sets the status of the toggle button. Set to %TRUE if you want the
226 	 * GtkToggleButton to be “pressed in”, and %FALSE to raise it.
227 	 * This action causes the #GtkToggleButton::toggled signal and the
228 	 * #GtkButton::clicked signal to be emitted.
229 	 *
230 	 * Params:
231 	 *     isActive = %TRUE or %FALSE.
232 	 */
233 	public void setActive(bool isActive)
234 	{
235 		gtk_toggle_button_set_active(gtkToggleButton, isActive);
236 	}
237 
238 	/**
239 	 * If the user has selected a range of elements (such as some text or
240 	 * spreadsheet cells) that are affected by a toggle button, and the
241 	 * current values in that range are inconsistent, you may want to
242 	 * display the toggle in an “in between” state. This function turns on
243 	 * “in between” display.  Normally you would turn off the inconsistent
244 	 * state again if the user toggles the toggle button. This has to be
245 	 * done manually, gtk_toggle_button_set_inconsistent() only affects
246 	 * visual appearance, it doesn’t affect the semantics of the button.
247 	 *
248 	 * Params:
249 	 *     setting = %TRUE if state is inconsistent
250 	 */
251 	public void setInconsistent(bool setting)
252 	{
253 		gtk_toggle_button_set_inconsistent(gtkToggleButton, setting);
254 	}
255 
256 	/**
257 	 * Sets whether the button is displayed as a separate indicator and label.
258 	 * You can call this function on a checkbutton or a radiobutton with
259 	 * @draw_indicator = %FALSE to make the button look like a normal button.
260 	 *
261 	 * This can be used to create linked strip of buttons that work like
262 	 * a #GtkStackSwitcher.
263 	 *
264 	 * This function only affects instances of classes like #GtkCheckButton
265 	 * and #GtkRadioButton that derive from #GtkToggleButton,
266 	 * not instances of #GtkToggleButton itself.
267 	 *
268 	 * Params:
269 	 *     drawIndicator = if %TRUE, draw the button as a separate indicator
270 	 *         and label; if %FALSE, draw the button like a normal button
271 	 */
272 	public void setMode(bool drawIndicator)
273 	{
274 		gtk_toggle_button_set_mode(gtkToggleButton, drawIndicator);
275 	}
276 
277 	/**
278 	 * Emits the #GtkToggleButton::toggled signal on the
279 	 * #GtkToggleButton. There is no good reason for an
280 	 * application ever to call this function.
281 	 */
282 	public void toggled()
283 	{
284 		gtk_toggle_button_toggled(gtkToggleButton);
285 	}
286 
287 	protected class OnToggledDelegateWrapper
288 	{
289 		void delegate(ToggleButton) dlg;
290 		gulong handlerId;
291 		
292 		this(void delegate(ToggleButton) dlg)
293 		{
294 			this.dlg = dlg;
295 			onToggledListeners ~= this;
296 		}
297 		
298 		void remove(OnToggledDelegateWrapper source)
299 		{
300 			foreach(index, wrapper; onToggledListeners)
301 			{
302 				if (wrapper.handlerId == source.handlerId)
303 				{
304 					onToggledListeners[index] = null;
305 					onToggledListeners = std.algorithm.remove(onToggledListeners, index);
306 					break;
307 				}
308 			}
309 		}
310 	}
311 	OnToggledDelegateWrapper[] onToggledListeners;
312 
313 	/**
314 	 * Should be connected if you wish to perform an action whenever the
315 	 * #GtkToggleButton's state is changed.
316 	 */
317 	gulong addOnToggled(void delegate(ToggleButton) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
318 	{
319 		auto wrapper = new OnToggledDelegateWrapper(dlg);
320 		wrapper.handlerId = Signals.connectData(
321 			this,
322 			"toggled",
323 			cast(GCallback)&callBackToggled,
324 			cast(void*)wrapper,
325 			cast(GClosureNotify)&callBackToggledDestroy,
326 			connectFlags);
327 		return wrapper.handlerId;
328 	}
329 	
330 	extern(C) static void callBackToggled(GtkToggleButton* togglebuttonStruct, OnToggledDelegateWrapper wrapper)
331 	{
332 		wrapper.dlg(wrapper.outer);
333 	}
334 	
335 	extern(C) static void callBackToggledDestroy(OnToggledDelegateWrapper wrapper, GClosure* closure)
336 	{
337 		wrapper.remove(wrapper);
338 	}
339 }