Issue #1160: file dialog view filter getting confused with file...

... format selection.
Second step: add a "Show All Files" checkbox so that one can still
prevent view filtering even when forcing a load format.
This is useful when loading files with unusual extensions, for instance.
This commit is contained in:
Jehan 2018-07-25 15:28:04 +02:00
parent 193a49a6d1
commit 6369445874
2 changed files with 46 additions and 3 deletions

View File

@ -57,7 +57,8 @@ enum
PROP_AUTOMATIC_LABEL,
PROP_FILE_FILTER_LABEL,
PROP_FILE_PROCS,
PROP_FILE_PROCS_ALL_IMAGES
PROP_FILE_PROCS_ALL_IMAGES,
PROP_SHOW_ALL_FILES,
};
typedef struct _GimpFileDialogState GimpFileDialogState;
@ -213,6 +214,11 @@ gimp_file_dialog_class_init (GimpFileDialogClass *klass)
GIMP_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class, PROP_SHOW_ALL_FILES,
g_param_spec_boolean ("show-all-files",
NULL, NULL, FALSE,
GIMP_PARAM_READWRITE));
gtk_widget_class_set_css_name (widget_class, "GimpFileDialog");
}
@ -272,6 +278,11 @@ gimp_file_dialog_set_property (GObject *object,
gimp_plug_in_manager_get_file_procedures (dialog->gimp->plug_in_manager,
g_value_get_enum (value));
break;
case PROP_SHOW_ALL_FILES:
dialog->show_all_files = g_value_get_boolean (value);
gimp_file_dialog_proc_changed (GIMP_FILE_PROC_VIEW (dialog->proc_view),
dialog);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -295,6 +306,9 @@ gimp_file_dialog_get_property (GObject *object,
case PROP_HELP_ID:
g_value_set_string (value, dialog->help_id);
break;
case PROP_SHOW_ALL_FILES:
g_value_set_boolean (value, dialog->show_all_files);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@ -714,7 +728,9 @@ gimp_file_dialog_add_preview (GimpFileDialog *dialog)
static void
gimp_file_dialog_add_proc_selection (GimpFileDialog *dialog)
{
GtkWidget *box;
GtkWidget *scrolled_window;
GtkWidget *checkbox;
dialog->proc_expander = gtk_expander_new_with_mnemonic (NULL);
gtk_expander_set_resize_toplevel (GTK_EXPANDER (dialog->proc_expander), TRUE);
@ -724,12 +740,17 @@ gimp_file_dialog_add_proc_selection (GimpFileDialog *dialog)
TRUE, TRUE, 0);
gtk_widget_show (dialog->proc_expander);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
gtk_container_add (GTK_CONTAINER (dialog->proc_expander), box);
gtk_widget_show (box);
/* The list of file formats. */
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (dialog->proc_expander), scrolled_window);
gtk_box_pack_start (GTK_BOX (box), scrolled_window, TRUE, TRUE, 1);
gtk_widget_show (scrolled_window);
gtk_widget_set_size_request (scrolled_window, -1, 200);
@ -746,6 +767,13 @@ gimp_file_dialog_add_proc_selection (GimpFileDialog *dialog)
dialog);
gimp_file_proc_view_set_proc (GIMP_FILE_PROC_VIEW (dialog->proc_view), NULL);
/* Checkbox to show all files. */
checkbox = gimp_prop_check_button_new (G_OBJECT (dialog),
"show-all-files",
_("Show All Files"));
gtk_box_pack_start (GTK_BOX (box), checkbox, FALSE, FALSE, 1);
gtk_widget_show (checkbox);
}
static void
@ -776,14 +804,27 @@ gimp_file_dialog_proc_changed (GimpFileProcView *view,
if (name)
{
gchar *label = g_strdup_printf (_("Select File _Type (%s)"), name);
gchar *label;
if (dialog->show_all_files)
label = g_strdup_printf (_("Select File _Type (%s) - Show All Files"), name);
else
label = g_strdup_printf (_("Select File _Type (%s)"), name);
gtk_expander_set_label (GTK_EXPANDER (dialog->proc_expander), label);
g_free (label);
g_free (name);
}
if (dialog->show_all_files)
{
g_object_unref (filter);
filter = gtk_file_filter_new ();
gtk_file_filter_add_pattern (filter, "*");
g_object_ref_sink (filter);
}
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
g_object_unref (filter);
if (gtk_file_chooser_get_action (chooser) == GTK_FILE_CHOOSER_ACTION_SAVE)
{

View File

@ -60,6 +60,8 @@ struct _GimpFileDialog
GSList *file_procs;
GSList *file_procs_all_images;
gboolean show_all_files;
};
struct _GimpFileDialogClass