3.2 Programa de demostración del empaquetado

En este ejemplo, la base de todos los widgets es una caja vertical, que a su vez es hija de la ventana. Los widgets hijos no se muestran de modo homogéneo y no hay un espacio adicional (diferente del espaciado estándar). Hay seis cajas horizontales en la caja vertical, tal y como se definen con la función makeBox, que tiene el tipo mostrado. Además, hay dos etiquetas en la caja vertical así como dos separadores horizontales. El último widget es el botón Quit cuya señal onClicked se engancha a la función mainQuit.

Los separadores se crean con hSeparatorNew y están espaciados por boxPackStart con un espacio de separación de diez píxeles. Las etiquetas (label) se crean con labelNew con un Maybe String y su posición se establece con miscSetAlignment para estar justificados a la izquierda y arriba.

Packing demo application

La función makeBox :: Bool -> Int -> Packing -> Int -> IO HBox demuestra como los widgets de Gtk2Hs encajan dentro del sistyema de tipos de haskell. Packing es simplemente un tipo, como Int y Bool y IO HBox es como IO String en el típico IO. La función crea cinco botones, los etiqueta con el texto apropiado y los empaqueta en una caja horizontal. Entonces la función se emplea en el programa principal para crear los modos de empaquetado deseados.

import Graphics.UI.Gtk

main :: IO ()
main = do
  initGUI
  window     <- windowNew
  vbox       <- vBoxNew False 0
  set window [containerBorderWidth := 10,
              windowTitle := "Packing Demonstration",
              containerChild := vbox]
  label1     <- labelNew (Just "hBoxNew False 0")
  miscSetAlignment label1 0 0
  boxPackStart vbox label1 PackNatural 0
  box1       <- makeBox False 0 PackNatural 0
  boxPackStart vbox box1 PackNatural 0
  box2       <- makeBox False 0 PackRepel 0
  boxPackStart vbox box2 PackNatural 0
  box3       <- makeBox False 0 PackGrow 0
  boxPackStart vbox box3 PackNatural 0
  sep1       <- hSeparatorNew
  boxPackStart vbox sep1 PackNatural 10
  label2     <- labelNew (Just "hBoxNew True 0")
  miscSetAlignment label2 0 0
  boxPackStart vbox label2 PackNatural 0
  box4       <- makeBox True 0 PackNatural 0
  boxPackStart vbox box4 PackNatural 0
  box5       <- makeBox True 0 PackRepel 0
  boxPackStart vbox box5 PackNatural 0
  box6       <- makeBox False 0 PackGrow 0
  boxPackStart vbox box6 PackNatural 0
  sep        <- hSeparatorNew
  boxPackStart vbox sep PackNatural 10
  quitbox    <- hBoxNew False 0
  boxPackStart vbox quitbox PackNatural 0
  quitbutton <- buttonNewWithLabel "Quit"
  boxPackStart quitbox quitbutton PackRepel 0
  onClicked quitbutton mainQuit
  onDestroy window mainQuit
  widgetShowAll window
  mainGUI


makeBox :: Bool -> Int -> Packing -> Int -> IO HBox
makeBox homogeneous spacing packing padding = do
  box     <- hBoxNew homogeneous spacing
  button1 <- buttonNewWithLabel "boxPackStart"
  boxPackStart box button1 packing padding
  button2 <- buttonNewWithLabel "box"
  boxPackStart box button2 packing padding
  button3 <- buttonNewWithLabel "button"
  boxPackStart box button3 packing padding
  button4 <- case packing of
                  PackNatural -> buttonNewWithLabel "PackNatural"
                  PackRepel   -> buttonNewWithLabel "PackRepel"
                  PackGrow    -> buttonNewWithLabel "PackGrow"
  boxPackStart box button4 packing padding
  button5 <- buttonNewWithLabel (show padding)
  boxPackStart box button5 packing padding
  return box

La imagen de abajo muestra los efectos de modificar el tamaño de la ventana horizontalmente. En el primer grupo, con homogeneous en False, las modificaciones horizontales dejan la frimera fila de botones como estaban, espacian la segunda fila de modo equilibrado y agrandan los botones de la tercera fila. En el segundo grupo, los botones se empaquetan homogeneamente, y las primeras dos filas se verán iguales. Si modificamos el tamaño verticalmente, simplemente añadirá espacios adicionales al final, ya que la caja vertical ha sido inicializada con False.

Resized packing demo application