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.Builder; 26 27 private import glib.ConstructionException; 28 private import glib.ErrorG; 29 private import glib.GException; 30 private import glib.Module; 31 private import glib.Str; 32 private import gobject.ObjectG; 33 private import gobject.ParamSpec; 34 private import gobject.Type; 35 private import gobject.Value; 36 private import gtk.Application; 37 private import gtk.Widget; 38 private import gtkc.glib; 39 private import gtkc.gobject; 40 private import gtkc.gtk; 41 public import gtkc.gtktypes; 42 private import gtkc.paths; 43 private import std.string; 44 45 46 /** 47 * A GtkBuilder is an auxiliary object that reads textual descriptions 48 * of a user interface and instantiates the described objects. To create 49 * a GtkBuilder from a user interface description, call 50 * gtk_builder_new_from_file(), gtk_builder_new_from_resource() or 51 * gtk_builder_new_from_string(). 52 * 53 * In the (unusual) case that you want to add user interface 54 * descriptions from multiple sources to the same GtkBuilder you can 55 * call gtk_builder_new() to get an empty builder and populate it by 56 * (multiple) calls to gtk_builder_add_from_file(), 57 * gtk_builder_add_from_resource() or gtk_builder_add_from_string(). 58 * 59 * A GtkBuilder holds a reference to all objects that it has constructed 60 * and drops these references when it is finalized. This finalization can 61 * cause the destruction of non-widget objects or widgets which are not 62 * contained in a toplevel window. For toplevel windows constructed by a 63 * builder, it is the responsibility of the user to call gtk_widget_destroy() 64 * to get rid of them and all the widgets they contain. 65 * 66 * The functions gtk_builder_get_object() and gtk_builder_get_objects() 67 * can be used to access the widgets in the interface by the names assigned 68 * to them inside the UI description. Toplevel windows returned by these 69 * functions will stay around until the user explicitly destroys them 70 * with gtk_widget_destroy(). Other widgets will either be part of a 71 * larger hierarchy constructed by the builder (in which case you should 72 * not have to worry about their lifecycle), or without a parent, in which 73 * case they have to be added to some container to make use of them. 74 * Non-widget objects need to be reffed with g_object_ref() to keep them 75 * beyond the lifespan of the builder. 76 * 77 * The function gtk_builder_connect_signals() and variants thereof can be 78 * used to connect handlers to the named signals in the description. 79 * 80 * # GtkBuilder UI Definitions # {#BUILDER-UI} 81 * 82 * GtkBuilder parses textual descriptions of user interfaces which are 83 * specified in an XML format which can be roughly described by the 84 * RELAX NG schema below. We refer to these descriptions as “GtkBuilder 85 * UI definitions” or just “UI definitions” if the context is clear. 86 * Do not confuse GtkBuilder UI Definitions with 87 * [GtkUIManager UI Definitions][XML-UI], which are more limited in scope. 88 * It is common to use `.ui` as the filename extension for files containing 89 * GtkBuilder UI definitions. 90 * 91 * [RELAX NG Compact Syntax](https://git.gnome.org/browse/gtk+/tree/gtk/gtkbuilder.rnc) 92 * 93 * The toplevel element is <interface>. It optionally takes a “domain” 94 * attribute, which will make the builder look for translated strings 95 * using dgettext() in the domain specified. This can also be done by 96 * calling gtk_builder_set_translation_domain() on the builder. 97 * Objects are described by <object> elements, which can contain 98 * <property> elements to set properties, <signal> elements which 99 * connect signals to handlers, and <child> elements, which describe 100 * child objects (most often widgets inside a container, but also e.g. 101 * actions in an action group, or columns in a tree model). A <child> 102 * element contains an <object> element which describes the child object. 103 * The target toolkit version(s) are described by <requires> elements, 104 * the “lib” attribute specifies the widget library in question (currently 105 * the only supported value is “gtk+”) and the “version” attribute specifies 106 * the target version in the form “<major>.<minor>”. The builder will error 107 * out if the version requirements are not met. 108 * 109 * Typically, the specific kind of object represented by an <object> 110 * element is specified by the “class” attribute. If the type has not 111 * been loaded yet, GTK+ tries to find the get_type() function from the 112 * class name by applying heuristics. This works in most cases, but if 113 * necessary, it is possible to specify the name of the get_type() function 114 * explictly with the "type-func" attribute. As a special case, GtkBuilder 115 * allows to use an object that has been constructed by a #GtkUIManager in 116 * another part of the UI definition by specifying the id of the #GtkUIManager 117 * in the “constructor” attribute and the name of the object in the “id” 118 * attribute. 119 * 120 * Objects may be given a name with the “id” attribute, which allows the 121 * application to retrieve them from the builder with gtk_builder_get_object(). 122 * An id is also necessary to use the object as property value in other 123 * parts of the UI definition. GTK+ reserves ids starting and ending 124 * with ___ (3 underscores) for its own purposes. 125 * 126 * Setting properties of objects is pretty straightforward with the 127 * <property> element: the “name” attribute specifies the name of the 128 * property, and the content of the element specifies the value. 129 * If the “translatable” attribute is set to a true value, GTK+ uses 130 * gettext() (or dgettext() if the builder has a translation domain set) 131 * to find a translation for the value. This happens before the value 132 * is parsed, so it can be used for properties of any type, but it is 133 * probably most useful for string properties. It is also possible to 134 * specify a context to disambiguate short strings, and comments which 135 * may help the translators. 136 * 137 * GtkBuilder can parse textual representations for the most common 138 * property types: characters, strings, integers, floating-point numbers, 139 * booleans (strings like “TRUE”, “t”, “yes”, “y”, “1” are interpreted 140 * as %TRUE, strings like “FALSE”, “f”, “no”, “n”, “0” are interpreted 141 * as %FALSE), enumerations (can be specified by their name, nick or 142 * integer value), flags (can be specified by their name, nick, integer 143 * value, optionally combined with “|”, e.g. “GTK_VISIBLE|GTK_REALIZED”) 144 * and colors (in a format understood by gdk_rgba_parse()). Pixbufs can 145 * be specified as a filename of an image file to load. Objects can be 146 * referred to by their name and by default refer to objects declared 147 * in the local xml fragment and objects exposed via 148 * gtk_builder_expose_object(). 149 * 150 * In general, GtkBuilder allows forward references to objects — 151 * declared in the local xml; an object doesn’t have to be constructed 152 * before it can be referred to. The exception to this rule is that an 153 * object has to be constructed before it can be used as the value of 154 * a construct-only property. 155 * 156 * It is also possible to bind a property value to another object's 157 * property value using the attributes 158 * "bind-source" to specify the source object of the binding, 159 * "bind-property" to specify the source property and optionally 160 * "bind-flags" to specify the binding flags 161 * Internally builder implement this using GBinding objects. 162 * For more information see g_object_bind_property() 163 * 164 * Signal handlers are set up with the <signal> element. The “name” 165 * attribute specifies the name of the signal, and the “handler” attribute 166 * specifies the function to connect to the signal. By default, GTK+ tries 167 * to find the handler using g_module_symbol(), but this can be changed by 168 * passing a custom #GtkBuilderConnectFunc to 169 * gtk_builder_connect_signals_full(). The remaining attributes, “after”, 170 * “swapped” and “object”, have the same meaning as the corresponding 171 * parameters of the g_signal_connect_object() or 172 * g_signal_connect_data() functions. A “last_modification_time” 173 * attribute is also allowed, but it does not have a meaning to the 174 * builder. 175 * 176 * Sometimes it is necessary to refer to widgets which have implicitly 177 * been constructed by GTK+ as part of a composite widget, to set 178 * properties on them or to add further children (e.g. the @vbox of 179 * a #GtkDialog). This can be achieved by setting the “internal-child” 180 * propery of the <child> element to a true value. Note that GtkBuilder 181 * still requires an <object> element for the internal child, even if it 182 * has already been constructed. 183 * 184 * A number of widgets have different places where a child can be added 185 * (e.g. tabs vs. page content in notebooks). This can be reflected in 186 * a UI definition by specifying the “type” attribute on a <child> 187 * The possible values for the “type” attribute are described in the 188 * sections describing the widget-specific portions of UI definitions. 189 * 190 * # A GtkBuilder UI Definition 191 * 192 * |[ 193 * <interface> 194 * <object class="GtkDialog" id="dialog1"> 195 * <child internal-child="vbox"> 196 * <object class="GtkBox" id="vbox1"> 197 * <property name="border-width">10</property> 198 * <child internal-child="action_area"> 199 * <object class="GtkButtonBox" id="hbuttonbox1"> 200 * <property name="border-width">20</property> 201 * <child> 202 * <object class="GtkButton" id="ok_button"> 203 * <property name="label">gtk-ok</property> 204 * <property name="use-stock">TRUE</property> 205 * <signal name="clicked" handler="ok_button_clicked"/> 206 * </object> 207 * </child> 208 * </object> 209 * </child> 210 * </object> 211 * </child> 212 * </object> 213 * </interface> 214 * ]| 215 * 216 * Beyond this general structure, several object classes define their 217 * own XML DTD fragments for filling in the ANY placeholders in the DTD 218 * above. Note that a custom element in a <child> element gets parsed by 219 * the custom tag handler of the parent object, while a custom element in 220 * an <object> element gets parsed by the custom tag handler of the object. 221 * 222 * These XML fragments are explained in the documentation of the 223 * respective objects. 224 * 225 * Additionally, since 3.10 a special <template> tag has been added 226 * to the format allowing one to define a widget class’s components. 227 * See the [GtkWidget documentation][composite-templates] for details. 228 */ 229 public class Builder : ObjectG 230 { 231 /** the main Gtk struct */ 232 protected GtkBuilder* gtkBuilder; 233 234 /** Get the main Gtk struct */ 235 public GtkBuilder* getBuilderStruct() 236 { 237 return gtkBuilder; 238 } 239 240 /** the main Gtk struct as a void* */ 241 protected override void* getStruct() 242 { 243 return cast(void*)gtkBuilder; 244 } 245 246 protected override void setStruct(GObject* obj) 247 { 248 gtkBuilder = cast(GtkBuilder*)obj; 249 super.setStruct(obj); 250 } 251 252 /** 253 * Sets our main struct and passes it to the parent class. 254 */ 255 public this (GtkBuilder* gtkBuilder, bool ownedRef = false) 256 { 257 this.gtkBuilder = gtkBuilder; 258 super(cast(GObject*)gtkBuilder, ownedRef); 259 } 260 261 /** 262 * Creates a new builder object. 263 * Since 2.12 264 * Throws: ConstructionException GTK+ fails to create the object. 265 */ 266 public this () 267 { 268 // GtkBuilder* gtk_builder_new (void); 269 auto p = gtk_builder_new(); 270 if(p is null) 271 { 272 throw new ConstructionException("null returned by gtk_builder_new()"); 273 } 274 this(cast(GtkBuilder*) p); 275 276 GtkBuilderClass* klass = Type.getInstanceClass!(GtkBuilderClass)( this ); 277 klass.getTypeFromName = >k_builder_real_get_type_from_name_override; 278 } 279 280 /** 281 * This function is a modification of _gtk_builder_resolve_type_lazily from "gtk/gtkbuilder.c". 282 * It is needed because it assumes we are linking at compile time to the gtk libs. 283 * specifically the NULL in g_module_open( NULL, 0 ); 284 * It replaces the default function pointer "get_type_from_name" in GtkBuilderClass. 285 */ 286 extern(C) private static GType gtk_builder_real_get_type_from_name_override ( GtkBuilder* builder, const(char)* name ) 287 { 288 GType gtype; 289 gtype = g_type_from_name( name ); 290 if (gtype != GType.INVALID) 291 { 292 return gtype; 293 } 294 295 /* 296 * Try to map a type name to a _get_type function 297 * and call it, eg: 298 * 299 * GtkWindow -> gtk_window_get_type 300 * GtkHBox -> gtk_hbox_get_type 301 * GtkUIManager -> gtk_ui_manager_get_type 302 * 303 */ 304 char c; 305 string symbol_name; 306 307 for (int i = 0; name[i] != '\0'; i++) 308 { 309 c = name[i]; 310 /* skip if uppercase, first or previous is uppercase */ 311 if ((c == Str.asciiToupper (c) && 312 i > 0 && name[i-1] != Str.asciiToupper (name[i-1])) || 313 (i > 2 && name[i] == Str.asciiToupper (name[i]) && 314 name[i-1] == Str.asciiToupper (name[i-1]) && 315 name[i-2] == Str.asciiToupper (name[i-2])) 316 ) 317 318 symbol_name ~= '_'; 319 symbol_name ~= Str.asciiTolower (c); 320 } 321 symbol_name ~= "_get_type" ; 322 323 /* scan linked librarys for function symbol */ 324 foreach ( lib; importLibs ) 325 { 326 GType function() func; 327 Module mod = Module.open( lib, GModuleFlags.LAZY ); 328 if( mod is null ) 329 continue; 330 331 scope(exit) mod.close(); 332 333 if ( mod.symbol( symbol_name, cast(void**)&func ) ) { 334 return func(); 335 } 336 } 337 338 return GType.INVALID; 339 } 340 341 /** 342 * Gets the object named name. Note that this function does not 343 * increment the reference count of the returned object. 344 * Since 2.12 345 * Params: 346 * name = name of object to get 347 * Returns: the object named name or NULL if it could not be found in the object tree.. transfer none. 348 */ 349 public ObjectG getObject(string name) 350 { 351 // GObject* gtk_builder_get_object (GtkBuilder *builder, const gchar *name); 352 return newFromObject( gtk_builder_get_object(gtkBuilder, Str.toStringz(name)) ); 353 } 354 355 /** 356 * Gets all objects that have been constructed by builder. 357 * Since 2.12 358 * Returns: an array containing all the objects constructed by the GtkBuilder instance. 359 */ 360 public ObjectG[] getObjects() 361 { 362 ObjectG[] objects; 363 364 // GSList* gtk_builder_get_objects (GtkBuilder *builder); 365 GSList* list = gtk_builder_get_objects(gtkBuilder); 366 367 while ( list.next !is null ) 368 { 369 objects ~= newFromObject( cast(GObject*)list.data ); 370 list = list.next; 371 } 372 373 g_slist_free(list); 374 375 return objects; 376 } 377 378 /** 379 * This function creates an D object corresponding to the Struct pointer passed in. 380 */ 381 public ObjectG newFromObject(GObject* cobj) 382 { 383 if(cobj is null) 384 { 385 return null; 386 } 387 388 void* dObj = g_object_get_data(cobj, Str.toStringz("GObject")); 389 390 if ( dObj !is null ) 391 { 392 return cast(ObjectG)dObj; 393 } 394 395 string type = convertClassName(Type.name((cast(GTypeInstance*)cobj).gClass.gType)); 396 ClassInfo ci = cast(ClassInfo)ClassInfo.find(type); 397 398 //Gobject and Gio types both start with g, so try both. 399 if(ci is null && startsWith(type, "gobject")) 400 { 401 ci = cast(ClassInfo)ClassInfo.find("gio"~ type[7..$]); 402 } 403 404 if(ci is null) 405 { 406 return null; 407 } 408 409 ObjectG obj = cast(ObjectG)gtkc.gtktypes._d_newclass(ci); 410 411 obj.__ctor(cobj); 412 413 return obj; 414 } 415 416 /** 417 * Turn the name of a C Type in to the name of the corresponding D type. 418 * Note: If the prefix of the type is "G" this always usses "gobject" as 419 * the prefix, extra care should be taken for types from GIO. 420 */ 421 private string convertClassName(string gName) 422 { 423 string conv; 424 string prefix; 425 426 if ( startsWith(gName, "GtkSource" ) ) prefix = "Gsv"; 427 else if ( startsWith(gName, "Gtk") ) prefix = "Gtk"; 428 else if ( startsWith(gName, "Gdk") ) prefix = "Gdk"; 429 else if ( startsWith(gName, "Gst") ) prefix = "Gst"; 430 else if ( startsWith(gName, "Gda") ) prefix = "Gda"; 431 else if ( startsWith(gName, "Atk") ) prefix = "Atk"; 432 else if ( startsWith(gName, "G") ) prefix = "G"; 433 else if ( startsWith(gName, "Pango") ) prefix = "Pg"; 434 else if ( startsWith(gName, "cairo") ) prefix = "cairo"; 435 436 conv = gName[prefix.length..gName.length]; 437 438 if ( conv == "Object" ) conv ~= prefix; 439 if ( prefix == "Pg" ) conv = "Pg" ~ gName[5..gName.length]; 440 if ( prefix == "cairo") conv = toUpper(gName[6..7]) ~ gName[7..gName.length - 2]; 441 442 prefix = toLower(prefix); 443 444 if( prefix == "gst") prefix = "gstreamer"; 445 if( prefix == "g") prefix = "gobject"; 446 if( prefix == "pg" ) prefix = "pango"; 447 448 return prefix ~"."~ conv ~"."~ conv; 449 } 450 451 private bool startsWith(string str, string prefix) 452 { 453 return str.length >= prefix.length && str[0..prefix.length] == prefix; 454 } 455 456 /** 457 */ 458 459 /** */ 460 public static GType getType() 461 { 462 return gtk_builder_get_type(); 463 } 464 465 /** 466 * Builds the [GtkBuilder UI definition][BUILDER-UI] 467 * in the file @filename. 468 * 469 * If there is an error opening the file or parsing the description then 470 * the program will be aborted. You should only ever attempt to parse 471 * user interface descriptions that are shipped as part of your program. 472 * 473 * Params: 474 * filename = filename of user interface description file 475 * 476 * Return: a #GtkBuilder containing the described interface 477 * 478 * Since: 3.10 479 * 480 * Throws: ConstructionException GTK+ fails to create the object. 481 */ 482 public this(string filename) 483 { 484 auto p = gtk_builder_new_from_file(Str.toStringz(filename)); 485 486 if(p is null) 487 { 488 throw new ConstructionException("null returned by new_from_file"); 489 } 490 491 this(cast(GtkBuilder*) p, true); 492 } 493 494 /** 495 * Adds the @callback_symbol to the scope of @builder under the given @callback_name. 496 * 497 * Using this function overrides the behavior of gtk_builder_connect_signals() 498 * for any callback symbols that are added. Using this method allows for better 499 * encapsulation as it does not require that callback symbols be declared in 500 * the global namespace. 501 * 502 * Params: 503 * callbackName = The name of the callback, as expected in the XML 504 * callbackSymbol = The callback pointer 505 * 506 * Since: 3.10 507 */ 508 public void addCallbackSymbol(string callbackName, GCallback callbackSymbol) 509 { 510 gtk_builder_add_callback_symbol(gtkBuilder, Str.toStringz(callbackName), callbackSymbol); 511 } 512 513 /** 514 * Parses a file containing a [GtkBuilder UI definition][BUILDER-UI] 515 * and merges it with the current contents of @builder. 516 * 517 * Most users will probably want to use gtk_builder_new_from_file(). 518 * 519 * If an error occurs, 0 will be returned and @error will be assigned a 520 * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_FILE_ERROR 521 * domain. 522 * 523 * It’s not really reasonable to attempt to handle failures of this 524 * call. You should not use this function with untrusted files (ie: 525 * files that are not part of your application). Broken #GtkBuilder 526 * files can easily crash your program, and it’s possible that memory 527 * was leaked leading up to the reported failure. The only reasonable 528 * thing to do when an error is detected is to call g_error(). 529 * 530 * Params: 531 * filename = the name of the file to parse 532 * 533 * Return: A positive value on success, 0 if an error occurred 534 * 535 * Since: 2.12 536 * 537 * Throws: GException on failure. 538 */ 539 public uint addFromFile(string filename) 540 { 541 GError* err = null; 542 543 auto p = gtk_builder_add_from_file(gtkBuilder, Str.toStringz(filename), &err); 544 545 if (err !is null) 546 { 547 throw new GException( new ErrorG(err) ); 548 } 549 550 return p; 551 } 552 553 /** 554 * Parses a resource file containing a [GtkBuilder UI definition][BUILDER-UI] 555 * and merges it with the current contents of @builder. 556 * 557 * Most users will probably want to use gtk_builder_new_from_resource(). 558 * 559 * If an error occurs, 0 will be returned and @error will be assigned a 560 * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_RESOURCE_ERROR 561 * domain. 562 * 563 * It’s not really reasonable to attempt to handle failures of this 564 * call. The only reasonable thing to do when an error is detected is 565 * to call g_error(). 566 * 567 * Params: 568 * resourcePath = the path of the resource file to parse 569 * 570 * Return: A positive value on success, 0 if an error occurred 571 * 572 * Since: 3.4 573 * 574 * Throws: GException on failure. 575 */ 576 public uint addFromResource(string resourcePath) 577 { 578 GError* err = null; 579 580 auto p = gtk_builder_add_from_resource(gtkBuilder, Str.toStringz(resourcePath), &err); 581 582 if (err !is null) 583 { 584 throw new GException( new ErrorG(err) ); 585 } 586 587 return p; 588 } 589 590 /** 591 * Parses a string containing a [GtkBuilder UI definition][BUILDER-UI] 592 * and merges it with the current contents of @builder. 593 * 594 * Most users will probably want to use gtk_builder_new_from_string(). 595 * 596 * Upon errors 0 will be returned and @error will be assigned a 597 * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or 598 * #G_VARIANT_PARSE_ERROR domain. 599 * 600 * It’s not really reasonable to attempt to handle failures of this 601 * call. The only reasonable thing to do when an error is detected is 602 * to call g_error(). 603 * 604 * Params: 605 * buffer = the string to parse 606 * length = the length of @buffer (may be -1 if @buffer is nul-terminated) 607 * 608 * Return: A positive value on success, 0 if an error occurred 609 * 610 * Since: 2.12 611 * 612 * Throws: GException on failure. 613 */ 614 public uint addFromString(string buffer) 615 { 616 GError* err = null; 617 618 auto p = gtk_builder_add_from_string(gtkBuilder, Str.toStringz(buffer), cast(size_t)buffer.length, &err); 619 620 if (err !is null) 621 { 622 throw new GException( new ErrorG(err) ); 623 } 624 625 return p; 626 } 627 628 /** 629 * Parses a file containing a [GtkBuilder UI definition][BUILDER-UI] 630 * building only the requested objects and merges 631 * them with the current contents of @builder. 632 * 633 * Upon errors 0 will be returned and @error will be assigned a 634 * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_FILE_ERROR 635 * domain. 636 * 637 * If you are adding an object that depends on an object that is not 638 * its child (for instance a #GtkTreeView that depends on its 639 * #GtkTreeModel), you have to explicitly list all of them in @object_ids. 640 * 641 * Params: 642 * filename = the name of the file to parse 643 * objectIds = nul-terminated array of objects to build 644 * 645 * Return: A positive value on success, 0 if an error occurred 646 * 647 * Since: 2.14 648 * 649 * Throws: GException on failure. 650 */ 651 public uint addObjectsFromFile(string filename, string[] objectIds) 652 { 653 GError* err = null; 654 655 auto p = gtk_builder_add_objects_from_file(gtkBuilder, Str.toStringz(filename), Str.toStringzArray(objectIds), &err); 656 657 if (err !is null) 658 { 659 throw new GException( new ErrorG(err) ); 660 } 661 662 return p; 663 } 664 665 /** 666 * Parses a resource file containing a [GtkBuilder UI definition][BUILDER-UI] 667 * building only the requested objects and merges 668 * them with the current contents of @builder. 669 * 670 * Upon errors 0 will be returned and @error will be assigned a 671 * #GError from the #GTK_BUILDER_ERROR, #G_MARKUP_ERROR or #G_RESOURCE_ERROR 672 * domain. 673 * 674 * If you are adding an object that depends on an object that is not 675 * its child (for instance a #GtkTreeView that depends on its 676 * #GtkTreeModel), you have to explicitly list all of them in @object_ids. 677 * 678 * Params: 679 * resourcePath = the path of the resource file to parse 680 * objectIds = nul-terminated array of objects to build 681 * 682 * Return: A positive value on success, 0 if an error occurred 683 * 684 * Since: 3.4 685 * 686 * Throws: GException on failure. 687 */ 688 public uint addObjectsFromResource(string resourcePath, string[] objectIds) 689 { 690 GError* err = null; 691 692 auto p = gtk_builder_add_objects_from_resource(gtkBuilder, Str.toStringz(resourcePath), Str.toStringzArray(objectIds), &err); 693 694 if (err !is null) 695 { 696 throw new GException( new ErrorG(err) ); 697 } 698 699 return p; 700 } 701 702 /** 703 * Parses a string containing a [GtkBuilder UI definition][BUILDER-UI] 704 * building only the requested objects and merges 705 * them with the current contents of @builder. 706 * 707 * Upon errors 0 will be returned and @error will be assigned a 708 * #GError from the #GTK_BUILDER_ERROR or #G_MARKUP_ERROR domain. 709 * 710 * If you are adding an object that depends on an object that is not 711 * its child (for instance a #GtkTreeView that depends on its 712 * #GtkTreeModel), you have to explicitly list all of them in @object_ids. 713 * 714 * Params: 715 * buffer = the string to parse 716 * length = the length of @buffer (may be -1 if @buffer is nul-terminated) 717 * objectIds = nul-terminated array of objects to build 718 * 719 * Return: A positive value on success, 0 if an error occurred 720 * 721 * Since: 2.14 722 * 723 * Throws: GException on failure. 724 */ 725 public uint addObjectsFromString(string buffer, size_t length, string[] objectIds) 726 { 727 GError* err = null; 728 729 auto p = gtk_builder_add_objects_from_string(gtkBuilder, Str.toStringz(buffer), length, Str.toStringzArray(objectIds), &err); 730 731 if (err !is null) 732 { 733 throw new GException( new ErrorG(err) ); 734 } 735 736 return p; 737 } 738 739 /** 740 * This method is a simpler variation of gtk_builder_connect_signals_full(). 741 * It uses symbols explicitly added to @builder with prior calls to 742 * gtk_builder_add_callback_symbol(). In the case that symbols are not 743 * explicitly added; it uses #GModule’s introspective features (by opening the module %NULL) 744 * to look at the application’s symbol table. From here it tries to match 745 * the signal handler names given in the interface description with 746 * symbols in the application and connects the signals. Note that this 747 * function can only be called once, subsequent calls will do nothing. 748 * 749 * Note that unless gtk_builder_add_callback_symbol() is called for 750 * all signal callbacks which are referenced by the loaded XML, this 751 * function will require that #GModule be supported on the platform. 752 * 753 * If you rely on #GModule support to lookup callbacks in the symbol table, 754 * the following details should be noted: 755 * 756 * When compiling applications for Windows, you must declare signal callbacks 757 * with #G_MODULE_EXPORT, or they will not be put in the symbol table. 758 * On Linux and Unices, this is not necessary; applications should instead 759 * be compiled with the -Wl,--export-dynamic CFLAGS, and linked against 760 * gmodule-export-2.0. 761 * 762 * Params: 763 * userData = user data to pass back with all signals 764 * 765 * Since: 2.12 766 */ 767 public void connectSignals(void* userData) 768 { 769 gtk_builder_connect_signals(gtkBuilder, userData); 770 } 771 772 /** 773 * This function can be thought of the interpreted language binding 774 * version of gtk_builder_connect_signals(), except that it does not 775 * require GModule to function correctly. 776 * 777 * Params: 778 * func = the function used to connect the signals 779 * userData = arbitrary data that will be passed to the connection function 780 * 781 * Since: 2.12 782 */ 783 public void connectSignalsFull(GtkBuilderConnectFunc func, void* userData) 784 { 785 gtk_builder_connect_signals_full(gtkBuilder, func, userData); 786 } 787 788 /** 789 * Add @object to the @builder object pool so it can be referenced just like any 790 * other object built by builder. 791 * 792 * Params: 793 * name = the name of the object exposed to the builder 794 * object = the object to expose 795 * 796 * Since: 3.8 797 */ 798 public void exposeObject(string name, ObjectG object) 799 { 800 gtk_builder_expose_object(gtkBuilder, Str.toStringz(name), (object is null) ? null : object.getObjectGStruct()); 801 } 802 803 /** 804 * Main private entry point for building composite container 805 * components from template XML. 806 * 807 * This is exported purely to let gtk-builder-tool validate 808 * templates, applications have no need to call this function. 809 * 810 * Params: 811 * widget = the widget that is being extended 812 * templateType = the type that the template is for 813 * buffer = the string to parse 814 * length = the length of @buffer (may be -1 if @buffer is nul-terminated) 815 * 816 * Return: A positive value on success, 0 if an error occurred 817 * 818 * Throws: GException on failure. 819 */ 820 public uint extendWithTemplate(Widget widget, GType templateType, string buffer, size_t length) 821 { 822 GError* err = null; 823 824 auto p = gtk_builder_extend_with_template(gtkBuilder, (widget is null) ? null : widget.getWidgetStruct(), templateType, Str.toStringz(buffer), length, &err); 825 826 if (err !is null) 827 { 828 throw new GException( new ErrorG(err) ); 829 } 830 831 return p; 832 } 833 834 /** 835 * Gets the #GtkApplication associated with the builder. 836 * 837 * The #GtkApplication is used for creating action proxies as requested 838 * from XML that the builder is loading. 839 * 840 * By default, the builder uses the default application: the one from 841 * g_application_get_default(). If you want to use another application 842 * for constructing proxies, use gtk_builder_set_application(). 843 * 844 * Return: the application being used by the builder, 845 * or %NULL 846 * 847 * Since: 3.10 848 */ 849 public Application getApplication() 850 { 851 auto p = gtk_builder_get_application(gtkBuilder); 852 853 if(p is null) 854 { 855 return null; 856 } 857 858 return ObjectG.getDObject!(Application)(cast(GtkApplication*) p); 859 } 860 861 /** 862 * Gets the translation domain of @builder. 863 * 864 * Return: the translation domain. This string is owned 865 * by the builder object and must not be modified or freed. 866 * 867 * Since: 2.12 868 */ 869 public string getTranslationDomain() 870 { 871 return Str.toString(gtk_builder_get_translation_domain(gtkBuilder)); 872 } 873 874 /** 875 * Looks up a type by name, using the virtual function that 876 * #GtkBuilder has for that purpose. This is mainly used when 877 * implementing the #GtkBuildable interface on a type. 878 * 879 * Params: 880 * typeName = type name to lookup 881 * 882 * Return: the #GType found for @type_name or #G_TYPE_INVALID 883 * if no type was found 884 * 885 * Since: 2.12 886 */ 887 public GType getTypeFromName(string typeName) 888 { 889 return gtk_builder_get_type_from_name(gtkBuilder, Str.toStringz(typeName)); 890 } 891 892 /** 893 * Fetches a symbol previously added to @builder 894 * with gtk_builder_add_callback_symbols() 895 * 896 * This function is intended for possible use in language bindings 897 * or for any case that one might be cusomizing signal connections 898 * using gtk_builder_connect_signals_full() 899 * 900 * Params: 901 * callbackName = The name of the callback 902 * 903 * Return: The callback symbol in @builder for @callback_name, or %NULL 904 * 905 * Since: 3.10 906 */ 907 public GCallback lookupCallbackSymbol(string callbackName) 908 { 909 return gtk_builder_lookup_callback_symbol(gtkBuilder, Str.toStringz(callbackName)); 910 } 911 912 /** 913 * Sets the application associated with @builder. 914 * 915 * You only need this function if there is more than one #GApplication 916 * in your process. @application cannot be %NULL. 917 * 918 * Params: 919 * application = a #GtkApplication 920 * 921 * Since: 3.10 922 */ 923 public void setApplication(Application application) 924 { 925 gtk_builder_set_application(gtkBuilder, (application is null) ? null : application.getGtkApplicationStruct()); 926 } 927 928 /** 929 * Sets the translation domain of @builder. 930 * See #GtkBuilder:translation-domain. 931 * 932 * Params: 933 * domain = the translation domain or %NULL 934 * 935 * Since: 2.12 936 */ 937 public void setTranslationDomain(string domain) 938 { 939 gtk_builder_set_translation_domain(gtkBuilder, Str.toStringz(domain)); 940 } 941 942 /** 943 * This function demarshals a value from a string. This function 944 * calls g_value_init() on the @value argument, so it need not be 945 * initialised beforehand. 946 * 947 * This function can handle char, uchar, boolean, int, uint, long, 948 * ulong, enum, flags, float, double, string, #GdkColor, #GdkRGBA and 949 * #GtkAdjustment type values. Support for #GtkWidget type values is 950 * still to come. 951 * 952 * Upon errors %FALSE will be returned and @error will be assigned a 953 * #GError from the #GTK_BUILDER_ERROR domain. 954 * 955 * Params: 956 * pspec = the #GParamSpec for the property 957 * str = the string representation of the value 958 * value = the #GValue to store the result in 959 * 960 * Return: %TRUE on success 961 * 962 * Since: 2.12 963 * 964 * Throws: GException on failure. 965 */ 966 public bool valueFromString(ParamSpec pspec, string str, out Value value) 967 { 968 GValue* outvalue = gMalloc!GValue(); 969 GError* err = null; 970 971 auto p = gtk_builder_value_from_string(gtkBuilder, (pspec is null) ? null : pspec.getParamSpecStruct(), Str.toStringz(str), outvalue, &err) != 0; 972 973 if (err !is null) 974 { 975 throw new GException( new ErrorG(err) ); 976 } 977 978 value = ObjectG.getDObject!(Value)(outvalue, true); 979 980 return p; 981 } 982 983 /** 984 * Like gtk_builder_value_from_string(), this function demarshals 985 * a value from a string, but takes a #GType instead of #GParamSpec. 986 * This function calls g_value_init() on the @value argument, so it 987 * need not be initialised beforehand. 988 * 989 * Upon errors %FALSE will be returned and @error will be assigned a 990 * #GError from the #GTK_BUILDER_ERROR domain. 991 * 992 * Params: 993 * type = the #GType of the value 994 * str = the string representation of the value 995 * value = the #GValue to store the result in 996 * 997 * Return: %TRUE on success 998 * 999 * Since: 2.12 1000 * 1001 * Throws: GException on failure. 1002 */ 1003 public bool valueFromStringType(GType type, string str, out Value value) 1004 { 1005 GValue* outvalue = gMalloc!GValue(); 1006 GError* err = null; 1007 1008 auto p = gtk_builder_value_from_string_type(gtkBuilder, type, Str.toStringz(str), outvalue, &err) != 0; 1009 1010 if (err !is null) 1011 { 1012 throw new GException( new ErrorG(err) ); 1013 } 1014 1015 value = ObjectG.getDObject!(Value)(outvalue, true); 1016 1017 return p; 1018 } 1019 }