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