Programmation GTK/Widgets de sélection de fichiers


Le widget sélection de fichier est un moyen simple et rapide pour afficher un fichier dans une boîte de dialogue. Il est complet, avec des boutons Ok, Annuler et Aide. C'est un bon moyen de raccourcir les temps de programmation.

Pour créer une boîte de sélection de fichier, on utilise :

 GtkWidget* gtk_file_selection_new (gchar *title);

Pour configurer le nom de fichier, par exemple pour aller dans un répertoire précis ou donner un nom de fichier par défaut, on utilise la fonction :

 void gtk_file_selection_set_filename (GtkFileSelection *filesel, gchar *filename);

Pour récupérer le texte que l'utilisateur a entré, ou sur lequel il a cliqué, on utilisera la fonction :

 gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel);

Des pointeurs permettent d'accéder aux widgets contenus dans la widget de sélection de fichiers. Ce sont :

  • dir_list
  • file_list
  • selection_entry
  • selection_text
  • main_vbox
  • ok_button
  • cancel_button
  • help_button

Le plus souvent, on utilise les pointeurs ok_button, cancel_button, et help_button pour préciser leurs utilisations.

Voici un exemple emprunté à testgtk.c et modifié pour fonctionner tout seul. Comme vous le verrez, il n'y a pas grand chose à faire pour créer un wigdget de sélection de fichier. Cependant, dans cet exemple, si le bouton Aide apparaît à l'écran, il ne fait rien car aucun signal ne lui est attaché.

 #include <gtk/gtk.h>
 
 /* Récupère le nom de fichier sélectionné et l'affiche sur la console. */
 
 void file_ok_sel (GtkWidget *w, GtkFileSelection *fs)
 {
    g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
 }
 
 void destroy (GtkWidget *widget, gpointer *data)
 {
    gtk_main_quit ();
 }

 int main (int argc, char *argv[])
 {
    GtkWidget *filew;
     
    gtk_init (&argc, &argv);
     
    /* Création d'un widget de sélection de fichier. */
 
    filew = gtk_file_selection_new ("File selection");
     
    gtk_signal_connect (GTK_OBJECT (filew), "destroy",
                        (GtkSignalFunc) destroy, &filew);
 
    /* Connexion de ok_button à la fonction file_ok_sel() */
 
    gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
                        "clicked", (GtkSignalFunc) file_ok_sel, filew );
    
    /* Connexion de cancel_button pour détruire le widget */
 
    gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button),
                               "clicked", (GtkSignalFunc) gtk_widget_destroy,
                               GTK_OBJECT (filew));
    
    /* Configuration du nom de fichier, comme s'il s'agissait d'un dialogue de
     * sauvegarde et que nous donnions un nom de fichier par défaut. */
 
    gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), 
                                     "penguin.png");
    
    gtk_widget_show(filew);
    gtk_main ();
    return 0;
 }