Tutoriel Gtk2Hs

4.3 Étiquettes

Les étiquettes sont énormément utilisées par Gtk2Hs et sont relativement simples. Les étiquettes n’émettent pas de signaux. Si vous avez besoin de capturer un signal, placez l’étiquette à l’intérieur d’un widget EventBox (ils permettent de capturer des signaux pour des widgets qui n’ont pas leur propre fenêtre).

Pour créer une étiquette, utilisez:

labelNew :: Maybe String -> IO Label

labelNewWithMnemonic :: String -> IO Label

Avec la seconde fonction, si un caractère est précédé d’un underscore (tiret bas), il est souligné. Si vous avez besoin d’afficher le caractère underscore dans une étiquette, utilisez (deux underscore à la suite). Le premier caractère représente un raccourci clavier appelé mnémonique. Quand cette touche est pressée, le widget activable qui contient l’étiquette (par exemple, un bouton) sera activé. Le mnémonique peut également être affecté à un widget avec labelSetMnemonicWidget.

Pour changer le texte du label après sa création ou pour obtenir le texte de l’étiquette, utilisez les fonctions:

labelSetText :: LabelClass self => self -> String -> IO ()

labelGetLabel :: LabelClass self => self -> IO String

Ou alors les fonctions génériques set ou get. L’espace nécessaire à la nouvelle chaîne de caractères sera automatiquement ajusté au besoin. Vous pouvez écrire des étiquettes multi-ligne en plaçant des sauts de ligne dans la chaîne de caractères. Si vous avez des chaînes multi-ligne, les lignes peuvent être justifiées en utilisant:

labelSetJustify :: LabelClass self => self -> Justification -> IO ()

Ou le type Justification reçoit un des constructeurs suivant:

  • JustifyLeft
  • JustifyRight
  • JustifyCenter
  • JustifyFill

Le widget label est aussi capable de faire des retours à la ligne automatiques. Cela peut être activé avec:

labelSetLineWrap :: LabelClass self => self -> Bool -> IO ()

Si vous voulez que votre étiquette soit soulignée, alors vous pouvez définir un motif pour l’étiquette:

labelSetPattern :: LabelClass self => self -> [Int] -> IO ()

La liste de Int marque les parties soulignées du texte,alternées par les parties non-soulignées. Par exemple, [3, 1, 3] signifie que les trois premiers caractères seront soulignés, le suivant non et les trois autres suivants oui.

Vous pouvez également rendre le texte d’une étiquette sélectionnable, l’utilisateur pourra alors le copier et le coller et utiliser des options de formatage.

En dessous, un petit exemple pour illustrer certaines de ces fonctions. Il utilise le widget Frame pour montrer les styles des étiquettes. Un widget Frame est juste une décoration comme un HSeparator et un VSeparator mais il entoure le widget et est une instance de Container. Le widget encadré doit donc être ajouté avec containerAdd. Un cadre peut lui-même contenir une étiquette pour fournir des informations sur son contenu.

Gtk Gtk2Hs Label examples

Pour que toutes les étiquettes soient encadrées, on crée une fonction myLabelWithFrameNew pour retourner l’étiquette et son cadre dans un . Gtk2Hs est vraiment dans le style de Haskell, vous pouvez utiliser tous les types de données et fonctionnalités. Justifier du texte est assez évident mais cela s’applique uniquement aux lignes à l’intérieur de l’étiquette. Pour justifier à droite label2, vous avez besoin de miscSetAlignment comme montré en dessous. Les deux derniers widgets dans la boite horizontale à gauche sont empaquetés avec boxPackEnd au lieu de l’habituel boxPackStart. L’étiquette du bouton montre l’utilisation d’un mnémonique comme raccourci clavier. Appuyer sur Alt-C au clavier à le même effet que de cliquer sur le bouton.

import Graphics.UI.Gtk

main:: IO ()
main = do
  initGUI
  window  <- windowNew
  set window [windowTitle := "Labels", containerBorderWidth := 10]
  mainbox <- vBoxNew False 10
  containerAdd window mainbox
  hbox    <- hBoxNew True 5
  boxPackStart mainbox hbox PackNatural 0
  vbox1   <- vBoxNew False 10
  vbox2   <- vBoxNew False 0
  boxPackStart hbox vbox1 PackNatural 0
  boxPackStart hbox vbox2 PackNatural 0

  (label1,frame1) <- myLabelWithFrameNew
  boxPackStart vbox1 frame1 PackNatural 0
  labelSetText label1 "Penny Harter"

  (label2,frame2) <- myLabelWithFrameNew
  boxPackStart vbox1 frame2 PackNatural 0
  labelSetText label2 "broken bowl\nthe pieces\nstill rocking"
  miscSetAlignment label2 0.0 0.0
  hsep1           <- hSeparatorNew
  boxPackStart vbox1 hsep1 PackNatural 10

  (label3,frame3) <- myLabelWithFrameNew
  boxPackStart vbox1 frame3 PackNatural 0
  labelSetText label3 "Gary Snyder"

  (label4,frame4) <- myLabelWithFrameNew
  boxPackStart vbox1 frame4 PackNatural 0
  labelSetText label4 "After weeks of watching the roof leak\nI fixed it tonight\nby moving a single board"
  labelSetJustify label4 JustifyCenter

  (label5,frame5) <- myLabelWithFrameNew
  boxPackStart vbox2 frame5 PackNatural 0
  labelSetText label5 "Kobayashi Issa"

  (label7,frame7) <- myLabelWithFrameNew
  boxPackEnd vbox2 frame7 PackNatural 0
  labelSetText label7 "only one guy and\nonly one fly trying to\nmake the guest room do"
  labelSetJustify label7 JustifyRight

  (label6,frame6) <- myLabelWithFrameNew
  boxPackEnd vbox2 frame6 PackNatural 10
  labelSetText label6 "One Guy"
  frameSetLabel frame6 "Title:"
  labelSetPattern label6 [3, 1, 3]

  button      <- buttonNew
  boxPackEnd mainbox button PackNatural 20
  buttonlabel <- labelNewWithMnemonic "Haiku _Clicked"
  containerAdd button buttonlabel

  widgetShowAll window
  onClicked button (putStrLn "button clicked...")
  onDestroy window mainQuit
  mainGUI


myLabelWithFrameNew :: IO (Label,Frame)
myLabelWithFrameNew = do
  label <- labelNew Nothing
  frame <- frameNew
  containerAdd frame label
  frameSetShadowType frame ShadowOut
  return (label, frame)


-- Haikus quoted from X.J. Kennedy, Dana Gioia, Introduction to Poetry, Longman, 1997