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