décembre
2009
Bonjour !
Dans le précédent billet consacré à LablGTK, nous avons parlé du module GButton. Nous allons maintenant nous pencher sur un autre module incontournable dès que l’on veut créer une interface graphique : le module GWindow.
Le module GWindow
définit des fenêtres (GtkWindow
), des boîtes de dialogue qui affichent des messages (GtkMessageDialog
) ou un contenu plus complexe (GtkDialog
). On y trouve aussi des fenêtres spécialisées dans la manipulation des fichiers (GtkFileChooserDialog
), des couleurs (GtkColorDialog
), des fontes (GtkFontDialog
). Enfin, le module GWindow
fournit une boîte de dialogue ‘À propos…’ (GtkAboutDialog
) qui simplifie le développement des applications.
GtkWindow
Les fenêtres de type GtkWindow
sont appelées toplevel. Elles servent de conteneur principal pour une interface et n’ont donc pas de widget parent. Voici quelques méthodes intéressantes pour modifier la taille de la fenêtre :
Méthode | Description |
---|---|
#fullscreen |
Passer en mode ‘Plein écran’ |
#unfullscreen |
Sortir du mode ‘Plein écran’ |
#maximize |
Occuper toute la place disponible |
#unmaximize |
Réduire à la taille normale |
#stick |
Rendre la fenêtre visible sur tous les bureaux |
#unstick |
Rendre la fenêtre visible sur le bureau actif uniquement |
Fenêtre principale et fermeture de l’application
En général, on utilise #event#connect#delete
pour afficher un message de confirmation de la fermeture à l’attention de l’utilisateur, et #connect#destroy
pour appeler la fonction GMain.quit
et quitter l’application.
Widgets enfants
Dernier point, et non des moindres : les fenêtres sont des widgets qui ne peuvent contenir qu’un seul widget enfant. Par conséquent, toute interface tant soit peu complexe devra faire appel à des boîtes (module GPack
) dont nous parlerons dans le prochain billet.
GtkMessageDialog
Les fenêtres de type GtkMessageDialog
servent à afficher un court message à l’attention de l’utilisateur. On s’en sert notamment pour demander confirmation avant de fermer l’application lorsque des modifications ont été apportées depuis le dernier enregistrement. Ces boîtes de dialogue permettent d’écrire des textes très lisibles grâce aux balises Pango (gras, italique, choix de la taille de la police, etc.).
GtkDialog
Boîte de dialogue de type GtkDialog
Les boîtes de dialogue de type GtkDialog
sont souvent utilisées pour créer la page ‘Préférences’ dans une application. Ce sont des fenêtres composées dès l’origine d’une boîte verticale (méthode #vbox
) dans laquelle il est possible de placer n’importe quelle combinaison de widgets. On ajoute des boutons (fermeture, annulation, validation, aide, etc.) avec les méthodes :
Méthode | Description |
---|---|
#add_button |
Ajoute un bouton en indiquant le texte qu’il contient |
#add_button_stock |
Ajoute un bouton avec une icône associée (GtkStock.id ) |
Les boutons sont insérés dans un widget de type GtkButtonBox accessible avec la méthode #action_area.
GtkAboutDialog
La boîte de dialogue GtkAboutDialog
permet de créer simplement une boîte de dialogue de type « À propos… » pour votre application. Elle permet de décrire brièvement le logiciel. Voici quelques-unes des méthodes disponibles :
Méthode | Description |
---|---|
#set_authors |
Nom des développeurs du logiciel. |
#set_documenters |
Auteurs de la documentation. |
#set_license |
Licence du logiciel. |
#set_logo |
Logo du logiciel. |
#set_website |
Site web du logiciel. |
#set_version |
Version du logiciel. |
#set_copyright |
Copyright. |
Comme vous pouvez le voir, cette boîte de dialogue a été conçue pour uniformiser les applications qui utilisent GTK, mais aussi et surtout pour accélérer le développement d’un nouveau logiciel.
Autres boîtes de dialogue
Il existe d’autres boîtes de dialogue plus spécialisées comme GtkColorSelectionDialog
(sélection de couleur), GtkFontSelectionDialog
(sélection de fonte) ou GtkFileChooserDialog
(sélection de fichier). Plutôt qu’un long discours, je vous propose de les découvrir à travers un exemple de code. Il s’agit d’un éditeur de texte simpliste que vous pouvez tester avec la commande ocaml -w s -I +lablgtk2 lablgtk.cma test.ml. De plus, vous verrez que ces quelques boîtes de dialogue ressemblent beaucoup à ce que nous avons vu précédemment avec le module GButton.
module Aux = struct let load (text : GText.view) file = let ich = open_in file in let len = in_channel_length ich in let buf = Buffer.create len in Buffer.add_channel buf ich len; close_in ich; text#buffer#set_text (Buffer.contents buf) let save (text : GText.view) file = let och = open_out file in output_string och (text#buffer#get_text ()); close_out och end let _ = GMain.init () (* GtkWindow - Fenêtre principale. *) let window = let wnd = GWindow.window ~height:300 ~resizable:false ~position:`CENTER ~title:"GWindow Demo" () in wnd#connect#destroy GMain.quit; wnd (* GtkMessageDialog - Court message à l'attention de l'utilisateur. *) let confirm _ = let dlg = GWindow.message_dialog ~message:"<b><big>Voulez-vous vraiment quitter ?</big>\n\n\ Attention :\nToutes les modifications seront perdues.</b>\n" ~parent:window ~destroy_with_parent:true ~use_markup:true ~message_type:`QUESTION ~position:`CENTER_ON_PARENT ~buttons:GWindow.Buttons.yes_no () in let res = dlg#run () = `NO in dlg#destroy (); res let vbox = GPack.vbox ~spacing:5 ~border_width:5 ~packing:window#add () let text = let scroll = GBin.scrolled_window ~hpolicy:`ALWAYS ~vpolicy:`ALWAYS ~shadow_type:`ETCHED_IN ~packing:vbox#add () in let txt = GText.view ~packing:scroll#add () in txt#misc#modify_font_by_name "Monospace 10"; txt let bbox = GPack.button_box `HORIZONTAL ~spacing:5 ~layout:`SPREAD ~packing:(vbox#pack ~expand:false) () (* GtkFileChooserDialog - Boîte de dialogue d'ouverture et d'enregistrement. *) let action_button stock event action = let dlg = GWindow.file_chooser_dialog ~action:`OPEN ~parent:window ~position:`CENTER_ON_PARENT ~destroy_with_parent:true () in dlg#add_button_stock `CANCEL `CANCEL; dlg#add_select_button_stock stock event; let btn = GButton.button ~stock ~packing:bbox#add () in GMisc.image ~stock ~packing:btn#set_image (); btn#connect#clicked (fun () -> if dlg#run () = `OPEN then Gaux.may action dlg#filename; dlg#misc#hide ()); btn let open_button = action_button `OPEN `OPEN (Aux.load text) let save_button = action_button `SAVE `SAVE (Aux.save text) (* GtkColorSelectionDialog - Sélection de couleur. *) let color_picker = let dlg = GWindow.color_selection_dialog ~parent:window ~destroy_with_parent:true ~position:`CENTER_ON_PARENT () in dlg#ok_button#connect#clicked (fun () -> text#misc#modify_base [`NORMAL, `COLOR dlg#colorsel#color]); let btn = GButton.button ~label:"Arrière-plan" ~packing:bbox#add () in GMisc.image ~stock:`COLOR_PICKER ~packing:btn#set_image (); btn#connect#clicked (fun () -> ignore (dlg#run ()); dlg#misc#hide ()); btn (* GtkFontSelectionDialog - Sélection de fonte. *) let font_button = let dlg = GWindow.font_selection_dialog ~parent:window ~destroy_with_parent:true ~position:`CENTER_ON_PARENT () in dlg#ok_button#connect#clicked (fun () -> text#misc#modify_font_by_name dlg#selection#font_name); let btn = GButton.button ~stock:`SELECT_FONT ~packing:bbox#add () in GMisc.image ~stock:`SELECT_FONT ~packing:btn#set_image (); btn#connect#clicked (fun () -> ignore (dlg#run ()); dlg#misc#hide ()); btn (* GtkAboutDialog - Boîte de dialogue "À propos..." *) let about_button = let dlg = GWindow.about_dialog ~authors:["Cacophrene (<cacophrene AT gmail DOT com>)"] ~copyright:"Copyright © 2009-2010 Cacophrene" ~license:"GNU General Public License v3" ~version:"1.0" ~website:"http://blog.developpez.com/ocamlblog/" ~website_label:"OCamlBlog" ~position:`CENTER_ON_PARENT ~parent:window ~destroy_with_parent:true () in let btn = GButton.button ~stock:`ABOUT ~packing:bbox#add () in GMisc.image ~stock:`ABOUT ~packing:btn#set_image (); btn#connect#clicked (fun () -> ignore (dlg#run ()); dlg#misc#hide ()); btn let _ = window#event#connect#delete confirm; window#show (); GMain.main ()
Bonne année 2010 et à bientôt pour de nouvelles aventures caméliennes,
Cacophrène
Bonne année à toi.
On apprécie vraiment tout ce que tu fais pour mieux documenter OCaml/LablGtk.