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.MenuButton;
26 
27 private import gio.MenuModel;
28 private import glib.ConstructionException;
29 private import gobject.ObjectG;
30 private import gtk.Menu;
31 private import gtk.Popover;
32 private import gtk.ToggleButton;
33 private import gtk.Widget;
34 private import gtk.c.functions;
35 public  import gtk.c.types;
36 public  import gtkc.gtktypes;
37 
38 
39 /**
40  * The #GtkMenuButton widget is used to display a popup when clicked on.
41  * This popup can be provided either as a #GtkMenu, a #GtkPopover or an
42  * abstract #GMenuModel.
43  * 
44  * The #GtkMenuButton widget can hold any valid child widget. That is, it
45  * can hold almost any other standard #GtkWidget. The most commonly used
46  * child is #GtkImage. If no widget is explicitely added to the #GtkMenuButton,
47  * a #GtkImage is automatically created, using an arrow image oriented
48  * according to #GtkMenuButton:direction or the generic “open-menu-symbolic”
49  * icon if the direction is not set.
50  * 
51  * The positioning of the popup is determined by the #GtkMenuButton:direction
52  * property of the menu button.
53  * 
54  * For menus, the #GtkWidget:halign and #GtkWidget:valign properties of the
55  * menu are also taken into account. For example, when the direction is
56  * %GTK_ARROW_DOWN and the horizontal alignment is %GTK_ALIGN_START, the
57  * menu will be positioned below the button, with the starting edge
58  * (depending on the text direction) of the menu aligned with the starting
59  * edge of the button. If there is not enough space below the button, the
60  * menu is popped up above the button instead. If the alignment would move
61  * part of the menu offscreen, it is “pushed in”.
62  * 
63  * ## Direction = Down
64  * 
65  * - halign = start
66  * 
67  * ![](down-start.png)
68  * 
69  * - halign = center
70  * 
71  * ![](down-center.png)
72  * 
73  * - halign = end
74  * 
75  * ![](down-end.png)
76  * 
77  * ## Direction = Up
78  * 
79  * - halign = start
80  * 
81  * ![](up-start.png)
82  * 
83  * - halign = center
84  * 
85  * ![](up-center.png)
86  * 
87  * - halign = end
88  * 
89  * ![](up-end.png)
90  * 
91  * ## Direction = Left
92  * 
93  * - valign = start
94  * 
95  * ![](left-start.png)
96  * 
97  * - valign = center
98  * 
99  * ![](left-center.png)
100  * 
101  * - valign = end
102  * 
103  * ![](left-end.png)
104  * 
105  * ## Direction = Right
106  * 
107  * - valign = start
108  * 
109  * ![](right-start.png)
110  * 
111  * - valign = center
112  * 
113  * ![](right-center.png)
114  * 
115  * - valign = end
116  * 
117  * ![](right-end.png)
118  * 
119  * # CSS nodes
120  * 
121  * GtkMenuButton has a single CSS node with name button. To differentiate
122  * it from a plain #GtkButton, it gets the .popup style class.
123  */
124 public class MenuButton : ToggleButton
125 {
126 	/** the main Gtk struct */
127 	protected GtkMenuButton* gtkMenuButton;
128 
129 	/** Get the main Gtk struct */
130 	public GtkMenuButton* getMenuButtonStruct(bool transferOwnership = false)
131 	{
132 		if (transferOwnership)
133 			ownedRef = false;
134 		return gtkMenuButton;
135 	}
136 
137 	/** the main Gtk struct as a void* */
138 	protected override void* getStruct()
139 	{
140 		return cast(void*)gtkMenuButton;
141 	}
142 
143 	/**
144 	 * Sets our main struct and passes it to the parent class.
145 	 */
146 	public this (GtkMenuButton* gtkMenuButton, bool ownedRef = false)
147 	{
148 		this.gtkMenuButton = gtkMenuButton;
149 		super(cast(GtkToggleButton*)gtkMenuButton, ownedRef);
150 	}
151 
152 
153 	/** */
154 	public static GType getType()
155 	{
156 		return gtk_menu_button_get_type();
157 	}
158 
159 	/**
160 	 * Creates a new #GtkMenuButton widget with downwards-pointing
161 	 * arrow as the only child. You can replace the child widget
162 	 * with another #GtkWidget should you wish to.
163 	 *
164 	 * Returns: The newly created #GtkMenuButton widget
165 	 *
166 	 * Since: 3.6
167 	 *
168 	 * Throws: ConstructionException GTK+ fails to create the object.
169 	 */
170 	public this()
171 	{
172 		auto p = gtk_menu_button_new();
173 
174 		if(p is null)
175 		{
176 			throw new ConstructionException("null returned by new");
177 		}
178 
179 		this(cast(GtkMenuButton*) p);
180 	}
181 
182 	/**
183 	 * Returns the parent #GtkWidget to use to line up with menu.
184 	 *
185 	 * Returns: a #GtkWidget value or %NULL
186 	 *
187 	 * Since: 3.6
188 	 */
189 	public Widget getAlignWidget()
190 	{
191 		auto p = gtk_menu_button_get_align_widget(gtkMenuButton);
192 
193 		if(p is null)
194 		{
195 			return null;
196 		}
197 
198 		return ObjectG.getDObject!(Widget)(cast(GtkWidget*) p);
199 	}
200 
201 	/**
202 	 * Returns the direction the popup will be pointing at when popped up.
203 	 *
204 	 * Returns: a #GtkArrowType value
205 	 *
206 	 * Since: 3.6
207 	 */
208 	public GtkArrowType getMenuDirection()
209 	{
210 		return gtk_menu_button_get_direction(gtkMenuButton);
211 	}
212 
213 	/**
214 	 * Returns the #GMenuModel used to generate the popup.
215 	 *
216 	 * Returns: a #GMenuModel or %NULL
217 	 *
218 	 * Since: 3.6
219 	 */
220 	public MenuModel getMenuModel()
221 	{
222 		auto p = gtk_menu_button_get_menu_model(gtkMenuButton);
223 
224 		if(p is null)
225 		{
226 			return null;
227 		}
228 
229 		return ObjectG.getDObject!(MenuModel)(cast(GMenuModel*) p);
230 	}
231 
232 	/**
233 	 * Returns the #GtkPopover that pops out of the button.
234 	 * If the button is not using a #GtkPopover, this function
235 	 * returns %NULL.
236 	 *
237 	 * Returns: a #GtkPopover or %NULL
238 	 *
239 	 * Since: 3.12
240 	 */
241 	public Popover getPopover()
242 	{
243 		auto p = gtk_menu_button_get_popover(gtkMenuButton);
244 
245 		if(p is null)
246 		{
247 			return null;
248 		}
249 
250 		return ObjectG.getDObject!(Popover)(cast(GtkPopover*) p);
251 	}
252 
253 	/**
254 	 * Returns the #GtkMenu that pops out of the button.
255 	 * If the button does not use a #GtkMenu, this function
256 	 * returns %NULL.
257 	 *
258 	 * Returns: a #GtkMenu or %NULL
259 	 *
260 	 * Since: 3.6
261 	 */
262 	public Menu getPopup()
263 	{
264 		auto p = gtk_menu_button_get_popup(gtkMenuButton);
265 
266 		if(p is null)
267 		{
268 			return null;
269 		}
270 
271 		return ObjectG.getDObject!(Menu)(cast(GtkMenu*) p);
272 	}
273 
274 	/**
275 	 * Returns whether a #GtkPopover or a #GtkMenu will be constructed
276 	 * from the menu model.
277 	 *
278 	 * Returns: %TRUE if using a #GtkPopover
279 	 *
280 	 * Since: 3.12
281 	 */
282 	public bool getUsePopover()
283 	{
284 		return gtk_menu_button_get_use_popover(gtkMenuButton) != 0;
285 	}
286 
287 	/**
288 	 * Sets the #GtkWidget to use to line the menu with when popped up.
289 	 * Note that the @align_widget must contain the #GtkMenuButton itself.
290 	 *
291 	 * Setting it to %NULL means that the menu will be aligned with the
292 	 * button itself.
293 	 *
294 	 * Note that this property is only used with menus currently,
295 	 * and not for popovers.
296 	 *
297 	 * Params:
298 	 *     alignWidget = a #GtkWidget
299 	 *
300 	 * Since: 3.6
301 	 */
302 	public void setAlignWidget(Widget alignWidget)
303 	{
304 		gtk_menu_button_set_align_widget(gtkMenuButton, (alignWidget is null) ? null : alignWidget.getWidgetStruct());
305 	}
306 
307 	/**
308 	 * Sets the direction in which the popup will be popped up, as
309 	 * well as changing the arrow’s direction. The child will not
310 	 * be changed to an arrow if it was customized.
311 	 *
312 	 * If the does not fit in the available space in the given direction,
313 	 * GTK+ will its best to keep it inside the screen and fully visible.
314 	 *
315 	 * If you pass %GTK_ARROW_NONE for a @direction, the popup will behave
316 	 * as if you passed %GTK_ARROW_DOWN (although you won’t see any arrows).
317 	 *
318 	 * Params:
319 	 *     direction = a #GtkArrowType
320 	 *
321 	 * Since: 3.6
322 	 */
323 	public void setMenuDirection(GtkArrowType direction)
324 	{
325 		gtk_menu_button_set_direction(gtkMenuButton, direction);
326 	}
327 
328 	/**
329 	 * Sets the #GMenuModel from which the popup will be constructed,
330 	 * or %NULL to dissociate any existing menu model and disable the button.
331 	 *
332 	 * Depending on the value of #GtkMenuButton:use-popover, either a
333 	 * #GtkMenu will be created with gtk_menu_new_from_model(), or a
334 	 * #GtkPopover with gtk_popover_new_from_model(). In either case,
335 	 * actions will be connected as documented for these functions.
336 	 *
337 	 * If #GtkMenuButton:popup or #GtkMenuButton:popover are already set, those
338 	 * widgets are dissociated from the @menu_button, and those properties are set
339 	 * to %NULL.
340 	 *
341 	 * Params:
342 	 *     menuModel = a #GMenuModel, or %NULL to unset and disable the
343 	 *         button
344 	 *
345 	 * Since: 3.6
346 	 */
347 	public void setMenuModel(MenuModel menuModel)
348 	{
349 		gtk_menu_button_set_menu_model(gtkMenuButton, (menuModel is null) ? null : menuModel.getMenuModelStruct());
350 	}
351 
352 	/**
353 	 * Sets the #GtkPopover that will be popped up when the @menu_button is clicked,
354 	 * or %NULL to dissociate any existing popover and disable the button.
355 	 *
356 	 * If #GtkMenuButton:menu-model or #GtkMenuButton:popup are set, those objects
357 	 * are dissociated from the @menu_button, and those properties are set to %NULL.
358 	 *
359 	 * Params:
360 	 *     popover = a #GtkPopover, or %NULL to unset and disable the button
361 	 *
362 	 * Since: 3.12
363 	 */
364 	public void setPopover(Widget popover)
365 	{
366 		gtk_menu_button_set_popover(gtkMenuButton, (popover is null) ? null : popover.getWidgetStruct());
367 	}
368 
369 	/**
370 	 * Sets the #GtkMenu that will be popped up when the @menu_button is clicked, or
371 	 * %NULL to dissociate any existing menu and disable the button.
372 	 *
373 	 * If #GtkMenuButton:menu-model or #GtkMenuButton:popover are set, those objects
374 	 * are dissociated from the @menu_button, and those properties are set to %NULL.
375 	 *
376 	 * Params:
377 	 *     menu = a #GtkMenu, or %NULL to unset and disable the button
378 	 *
379 	 * Since: 3.6
380 	 */
381 	public void setPopup(Widget menu)
382 	{
383 		gtk_menu_button_set_popup(gtkMenuButton, (menu is null) ? null : menu.getWidgetStruct());
384 	}
385 
386 	/**
387 	 * Sets whether to construct a #GtkPopover instead of #GtkMenu
388 	 * when gtk_menu_button_set_menu_model() is called. Note that
389 	 * this property is only consulted when a new menu model is set.
390 	 *
391 	 * Params:
392 	 *     usePopover = %TRUE to construct a popover from the menu model
393 	 *
394 	 * Since: 3.12
395 	 */
396 	public void setUsePopover(bool usePopover)
397 	{
398 		gtk_menu_button_set_use_popover(gtkMenuButton, usePopover);
399 	}
400 }