Interfacing Raku to Gnome GTK+

TITLE

Gnome::Gtk3::FileChooserDialog

SUBTITLE

A file chooser dialog, suitable for “File/Open” or “File/Save” commands

Description

Gnome::Gtk3::FileChooserDialog is a dialog box suitable for use with “File/Open” or “File/Save as” commands. This widget works by putting a Gnome::Gtk3::FileChooserWidget inside a Gnome::Gtk3::Dialog. It exposes the Gnome::Gtk3::FileChooser interface, so you can use all of the Gnome::Gtk3::FileChooser functions on the file chooser dialog as well as those for Gnome::Gtk3::Dialog.

Note that Gnome::Gtk3::FileChooserDialog does not have any methods of its own. Instead, you should use the functions that work on a Gnome::Gtk3::FileChooser.

If you want to integrate well with the platform you should use the Gnome::Gtk3::FileChooserNative API, which will use a platform-specific dialog if available and fall back to Gnome::Gtk3::FileChooserDialog otherwise.

Typical usage

In the simplest of cases, you can use a Gnome::Gtk3::FileChooserDialog to select a file for opening:

my Gnome::Gtk3::FileChooserDialog $dialog .= new(
  :title("Open File"), :parent($top-window),
  :action(GTK_FILE_CHOOSER_ACTION_OPEN),
  :button-spec( [
      "_Cancel", GTK_RESPONSE_CANCEL,
      "_Open", GTK_RESPONSE_ACCEPT
    ]
  )
);

my $response = $dialog.gtk-dialog-run;
$dialog.gtk-widget-hide;
if $response ~~ GTK_RESPONSE_ACCEPT {
  my Str $file = $dialog.get-filename;
  note "Opening file $file";
}

To use a dialog for saving, you can use this:

my Gnome::Gtk3::FileChooserDialog $dialog .= new(
  :title("Open File"), :parent($top-window),
  :action(GTK_FILE_CHOOSER_ACTION_SAVE),
  :button-spec( [
      "_Cancel", GTK_RESPONSE_CANCEL,
      "_Open", GTK_RESPONSE_ACCEPT
    ]
  )
);

$dialog.set-do-overwrite-confirmation(1);

if $user-edited-a-new-document {
  $dialog.set_current_name("Untitled document");
}

else {
  $dialog.set_filename($existing-filename);
}

my $response = $dialog.gtk-dialog-run;
$dialog.gtk-widget-hide;
if $response ~~ GTK_RESPONSE_ACCEPT {
  my Str $file = $dialog.get-filename;
  note "Saving to file $file";
}

$dialog.gtk-widget-destroy;

Setting up a file chooser dialog

There are various cases in which you may need to use a Gnome::Gtk3::FileChooserDialog:

  • To select a file for opening. Use GTK_FILE_CHOOSER_ACTION_OPEN.

  • To save a file for the first time. Use GTK_FILE_CHOOSER_ACTION_SAVE, and suggest a name such as “Untitled” with gtk_file_chooser_set_current_name().

  • To save a file under a different name. Use GTK_FILE_CHOOSER_ACTION_SAVE, and set the existing filename with gtk_file_chooser_set_filename().

  • To choose a folder instead of a file. Use GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER.

Note that old versions of the file chooser’s documentation suggested using gtk_file_chooser_set_current_folder() in various situations, with the intention of letting the application suggest a reasonable default folder. This is no longer considered to be a good policy, as now the file chooser is able to make good suggestions on its own. In general, you should only cause the file chooser to show a specific folder when it is appropriate to use gtk_file_chooser_set_filename(), i.e. when you are doing a Save As command and you already have a file saved somewhere.

Response Codes

Gnome::Gtk3::FileChooserDialog inherits from Gnome::Gtk3::Dialog, so buttons that go in its action area have response codes such as GTK_RESPONSE_ACCEPT and GTK_RESPONSE_CANCEL. For example, you could create a dialog window as follows;

my Gnome::Gtk3::FileChooserDialog $dialog .= new(
  :title("Open File"), :parent($top-window),
  :action(GTK_FILE_CHOOSER_ACTION_OPEN),
  :button-spec( [
      "_Cancel", GTK_RESPONSE_CANCEL,
      "_Open", GTK_RESPONSE_ACCEPT
    ]
  )
);

This will create buttons for “Cancel” and “Open” that use stock response identifiers from ResponseType from Gnome::Gtk3::Dialog. For most dialog boxes you can use your own custom response codes rather than the ones in ResponseType, but Gnome::Gtk3::FileChooserDialog assumes that its “accept”-type action, e.g. an “Open” or “Save” button, will have one of the following response codes:

  • GTK_RESPONSE_ACCEPT

  • GTK_RESPONSE_OK

  • GTK_RESPONSE_YES

  • GTK_RESPONSE_APPLY

This is because Gnome::Gtk3::FileChooserDialog 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 ResponseType when you use Gnome::Gtk3::FileChooserDialog to ensure proper operation.

Implemented Interfaces

See Also

Gnome::Gtk3::FileChooser, Gnome::Gtk3::Dialog.

Synopsis

Declaration

unit class Gnome::Gtk3::FileChooserDialog;
also is Gnome::Gtk3::Dialog;
also does Gnome::Gtk3::FileChooser;

Example

An example using builder

use Gnome::Gtk3::Dialog;
use Gnome::Gtk3::FileChooserDialog;

my Gnome::Gtk3::FileChooserDialog $fchoose .= new(:build-id<save-dialog>);

# show the dialog
my Int $response = $fchoose.gtk-dialog-run;
if $response ~~ GTK_RESPONSE_ACCEPT {
  ...
}

# when dialog buttons are pressed hide it again
$fchoose.hide;

Methods

new

multi method new ( GtkFileChooserAction :$action! )

multi method new (
  GtkFileChooserAction :$action!, Str :$title, Gnome::GObject::Object $parent,
  List :$buttons-spec
)

Create an object using a native object from elsewhere. See also gtk_file_chooser_dialog_new() below.

multi method new ( N-GObject :$native-object! )

Create an object using a native object from elsewhere. See also Gnome::GObject::Object.

multi method new ( Str :$build-id! )

Create an object using a native object from a builder. See also Gnome::GObject::Object.

[gtk_] file_chooser_dialog_new

Creates a new file chooser dialog. This function is analogous to gtk_dialog_new_with_buttons(). This method is called when creating the object using .new(:action(…), …).

Returns: a new native file chooser dialog.

Since: 2.4

method gtk_file_chooser_dialog_new (
  Str $title, N-GObject $parent, GtkFileChooserAction $action,
  *@buttons-spec
  --> N-GObject
)
  • Str $title; Title of the dialog, or Any.

  • N-GObject $parent; Transient parent of the dialog, or Any.

  • GtkFileChooserAction $action; Open or save mode for the dialog.

  • *@buttons-spec is a list button specifications. The list has an even number of members of which;

    • Str $button-label to go on the button.

    • $response-code, an Int, GtkResponseType or other enum (with int values) to return for the button. Taking a GtkResponseType will help the chooser dialog make a proper decision if needed. Otherwise, the user can always check codes returned by the dialog to find out what to do next.