Containers
Containers are widgets that may contain multiple child widgets. Some
examples of such widgets are Box
, ListBox
, and Paned
.
Just like single widgets and bins, the container
function takes as
arguments a widget constructor and a list of
properties. The third argument however,
is a collection of child widgets.
Container and Children Types
Different container widgets use different types to help you construct a valid widget hierarchy. These types are enforcing the existing GTK+ widget rules, that otherwise would be printed as warnings or errors.
Things that vary between container widget types are:
- The types of their child widgets
- The type of collection used to pass the children as a parameter
Box
In the case of Box
, the collection of child widgets has type
[BoxChild event]
.
container Box [] [ BoxChild defaultBoxChildProperties (widget Button []) , BoxChild defaultBoxChildProperties (widget CheckButton []) ]
As BoxChildProperties
is a record, it's easy to override the
defaults with custom values, specifying how the child should be
packed in the box.
container Box [] [ BoxChild defaultBoxChildProperties { padding = 10 } (widget Button []) , BoxChild defaultBoxChildProperties { expand = True } (widget CheckButton []) ]
For convenience, widgets can be wrapped in BoxChild
values
automatically using the default box packing properties.
container Box [] [ widget Button [] , widget CheckButton [] ]
Grid
Grid
is similar to Box
, except that the child widgets occupy
a grid (possibly taking up multiple cells) instead of being arranged
in a simple line.
The collection of child widgets has type [GridChild event]
and a
GridChildProperties
value specifies size and location in the grid.
container Grid [] [ GridChild defaultGridChildProperties (widget Label [#label := "Input"]) , GridChild defaultGridChildProperties { leftAttach = 1 } (widget Entry [#hexpand := True]) ]
ListBox
The collection of child widgets used with ListBox
is of type [Bin
ListBoxRow Widget event]
, where ListBoxRow
is the regular
constructor defined in the gi-gtk package. Instead of accepting
any [Widget event]
, the type constrains its usage to only accept
proper ListBoxRow
widgets as children.
container ListBox [] [ bin ListBoxRow [] (widget Button []) , bin ListBoxRow [] (widget CheckButton []) ]
Paned
The Paned
widget in GTK+ has two panes, which contain one widget
each. While Paned
widgets can be constructed using the container
function, the smart constructor paned
is recommended. It takes a
list of attributes, along with two Pane
values.
paned [#wideHandle := True] (pane defaultPaneProperties { resize = True } $ widget Label [#label := "Left"]) (pane defaultPaneProperties { resize = True, shrink = False } $ widget Label [#label := "Right"])
Each Pane
is constructed using the pane
function, which takes a
PaneProperties
value and a child widget. These pane property values
are used to call the underlying pack1
/pack2
functions on the GTK+
widget.
Notebook
The Notebook
widget has multiple children - called "pages" - and
tabs that allow you to view one page at a time. You should construct
Notebooks with the notebook
, page
, and pageWithTab
functions.
notebook [] [ page "First tab label" (widget Label [#label := "First tab content..."]) , pageWithTab (widget Button [#label := "Using a button as the tab label widget"]) (widget Label [#label := "Second tab content..."]) ]