`GtkFileChooserDialog` is a dialog suitable for use with “File Open” or “File Save” commands.
![An example GtkFileChooserDialog](filechooser.png)
This widget works by putting a [[email protected]] inside a [[email protected]]. It exposes the [[email protected]] interface, so you can use all of the [[email protected]] functions on the file chooser dialog as well as those for [[email protected]].
Note that `GtkFileChooserDialog` does not have any methods of its own. Instead, you should use the functions that work on a [ [email protected]].
If you want to integrate well with the platform you should use the [[email protected]] API, which will use a platform-specific dialog if available and fall back to `GtkFileChooserDialog` otherwise.
In the simplest of cases, you can the following code to use `GtkFileChooserDialog` to select a file for opening:
```c static void on_open_response (GtkDialog *dialog, int response) { if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
g_autoptr(GFile) file = gtk_file_chooser_get_file (chooser);
open_file (file); }
gtk_window_destroy (GTK_WINDOW (dialog)); }
// ... GtkWidget *dialog; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
dialog = gtk_file_chooser_dialog_new ("Open File", parent_window, action, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL);
gtk_widget_show (dialog);
g_signal_connect (dialog, "response", G_CALLBACK (on_open_response), NULL); ```
To use a dialog for saving, you can use this:
```c static void on_save_response (GtkDialog *dialog, int response) { if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog);
g_autoptr(GFile) file = gtk_file_chooser_get_file (chooser);
save_to_file (file); }
gtk_window_destroy (GTK_WINDOW (dialog)); }
// ... GtkWidget *dialog; GtkFileChooser *chooser; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
dialog = gtk_file_chooser_dialog_new ("Save File", parent_window, action, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER (dialog);
if (user_edited_a_new_document) gtk_file_chooser_set_current_name (chooser, _("Untitled document")); else gtk_file_chooser_set_file ( chooser, existing_filename);
gtk_widget_show (dialog);
g_signal_connect (dialog, "response", G_CALLBACK (on_save_response), NULL); ```
There are various cases in which you may need to use a `GtkFileChooserDialog`:
In general, you should only cause the file chooser to show a specific folder when it is appropriate to use [ [email protected]_file], i.e. when you are doing a “Save As” command and you already have a file saved somewhere.
`GtkFileChooserDialog` inherits from [[email protected]], so buttons that go in its action area have response codes such as gtk_response_accept and gtk_response_cancel. For example, you could call [[email protected]] as follows:
```c GtkWidget *dialog; GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
dialog = gtk_file_chooser_dialog_new ("Open File", parent_window, action, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); ```
This will create buttons for “Cancel” and “Open” that use predefined response identifiers from [[email protected]]. For most dialog boxes you can use your own custom response codes rather than the ones in [[email protected]], but `GtkFileChooserDialog` assumes that its “accept”-type action, e.g. an “Open” or “Save” button, will have one of the following response codes:
This is because `GtkFileChooserDialog` must intercept responses and switch to folders if appropriate, rather than letting the dialog terminate — the implementation uses these known response codes to know which responses can be blocked if appropriate.
To summarize, make sure you use a predefined response code when you use `GtkFileChooserDialog` to ensure proper operation.