VI. Choisir un fichier▲
VI-A. Aperçu▲
VI-B. Utilisation d'un GtkFileChooserFile▲
Jusqu'à présent l'utilisateur n'avait pas le choix quant au fichier à ouvrir, heureusement GTK+ vient à notre aide grâce au widget GtkFileChooserFile qui est tout simplement une boîte de dialogue qui propose à l'utilisateur de sélectionner un fichier dans son arborescence disque.
Commençons par créer notre boîte de dialogue dans la fonction cb_open :
void
cb_open (
GtkWidget *
p_widget, gpointer user_data)
{
GtkWidget *
p_dialog =
NULL
;
p_dialog =
gtk_file_chooser_dialog_new (
"
Ouvrir un fichier
"
, NULL
,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL
);
/* ... */
}
Cette fonction nécessite le titre de la boîte de dialogue, une fenêtre parente, le type d'action (ici, on souhaite ouvrir un fichier, GTK+ autorisera l'utilisateur à sélectionner uniquement les fichiers existants). Pour finir, il s'agit d'un couple de valeurs GTK_STOCK_ITEM/GTK_STOCK_RESPONSE qui permet de créer un bouton utilisant le stock ID spécifié et, lorsque celui-ci est cliqué, la fonction servant à lancer la boîte de dialogue retournera la réponse ID correspondant. Il existe une série de valeurs définies par GTK+, qu'il est conseillé d'utiliser :
typedef
enum
{
/* GTK returns this if a response widget has no response_id,
* or if the dialog gets programmatically hidden or destroyed.
*/
GTK_RESPONSE_NONE =
-
1
,
/* GTK won't return these unless you pass them in
* as the response for an action widget. They are
* for your convenience.
*/
GTK_RESPONSE_REJECT =
-
2
,
GTK_RESPONSE_ACCEPT =
-
3
,
/* If the dialog is deleted. */
GTK_RESPONSE_DELETE_EVENT =
-
4
,
/* These are returned from GTK dialogs, and you can also use them
* yourself if you like.
*/
GTK_RESPONSE_OK =
-
5
,
GTK_RESPONSE_CANCEL =
-
6
,
GTK_RESPONSE_CLOSE =
-
7
,
GTK_RESPONSE_YES =
-
8
,
GTK_RESPONSE_NO =
-
9
,
GTK_RESPONSE_APPLY =
-
10
,
GTK_RESPONSE_HELP =
-
11
}
GtkResponseType;
Nous indiquons la fin des couples stock id/réponse id avec la valeur NULL.
Une fois la boîte de dialogue créée, on demande à GTK+ de l'afficher grâce à la fonction gtk_dialog_run, puis on récupère sa valeur de retour, qui correspond au bouton cliqué par l'utilisateur :
if
(
gtk_dialog_run (
GTK_DIALOG (
p_dialog)) ==
GTK_RESPONSE_ACCEPT)
{
/* ... */
}
Ici ce qui nous intéresse, c'est lorsque que l'utilisateur clique sur le bouton ouvrir (donc gtk_dialog_run renvoie GTK_RESPONSE_ACCEPT), dans ce cas, il nous suffit de récupérer le nom du fichier sélectionné puis de l'ouvrir :
gchar *
file_name =
NULL
;
file_name =
gtk_file_chooser_get_filename (
GTK_FILE_CHOOSER (
p_dialog));
open_file (
file_name, GTK_TEXT_VIEW (
user_data));
g_free (
file_name), file_name =
NULL
;
Pour finir, dans tous les cas, on n'oublie pas de détruire la boîte de dialogue :
gtk_widget_destroy (
p_dialog);
Et voilà le travail : l'utilisateur peut ouvrir le fichier qu'il souhaite.