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.Container; 26 27 private import cairo.Context; 28 private import glib.ListG; 29 private import glib.Str; 30 private import gobject.ObjectG; 31 private import gobject.ParamSpec; 32 private import gobject.Signals; 33 private import gobject.Value; 34 private import gtk.Adjustment; 35 private import gtk.Widget; 36 private import gtk.WidgetPath; 37 public import gtkc.gdktypes; 38 private import gtkc.gtk; 39 public import gtkc.gtktypes; 40 private import std.algorithm; 41 42 43 /** 44 * A GTK+ user interface is constructed by nesting widgets inside widgets. 45 * Container widgets are the inner nodes in the resulting tree of widgets: 46 * they contain other widgets. So, for example, you might have a #GtkWindow 47 * containing a #GtkFrame containing a #GtkLabel. If you wanted an image instead 48 * of a textual label inside the frame, you might replace the #GtkLabel widget 49 * with a #GtkImage widget. 50 * 51 * There are two major kinds of container widgets in GTK+. Both are subclasses 52 * of the abstract GtkContainer base class. 53 * 54 * The first type of container widget has a single child widget and derives 55 * from #GtkBin. These containers are decorators, which 56 * add some kind of functionality to the child. For example, a #GtkButton makes 57 * its child into a clickable button; a #GtkFrame draws a frame around its child 58 * and a #GtkWindow places its child widget inside a top-level window. 59 * 60 * The second type of container can have more than one child; its purpose is to 61 * manage layout. This means that these containers assign 62 * sizes and positions to their children. For example, a #GtkHBox arranges its 63 * children in a horizontal row, and a #GtkGrid arranges the widgets it contains 64 * in a two-dimensional grid. 65 * 66 * For implementations of #GtkContainer the virtual method #GtkContainerClass.forall() 67 * is always required, since it's used for drawing and other internal operations 68 * on the children. 69 * If the #GtkContainer implementation expect to have non internal children 70 * it's needed to implement both #GtkContainerClass.add() and #GtkContainerClass.remove(). 71 * If the GtkContainer implementation has internal children, they should be added 72 * with gtk_widget_set_parent() on init() and removed with gtk_widget_unparent() 73 * in the #GtkWidgetClass.destroy() implementation. 74 * See more about implementing custom widgets at https://wiki.gnome.org/HowDoI/CustomWidgets 75 * 76 * # Height for width geometry management 77 * 78 * GTK+ uses a height-for-width (and width-for-height) geometry management system. 79 * Height-for-width means that a widget can change how much vertical space it needs, 80 * depending on the amount of horizontal space that it is given (and similar for 81 * width-for-height). 82 * 83 * There are some things to keep in mind when implementing container widgets 84 * that make use of GTK+’s height for width geometry management system. First, 85 * it’s important to note that a container must prioritize one of its 86 * dimensions, that is to say that a widget or container can only have a 87 * #GtkSizeRequestMode that is %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH or 88 * %GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT. However, every widget and container 89 * must be able to respond to the APIs for both dimensions, i.e. even if a 90 * widget has a request mode that is height-for-width, it is possible that 91 * its parent will request its sizes using the width-for-height APIs. 92 * 93 * To ensure that everything works properly, here are some guidelines to follow 94 * when implementing height-for-width (or width-for-height) containers. 95 * 96 * Each request mode involves 2 virtual methods. Height-for-width apis run 97 * through gtk_widget_get_preferred_width() and then through gtk_widget_get_preferred_height_for_width(). 98 * When handling requests in the opposite #GtkSizeRequestMode it is important that 99 * every widget request at least enough space to display all of its content at all times. 100 * 101 * When gtk_widget_get_preferred_height() is called on a container that is height-for-width, 102 * the container must return the height for its minimum width. This is easily achieved by 103 * simply calling the reverse apis implemented for itself as follows: 104 * 105 * |[<!-- language="C" --> 106 * static void 107 * foo_container_get_preferred_height (GtkWidget *widget, 108 * gint *min_height, 109 * gint *nat_height) 110 * { 111 * if (i_am_in_height_for_width_mode) 112 * { 113 * gint min_width; 114 * 115 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, 116 * &min_width, 117 * NULL); 118 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_height_for_width 119 * (widget, 120 * min_width, 121 * min_height, 122 * nat_height); 123 * } 124 * else 125 * { 126 * ... many containers support both request modes, execute the 127 * real width-for-height request here by returning the 128 * collective heights of all widgets that are stacked 129 * vertically (or whatever is appropriate for this container) 130 * ... 131 * } 132 * } 133 * ]| 134 * 135 * Similarly, when gtk_widget_get_preferred_width_for_height() is called for a container or widget 136 * that is height-for-width, it then only needs to return the base minimum width like so: 137 * 138 * |[<!-- language="C" --> 139 * static void 140 * foo_container_get_preferred_width_for_height (GtkWidget *widget, 141 * gint for_height, 142 * gint *min_width, 143 * gint *nat_width) 144 * { 145 * if (i_am_in_height_for_width_mode) 146 * { 147 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, 148 * min_width, 149 * nat_width); 150 * } 151 * else 152 * { 153 * ... execute the real width-for-height request here based on 154 * the required width of the children collectively if the 155 * container were to be allocated the said height ... 156 * } 157 * } 158 * ]| 159 * 160 * Height for width requests are generally implemented in terms of a virtual allocation 161 * of widgets in the input orientation. Assuming an height-for-width request mode, a container 162 * would implement the get_preferred_height_for_width() virtual function by first calling 163 * gtk_widget_get_preferred_width() for each of its children. 164 * 165 * For each potential group of children that are lined up horizontally, the values returned by 166 * gtk_widget_get_preferred_width() should be collected in an array of #GtkRequestedSize structures. 167 * Any child spacing should be removed from the input @for_width and then the collective size should be 168 * allocated using the gtk_distribute_natural_allocation() convenience function. 169 * 170 * The container will then move on to request the preferred height for each child by using 171 * gtk_widget_get_preferred_height_for_width() and using the sizes stored in the #GtkRequestedSize array. 172 * 173 * To allocate a height-for-width container, it’s again important 174 * to consider that a container must prioritize one dimension over the other. So if 175 * a container is a height-for-width container it must first allocate all widgets horizontally 176 * using a #GtkRequestedSize array and gtk_distribute_natural_allocation() and then add any 177 * extra space (if and where appropriate) for the widget to expand. 178 * 179 * After adding all the expand space, the container assumes it was allocated sufficient 180 * height to fit all of its content. At this time, the container must use the total horizontal sizes 181 * of each widget to request the height-for-width of each of its children and store the requests in a 182 * #GtkRequestedSize array for any widgets that stack vertically (for tabular containers this can 183 * be generalized into the heights and widths of rows and columns). 184 * The vertical space must then again be distributed using gtk_distribute_natural_allocation() 185 * while this time considering the allocated height of the widget minus any vertical spacing 186 * that the container adds. Then vertical expand space should be added where appropriate and available 187 * and the container should go on to actually allocating the child widgets. 188 * 189 * See [GtkWidget’s geometry management section][geometry-management] 190 * to learn more about implementing height-for-width geometry management for widgets. 191 * 192 * # Child properties 193 * 194 * GtkContainer introduces child properties. 195 * These are object properties that are not specific 196 * to either the container or the contained widget, but rather to their relation. 197 * Typical examples of child properties are the position or pack-type of a widget 198 * which is contained in a #GtkBox. 199 * 200 * Use gtk_container_class_install_child_property() to install child properties 201 * for a container class and gtk_container_class_find_child_property() or 202 * gtk_container_class_list_child_properties() to get information about existing 203 * child properties. 204 * 205 * To set the value of a child property, use gtk_container_child_set_property(), 206 * gtk_container_child_set() or gtk_container_child_set_valist(). 207 * To obtain the value of a child property, use 208 * gtk_container_child_get_property(), gtk_container_child_get() or 209 * gtk_container_child_get_valist(). To emit notification about child property 210 * changes, use gtk_widget_child_notify(). 211 * 212 * # GtkContainer as GtkBuildable 213 * 214 * The GtkContainer implementation of the GtkBuildable interface supports 215 * a <packing> element for children, which can contain multiple <property> 216 * elements that specify child properties for the child. 217 * 218 * Since 2.16, child properties can also be marked as translatable using 219 * the same “translatable”, “comments” and “context” attributes that are used 220 * for regular properties. 221 * 222 * Since 3.16, containers can have a <focus-chain> element containing multiple 223 * <widget> elements, one for each child that should be added to the focus 224 * chain. The ”name” attribute gives the id of the widget. 225 * 226 * An example of these properties in UI definitions: 227 * |[ 228 * <object class="GtkBox"> 229 * <child> 230 * <object class="GtkEntry" id="entry1"/> 231 * <packing> 232 * <property name="pack-type">start</property> 233 * </packing> 234 * </child> 235 * <child> 236 * <object class="GtkEntry" id="entry2"/> 237 * </child> 238 * <focus-chain> 239 * <widget name="entry1"/> 240 * <widget name="entry2"/> 241 * </focus-chain> 242 * </object> 243 * ]| 244 */ 245 public class Container : Widget 246 { 247 /** the main Gtk struct */ 248 protected GtkContainer* gtkContainer; 249 250 /** Get the main Gtk struct */ 251 public GtkContainer* getContainerStruct() 252 { 253 return gtkContainer; 254 } 255 256 /** the main Gtk struct as a void* */ 257 protected override void* getStruct() 258 { 259 return cast(void*)gtkContainer; 260 } 261 262 protected override void setStruct(GObject* obj) 263 { 264 gtkContainer = cast(GtkContainer*)obj; 265 super.setStruct(obj); 266 } 267 268 /** 269 * Sets our main struct and passes it to the parent class. 270 */ 271 public this (GtkContainer* gtkContainer, bool ownedRef = false) 272 { 273 this.gtkContainer = gtkContainer; 274 super(cast(GtkWidget*)gtkContainer, ownedRef); 275 } 276 277 /** 278 * Removes all widgets from the container 279 */ 280 void removeAll() 281 { 282 GList* gList = gtk_container_get_children(getContainerStruct()); 283 if ( gList !is null ) 284 { 285 ListG children = new ListG(gList); 286 for ( int i=children.length()-1 ; i>=0 ; i-- ) 287 { 288 gtk_container_remove(getContainerStruct(), cast(GtkWidget*)children.nthData(i)); 289 } 290 } 291 } 292 293 /** 294 */ 295 296 /** */ 297 public static GType getType() 298 { 299 return gtk_container_get_type(); 300 } 301 302 /** 303 * Adds @widget to @container. Typically used for simple containers 304 * such as #GtkWindow, #GtkFrame, or #GtkButton; for more complicated 305 * layout containers such as #GtkBox or #GtkGrid, this function will 306 * pick default packing parameters that may not be correct. So 307 * consider functions such as gtk_box_pack_start() and 308 * gtk_grid_attach() as an alternative to gtk_container_add() in 309 * those cases. A widget may be added to only one container at a time; 310 * you can’t place the same widget inside two different containers. 311 * 312 * Note that some containers, such as #GtkScrolledWindow or #GtkListBox, 313 * may add intermediate children between the added widget and the 314 * container. 315 * 316 * Params: 317 * widget = a widget to be placed inside @container 318 */ 319 public void add(Widget widget) 320 { 321 gtk_container_add(gtkContainer, (widget is null) ? null : widget.getWidgetStruct()); 322 } 323 324 /** */ 325 public void checkResize() 326 { 327 gtk_container_check_resize(gtkContainer); 328 } 329 330 /** 331 * Gets the value of a child property for @child and @container. 332 * 333 * Params: 334 * child = a widget which is a child of @container 335 * propertyName = the name of the property to get 336 * value = a location to return the value 337 */ 338 public void childGetProperty(Widget child, string propertyName, Value value) 339 { 340 gtk_container_child_get_property(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(propertyName), (value is null) ? null : value.getValueStruct()); 341 } 342 343 /** 344 * Gets the values of one or more child properties for @child and @container. 345 * 346 * Params: 347 * child = a widget which is a child of @container 348 * firstPropertyName = the name of the first property to get 349 * varArgs = return location for the first property, followed 350 * optionally by more name/return location pairs, followed by %NULL 351 */ 352 public void childGetValist(Widget child, string firstPropertyName, void* varArgs) 353 { 354 gtk_container_child_get_valist(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(firstPropertyName), varArgs); 355 } 356 357 /** 358 * Emits a #GtkWidget::child-notify signal for the 359 * [child property][child-properties] 360 * @child_property on the child. 361 * 362 * This is an analogue of g_object_notify() for child properties. 363 * 364 * Also see gtk_widget_child_notify(). 365 * 366 * Params: 367 * child = the child widget 368 * childProperty = the name of a child property installed on 369 * the class of @container 370 * 371 * Since: 3.2 372 */ 373 public void childNotify(Widget child, string childProperty) 374 { 375 gtk_container_child_notify(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(childProperty)); 376 } 377 378 /** 379 * Emits a #GtkWidget::child-notify signal for the 380 * [child property][child-properties] specified by 381 * @pspec on the child. 382 * 383 * This is an analogue of g_object_notify_by_pspec() for child properties. 384 * 385 * Params: 386 * child = the child widget 387 * pspec = the #GParamSpec of a child property instealled on 388 * the class of @container 389 * 390 * Since: 3.18 391 */ 392 public void childNotifyByPspec(Widget child, ParamSpec pspec) 393 { 394 gtk_container_child_notify_by_pspec(gtkContainer, (child is null) ? null : child.getWidgetStruct(), (pspec is null) ? null : pspec.getParamSpecStruct()); 395 } 396 397 /** 398 * Sets a child property for @child and @container. 399 * 400 * Params: 401 * child = a widget which is a child of @container 402 * propertyName = the name of the property to set 403 * value = the value to set the property to 404 */ 405 public void childSetProperty(Widget child, string propertyName, Value value) 406 { 407 gtk_container_child_set_property(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(propertyName), (value is null) ? null : value.getValueStruct()); 408 } 409 410 /** 411 * Sets one or more child properties for @child and @container. 412 * 413 * Params: 414 * child = a widget which is a child of @container 415 * firstPropertyName = the name of the first property to set 416 * varArgs = a %NULL-terminated list of property names and values, starting 417 * with @first_prop_name 418 */ 419 public void childSetValist(Widget child, string firstPropertyName, void* varArgs) 420 { 421 gtk_container_child_set_valist(gtkContainer, (child is null) ? null : child.getWidgetStruct(), Str.toStringz(firstPropertyName), varArgs); 422 } 423 424 /** 425 * Returns the type of the children supported by the container. 426 * 427 * Note that this may return %G_TYPE_NONE to indicate that no more 428 * children can be added, e.g. for a #GtkPaned which already has two 429 * children. 430 * 431 * Return: a #GType. 432 */ 433 public GType childType() 434 { 435 return gtk_container_child_type(gtkContainer); 436 } 437 438 /** 439 * Invokes @callback on each direct child of @container, including 440 * children that are considered “internal” (implementation details 441 * of the container). “Internal” children generally weren’t added 442 * by the user of the container, but were added by the container 443 * implementation itself. 444 * 445 * Most applications should use gtk_container_foreach(), rather 446 * than gtk_container_forall(). 447 * 448 * Params: 449 * callback = a callback 450 * callbackData = callback user data 451 */ 452 public void forall(GtkCallback callback, void* callbackData) 453 { 454 gtk_container_forall(gtkContainer, callback, callbackData); 455 } 456 457 /** 458 * Invokes @callback on each non-internal child of @container. 459 * See gtk_container_forall() for details on what constitutes 460 * an “internal” child. For all practical purposes, this function 461 * should iterate over precisely those child widgets that were 462 * added to the container by the application with explicit add() 463 * calls. 464 * 465 * Most applications should use gtk_container_foreach(), 466 * rather than gtk_container_forall(). 467 * 468 * Params: 469 * callback = a callback 470 * callbackData = callback user data 471 */ 472 public void foreac(GtkCallback callback, void* callbackData) 473 { 474 gtk_container_foreach(gtkContainer, callback, callbackData); 475 } 476 477 /** 478 * Retrieves the border width of the container. See 479 * gtk_container_set_border_width(). 480 * 481 * Return: the current border width 482 */ 483 public uint getBorderWidth() 484 { 485 return gtk_container_get_border_width(gtkContainer); 486 } 487 488 /** 489 * Returns the container’s non-internal children. See 490 * gtk_container_forall() for details on what constitutes an "internal" child. 491 * 492 * Return: a newly-allocated list of the container’s non-internal children. 493 */ 494 public ListG getChildren() 495 { 496 auto p = gtk_container_get_children(gtkContainer); 497 498 if(p is null) 499 { 500 return null; 501 } 502 503 return new ListG(cast(GList*) p); 504 } 505 506 /** 507 * Retrieves the focus chain of the container, if one has been 508 * set explicitly. If no focus chain has been explicitly 509 * set, GTK+ computes the focus chain based on the positions 510 * of the children. In that case, GTK+ stores %NULL in 511 * @focusable_widgets and returns %FALSE. 512 * 513 * Params: 514 * focusableWidgets = location 515 * to store the focus chain of the 516 * container, or %NULL. You should free this list 517 * using g_list_free() when you are done with it, however 518 * no additional reference count is added to the 519 * individual widgets in the focus chain. 520 * 521 * Return: %TRUE if the focus chain of the container 522 * has been set explicitly. 523 */ 524 public bool getFocusChain(out ListG focusableWidgets) 525 { 526 GList* outfocusableWidgets = null; 527 528 auto p = gtk_container_get_focus_chain(gtkContainer, &outfocusableWidgets) != 0; 529 530 focusableWidgets = new ListG(outfocusableWidgets); 531 532 return p; 533 } 534 535 /** 536 * Returns the current focus child widget inside @container. This is not the 537 * currently focused widget. That can be obtained by calling 538 * gtk_window_get_focus(). 539 * 540 * Return: The child widget which will receive the 541 * focus inside @container when the @container is focused, 542 * or %NULL if none is set. 543 * 544 * Since: 2.14 545 */ 546 public Widget getFocusChild() 547 { 548 auto p = gtk_container_get_focus_child(gtkContainer); 549 550 if(p is null) 551 { 552 return null; 553 } 554 555 return ObjectG.getDObject!(Widget)(cast(GtkWidget*) p); 556 } 557 558 /** 559 * Retrieves the horizontal focus adjustment for the container. See 560 * gtk_container_set_focus_hadjustment (). 561 * 562 * Return: the horizontal focus adjustment, or %NULL if 563 * none has been set. 564 */ 565 public Adjustment getFocusHadjustment() 566 { 567 auto p = gtk_container_get_focus_hadjustment(gtkContainer); 568 569 if(p is null) 570 { 571 return null; 572 } 573 574 return ObjectG.getDObject!(Adjustment)(cast(GtkAdjustment*) p); 575 } 576 577 /** 578 * Retrieves the vertical focus adjustment for the container. See 579 * gtk_container_set_focus_vadjustment(). 580 * 581 * Return: the vertical focus adjustment, or 582 * %NULL if none has been set. 583 */ 584 public Adjustment getFocusVadjustment() 585 { 586 auto p = gtk_container_get_focus_vadjustment(gtkContainer); 587 588 if(p is null) 589 { 590 return null; 591 } 592 593 return ObjectG.getDObject!(Adjustment)(cast(GtkAdjustment*) p); 594 } 595 596 /** 597 * Returns a newly created widget path representing all the widget hierarchy 598 * from the toplevel down to and including @child. 599 * 600 * Params: 601 * child = a child of @container 602 * 603 * Return: A newly created #GtkWidgetPath 604 */ 605 public WidgetPath getPathForChild(Widget child) 606 { 607 auto p = gtk_container_get_path_for_child(gtkContainer, (child is null) ? null : child.getWidgetStruct()); 608 609 if(p is null) 610 { 611 return null; 612 } 613 614 return ObjectG.getDObject!(WidgetPath)(cast(GtkWidgetPath*) p, true); 615 } 616 617 /** 618 * Returns the resize mode for the container. See 619 * gtk_container_set_resize_mode (). 620 * 621 * Deprecated: Resize modes are deprecated. They aren’t necessary 622 * anymore since frame clocks and might introduce obscure bugs if 623 * used. 624 * 625 * Return: the current resize mode 626 */ 627 public GtkResizeMode getResizeMode() 628 { 629 return gtk_container_get_resize_mode(gtkContainer); 630 } 631 632 /** 633 * When a container receives a call to the draw function, it must send 634 * synthetic #GtkWidget::draw calls to all children that don’t have their 635 * own #GdkWindows. This function provides a convenient way of doing this. 636 * A container, when it receives a call to its #GtkWidget::draw function, 637 * calls gtk_container_propagate_draw() once for each child, passing in 638 * the @cr the container received. 639 * 640 * gtk_container_propagate_draw() takes care of translating the origin of @cr, 641 * and deciding whether the draw needs to be sent to the child. It is a 642 * convenient and optimized way of getting the same effect as calling 643 * gtk_widget_draw() on the child directly. 644 * 645 * In most cases, a container can simply either inherit the 646 * #GtkWidget::draw implementation from #GtkContainer, or do some drawing 647 * and then chain to the ::draw implementation from #GtkContainer. 648 * 649 * Params: 650 * child = a child of @container 651 * cr = Cairo context as passed to the container. If you want to use @cr 652 * in container’s draw function, consider using cairo_save() and 653 * cairo_restore() before calling this function. 654 */ 655 public void propagateDraw(Widget child, Context cr) 656 { 657 gtk_container_propagate_draw(gtkContainer, (child is null) ? null : child.getWidgetStruct(), (cr is null) ? null : cr.getContextStruct()); 658 } 659 660 /** 661 * Removes @widget from @container. @widget must be inside @container. 662 * Note that @container will own a reference to @widget, and that this 663 * may be the last reference held; so removing a widget from its 664 * container can destroy that widget. If you want to use @widget 665 * again, you need to add a reference to it before removing it from 666 * a container, using g_object_ref(). If you don’t want to use @widget 667 * again it’s usually more efficient to simply destroy it directly 668 * using gtk_widget_destroy() since this will remove it from the 669 * container and help break any circular reference count cycles. 670 * 671 * Params: 672 * widget = a current child of @container 673 */ 674 public void remove(Widget widget) 675 { 676 gtk_container_remove(gtkContainer, (widget is null) ? null : widget.getWidgetStruct()); 677 } 678 679 /** */ 680 public void resizeChildren() 681 { 682 gtk_container_resize_children(gtkContainer); 683 } 684 685 /** 686 * Sets the border width of the container. 687 * 688 * The border width of a container is the amount of space to leave 689 * around the outside of the container. The only exception to this is 690 * #GtkWindow; because toplevel windows can’t leave space outside, 691 * they leave the space inside. The border is added on all sides of 692 * the container. To add space to only one side, use a specific 693 * #GtkWidget:margin property on the child widget, for example 694 * #GtkWidget:margin-top. 695 * 696 * Params: 697 * borderWidth = amount of blank space to leave outside 698 * the container. Valid values are in the range 0-65535 pixels. 699 */ 700 public void setBorderWidth(uint borderWidth) 701 { 702 gtk_container_set_border_width(gtkContainer, borderWidth); 703 } 704 705 /** 706 * Sets a focus chain, overriding the one computed automatically by GTK+. 707 * 708 * In principle each widget in the chain should be a descendant of the 709 * container, but this is not enforced by this method, since it’s allowed 710 * to set the focus chain before you pack the widgets, or have a widget 711 * in the chain that isn’t always packed. The necessary checks are done 712 * when the focus chain is actually traversed. 713 * 714 * Params: 715 * focusableWidgets = the new focus chain 716 */ 717 public void setFocusChain(ListG focusableWidgets) 718 { 719 gtk_container_set_focus_chain(gtkContainer, (focusableWidgets is null) ? null : focusableWidgets.getListGStruct()); 720 } 721 722 /** 723 * Sets, or unsets if @child is %NULL, the focused child of @container. 724 * 725 * This function emits the GtkContainer::set_focus_child signal of 726 * @container. Implementations of #GtkContainer can override the 727 * default behaviour by overriding the class closure of this signal. 728 * 729 * This is function is mostly meant to be used by widgets. Applications can use 730 * gtk_widget_grab_focus() to manually set the focus to a specific widget. 731 * 732 * Params: 733 * child = a #GtkWidget, or %NULL 734 */ 735 public void setFocusChild(Widget child) 736 { 737 gtk_container_set_focus_child(gtkContainer, (child is null) ? null : child.getWidgetStruct()); 738 } 739 740 /** 741 * Hooks up an adjustment to focus handling in a container, so when a child 742 * of the container is focused, the adjustment is scrolled to show that 743 * widget. This function sets the horizontal alignment. 744 * See gtk_scrolled_window_get_hadjustment() for a typical way of obtaining 745 * the adjustment and gtk_container_set_focus_vadjustment() for setting 746 * the vertical adjustment. 747 * 748 * The adjustments have to be in pixel units and in the same coordinate 749 * system as the allocation for immediate children of the container. 750 * 751 * Params: 752 * adjustment = an adjustment which should be adjusted when the focus is 753 * moved among the descendents of @container 754 */ 755 public void setFocusHadjustment(Adjustment adjustment) 756 { 757 gtk_container_set_focus_hadjustment(gtkContainer, (adjustment is null) ? null : adjustment.getAdjustmentStruct()); 758 } 759 760 /** 761 * Hooks up an adjustment to focus handling in a container, so when a 762 * child of the container is focused, the adjustment is scrolled to 763 * show that widget. This function sets the vertical alignment. See 764 * gtk_scrolled_window_get_vadjustment() for a typical way of obtaining 765 * the adjustment and gtk_container_set_focus_hadjustment() for setting 766 * the horizontal adjustment. 767 * 768 * The adjustments have to be in pixel units and in the same coordinate 769 * system as the allocation for immediate children of the container. 770 * 771 * Params: 772 * adjustment = an adjustment which should be adjusted when the focus 773 * is moved among the descendents of @container 774 */ 775 public void setFocusVadjustment(Adjustment adjustment) 776 { 777 gtk_container_set_focus_vadjustment(gtkContainer, (adjustment is null) ? null : adjustment.getAdjustmentStruct()); 778 } 779 780 /** 781 * Sets the @reallocate_redraws flag of the container to the given value. 782 * 783 * Containers requesting reallocation redraws get automatically 784 * redrawn if any of their children changed allocation. 785 * 786 * Deprecated: Call gtk_widget_queue_draw() in your size_allocate handler. 787 * 788 * Params: 789 * needsRedraws = the new value for the container’s @reallocate_redraws flag 790 */ 791 public void setReallocateRedraws(bool needsRedraws) 792 { 793 gtk_container_set_reallocate_redraws(gtkContainer, needsRedraws); 794 } 795 796 /** 797 * Sets the resize mode for the container. 798 * 799 * The resize mode of a container determines whether a resize request 800 * will be passed to the container’s parent, queued for later execution 801 * or executed immediately. 802 * 803 * Deprecated: Resize modes are deprecated. They aren’t necessary 804 * anymore since frame clocks and might introduce obscure bugs if 805 * used. 806 * 807 * Params: 808 * resizeMode = the new resize mode 809 */ 810 public void setResizeMode(GtkResizeMode resizeMode) 811 { 812 gtk_container_set_resize_mode(gtkContainer, resizeMode); 813 } 814 815 /** 816 * Removes a focus chain explicitly set with gtk_container_set_focus_chain(). 817 */ 818 public void unsetFocusChain() 819 { 820 gtk_container_unset_focus_chain(gtkContainer); 821 } 822 823 protected class OnAddDelegateWrapper 824 { 825 void delegate(Widget, Container) dlg; 826 gulong handlerId; 827 ConnectFlags flags; 828 this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags) 829 { 830 this.dlg = dlg; 831 this.handlerId = handlerId; 832 this.flags = flags; 833 } 834 } 835 protected OnAddDelegateWrapper[] onAddListeners; 836 837 /** */ 838 gulong addOnAdd(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 839 { 840 onAddListeners ~= new OnAddDelegateWrapper(dlg, 0, connectFlags); 841 onAddListeners[onAddListeners.length - 1].handlerId = Signals.connectData( 842 this, 843 "add", 844 cast(GCallback)&callBackAdd, 845 cast(void*)onAddListeners[onAddListeners.length - 1], 846 cast(GClosureNotify)&callBackAddDestroy, 847 connectFlags); 848 return onAddListeners[onAddListeners.length - 1].handlerId; 849 } 850 851 extern(C) static void callBackAdd(GtkContainer* containerStruct, GtkWidget* object,OnAddDelegateWrapper wrapper) 852 { 853 wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer); 854 } 855 856 extern(C) static void callBackAddDestroy(OnAddDelegateWrapper wrapper, GClosure* closure) 857 { 858 wrapper.outer.internalRemoveOnAdd(wrapper); 859 } 860 861 protected void internalRemoveOnAdd(OnAddDelegateWrapper source) 862 { 863 foreach(index, wrapper; onAddListeners) 864 { 865 if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId) 866 { 867 onAddListeners[index] = null; 868 onAddListeners = std.algorithm.remove(onAddListeners, index); 869 break; 870 } 871 } 872 } 873 874 875 protected class OnCheckResizeDelegateWrapper 876 { 877 void delegate(Container) dlg; 878 gulong handlerId; 879 ConnectFlags flags; 880 this(void delegate(Container) dlg, gulong handlerId, ConnectFlags flags) 881 { 882 this.dlg = dlg; 883 this.handlerId = handlerId; 884 this.flags = flags; 885 } 886 } 887 protected OnCheckResizeDelegateWrapper[] onCheckResizeListeners; 888 889 /** */ 890 gulong addOnCheckResize(void delegate(Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 891 { 892 onCheckResizeListeners ~= new OnCheckResizeDelegateWrapper(dlg, 0, connectFlags); 893 onCheckResizeListeners[onCheckResizeListeners.length - 1].handlerId = Signals.connectData( 894 this, 895 "check-resize", 896 cast(GCallback)&callBackCheckResize, 897 cast(void*)onCheckResizeListeners[onCheckResizeListeners.length - 1], 898 cast(GClosureNotify)&callBackCheckResizeDestroy, 899 connectFlags); 900 return onCheckResizeListeners[onCheckResizeListeners.length - 1].handlerId; 901 } 902 903 extern(C) static void callBackCheckResize(GtkContainer* containerStruct,OnCheckResizeDelegateWrapper wrapper) 904 { 905 wrapper.dlg(wrapper.outer); 906 } 907 908 extern(C) static void callBackCheckResizeDestroy(OnCheckResizeDelegateWrapper wrapper, GClosure* closure) 909 { 910 wrapper.outer.internalRemoveOnCheckResize(wrapper); 911 } 912 913 protected void internalRemoveOnCheckResize(OnCheckResizeDelegateWrapper source) 914 { 915 foreach(index, wrapper; onCheckResizeListeners) 916 { 917 if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId) 918 { 919 onCheckResizeListeners[index] = null; 920 onCheckResizeListeners = std.algorithm.remove(onCheckResizeListeners, index); 921 break; 922 } 923 } 924 } 925 926 927 protected class OnRemoveDelegateWrapper 928 { 929 void delegate(Widget, Container) dlg; 930 gulong handlerId; 931 ConnectFlags flags; 932 this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags) 933 { 934 this.dlg = dlg; 935 this.handlerId = handlerId; 936 this.flags = flags; 937 } 938 } 939 protected OnRemoveDelegateWrapper[] onRemoveListeners; 940 941 /** */ 942 gulong addOnRemove(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 943 { 944 onRemoveListeners ~= new OnRemoveDelegateWrapper(dlg, 0, connectFlags); 945 onRemoveListeners[onRemoveListeners.length - 1].handlerId = Signals.connectData( 946 this, 947 "remove", 948 cast(GCallback)&callBackRemove, 949 cast(void*)onRemoveListeners[onRemoveListeners.length - 1], 950 cast(GClosureNotify)&callBackRemoveDestroy, 951 connectFlags); 952 return onRemoveListeners[onRemoveListeners.length - 1].handlerId; 953 } 954 955 extern(C) static void callBackRemove(GtkContainer* containerStruct, GtkWidget* object,OnRemoveDelegateWrapper wrapper) 956 { 957 wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer); 958 } 959 960 extern(C) static void callBackRemoveDestroy(OnRemoveDelegateWrapper wrapper, GClosure* closure) 961 { 962 wrapper.outer.internalRemoveOnRemove(wrapper); 963 } 964 965 protected void internalRemoveOnRemove(OnRemoveDelegateWrapper source) 966 { 967 foreach(index, wrapper; onRemoveListeners) 968 { 969 if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId) 970 { 971 onRemoveListeners[index] = null; 972 onRemoveListeners = std.algorithm.remove(onRemoveListeners, index); 973 break; 974 } 975 } 976 } 977 978 979 protected class OnSetFocusChildDelegateWrapper 980 { 981 void delegate(Widget, Container) dlg; 982 gulong handlerId; 983 ConnectFlags flags; 984 this(void delegate(Widget, Container) dlg, gulong handlerId, ConnectFlags flags) 985 { 986 this.dlg = dlg; 987 this.handlerId = handlerId; 988 this.flags = flags; 989 } 990 } 991 protected OnSetFocusChildDelegateWrapper[] onSetFocusChildListeners; 992 993 /** */ 994 gulong addOnSetFocusChild(void delegate(Widget, Container) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0) 995 { 996 onSetFocusChildListeners ~= new OnSetFocusChildDelegateWrapper(dlg, 0, connectFlags); 997 onSetFocusChildListeners[onSetFocusChildListeners.length - 1].handlerId = Signals.connectData( 998 this, 999 "set-focus-child", 1000 cast(GCallback)&callBackSetFocusChild, 1001 cast(void*)onSetFocusChildListeners[onSetFocusChildListeners.length - 1], 1002 cast(GClosureNotify)&callBackSetFocusChildDestroy, 1003 connectFlags); 1004 return onSetFocusChildListeners[onSetFocusChildListeners.length - 1].handlerId; 1005 } 1006 1007 extern(C) static void callBackSetFocusChild(GtkContainer* containerStruct, GtkWidget* object,OnSetFocusChildDelegateWrapper wrapper) 1008 { 1009 wrapper.dlg(ObjectG.getDObject!(Widget)(object), wrapper.outer); 1010 } 1011 1012 extern(C) static void callBackSetFocusChildDestroy(OnSetFocusChildDelegateWrapper wrapper, GClosure* closure) 1013 { 1014 wrapper.outer.internalRemoveOnSetFocusChild(wrapper); 1015 } 1016 1017 protected void internalRemoveOnSetFocusChild(OnSetFocusChildDelegateWrapper source) 1018 { 1019 foreach(index, wrapper; onSetFocusChildListeners) 1020 { 1021 if (wrapper.dlg == source.dlg && wrapper.flags == source.flags && wrapper.handlerId == source.handlerId) 1022 { 1023 onSetFocusChildListeners[index] = null; 1024 onSetFocusChildListeners = std.algorithm.remove(onSetFocusChildListeners, index); 1025 break; 1026 } 1027 } 1028 } 1029 1030 }