Add overwrite confirmation for SAVE mode. Fixes bug #152850:
2005-07-14 Federico Mena Quintero <federico@ximian.com> Add overwrite confirmation for SAVE mode. Fixes bug #152850: * gtk/gtkfilechooser.h: Add prototypes for gtk_file_chooser_set/get_do_overwrite_confirmation(). (GtkFileChooserConfirmation): New enum for the result of the "confirm-overwrite" signal. * gtk/gtkmarshalers.list: Add ENUM:VOID. * gtk/gtkfilechooser.c (gtk_file_chooser_class_init): Add a "do-overwrite-confirmation" boolean property. (gtk_file_chooser_set_do_overwrite_confirmation): Implement. (gtk_file_chooser_get_do_overwrite_confirmation): Implement. (confirm_overwrite_accumulator): New accumulator for the signal. * gtk/gtkfilechooserutils.h (GtkFileChooserProp): Add GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION. * gtk/gtkfilechooserutils.c (_gtk_file_chooser_install_properties): Override the do-overwrite-confirmation property. * gtk/gtkfilechooserprivate.h (struct _GtkFileChooserIface): Add a confirm_overwrite signal to the vtable. * gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_set_property): Handle the new property. (gtk_file_chooser_default_get_property): Likewise. (get_selected_file_info_from_file_list): New helper function; code taken from list_selection_changed(). (list_selection_changed): Use get_selected_file_info_from_file_list(). (should_respond_after_confirm_overwrite): New function. (gtk_file_chooser_default_should_respond): Confirm when necessary.
This commit is contained in:

committed by
Federico Mena Quintero

