décembre
2009
Bonjour !
Ce billet est le premier d’une longue série consacrée à LablGTK et, plus particulièrement, à la présentation détaillée des modules qui la constituent. Beaucoup de questions sur le forum caml de developpez.com plaident en faveur de cette idée. Il est vrai que la bibliothèque comporte plusieurs de 20 modules d’utilisation courante… ce qui n’est pas toujours évident au premier abord. Dans ce billet, nous allons commencer par quelque chose de simple : le module GButton.
Le module GButton définit des widgets cliquables communément appelés boutons. Ce sont des boutons simples (GtkButton), des bouton à bascule (GtkToggleButton), des cases à cocher (GtkCheckButton) ou des choix multiples (GtkRadioButton). On y trouve également des versions spécialisées dans la sélection d’une fonte (GtkFontButton) ou d’une couleur (GtkColorButton), ou encore la définition de liens cliquables (GtkLinkButton). Enfin, c’est avec ce module que l’on peut définir des barres d’outils (GtkToolbar).
Les boutons simples (GtkButton)
Les boutons simples sont principalement utilisés pour répondre à un clic de l’utilisateur (#connect#clicked). Ils possèdent un seul état et se retrouvent surtout dans les boîtes de dialogue sous la forme de boutons OK, Appliquer ou Annuler. Un bouton simple peut contenir une icône prédéfinie (module GtkStock) ou issue de n’importe quel widget (#set_image).
Les boutons à bascule (GtkToggleButton)
Les boutons à bascule sont des boutons à deux états (état enfoncé et état relâché). Leur état peut être déterminé avec #active (true quand le bouton est enfoncé). Pour les applications partielles, on utilisera quelque chose comme ceci :
let toggle =
let toggle = GButton.toggle_button () in
toggle#connect#toggled (foo toggle);
toggle
Les cases à cocher (GtkCheckButton)
Les cases à cocher permettent de sélectionner des options qui ne sont pas exclusives. En d’autres termes, plusieurs choix peuvent être sélectionnés simultanément. La fonction GButton.check_button qui permet de les créer renvoie un widget de type toggle_button. En d’autres termes, les cases à cocher sont des boutons à bascule dont l’apparence a été modifiée. Pour le programmeur, la manipulation est exactement la même que pour les boutons à bascule.
Les choix multiples (GtkRadioButton)
Les choix multiples obligent l’utilisateur à faire un choix parmi un ensemble de cas exclusifs. En d’autres termes, lorsqu’un nouveau choix est effectué, le choix précédent est automatiquement désélectionné. Pour assurer ce comportement, il ne faut pas oublier de définir le paramètre group pour relier les différents choix. Voici un exemple :
"Sunday"]
let build packing =
let rec loop group = function
| [] -> []
| label :: t -> let btn = GButton.radio_button ~label ?group ~packing () in
btn :: loop (Some (Gaux.default btn#group ~opt:group)) t
in loop None days
Sélection de fonte (GtkFontButton)
Ce bouton permet de choisir une police de caractères. L’événement associé est #connect#font_set, qui est déclenché chaque fois qu’une fonte est sélectionnée par l’utilisateur. La fonte peut être récupérée grâce à #font_name. Il s’agit d’une chaîne de caractères que l’on peut convertir dans un type plus adapté (Pango.font_description) avec la fonction Pango.Font.from_string. On a alors accès à de nombreuses infos telles que la taille, la famille, l’épaisseur…
Sélection de couleur (GtkColorButton)
Ce bouton permet de choisir une couleur. L’événement associé est #connect#color_set. La couleur est obtenue avec #color et renvoyée au format Gdk.color. On récupère les composantes rouge, verte et bleue d’une couleur au format Gdk.color avec les fonctions Gdk.Color.red, Gdk.Color.green et Gdk.Color.blue. Attention : les composantes sont sur 16 bits. Ne cherchez pas à reprogrammer ce bouton vous-mêmes, car ce serait long et inutile. Le bouton de sélection de couleur est vraiment bien conçu !
Lien cliquable (GtkLinkButton)
Ce bouton permet de définir un lien (par exemple vers une page web) auquel on peut accéder par simple clic. On le retrouve notamment dans la boîte de dialogue « À propos… » (GtkAboutDialog). Son utilisation est très simple :
let link = GButton.link_button "http://www.google.fr/" ~label:"Google France" ()
Barres d’outils (GtkToolbar)
Les barres d’outils sont utilisées pour grouper plusieurs boutons sur une petite zone de l’interface. Elles ont une orientation (verticale ou horizontale) et un style (icône seule (`ICONS), texte seul (`TEXT), icône et texte en dessous (`BOTH) ou icône et texte à côté (`BOTH_HORIZ)).
Les éléments d’une barre d’outils sont des widgets appelés toolitems. On retrouve la plupart des catégories de boutons :
- Des séparateurs : GtkSeparatorToolItem
- Des boutons simples : GtkToolButton
- Des boutons à bascule : GtkToggleToolButton
- Des choix multiples : GtkRadioToolButton
- Des boutons avec menu déroulant : GtkMenuToolButton
Voici le code qui a permis d’obtenir l’image ci-dessus :
GMain.init ();
let wnd = GWindow.window
~title:"GtkToolbar demo"
~position:`CENTER
~resizable:false
~width:800 ~height:600 () in
wnd#connect#destroy GMain.quit;
wnd
let box = GPack.vbox ~packing:window#add ()
let toolbar = GButton.toolbar
~orientation:`HORIZONTAL
~style:`ICONS
~packing:(box#pack ~expand:false) ()
let days =
let menu = GMenu.menu () in
List.iter (fun label -> ignore (GMenu.menu_item ~label ~packing:menu#add ()))
["Lundi"; "Mardi"; "Mercredi"; "Jeudi"; "Vendredi"; "Samedi"; "Dimanche"];
menu
let data = [`B `NEW; `B `OPEN; `B `SAVE; `S; `B `CUT; `B `COPY; `B `PASTE; `S;
`T "Bascule"; `S; `M days ]
let _ =
let packing = toolbar#insert in
List.iter (function
| `S -> ignore (GButton.separator_tool_item ~packing ())
| `B stock -> ignore (GButton.tool_button ~stock ~packing ())
| `T label -> ignore (GButton.toggle_tool_button ~label ~packing ())
| `M menu -> ignore (GButton.menu_tool_button ~label:"Foo" ~menu ~packing ())
| _ -> ()
) data
let _ =
window#show ();
GMain.main ()
Mais ce n’est pas tout ! En fait, on peut insérer à peu près n’importe quel widget dans une barre d’outils à condition de l’empaqueter au préalable dans l’unité de base des barres d’outils : le GtkToolItem.
Voici les quelques lignes qui ont permis d’insérer une fenêtre avec barres de défilement (GtkScrolledWindow) dans une barre d’outils :
~orientation:`HORIZONTAL
~style:`BOTH ()
let item = GButton.tool_item ~packing:toolbar#insert ()
let scroll = GBin.scrolled_window
~hpolicy:`NEVER
~vpolicy:`ALWAYS
~width:160 ~height:20
~packing:item#add ()
C’est tout pour aujourd’hui. Dans un prochain billet, nous aborderons un module de grande importance : GWindow.
À bientôt,
Cacophrène
Salut !
Merci pour ton message. L’astuce pour l’icône personnalisée est intéressante. Dans le même genre on peut utiliser
si on veut quelque chose de plus compliqué qu’un simple texte (par exemple on peut utiliser un
pour gagner le droit d’utiliser des balises de mise en forme Pango à peu de frais).
Pour les info bulles : je pense que la méthode
et l’objet
sont désormais obsolètes avec GTK 2.12 (voir la doc de
). Tous les widgets devraient utiliser à la place
pour du texte seul et
pour du texte avec une mise en forme associée à base de balises Pango (ce que ne permet pas
). Il y a un nouvel objet
(sans ‘s’ final) mais il n’existe pas encore de binding correspondant dans
(et
n’a pas encore été déplacé dans
… d’ailleurs ça n’arrivera probablement pas à cause des problèmes de compatibilité).
Un grand bravo à toi.
Je ne connaissais même pas tous les boutons.
Une petite astuce supplémentaire pour fournir une icône personnalisée à un tool_button, l’image étant localisée dans le fichier pix_path :
let image = GMisc.image ~file:pix_path () <br />
in tool_button#set_icon_widget image#coerce; <br />
Pour définir l’info_bulle d’un tool_button
tool_button#set_tooltip (GData.tooltips ()) "Clic-gauche pour actionner" ""; <br />