IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Cours GTK 2

Date de publication : 20 Février 2007



Sélection de fichier.

Le widget GtkFileSelection est une boîte de dialogue qui permet de demander à l'utilisateur le chemin d'un fichier particulier, à travers une liste de répertoire et de fichiers.

1. Créer une gtk_file_selection et l'utiliser

Nous allons ici créer une gtk_file_selection, et apprendre comment récupérer le chemin entré par l'utilisateur.

1.1 Créer le widget

On crée tout d'abord un pointeur vers la structure GtkWidget.

GtkWidget* file_selection;

Maintenant, on va instancier ce pointeur grâce à la fonction

GtkWidget* gtk_file_selection_new(const gchar* title)

Cette fonction renvoie l'adresse d'une structure GtkFileSelection. L'argument "const gchar *title" est le titre de votre boîte de dialogue : vous pouvez ainsi l'appeler suivant vos besoins "ouvrir...", "selectionner un fichier...", etc..

1.2 Affichage

Tout simplement :

gtk_window_show(file_selection);

Qui permet d'afficher la fenêtre et en même temps ce qu'elle contient (donc le label).

1.3 Récupérer le chemin.

Notre but est de récupérer le chemin spécifié par l'utilisateur lorsque celui-ci appuie sur le bouton ok.

On va pour cela tout d'abord utiliser le callback suivant, qui lorsque le bouton sera appuyé, appellera la fonction recuperer_chemin(GtkWidget *bouton, GtkWidget *file_selection) :

g_signal_connect(GTK_FILE_SELECTION(file_selection)->ok_button, "clicked", G_CALLBACK(recuperer_chemin), file_selection );

On voit ici que le bouton ok est une donnée membre de la structure GtkFileSelection : ok_button. Ce callback va fournir à la fonction recuperer_chemin un pointeur file_selection pour lui permettre de récupérer le chemin. Voila la fonction qui permet d'obtenir le chemin du fichier ou du répertoire sélectionné à partir de la gtk_file_selection :

G_CONST_RETURN gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel);

Voyons maintenant comment nous pouvons l'utiliser dans notre fonction :

void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection)
{
gchar *chemin;

chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );
}

Enfin, il est nécessaire de détruire la boîte de dialogue lorsque l'utilisateur clique sur le bouton cancel, et lorsque le chemin a été récupéré. Pour ce faire, faisons les deux callbacks suivants après le callback précédent :

g_signal_connect_swapped(GTK_FILE_SELECTION(file_selection)->ok_button, "clicked", G_CALLBACK(gtk_widget_destroy), file_selection);
g_signal_connect_swapped(GTK_FILE_SELECTION(file_selection)->cancel_button, "clicked", G_CALLBACK(gtk_widget_destroy), file_selection);

Le fait d'appeler g_signal_connect_swapped va permettre de ne pas transmettre l'argument inhérent au signal clicked sur les boutons à gtk_widget_destroy, mais seulement l'argument file_selection. Notez que l'appel des fonctions callbacks se fait dans l'ordre de leur définition, ainsi le callback entre le ok_button et la fonction gtk_widget_destroy se fera après l'appel de la fonction recuperer_chemin. Lorsque la fenêtre sera détruite, le chemin sera récupéré.

1.4 Programme d'exemple

#include <gtk/gtk.h>

void quitter(GtkWidget *widget); void creer_file_selection();
void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection);

int main(int argc,char* argv[])
{
GtkWidget *win;
GtkWidget *bouton_explorer;

gtk_init(&argc,&argv);

win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(win),"GtkFileSelection");
gtk_window_set_default_size(GTK_WINDOW(win),320,200);

// On créé un bouton explorer
bouton_explorer=gtk_button_new_with_mnemonic("_Explorer...");
// on met bouton_explorer dans win
gtk_container_add(GTK_CONTAINER(win),bouton_explorer);

g_signal_connect(G_OBJECT(win),"destroy",G_CALLBACK(quitter), NULL);
g_signal_connect(G_OBJECT(bouton_explorer), "clicked", G_CALLBACK(creer_file_selection), NULL);

// affichage de win et de ce qu'il contient
gtk_widget_show_all(win);
gtk_main();
return 0;
}

void quitter(GtkWidget* widget)
{
// destruction de win et de tout ce qu'il contient
gtk_widget_destroy(widget);
gtk_main_quit();
}

void creer_file_selection()
{
GtkWidget *selection;

selection = gtk_file_selection_new( g_locale_to_utf8( "Sélectionnez un fichier", -1, NULL, NULL, NULL) );
gtk_widget_show(selection);

//On interdit l'utilisation des autres fenetres.
gtk_window_set_modal(GTK_WINDOW(selection), TRUE);

g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(selection)->ok_button), "clicked", G_CALLBACK(recuperer_chemin), selection );

g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(selection)->cancel_button), "clicked", G_CALLBACK(gtk_widget_destroy), selection);
}

void recuperer_chemin (GtkWidget *bouton, GtkWidget *file_selection)
{
const gchar* chemin;
GtkWidget *dialog;
chemin = gtk_file_selection_get_filename(GTK_FILE_SELECTION (file_selection) );

dialog = gtk_message_dialog_new(GTK_WINDOW(file_selection),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Vous avez choisi :\n%s", chemin);

gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
gtk_widget_destroy(file_selection);
}
Résultat :





2. En savoir plus...

2.1 Fonctions documentées

void gtk_file_selection_set_filename (GtkFileSelection *filesel,const gchar *filename);
Permet de définir le chemin par défaut.
Entrée(s) :
filesel : la GtkFileSelection.
filename : le chemin.
Sortie : rien.
void gtk_file_selection_hide_fileop_buttons (GtkFileSelection *filesel);
Permet de cacher certains boutons de la boîte de dialogue(nouveau dossier, effacer le fichier, renommer le fichier).
Entrée(s) :
filesel : la GtkFileSelection.
Sortie : rien
void gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel);
Permet d'afficher certains boutons de la boîte de dialogue(nouveau dossier, effacer le fichier, renommer le fichier).
Entrée(s) :
filesel : la GtkFileSelection.
Sortie : rien.
void gtk_file_selection_set_select_multiple(GtkFileSelection *filesel,gboolean select_multiple);
On défini si l'on peut selectionner plusieurs fichiers.
Entrée(s) :
filesel : objet GtkFileSelection.
select_multiple : TRUE pour une selection multiple, FALSE (par défaut) sinon.
Sortie : rien.
gchar** gtk_file_selection_get_selections(GtkFileSelection *filesel);
L'équivalent de gtk_file_selection_get_filename mais pour des sélections multiples.
Entrée(s) :
filesel : objet GtkFileSelection.
Sortie : un tableau contenant les différents chemins.

Date de mise à jour : 28 septembre 2002