-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
/* GTK+: gtkfilechooserbutton.c
*
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "gtkliststore.h"
#include "gtkstock.h"
#include "gtktreemodelfilter.h"
-#include "gtkvseparator.h"
+#include "gtkseparator.h"
#include "gtkfilechooserdialog.h"
#include "gtkfilechooserprivate.h"
#include "gtkfilechooserutils.h"
#include "gtkfilechooserbutton.h"
+#include "gtkorientable.h"
+
#include "gtktypebuiltins.h"
#include "gtkprivate.h"
+#include "gtksettings.h"
+
+
+/**
+ * SECTION:gtkfilechooserbutton
+ * @Short_description: A button to launch a file selection dialog
+ * @Title: GtkFileChooserButton
+ * @See_also:#GtkFileChooserDialog
+ *
+ * The #GtkFileChooserButton is a widget that lets the user select a
+ * file. It implements the #GtkFileChooser interface. Visually, it is a
+ * file name with a button to bring up a #GtkFileChooserDialog.
+ * The user can then use that dialog to change the file associated with
+ * that button. This widget does not support setting the
+ * #GtkFileChooser:select-multiple property to %TRUE.
+ *
+ * <example>
+ * <title>Create a button to let the user select a file in /etc</title>
+ * <programlisting>
+ * {
+ * GtkWidget *button;
+ *
+ * button = gtk_file_chooser_button_new (_("Select a file"),
+ * GTK_FILE_CHOOSER_ACTION_OPEN);
+ * gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (button),
+ * "/etc");
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * The #GtkFileChooserButton supports the #GtkFileChooserAction<!-- -->s
+ * %GTK_FILE_CHOOSER_ACTION_OPEN and %GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER.
+ *
+ * <important>
+ * The #GtkFileChooserButton will ellipsize the label,
+ * and thus will thus request little horizontal space. To give the button
+ * more space, you should call gtk_widget_get_preferred_size(),
+ * gtk_file_chooser_button_set_width_chars(), or pack the button in
+ * such a way that other interface elements give space to the widget.
+ * </important>
+ */
+
/* **************** *
* Private Macros *
GtkTreeModel *filter_model;
GtkFileSystem *fs;
- GFile *old_file;
+ GFile *selection_while_inactive;
+ GFile *current_folder_while_inactive;
gulong combo_box_changed_id;
gulong dialog_file_activated_id;
/* Used for hiding/showing the dialog when the button is hidden */
guint active : 1;
- /* Used to track whether we need to set a default current folder on ::map() */
- guint folder_has_been_set : 1;
-
guint focus_on_click : 1;
};
/* GtkFileChooserIface Functions */
static void gtk_file_chooser_button_file_chooser_iface_init (GtkFileChooserIface *iface);
+static gboolean gtk_file_chooser_button_set_current_folder (GtkFileChooser *chooser,
+ GFile *file,
+ GError **error);
+static GFile *gtk_file_chooser_button_get_current_folder (GtkFileChooser *chooser);
+static gboolean gtk_file_chooser_button_select_file (GtkFileChooser *chooser,
+ GFile *file,
+ GError **error);
+static void gtk_file_chooser_button_unselect_file (GtkFileChooser *chooser,
+ GFile *file);
+static void gtk_file_chooser_button_unselect_all (GtkFileChooser *chooser);
+static GSList *gtk_file_chooser_button_get_files (GtkFileChooser *chooser);
static gboolean gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser,
GFile *file,
GError **error);
* GType Declaration *
* ******************* */
-G_DEFINE_TYPE_WITH_CODE (GtkFileChooserButton, gtk_file_chooser_button, GTK_TYPE_HBOX, { \
+G_DEFINE_TYPE_WITH_CODE (GtkFileChooserButton, gtk_file_chooser_button, GTK_TYPE_BOX, { \
G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER, gtk_file_chooser_button_file_chooser_iface_init) \
})
/* Button */
priv->button = gtk_button_new ();
- g_signal_connect (priv->button, "clicked", G_CALLBACK (button_clicked_cb),
- button);
- gtk_container_add (GTK_CONTAINER (button), priv->button);
+ g_signal_connect (priv->button, "clicked",
+ G_CALLBACK (button_clicked_cb), button);
+ gtk_box_pack_start (GTK_BOX (button), priv->button, TRUE, TRUE, 0);
+ gtk_widget_set_halign (priv->button, GTK_ALIGN_FILL);
gtk_widget_show (priv->button);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
priv->label = gtk_label_new (_(FALLBACK_DISPLAY_NAME));
gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END);
- gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5);
+ gtk_widget_set_halign (priv->label, GTK_ALIGN_START);
+ gtk_widget_set_valign (priv->label, GTK_ALIGN_CENTER);
gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 0);
//gtk_container_add (GTK_CONTAINER (box), priv->label);
gtk_widget_show (priv->label);
gtk_box_pack_start (GTK_BOX (box), sep, FALSE, FALSE, 0);
gtk_widget_show (sep);
- image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
- GTK_ICON_SIZE_MENU);
+ image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_box_pack_start (GTK_BOX (box), image, FALSE, FALSE, 0);
gtk_widget_show (image);
priv->combo_box_changed_id =
g_signal_connect (priv->combo_box, "changed",
G_CALLBACK (combo_box_changed_cb), button);
- gtk_container_add (GTK_CONTAINER (button), priv->combo_box);
+ gtk_box_pack_start (GTK_BOX (button), priv->combo_box, TRUE, TRUE, 0);
+ gtk_widget_set_halign (priv->combo_box, GTK_ALIGN_FILL);
priv->icon_cell = gtk_cell_renderer_pixbuf_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (priv->combo_box),
{
_gtk_file_chooser_delegate_iface_init (iface);
+ iface->set_current_folder = gtk_file_chooser_button_set_current_folder;
+ iface->get_current_folder = gtk_file_chooser_button_get_current_folder;
+ iface->select_file = gtk_file_chooser_button_select_file;
+ iface->unselect_file = gtk_file_chooser_button_unselect_file;
+ iface->unselect_all = gtk_file_chooser_button_unselect_all;
+ iface->get_files = gtk_file_chooser_button_get_files;
iface->add_shortcut_folder = gtk_file_chooser_button_add_shortcut_folder;
iface->remove_shortcut_folder = gtk_file_chooser_button_remove_shortcut_folder;
}
+static gboolean
+gtk_file_chooser_button_set_current_folder (GtkFileChooser *chooser,
+ GFile *file,
+ GError **error)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ return gtk_file_chooser_set_current_folder_file (delegate, file, error);
+ else
+ {
+ if (priv->current_folder_while_inactive)
+ g_object_unref (priv->current_folder_while_inactive);
+
+ priv->current_folder_while_inactive = g_object_ref (file);
+
+ g_signal_emit_by_name (button, "current-folder-changed");
+
+ return TRUE;
+ }
+}
+
+static GFile *
+gtk_file_chooser_button_get_current_folder (GtkFileChooser *chooser)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ return gtk_file_chooser_get_current_folder_file (delegate);
+ else
+ {
+ if (priv->current_folder_while_inactive)
+ return g_object_ref (priv->current_folder_while_inactive);
+ else
+ return NULL;
+ }
+}
+
+static gboolean
+gtk_file_chooser_button_select_file (GtkFileChooser *chooser,
+ GFile *file,
+ GError **error)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ return gtk_file_chooser_select_file (delegate, file, error);
+ else
+ {
+ if (priv->selection_while_inactive)
+ g_object_unref (priv->selection_while_inactive);
+
+ priv->selection_while_inactive = g_object_ref (file);
+
+ g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
+
+ return TRUE;
+ }
+}
+
+static void
+gtk_file_chooser_button_unselect_file (GtkFileChooser *chooser,
+ GFile *file)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ gtk_file_chooser_unselect_file (delegate, file);
+ else
+ {
+ if (g_file_equal (priv->selection_while_inactive, file))
+ {
+ if (priv->selection_while_inactive)
+ {
+ g_object_unref (priv->selection_while_inactive);
+ priv->selection_while_inactive = NULL;
+ }
+
+ g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
+ }
+ }
+}
+
+static void
+gtk_file_chooser_button_unselect_all (GtkFileChooser *chooser)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ gtk_file_chooser_unselect_all (delegate);
+ else
+ {
+ if (priv->selection_while_inactive)
+ {
+ g_object_unref (priv->selection_while_inactive);
+ priv->selection_while_inactive = NULL;
+ }
+
+ g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
+ }
+}
+
+static GSList *
+gtk_file_chooser_button_get_files (GtkFileChooser *chooser)
+{
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
+ GtkFileChooser *delegate;
+
+ delegate = g_object_get_qdata (G_OBJECT (chooser),
+ GTK_FILE_CHOOSER_DELEGATE_QUARK);
+
+ if (priv->active)
+ return gtk_file_chooser_get_files (delegate);
+ else
+ {
+ GSList *result;
+
+ result = NULL;
+
+ if (priv->selection_while_inactive)
+ result = g_slist_prepend (NULL, g_object_ref (priv->selection_while_inactive));
+ else if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (priv->dialog)) == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
+ {
+ /* If there is no "real" selection in SELECT_FOLDER mode, then we'll just return
+ * the current folder, since that is what GtkFileChooserDefault would do.
+ */
+ if (priv->current_folder_while_inactive)
+ result = g_slist_prepend (NULL, g_object_ref (priv->current_folder_while_inactive));
+ }
+
+ return result;
+ }
+}
+
static gboolean
gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser,
GFile *file,
GtkFileChooserButton *button;
GtkFileChooserButtonPrivate *priv;
GSList *list;
- char *current_folder;
object = G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor (type,
n_params,
gtk_file_chooser_button_set_title (button, _(DEFAULT_TITLE));
}
- current_folder = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (priv->dialog));
- if (current_folder != NULL)
- {
- priv->folder_has_been_set = TRUE;
- g_free (current_folder);
- }
-
g_signal_connect (priv->dialog, "delete-event",
G_CALLBACK (dialog_delete_event_cb), object);
g_signal_connect (priv->dialog, "response",
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object);
GtkFileChooserButtonPrivate *priv = button->priv;
- if (priv->old_file)
- g_object_unref (priv->old_file);
+ if (priv->selection_while_inactive)
+ g_object_unref (priv->selection_while_inactive);
+
+ if (priv->current_folder_while_inactive)
+ g_object_unref (priv->current_folder_while_inactive);
G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->finalize (object);
}
static void
gtk_file_chooser_button_map (GtkWidget *widget)
{
- GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
- GtkFileChooserButtonPrivate *priv = button->priv;
-
- if (!priv->folder_has_been_set)
- {
- char *current_working_dir;
-
- current_working_dir = g_get_current_dir ();
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), current_working_dir);
- g_free (current_working_dir);
-
- priv->folder_has_been_set = TRUE;
- }
-
GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map (widget);
}
GdkPixbuf *pixbuf;
GtkTreePath *path;
GtkTreeIter iter;
- GCancellable *model_cancellable;
+ GCancellable *model_cancellable = NULL;
struct SetDisplayNameData *data = callback_data;
gboolean is_folder;
gtk_tree_row_reference_free (data->row_ref);
g_free (data);
- g_object_unref (cancellable);
+ if (model_cancellable)
+ g_object_unref (model_cancellable);
}
static void
-1);
if (cancellable)
- g_cancellable_cancel (cancellable);
+ {
+ g_cancellable_cancel (cancellable);
+ g_object_unref (cancellable);
+ }
switch (type)
{
GtkTreeIter iter;
GtkTreePath *path;
GdkPixbuf *pixbuf;
- GCancellable *model_cancellable;
+ GCancellable *model_cancellable = NULL;
struct ChangeIconThemeData *data = user_data;
gchar *name;
gtk_tree_row_reference_free (data->row_ref);
g_free (data);
- g_object_unref (cancellable);
+ if (model_cancellable)
+ g_object_unref (model_cancellable);
}
static inline void
static void
model_add_volumes (GtkFileChooserButton *button,
- GSList *volumes)
+ GSList *volumes)
{
GtkListStore *store;
gint pos;
gboolean local_only;
- GtkFileSystem *file_system;
GSList *l;
-
+
if (!volumes)
return;
store = GTK_LIST_STORE (button->priv->model);
pos = model_get_type_position (button, ROW_TYPE_VOLUME);
local_only = gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (button->priv->dialog));
- file_system = button->priv->fs;
for (l = volumes; l; l = l->next)
{
volume = l->data;
if (local_only)
- {
- if (_gtk_file_system_volume_is_mounted (volume))
- {
- GFile *base_file;
+ {
+ if (_gtk_file_system_volume_is_mounted (volume))
+ {
+ GFile *base_file;
- base_file = _gtk_file_system_volume_get_root (volume);
- if (base_file != NULL)
+ base_file = _gtk_file_system_volume_get_root (volume);
+ if (base_file != NULL)
{
if (!g_file_is_native (base_file))
{
else
g_object_unref (base_file);
}
- }
- }
+ }
+ }
pixbuf = _gtk_file_system_volume_render_icon (volume,
- GTK_WIDGET (button),
- button->priv->icon_size,
- NULL);
+ GTK_WIDGET (button),
+ button->priv->icon_size,
+ NULL);
display_name = _gtk_file_system_volume_get_display_name (volume);
gtk_list_store_insert (store, &iter, pos);
gtk_list_store_set (store, &iter,
- ICON_COLUMN, pixbuf,
- DISPLAY_NAME_COLUMN, display_name,
- TYPE_COLUMN, ROW_TYPE_VOLUME,
- DATA_COLUMN, _gtk_file_system_volume_ref (volume),
- IS_FOLDER_COLUMN, TRUE,
- -1);
+ ICON_COLUMN, pixbuf,
+ DISPLAY_NAME_COLUMN, display_name,
+ TYPE_COLUMN, ROW_TYPE_VOLUME,
+ DATA_COLUMN, _gtk_file_system_volume_ref (volume),
+ IS_FOLDER_COLUMN, TRUE,
+ -1);
if (pixbuf)
- g_object_unref (pixbuf);
+ g_object_unref (pixbuf);
g_free (display_name);
button->priv->n_volumes++;
gtk_list_store_insert (store, &iter, pos);
gtk_list_store_set (store, &iter,
ICON_COLUMN, NULL,
- DISPLAY_NAME_COLUMN, _("Other..."),
+ DISPLAY_NAME_COLUMN, _("Other…"),
TYPE_COLUMN, ROW_TYPE_OTHER,
DATA_COLUMN, NULL,
IS_FOLDER_COLUMN, FALSE,
update_label_and_image (GtkFileChooserButton *button)
{
GtkFileChooserButtonPrivate *priv = button->priv;
- GdkPixbuf *pixbuf;
gchar *label_text;
GSList *files;
files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog));
label_text = NULL;
- pixbuf = NULL;
if (priv->update_button_cancellable)
{
volume = _gtk_file_system_get_volume_for_file (priv->fs, file);
if (volume)
- {
- GFile *base_file;
-
- base_file = _gtk_file_system_volume_get_root (volume);
- if (base_file && g_file_equal (base_file, file))
- {
- label_text = _gtk_file_system_volume_get_display_name (volume);
- pixbuf = _gtk_file_system_volume_render_icon (volume,
- GTK_WIDGET (button),
- priv->icon_size,
- NULL);
- }
-
- if (base_file)
- g_object_unref (base_file);
-
- _gtk_file_system_volume_unref (volume);
-
- if (label_text)
- goto out;
- }
+ {
+ GFile *base_file;
+
+ base_file = _gtk_file_system_volume_get_root (volume);
+ if (base_file && g_file_equal (base_file, file))
+ {
+ GdkPixbuf *pixbuf;
+
+ label_text = _gtk_file_system_volume_get_display_name (volume);
+ pixbuf = _gtk_file_system_volume_render_icon (volume,
+ GTK_WIDGET (button),
+ priv->icon_size,
+ NULL);
+ gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
+ if (pixbuf)
+ g_object_unref (pixbuf);
+ }
+
+ if (base_file)
+ g_object_unref (base_file);
+
+ _gtk_file_system_volume_unref (volume);
+
+ if (label_text)
+ goto out;
+ }
if (g_file_is_native (file))
- {
- priv->update_button_cancellable =
- _gtk_file_system_get_info (priv->fs, file,
- "standard::icon,standard::display-name",
- update_label_get_info_cb,
- g_object_ref (button));
- }
+ {
+ priv->update_button_cancellable =
+ _gtk_file_system_get_info (priv->fs, file,
+ "standard::icon,standard::display-name",
+ update_label_get_info_cb,
+ g_object_ref (button));
+ }
else
- {
- GdkPixbuf *pixbuf;
-
- label_text = _gtk_file_system_get_bookmark_label (button->priv->fs, file);
-
- pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)),
- "text-x-generic",
- priv->icon_size, 0, NULL);
-
- gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
-
- if (pixbuf)
- g_object_unref (pixbuf);
- }
+ {
+ GdkPixbuf *pixbuf;
+
+ label_text = _gtk_file_system_get_bookmark_label (button->priv->fs, file);
+ pixbuf = gtk_icon_theme_load_icon (get_icon_theme (GTK_WIDGET (priv->image)),
+ "text-x-generic",
+ priv->icon_size, 0, NULL);
+ gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
+ if (pixbuf)
+ g_object_unref (pixbuf);
+ }
}
out:
g_slist_foreach (files, (GFunc) g_object_unref, NULL);
update_combo_box (user_data);
}
+static void
+save_inactive_state (GtkFileChooserButton *button)
+{
+ GtkFileChooserButtonPrivate *priv = button->priv;
+
+ if (priv->current_folder_while_inactive)
+ g_object_unref (priv->current_folder_while_inactive);
+
+ if (priv->selection_while_inactive)
+ g_object_unref (priv->selection_while_inactive);
+
+ priv->current_folder_while_inactive = gtk_file_chooser_get_current_folder_file (GTK_FILE_CHOOSER (priv->dialog));
+ priv->selection_while_inactive = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (priv->dialog));
+}
+
+static void
+restore_inactive_state (GtkFileChooserButton *button)
+{
+ GtkFileChooserButtonPrivate *priv = button->priv;
+
+ if (priv->current_folder_while_inactive)
+ gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (priv->dialog), priv->current_folder_while_inactive, NULL);
+
+ if (priv->selection_while_inactive)
+ gtk_file_chooser_select_file (GTK_FILE_CHOOSER (priv->dialog), priv->selection_while_inactive, NULL);
+ else
+ gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (priv->dialog));
+}
+
/* Dialog */
static void
open_dialog (GtkFileChooserButton *button)
if (!priv->active)
{
- GSList *files;
-
g_signal_handler_block (priv->dialog,
priv->dialog_folder_changed_id);
g_signal_handler_block (priv->dialog,
priv->dialog_file_activated_id);
g_signal_handler_block (priv->dialog,
priv->dialog_selection_changed_id);
- files = gtk_file_chooser_get_files (GTK_FILE_CHOOSER (priv->dialog));
- if (files)
- {
- if (files->data)
- priv->old_file = g_object_ref (files->data);
- g_slist_foreach (files, (GFunc) g_object_unref, NULL);
- g_slist_free (files);
- }
+ restore_inactive_state (button);
priv->active = TRUE;
}
gpointer user_data)
{
GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
- GtkFileChooserButtonPrivate *priv = button->priv;
-
- priv->folder_has_been_set = TRUE;
g_signal_emit_by_name (button, "current-folder-changed");
}
if (response == GTK_RESPONSE_ACCEPT ||
response == GTK_RESPONSE_OK)
{
- g_signal_emit_by_name (user_data, "current-folder-changed");
- g_signal_emit_by_name (user_data, "selection-changed");
- }
- else if (priv->old_file)
- {
- switch (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)))
- {
- case GTK_FILE_CHOOSER_ACTION_OPEN:
- gtk_file_chooser_select_file (GTK_FILE_CHOOSER (dialog), priv->old_file,
- NULL);
- break;
- case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:
- gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (dialog),
- priv->old_file, NULL);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
+ save_inactive_state (button);
+
+ g_signal_emit_by_name (button, "current-folder-changed");
+ g_signal_emit_by_name (button, "selection-changed");
+
+ update_label_and_image (button);
+ update_combo_box (button);
}
else
- gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (dialog));
-
- if (priv->old_file)
{
- g_object_unref (priv->old_file);
- priv->old_file = NULL;
+ restore_inactive_state (button);
}
- update_label_and_image (user_data);
- update_combo_box (user_data);
-
if (priv->active)
{
g_signal_handler_unblock (priv->dialog,
if (response == GTK_RESPONSE_ACCEPT ||
response == GTK_RESPONSE_OK)
- g_signal_emit (user_data, file_chooser_button_signals[FILE_SET], 0);
+ g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0);
}
*
* Since: 2.6
**/
-G_CONST_RETURN gchar *
+const gchar *
gtk_file_chooser_button_get_title (GtkFileChooserButton *button)
{
g_return_val_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button), NULL);