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 change21 // find conversion definition on APILookup.txt22 // implement new conversion functionalities on the wrap.utils pakage23 24 25 modulegio.MenuModel;
26 27 privateimportgio.MenuAttributeIter;
28 privateimportgio.MenuLinkIter;
29 privateimportgio.c.functions;
30 publicimportgio.c.types;
31 privateimportglib.Str;
32 privateimportglib.Variant;
33 privateimportglib.VariantType;
34 privateimportgobject.ObjectG;
35 privateimportgobject.Signals;
36 privateimportstd.algorithm;
37 38 39 /**
40 * #GMenuModel represents the contents of a menu -- an ordered list of
41 * menu items. The items are associated with actions, which can be
42 * activated through them. Items can be grouped in sections, and may
43 * have submenus associated with them. Both items and sections usually
44 * have some representation data, such as labels or icons. The type of
45 * the associated action (ie whether it is stateful, and what kind of
46 * state it has) can influence the representation of the item.
47 *
48 * The conceptual model of menus in #GMenuModel is hierarchical:
49 * sections and submenus are again represented by #GMenuModels.
50 * Menus themselves do not define their own roles. Rather, the role
51 * of a particular #GMenuModel is defined by the item that references
52 * it (or, in the case of the 'root' menu, is defined by the context
53 * in which it is used).
54 *
55 * As an example, consider the visible portions of this menu:
56 *
57 * ## An example menu # {#menu-example}
58 *
59 * 
60 *
61 * There are 8 "menus" visible in the screenshot: one menubar, two
62 * submenus and 5 sections:
63 *
64 * - the toplevel menubar (containing 4 items)
65 * - the View submenu (containing 3 sections)
66 * - the first section of the View submenu (containing 2 items)
67 * - the second section of the View submenu (containing 1 item)
68 * - the final section of the View submenu (containing 1 item)
69 * - the Highlight Mode submenu (containing 2 sections)
70 * - the Sources section (containing 2 items)
71 * - the Markup section (containing 2 items)
72 *
73 * The [example][menu-model] illustrates the conceptual connection between
74 * these 8 menus. Each large block in the figure represents a menu and the
75 * smaller blocks within the large block represent items in that menu. Some
76 * items contain references to other menus.
77 *
78 * ## A menu example # {#menu-model}
79 *
80 * 
81 *
82 * Notice that the separators visible in the [example][menu-example]
83 * appear nowhere in the [menu model][menu-model]. This is because
84 * separators are not explicitly represented in the menu model. Instead,
85 * a separator is inserted between any two non-empty sections of a menu.
86 * Section items can have labels just like any other item. In that case,
87 * a display system may show a section header instead of a separator.
88 *
89 * The motivation for this abstract model of application controls is
90 * that modern user interfaces tend to make these controls available
91 * outside the application. Examples include global menus, jumplists,
92 * dash boards, etc. To support such uses, it is necessary to 'export'
93 * information about actions and their representation in menus, which
94 * is exactly what the [GActionGroup exporter][gio-GActionGroup-exporter]
95 * and the [GMenuModel exporter][gio-GMenuModel-exporter] do for
96 * #GActionGroup and #GMenuModel. The client-side counterparts to
97 * make use of the exported information are #GDBusActionGroup and
98 * #GDBusMenuModel.
99 *
100 * The API of #GMenuModel is very generic, with iterators for the
101 * attributes and links of an item, see g_menu_model_iterate_item_attributes()
102 * and g_menu_model_iterate_item_links(). The 'standard' attributes and
103 * link types have predefined names: %G_MENU_ATTRIBUTE_LABEL,
104 * %G_MENU_ATTRIBUTE_ACTION, %G_MENU_ATTRIBUTE_TARGET, %G_MENU_LINK_SECTION
105 * and %G_MENU_LINK_SUBMENU.
106 *
107 * Items in a #GMenuModel represent active controls if they refer to
108 * an action that can get activated when the user interacts with the
109 * menu item. The reference to the action is encoded by the string id
110 * in the %G_MENU_ATTRIBUTE_ACTION attribute. An action id uniquely
111 * identifies an action in an action group. Which action group(s) provide
112 * actions depends on the context in which the menu model is used.
113 * E.g. when the model is exported as the application menu of a
114 * #GtkApplication, actions can be application-wide or window-specific
115 * (and thus come from two different action groups). By convention, the
116 * application-wide actions have names that start with "app.", while the
117 * names of window-specific actions start with "win.".
118 *
119 * While a wide variety of stateful actions is possible, the following
120 * is the minimum that is expected to be supported by all users of exported
121 * menu information:
122 * - an action with no parameter type and no state
123 * - an action with no parameter type and boolean state
124 * - an action with string parameter type and string state
125 *
126 * ## Stateless
127 *
128 * A stateless action typically corresponds to an ordinary menu item.
129 *
130 * Selecting such a menu item will activate the action (with no parameter).
131 *
132 * ## Boolean State
133 *
134 * An action with a boolean state will most typically be used with a "toggle"
135 * or "switch" menu item. The state can be set directly, but activating the
136 * action (with no parameter) results in the state being toggled.
137 *
138 * Selecting a toggle menu item will activate the action. The menu item should
139 * be rendered as "checked" when the state is true.
140 *
141 * ## String Parameter and State
142 *
143 * Actions with string parameters and state will most typically be used to
144 * represent an enumerated choice over the items available for a group of
145 * radio menu items. Activating the action with a string parameter is
146 * equivalent to setting that parameter as the state.
147 *
148 * Radio menu items, in addition to being associated with the action, will
149 * have a target value. Selecting that menu item will result in activation
150 * of the action with the target value as the parameter. The menu item should
151 * be rendered as "selected" when the state of the action is equal to the
152 * target value of the menu item.
153 *
154 * Since: 2.32
155 */156 publicclassMenuModel : ObjectG157 {
158 /** the main Gtk struct */159 protectedGMenuModel* gMenuModel;
160 161 /** Get the main Gtk struct */162 publicGMenuModel* getMenuModelStruct(booltransferOwnership = false)
163 {
164 if (transferOwnership)
165 ownedRef = false;
166 returngMenuModel;
167 }
168 169 /** the main Gtk struct as a void* */170 protectedoverridevoid* getStruct()
171 {
172 returncast(void*)gMenuModel;
173 }
174 175 /**
176 * Sets our main struct and passes it to the parent class.
177 */178 publicthis (GMenuModel* gMenuModel, boolownedRef = false)
179 {
180 this.gMenuModel = gMenuModel;
181 super(cast(GObject*)gMenuModel, ownedRef);
182 }
183 184 185 /** */186 publicstaticGTypegetType()
187 {
188 returng_menu_model_get_type();
189 }
190 191 /**
192 * Queries the item at position @item_index in @model for the attribute
193 * specified by @attribute.
194 *
195 * If @expected_type is non-%NULL then it specifies the expected type of
196 * the attribute. If it is %NULL then any type will be accepted.
197 *
198 * If the attribute exists and matches @expected_type (or if the
199 * expected type is unspecified) then the value is returned.
200 *
201 * If the attribute does not exist, or does not match the expected type
202 * then %NULL is returned.
203 *
204 * Params:
205 * itemIndex = the index of the item
206 * attribute = the attribute to query
207 * expectedType = the expected type of the attribute, or
208 * %NULL
209 *
210 * Returns: the value of the attribute
211 *
212 * Since: 2.32
213 */214 publicVariantgetItemAttributeValue(intitemIndex, stringattribute, VariantTypeexpectedType)
215 {
216 auto__p = g_menu_model_get_item_attribute_value(gMenuModel, itemIndex, Str.toStringz(attribute), (expectedTypeisnull) ? null : expectedType.getVariantTypeStruct());
217 218 if(__pisnull)
219 {
220 returnnull;
221 }
222 223 returnnewVariant(cast(GVariant*) __p, true);
224 }
225 226 /**
227 * Queries the item at position @item_index in @model for the link
228 * specified by @link.
229 *
230 * If the link exists, the linked #GMenuModel is returned. If the link
231 * does not exist, %NULL is returned.
232 *
233 * Params:
234 * itemIndex = the index of the item
235 * link = the link to query
236 *
237 * Returns: the linked #GMenuModel, or %NULL
238 *
239 * Since: 2.32
240 */241 publicMenuModelgetItemLink(intitemIndex, stringlink)
242 {
243 auto__p = g_menu_model_get_item_link(gMenuModel, itemIndex, Str.toStringz(link));
244 245 if(__pisnull)
246 {
247 returnnull;
248 }
249 250 returnObjectG.getDObject!(MenuModel)(cast(GMenuModel*) __p, true);
251 }
252 253 /**
254 * Query the number of items in @model.
255 *
256 * Returns: the number of items
257 *
258 * Since: 2.32
259 */260 publicintgetNItems()
261 {
262 returng_menu_model_get_n_items(gMenuModel);
263 }
264 265 /**
266 * Queries if @model is mutable.
267 *
268 * An immutable #GMenuModel will never emit the #GMenuModel::items-changed
269 * signal. Consumers of the model may make optimisations accordingly.
270 *
271 * Returns: %TRUE if the model is mutable (ie: "items-changed" may be
272 * emitted).
273 *
274 * Since: 2.32
275 */276 publicboolisMutable()
277 {
278 returng_menu_model_is_mutable(gMenuModel) != 0;
279 }
280 281 /**
282 * Requests emission of the #GMenuModel::items-changed signal on @model.
283 *
284 * This function should never be called except by #GMenuModel
285 * subclasses. Any other calls to this function will very likely lead
286 * to a violation of the interface of the model.
287 *
288 * The implementation should update its internal representation of the
289 * menu before emitting the signal. The implementation should further
290 * expect to receive queries about the new state of the menu (and
291 * particularly added menu items) while signal handlers are running.
292 *
293 * The implementation must dispatch this call directly from a mainloop
294 * entry and not in response to calls -- particularly those from the
295 * #GMenuModel API. Said another way: the menu must not change while
296 * user code is running without returning to the mainloop.
297 *
298 * Params:
299 * position = the position of the change
300 * removed = the number of items removed
301 * added = the number of items added
302 *
303 * Since: 2.32
304 */305 publicvoiditemsChanged(intposition, intremoved, intadded)
306 {
307 g_menu_model_items_changed(gMenuModel, position, removed, added);
308 }
309 310 /**
311 * Creates a #GMenuAttributeIter to iterate over the attributes of
312 * the item at position @item_index in @model.
313 *
314 * You must free the iterator with g_object_unref() when you are done.
315 *
316 * Params:
317 * itemIndex = the index of the item
318 *
319 * Returns: a new #GMenuAttributeIter
320 *
321 * Since: 2.32
322 */323 publicMenuAttributeIteriterateItemAttributes(intitemIndex)
324 {
325 auto__p = g_menu_model_iterate_item_attributes(gMenuModel, itemIndex);
326 327 if(__pisnull)
328 {
329 returnnull;
330 }
331 332 returnObjectG.getDObject!(MenuAttributeIter)(cast(GMenuAttributeIter*) __p, true);
333 }
334 335 /**
336 * Creates a #GMenuLinkIter to iterate over the links of the item at
337 * position @item_index in @model.
338 *
339 * You must free the iterator with g_object_unref() when you are done.
340 *
341 * Params:
342 * itemIndex = the index of the item
343 *
344 * Returns: a new #GMenuLinkIter
345 *
346 * Since: 2.32
347 */348 publicMenuLinkIteriterateItemLinks(intitemIndex)
349 {
350 auto__p = g_menu_model_iterate_item_links(gMenuModel, itemIndex);
351 352 if(__pisnull)
353 {
354 returnnull;
355 }
356 357 returnObjectG.getDObject!(MenuLinkIter)(cast(GMenuLinkIter*) __p, true);
358 }
359 360 /**
361 * Emitted when a change has occurred to the menu.
362 *
363 * The only changes that can occur to a menu is that items are removed
364 * or added. Items may not change (except by being removed and added
365 * back in the same location). This signal is capable of describing
366 * both of those changes (at the same time).
367 *
368 * The signal means that starting at the index @position, @removed
369 * items were removed and @added items were added in their place. If
370 * @removed is zero then only items were added. If @added is zero
371 * then only items were removed.
372 *
373 * As an example, if the menu contains items a, b, c, d (in that
374 * order) and the signal (2, 1, 3) occurs then the new composition of
375 * the menu will be a, b, _, _, _, d (with each _ representing some
376 * new item).
377 *
378 * Signal handlers may query the model (particularly the added items)
379 * and expect to see the results of the modification that is being
380 * reported. The signal is emitted after the modification.
381 *
382 * Params:
383 * position = the position of the change
384 * removed = the number of items removed
385 * added = the number of items added
386 */387 gulongaddOnItemsChanged(voiddelegate(int, int, int, MenuModel) dlg, ConnectFlagsconnectFlags=cast(ConnectFlags)0)
388 {
389 returnSignals.connect(this, "items-changed", dlg, connectFlags ^ ConnectFlags.SWAPPED);
390 }
391 }