parent
7158c558ae
commit
fb7d6ac4fd
36
ChangeLog
36
ChangeLog
@ -1,3 +1,39 @@
|
|||||||
|
2005-07-14 Federico Mena Quintero <federico@ximian.com>
|
||||||
|
|
||||||
|
Add overwrite confirmation for SAVE mode. Fixes bug #152850:
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.h: Add prototypes for
|
||||||
|
gtk_file_chooser_set/get_do_overwrite_confirmation().
|
||||||
|
(GtkFileChooserConfirmation): New enum for the result of the
|
||||||
|
"confirm-overwrite" signal.
|
||||||
|
|
||||||
|
* gtk/gtkmarshalers.list: Add ENUM:VOID.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.c (gtk_file_chooser_class_init): Add a
|
||||||
|
"do-overwrite-confirmation" boolean property.
|
||||||
|
(gtk_file_chooser_set_do_overwrite_confirmation): Implement.
|
||||||
|
(gtk_file_chooser_get_do_overwrite_confirmation): Implement.
|
||||||
|
(confirm_overwrite_accumulator): New accumulator for the signal.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.h (GtkFileChooserProp): Add
|
||||||
|
GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.c
|
||||||
|
(_gtk_file_chooser_install_properties): Override the
|
||||||
|
do-overwrite-confirmation property.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserIface): Add a
|
||||||
|
confirm_overwrite signal to the vtable.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserdefault.c
|
||||||
|
(gtk_file_chooser_default_set_property): Handle the new property.
|
||||||
|
(gtk_file_chooser_default_get_property): Likewise.
|
||||||
|
(get_selected_file_info_from_file_list): New helper function; code
|
||||||
|
taken from list_selection_changed().
|
||||||
|
(list_selection_changed): Use get_selected_file_info_from_file_list().
|
||||||
|
(should_respond_after_confirm_overwrite): New function.
|
||||||
|
(gtk_file_chooser_default_should_respond): Confirm when necessary.
|
||||||
|
|
||||||
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtk.symbols: Add new exported symbols.
|
* gtk/gtk.symbols: Add new exported symbols.
|
||||||
|
@ -1,3 +1,39 @@
|
|||||||
|
2005-07-14 Federico Mena Quintero <federico@ximian.com>
|
||||||
|
|
||||||
|
Add overwrite confirmation for SAVE mode. Fixes bug #152850:
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.h: Add prototypes for
|
||||||
|
gtk_file_chooser_set/get_do_overwrite_confirmation().
|
||||||
|
(GtkFileChooserConfirmation): New enum for the result of the
|
||||||
|
"confirm-overwrite" signal.
|
||||||
|
|
||||||
|
* gtk/gtkmarshalers.list: Add ENUM:VOID.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.c (gtk_file_chooser_class_init): Add a
|
||||||
|
"do-overwrite-confirmation" boolean property.
|
||||||
|
(gtk_file_chooser_set_do_overwrite_confirmation): Implement.
|
||||||
|
(gtk_file_chooser_get_do_overwrite_confirmation): Implement.
|
||||||
|
(confirm_overwrite_accumulator): New accumulator for the signal.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.h (GtkFileChooserProp): Add
|
||||||
|
GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.c
|
||||||
|
(_gtk_file_chooser_install_properties): Override the
|
||||||
|
do-overwrite-confirmation property.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserIface): Add a
|
||||||
|
confirm_overwrite signal to the vtable.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserdefault.c
|
||||||
|
(gtk_file_chooser_default_set_property): Handle the new property.
|
||||||
|
(gtk_file_chooser_default_get_property): Likewise.
|
||||||
|
(get_selected_file_info_from_file_list): New helper function; code
|
||||||
|
taken from list_selection_changed().
|
||||||
|
(list_selection_changed): Use get_selected_file_info_from_file_list().
|
||||||
|
(should_respond_after_confirm_overwrite): New function.
|
||||||
|
(gtk_file_chooser_default_should_respond): Confirm when necessary.
|
||||||
|
|
||||||
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtk.symbols: Add new exported symbols.
|
* gtk/gtk.symbols: Add new exported symbols.
|
||||||
|
@ -1,3 +1,39 @@
|
|||||||
|
2005-07-14 Federico Mena Quintero <federico@ximian.com>
|
||||||
|
|
||||||
|
Add overwrite confirmation for SAVE mode. Fixes bug #152850:
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.h: Add prototypes for
|
||||||
|
gtk_file_chooser_set/get_do_overwrite_confirmation().
|
||||||
|
(GtkFileChooserConfirmation): New enum for the result of the
|
||||||
|
"confirm-overwrite" signal.
|
||||||
|
|
||||||
|
* gtk/gtkmarshalers.list: Add ENUM:VOID.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooser.c (gtk_file_chooser_class_init): Add a
|
||||||
|
"do-overwrite-confirmation" boolean property.
|
||||||
|
(gtk_file_chooser_set_do_overwrite_confirmation): Implement.
|
||||||
|
(gtk_file_chooser_get_do_overwrite_confirmation): Implement.
|
||||||
|
(confirm_overwrite_accumulator): New accumulator for the signal.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.h (GtkFileChooserProp): Add
|
||||||
|
GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserutils.c
|
||||||
|
(_gtk_file_chooser_install_properties): Override the
|
||||||
|
do-overwrite-confirmation property.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserIface): Add a
|
||||||
|
confirm_overwrite signal to the vtable.
|
||||||
|
|
||||||
|
* gtk/gtkfilechooserdefault.c
|
||||||
|
(gtk_file_chooser_default_set_property): Handle the new property.
|
||||||
|
(gtk_file_chooser_default_get_property): Likewise.
|
||||||
|
(get_selected_file_info_from_file_list): New helper function; code
|
||||||
|
taken from list_selection_changed().
|
||||||
|
(list_selection_changed): Use get_selected_file_info_from_file_list().
|
||||||
|
(should_respond_after_confirm_overwrite): New function.
|
||||||
|
(gtk_file_chooser_default_should_respond): Confirm when necessary.
|
||||||
|
|
||||||
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
2005-07-14 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
* gtk/gtk.symbols: Add new exported symbols.
|
* gtk/gtk.symbols: Add new exported symbols.
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "gtkintl.h"
|
#include "gtkintl.h"
|
||||||
#include "gtktypebuiltins.h"
|
#include "gtktypebuiltins.h"
|
||||||
#include "gtkprivate.h"
|
#include "gtkprivate.h"
|
||||||
|
#include "gtkmarshalers.h"
|
||||||
#include "gtkalias.h"
|
#include "gtkalias.h"
|
||||||
|
|
||||||
static void gtk_file_chooser_class_init (gpointer g_iface);
|
static void gtk_file_chooser_class_init (gpointer g_iface);
|
||||||
@ -56,6 +57,22 @@ gtk_file_chooser_get_type (void)
|
|||||||
return file_chooser_type;
|
return file_chooser_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
confirm_overwrite_accumulator (GSignalInvocationHint *ihint,
|
||||||
|
GValue *return_accu,
|
||||||
|
const GValue *handler_return,
|
||||||
|
gpointer dummy)
|
||||||
|
{
|
||||||
|
gboolean continue_emission;
|
||||||
|
GtkFileChooserConfirmation conf;
|
||||||
|
|
||||||
|
conf = g_value_get_enum (handler_return);
|
||||||
|
g_value_set_enum (return_accu, conf);
|
||||||
|
continue_emission = (conf == GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM);
|
||||||
|
|
||||||
|
return continue_emission;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_file_chooser_class_init (gpointer g_iface)
|
gtk_file_chooser_class_init (gpointer g_iface)
|
||||||
{
|
{
|
||||||
@ -171,6 +188,20 @@ gtk_file_chooser_class_init (gpointer g_iface)
|
|||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
g_cclosure_marshal_VOID__VOID,
|
g_cclosure_marshal_VOID__VOID,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GtkFileChooser::confirm-overwrite
|
||||||
|
* @chooser: the object which received the signal.
|
||||||
|
*
|
||||||
|
* FIXME
|
||||||
|
*/
|
||||||
|
g_signal_new ("confirm-overwrite",
|
||||||
|
iface_type,
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
G_STRUCT_OFFSET (GtkFileChooserIface, confirm_overwrite),
|
||||||
|
confirm_overwrite_accumulator, NULL,
|
||||||
|
_gtk_marshal_ENUM__VOID,
|
||||||
|
GTK_TYPE_FILE_CHOOSER_CONFIRMATION, 0);
|
||||||
|
|
||||||
g_object_interface_install_property (g_iface,
|
g_object_interface_install_property (g_iface,
|
||||||
g_param_spec_enum ("action",
|
g_param_spec_enum ("action",
|
||||||
@ -234,6 +265,15 @@ gtk_file_chooser_class_init (gpointer g_iface)
|
|||||||
P_("Whether the hidden files and folders should be displayed"),
|
P_("Whether the hidden files and folders should be displayed"),
|
||||||
FALSE,
|
FALSE,
|
||||||
GTK_PARAM_READWRITE));
|
GTK_PARAM_READWRITE));
|
||||||
|
|
||||||
|
g_object_interface_install_property (g_iface,
|
||||||
|
g_param_spec_boolean ("do-overwrite-confirmation",
|
||||||
|
P_("Do overwrite confirmation"),
|
||||||
|
P_("Whether a file chooser in GTK_FILE_CHOOSER_ACTION_SAVE "
|
||||||
|
"will present an overwrite confirmation dialog if the user "
|
||||||
|
"selects a file name that already exists."),
|
||||||
|
FALSE,
|
||||||
|
GTK_PARAM_READWRITE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1832,6 +1872,54 @@ gtk_file_chooser_get_show_hidden (GtkFileChooser *chooser)
|
|||||||
return show_hidden;
|
return show_hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_file_chooser_set_do_overwrite_confirmation:
|
||||||
|
* @chooser: a #GtkFileChooser
|
||||||
|
* @do_overwrite_confirmation: whether to confirm overwriting in save mode
|
||||||
|
*
|
||||||
|
* Sets whether a file chooser in GTK_FILE_CHOOSER_ACTION_SAVE mode will present
|
||||||
|
* a confirmation dialog if the user types a file name that already exists. This
|
||||||
|
* is %FALSE by default.
|
||||||
|
*
|
||||||
|
* Regardless of this setting, the @chooser will emit the "confirm-overwrite"
|
||||||
|
* signal when appropriate.
|
||||||
|
*
|
||||||
|
* If all you need is the stock confirmation dialog, set this property to %TRUE.
|
||||||
|
* You can override the way confirmation is done by actually handling the
|
||||||
|
* "confirm-overwrite" signal; please refer to its documentation for the
|
||||||
|
* details.
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
gtk_file_chooser_set_do_overwrite_confirmation (GtkFileChooser *chooser,
|
||||||
|
gboolean do_overwrite_confirmation)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GTK_IS_FILE_CHOOSER (chooser));
|
||||||
|
|
||||||
|
g_object_set (chooser, "do-overwrite-confirmation", do_overwrite_confirmation, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_file_chooser_get_do_overwrite_confirmation:
|
||||||
|
* @chooser: a #GtkFileChooser
|
||||||
|
*
|
||||||
|
* Queries whether a file chooser is set to confirm for overwriting when the user
|
||||||
|
* types a file name that already exists.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if the file chooser will present a confirmation dialog;
|
||||||
|
* %FALSE otherwise.
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
gtk_file_chooser_get_do_overwrite_confirmation (GtkFileChooser *chooser)
|
||||||
|
{
|
||||||
|
gboolean do_overwrite_confirmation;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GTK_IS_FILE_CHOOSER (chooser), FALSE);
|
||||||
|
|
||||||
|
g_object_get (chooser, "do-overwrite-confirmation", &do_overwrite_confirmation, NULL);
|
||||||
|
|
||||||
|
return do_overwrite_confirmation;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
|
||||||
/* DLL ABI stability backward compatibility versions */
|
/* DLL ABI stability backward compatibility versions */
|
||||||
|
@ -40,6 +40,13 @@ typedef enum
|
|||||||
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
|
GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
|
||||||
} GtkFileChooserAction;
|
} GtkFileChooserAction;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM,
|
||||||
|
GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME,
|
||||||
|
GTK_FILE_CHOOSER_CONFIRMATION_SELECT_AGAIN
|
||||||
|
} GtkFileChooserConfirmation;
|
||||||
|
|
||||||
GType gtk_file_chooser_get_type (void) G_GNUC_CONST;
|
GType gtk_file_chooser_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
/* GError enumeration for GtkFileChooser */
|
/* GError enumeration for GtkFileChooser */
|
||||||
@ -68,6 +75,10 @@ void gtk_file_chooser_set_show_hidden (GtkFileChooser
|
|||||||
gboolean show_hidden);
|
gboolean show_hidden);
|
||||||
gboolean gtk_file_chooser_get_show_hidden (GtkFileChooser *chooser);
|
gboolean gtk_file_chooser_get_show_hidden (GtkFileChooser *chooser);
|
||||||
|
|
||||||
|
void gtk_file_chooser_set_do_overwrite_confirmation (GtkFileChooser *chooser,
|
||||||
|
gboolean do_overwrite_confirmation);
|
||||||
|
gboolean gtk_file_chooser_get_do_overwrite_confirmation (GtkFileChooser *chooser);
|
||||||
|
|
||||||
/* Suggested name for the Save-type actions
|
/* Suggested name for the Save-type actions
|
||||||
*/
|
*/
|
||||||
void gtk_file_chooser_set_current_name (GtkFileChooser *chooser,
|
void gtk_file_chooser_set_current_name (GtkFileChooser *chooser,
|
||||||
|
@ -194,6 +194,7 @@ struct _GtkFileChooserDefault
|
|||||||
guint use_preview_label : 1;
|
guint use_preview_label : 1;
|
||||||
guint select_multiple : 1;
|
guint select_multiple : 1;
|
||||||
guint show_hidden : 1;
|
guint show_hidden : 1;
|
||||||
|
guint do_overwrite_confirmation : 1;
|
||||||
guint list_sort_ascending : 1;
|
guint list_sort_ascending : 1;
|
||||||
guint changing_folder : 1;
|
guint changing_folder : 1;
|
||||||
guint shortcuts_current_folder_active : 1;
|
guint shortcuts_current_folder_active : 1;
|
||||||
@ -4227,29 +4228,37 @@ gtk_file_chooser_default_set_property (GObject *object,
|
|||||||
action);
|
action);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND:
|
case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND:
|
||||||
set_file_system_backend (impl, g_value_get_string (value));
|
set_file_system_backend (impl, g_value_get_string (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_FILTER:
|
case GTK_FILE_CHOOSER_PROP_FILTER:
|
||||||
set_current_filter (impl, g_value_get_object (value));
|
set_current_filter (impl, g_value_get_object (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
|
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
|
||||||
set_local_only (impl, g_value_get_boolean (value));
|
set_local_only (impl, g_value_get_boolean (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
|
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
|
||||||
set_preview_widget (impl, g_value_get_object (value));
|
set_preview_widget (impl, g_value_get_object (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
|
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
|
||||||
impl->preview_widget_active = g_value_get_boolean (value);
|
impl->preview_widget_active = g_value_get_boolean (value);
|
||||||
update_preview_widget_visibility (impl);
|
update_preview_widget_visibility (impl);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL:
|
case GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL:
|
||||||
impl->use_preview_label = g_value_get_boolean (value);
|
impl->use_preview_label = g_value_get_boolean (value);
|
||||||
update_preview_widget_visibility (impl);
|
update_preview_widget_visibility (impl);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
|
case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
|
||||||
set_extra_widget (impl, g_value_get_object (value));
|
set_extra_widget (impl, g_value_get_object (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
|
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
|
||||||
{
|
{
|
||||||
gboolean select_multiple = g_value_get_boolean (value);
|
gboolean select_multiple = g_value_get_boolean (value);
|
||||||
@ -4265,6 +4274,7 @@ gtk_file_chooser_default_set_property (GObject *object,
|
|||||||
set_select_multiple (impl, select_multiple, FALSE);
|
set_select_multiple (impl, select_multiple, FALSE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
|
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
|
||||||
{
|
{
|
||||||
gboolean show_hidden = g_value_get_boolean (value);
|
gboolean show_hidden = g_value_get_boolean (value);
|
||||||
@ -4277,6 +4287,14 @@ gtk_file_chooser_default_set_property (GObject *object,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION:
|
||||||
|
{
|
||||||
|
gboolean do_overwrite_confirmation = g_value_get_boolean (value);
|
||||||
|
impl->do_overwrite_confirmation = do_overwrite_confirmation;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -4296,30 +4314,43 @@ gtk_file_chooser_default_get_property (GObject *object,
|
|||||||
case GTK_FILE_CHOOSER_PROP_ACTION:
|
case GTK_FILE_CHOOSER_PROP_ACTION:
|
||||||
g_value_set_enum (value, impl->action);
|
g_value_set_enum (value, impl->action);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_FILTER:
|
case GTK_FILE_CHOOSER_PROP_FILTER:
|
||||||
g_value_set_object (value, impl->current_filter);
|
g_value_set_object (value, impl->current_filter);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
|
case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY:
|
||||||
g_value_set_boolean (value, impl->local_only);
|
g_value_set_boolean (value, impl->local_only);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
|
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET:
|
||||||
g_value_set_object (value, impl->preview_widget);
|
g_value_set_object (value, impl->preview_widget);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
|
case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE:
|
||||||
g_value_set_boolean (value, impl->preview_widget_active);
|
g_value_set_boolean (value, impl->preview_widget_active);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL:
|
case GTK_FILE_CHOOSER_PROP_USE_PREVIEW_LABEL:
|
||||||
g_value_set_boolean (value, impl->use_preview_label);
|
g_value_set_boolean (value, impl->use_preview_label);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
|
case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET:
|
||||||
g_value_set_object (value, impl->extra_widget);
|
g_value_set_object (value, impl->extra_widget);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
|
case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE:
|
||||||
g_value_set_boolean (value, impl->select_multiple);
|
g_value_set_boolean (value, impl->select_multiple);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
|
case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN:
|
||||||
g_value_set_boolean (value, impl->show_hidden);
|
g_value_set_boolean (value, impl->show_hidden);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION:
|
||||||
|
g_value_set_boolean (value, impl->do_overwrite_confirmation);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -5843,6 +5874,142 @@ switch_to_selected_folder (GtkFileChooserDefault *impl)
|
|||||||
change_folder_and_display_error (impl, closure.path);
|
change_folder_and_display_error (impl, closure.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Gets the GtkFileInfo for the selected row in the file list; assumes single
|
||||||
|
* selection mode.
|
||||||
|
*/
|
||||||
|
static const GtkFileInfo *
|
||||||
|
get_selected_file_info_from_file_list (GtkFileChooserDefault *impl,
|
||||||
|
gboolean *had_selection)
|
||||||
|
{
|
||||||
|
GtkTreeSelection *selection;
|
||||||
|
GtkTreeIter iter, child_iter;
|
||||||
|
const GtkFileInfo *info;
|
||||||
|
|
||||||
|
g_assert (!impl->select_multiple);
|
||||||
|
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
|
||||||
|
if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
|
||||||
|
{
|
||||||
|
*had_selection = FALSE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*had_selection = TRUE;
|
||||||
|
|
||||||
|
gtk_tree_model_sort_convert_iter_to_child_iter (impl->sort_model,
|
||||||
|
&child_iter,
|
||||||
|
&iter);
|
||||||
|
|
||||||
|
info = _gtk_file_system_model_get_info (impl->browse_files_model, &child_iter);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gets the display name of the selected file in the file list; assumes single
|
||||||
|
* selection mode and that something is selected.
|
||||||
|
*/
|
||||||
|
static const gchar *
|
||||||
|
get_display_name_from_file_list (GtkFileChooserDefault *impl)
|
||||||
|
{
|
||||||
|
const GtkFileInfo *info;
|
||||||
|
gboolean had_selection;
|
||||||
|
|
||||||
|
info = get_selected_file_info_from_file_list (impl, &had_selection);
|
||||||
|
g_assert (had_selection);
|
||||||
|
g_assert (info != NULL);
|
||||||
|
|
||||||
|
return gtk_file_info_get_display_name (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_custom_button_to_dialog (GtkDialog *dialog,
|
||||||
|
const gchar *mnemonic_label,
|
||||||
|
const gchar *stock_id,
|
||||||
|
gint response_id)
|
||||||
|
{
|
||||||
|
GtkWidget *button;
|
||||||
|
|
||||||
|
button = gtk_button_new_with_mnemonic (mnemonic_label);
|
||||||
|
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
|
||||||
|
gtk_button_set_image (GTK_BUTTON (button),
|
||||||
|
gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON));
|
||||||
|
gtk_widget_show (button);
|
||||||
|
|
||||||
|
gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Presents an overwrite confirmation dialog; returns whether we should accept
|
||||||
|
* the filename.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
confirm_dialog_should_accept_filename (GtkFileChooserDefault *impl,
|
||||||
|
const gchar *file_part)
|
||||||
|
{
|
||||||
|
GtkWindow *toplevel;
|
||||||
|
GtkWidget *dialog;
|
||||||
|
int response;
|
||||||
|
|
||||||
|
toplevel = get_toplevel (GTK_WIDGET (impl));
|
||||||
|
|
||||||
|
dialog = gtk_message_dialog_new (toplevel,
|
||||||
|
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||||
|
GTK_MESSAGE_QUESTION,
|
||||||
|
GTK_BUTTONS_NONE,
|
||||||
|
_("A file named \"%s\" already exists."),
|
||||||
|
file_part);
|
||||||
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
||||||
|
_("Do you want to replace it with the one you are saving?"));
|
||||||
|
|
||||||
|
add_custom_button_to_dialog (GTK_DIALOG (dialog), _("_Select another file"), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
|
||||||
|
add_custom_button_to_dialog (GTK_DIALOG (dialog), _("_Replace existing file"), GTK_STOCK_REFRESH, GTK_RESPONSE_ACCEPT);
|
||||||
|
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
|
||||||
|
|
||||||
|
response = gtk_dialog_run (GTK_DIALOG (dialog));
|
||||||
|
|
||||||
|
gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
|
return (response == GTK_RESPONSE_ACCEPT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Does overwrite confirmation if appropriate, and returns whether the dialog
|
||||||
|
* should respond. Can get the file part from the file list or the save entry.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
should_respond_after_confirm_overwrite (GtkFileChooserDefault *impl,
|
||||||
|
gboolean get_file_part_from_file_list)
|
||||||
|
{
|
||||||
|
GtkFileChooserConfirmation conf;
|
||||||
|
const gchar *file_part;
|
||||||
|
|
||||||
|
if (!impl->do_overwrite_confirmation)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (get_file_part_from_file_list)
|
||||||
|
file_part = get_display_name_from_file_list (impl);
|
||||||
|
else
|
||||||
|
file_part = _gtk_file_chooser_entry_get_file_part (GTK_FILE_CHOOSER_ENTRY (impl->save_file_name_entry));
|
||||||
|
|
||||||
|
g_assert (file_part != NULL);
|
||||||
|
|
||||||
|
conf = GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM;
|
||||||
|
|
||||||
|
g_signal_emit_by_name (impl, "confirm-overwrite", &conf);
|
||||||
|
|
||||||
|
switch (conf)
|
||||||
|
{
|
||||||
|
case GTK_FILE_CHOOSER_CONFIRMATION_CONFIRM:
|
||||||
|
return confirm_dialog_should_accept_filename (impl, file_part);
|
||||||
|
|
||||||
|
case GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case GTK_FILE_CHOOSER_CONFIRMATION_SELECT_AGAIN:
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Implementation for GtkFileChooserEmbed::should_respond() */
|
/* Implementation for GtkFileChooserEmbed::should_respond() */
|
||||||
static gboolean
|
static gboolean
|
||||||
gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed)
|
gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed)
|
||||||
@ -5914,6 +6081,8 @@ gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed)
|
|||||||
switch_to_selected_folder (impl);
|
switch_to_selected_folder (impl);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
else if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
||||||
|
return should_respond_after_confirm_overwrite (impl, TRUE);
|
||||||
else
|
else
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@ -5991,7 +6160,11 @@ gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed)
|
|||||||
if (is_folder)
|
if (is_folder)
|
||||||
{
|
{
|
||||||
if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
||||||
retval = TRUE;
|
{
|
||||||
|
g_assert (!is_file_part_empty);
|
||||||
|
|
||||||
|
retval = should_respond_after_confirm_overwrite (impl, FALSE);
|
||||||
|
}
|
||||||
else /* GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER */
|
else /* GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER */
|
||||||
{
|
{
|
||||||
GError *create_error;
|
GError *create_error;
|
||||||
@ -6358,20 +6531,13 @@ list_selection_changed (GtkTreeSelection *selection,
|
|||||||
/* See if we are in the new folder editable row for Save mode */
|
/* See if we are in the new folder editable row for Save mode */
|
||||||
if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
if (impl->action == GTK_FILE_CHOOSER_ACTION_SAVE)
|
||||||
{
|
{
|
||||||
GtkTreeSelection *selection;
|
|
||||||
GtkTreeIter iter, child_iter;
|
|
||||||
const GtkFileInfo *info;
|
const GtkFileInfo *info;
|
||||||
|
gboolean had_selection;
|
||||||
|
|
||||||
g_assert (!impl->select_multiple);
|
info = get_selected_file_info_from_file_list (impl, &had_selection);
|
||||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
|
if (!had_selection)
|
||||||
if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
|
|
||||||
goto out; /* normal processing */
|
goto out; /* normal processing */
|
||||||
|
|
||||||
gtk_tree_model_sort_convert_iter_to_child_iter (impl->sort_model,
|
|
||||||
&child_iter,
|
|
||||||
&iter);
|
|
||||||
|
|
||||||
info = _gtk_file_system_model_get_info (impl->browse_files_model, &child_iter);
|
|
||||||
if (!info)
|
if (!info)
|
||||||
return; /* We are on the editable row for New Folder */
|
return; /* We are on the editable row for New Folder */
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,7 @@ struct _GtkFileChooserIface
|
|||||||
void (*selection_changed) (GtkFileChooser *chooser);
|
void (*selection_changed) (GtkFileChooser *chooser);
|
||||||
void (*update_preview) (GtkFileChooser *chooser);
|
void (*update_preview) (GtkFileChooser *chooser);
|
||||||
void (*file_activated) (GtkFileChooser *chooser);
|
void (*file_activated) (GtkFileChooser *chooser);
|
||||||
|
GtkFileChooserConfirmation (*confirm_overwrite) (GtkFileChooser *chooser);
|
||||||
};
|
};
|
||||||
|
|
||||||
GtkFileSystem *_gtk_file_chooser_get_file_system (GtkFileChooser *chooser);
|
GtkFileSystem *_gtk_file_chooser_get_file_system (GtkFileChooser *chooser);
|
||||||
|
@ -66,6 +66,9 @@ static void delegate_update_preview (GtkFileChooser *choose
|
|||||||
static void delegate_file_activated (GtkFileChooser *chooser,
|
static void delegate_file_activated (GtkFileChooser *chooser,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
|
||||||
|
static GtkFileChooserConfirmation delegate_confirm_overwrite (GtkFileChooser *chooser,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _gtk_file_chooser_install_properties:
|
* _gtk_file_chooser_install_properties:
|
||||||
* @klass: the class structure for a type deriving from #GObject
|
* @klass: the class structure for a type deriving from #GObject
|
||||||
@ -110,6 +113,9 @@ _gtk_file_chooser_install_properties (GObjectClass *klass)
|
|||||||
g_object_class_override_property (klass,
|
g_object_class_override_property (klass,
|
||||||
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
|
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
|
||||||
"show-hidden");
|
"show-hidden");
|
||||||
|
g_object_class_override_property (klass,
|
||||||
|
GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION,
|
||||||
|
"do-overwrite-confirmation");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -173,6 +179,8 @@ _gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
|
|||||||
G_CALLBACK (delegate_update_preview), receiver);
|
G_CALLBACK (delegate_update_preview), receiver);
|
||||||
g_signal_connect (delegate, "file-activated",
|
g_signal_connect (delegate, "file-activated",
|
||||||
G_CALLBACK (delegate_file_activated), receiver);
|
G_CALLBACK (delegate_file_activated), receiver);
|
||||||
|
g_signal_connect (delegate, "confirm-overwrite",
|
||||||
|
G_CALLBACK (delegate_confirm_overwrite), receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
GQuark
|
GQuark
|
||||||
@ -342,5 +350,15 @@ delegate_file_activated (GtkFileChooser *chooser,
|
|||||||
g_signal_emit_by_name (data, "file-activated");
|
g_signal_emit_by_name (data, "file-activated");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GtkFileChooserConfirmation
|
||||||
|
delegate_confirm_overwrite (GtkFileChooser *chooser,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkFileChooserConfirmation conf;
|
||||||
|
|
||||||
|
g_signal_emit_by_name (data, "confirm-overwrite", &conf);
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
#define __GTK_FILE_CHOOSER_UTILS_C__
|
#define __GTK_FILE_CHOOSER_UTILS_C__
|
||||||
#include "gtkaliasdef.c"
|
#include "gtkaliasdef.c"
|
||||||
|
@ -40,7 +40,8 @@ typedef enum {
|
|||||||
GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
|
GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET,
|
||||||
GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
|
GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
|
||||||
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
|
GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
|
||||||
GTK_FILE_CHOOSER_PROP_LAST = GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN
|
GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION,
|
||||||
|
GTK_FILE_CHOOSER_PROP_LAST = GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION
|
||||||
} GtkFileChooserProp;
|
} GtkFileChooserProp;
|
||||||
|
|
||||||
void _gtk_file_chooser_install_properties (GObjectClass *klass);
|
void _gtk_file_chooser_install_properties (GObjectClass *klass);
|
||||||
|
@ -161,7 +161,7 @@ gtk_file_chooser_widget_constructor (GType type,
|
|||||||
current_folder = g_get_current_dir ();
|
current_folder = g_get_current_dir ();
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (priv->impl), current_folder);
|
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (priv->impl), current_folder);
|
||||||
g_free (current_folder);
|
g_free (current_folder);
|
||||||
|
|
||||||
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object),
|
_gtk_file_chooser_set_delegate (GTK_FILE_CHOOSER (object),
|
||||||
GTK_FILE_CHOOSER (priv->impl));
|
GTK_FILE_CHOOSER (priv->impl));
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ BOOLEAN:NONE
|
|||||||
BOOLEAN:BOOLEAN,BOOLEAN,BOOLEAN
|
BOOLEAN:BOOLEAN,BOOLEAN,BOOLEAN
|
||||||
BOOLEAN:STRING
|
BOOLEAN:STRING
|
||||||
ENUM:ENUM
|
ENUM:ENUM
|
||||||
|
ENUM:VOID
|
||||||
INT:POINTER
|
INT:POINTER
|
||||||
NONE:BOOLEAN
|
NONE:BOOLEAN
|
||||||
NONE:ENUM
|
NONE:ENUM
|
||||||
|
Reference in New Issue
Block a user