Date de publication : 20 Février 2007
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..
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).
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é.
#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 : |
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. |