Tutoriel Gtk2Hs

3.2 Programme de démonstration de l’empaquetage

La base de tous les widgets montrés ici est une boite verticale, qui est elle-même un enfant de la fenêtre. Les widgets enfants ne sont pas affichés de façon homogène et il n’y a pas d’espace additionnel (autre que l’espace standard). Il y a six boites horizontales dans la boite verticale, définie par la fonction makeBox. En outre, il y a deux labels dans la boite verticale ainsi que deux séparateurs. Le dernier widget est le bouton Quit dont le signal onClicked est connecté à la fonction mainQuit.

Les séparateurs sont créés avec hSeparatorNew et ils sont espacés avec boxPackStart avec un espacement de dix pixels. Les labels sont créés avec labelNew qui prend comme argument Maybe String et leur positionnement est défini avec miscSetAlignment pour être justifié en haut à gauche.

Gtk Gtk2Hs Packing demo application

La fonction makeBox :: Bool -> Int -> Packing -> Int -> IO HBox montre comment les widgets Gtk2Hs s’adaptent au système de types de Haskell. Packing est juste un type comme Int et Bool et IO HBox est juste comme IO String dans La fonction crée cinq boutons, les labellise avec le texte approprié et les empilent dans une boite horizontale. La fonction est alors utilisée dans le programme principal pour créer l’empaquetage de la manière souhaitée.

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

L’image suivante montre les effets du redimensionnement horizontale de la fenêtre. Dans le premier groupe avec homogeneous définis à False, le redimensionnement horizontal laisse la première ligne de boutons telle qu’elle est, les espaces de la seconde uniformes et élargit les boutons de la troisième ligne. Dans le deuxième groupe, les boutons sont réglés pour être empaquetés de façon homogène et les deux premières lignes se ressemblent.Redimensionner la fenêtre verticalement ajoute seulement un espace additionnel à la fin car la boite verticale a été initialisée à False.

Gtk Gtk2Hs Resized packing demo application