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.
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.