gtkfilechooser: improve preview panel

This commit is contained in:
Daemonratte 2026-05-19 11:41:55 +02:00
commit 281f231d73
4 changed files with 538 additions and 14 deletions

View file

@ -268,6 +268,8 @@ typedef enum {
#define PREVIEW_HBOX_SPACING 12
#define PREVIEW_PANEL_WIDTH 240
#define PREVIEW_PANEL_IMAGE_MIN_SIZE 64
#define PREVIEW_PANEL_IMAGE_MAX_SIZE 1024
#define NUM_LINES 45
#define NUM_CHARS 60
@ -889,6 +891,12 @@ gtk_file_chooser_default_finalize (GObject *object)
icon_view_scale_remove_timeout (impl);
if (impl->preview_panel_resize_timeout_id)
{
g_source_remove (impl->preview_panel_resize_timeout_id);
impl->preview_panel_resize_timeout_id = 0;
}
unset_file_system_backend (impl);
if (impl->shortcuts_pane_filter_model)
@ -4391,19 +4399,228 @@ preview_panel_get_type_name (GFileInfo *info)
return description ? description : g_strdup (content_type);
}
static gint
preview_panel_get_image_size (GtkFileChooserDefault *impl)
{
GtkAllocation allocation;
gint width;
gint list_height;
gint limit;
if (impl->preview_box)
gtk_widget_get_allocation (impl->preview_box, &allocation);
else if (impl->preview_panel)
gtk_widget_get_allocation (impl->preview_panel, &allocation);
else
return PREVIEW_PANEL_WIDTH - 12;
width = allocation.width;
if (width <= 1)
width = PREVIEW_PANEL_WIDTH;
/*
* Use the file list height as the vertical limit. Do not use the
* preview panel height here: the preview image contributes to that
* height, which can create a resize feedback loop.
*/
list_height = 0;
if (impl->browse_files_scrolled_window)
{
gtk_widget_get_allocation (impl->browse_files_scrolled_window, &allocation);
list_height = allocation.height;
}
limit = width - 12;
if (list_height > 180)
limit = MIN (limit, list_height - 160);
else
limit = MIN (limit, PREVIEW_PANEL_WIDTH - 12);
return CLAMP (limit,
PREVIEW_PANEL_IMAGE_MIN_SIZE,
PREVIEW_PANEL_IMAGE_MAX_SIZE);
}
static void
preview_panel_clear_image (GtkFileChooserDefault *impl)
{
if (!impl->preview_panel_image)
return;
gtk_image_clear (GTK_IMAGE (impl->preview_panel_image));
gtk_widget_hide (impl->preview_panel_image);
impl->preview_panel_last_image_size = 0;
}
static GdkPixbuf *
preview_panel_scale_pixbuf_to_fit (GdkPixbuf *pixbuf,
gint size)
{
GdkPixbuf *scaled;
gint width;
gint height;
gint scaled_width;
gint scaled_height;
gdouble scale;
if (pixbuf == NULL)
return NULL;
width = gdk_pixbuf_get_width (pixbuf);
height = gdk_pixbuf_get_height (pixbuf);
if (width <= 0 || height <= 0)
return pixbuf;
scale = MIN ((gdouble) size / width, (gdouble) size / height);
scaled_width = MAX (1, (gint) (width * scale + 0.5));
scaled_height = MAX (1, (gint) (height * scale + 0.5));
if (scaled_width == width && scaled_height == height)
return pixbuf;
scaled = gdk_pixbuf_scale_simple (pixbuf,
scaled_width,
scaled_height,
GDK_INTERP_BILINEAR);
g_object_unref (pixbuf);
return scaled;
}
static GdkPixbuf *
preview_panel_render_icon (GtkFileChooserDefault *impl,
GFileInfo *info,
gint image_size)
{
GtkIconTheme *theme;
GtkIconInfo *icon_info = NULL;
GdkPixbuf *pixbuf = NULL;
GIcon *icon;
GError *error = NULL;
if (info == NULL)
return NULL;
if (!g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_ICON))
return NULL;
icon = g_file_info_get_icon (info);
if (icon == NULL)
return NULL;
theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (impl)));
#ifdef GTK_ICON_LOOKUP_FORCE_SVG
icon_info = gtk_icon_theme_lookup_by_gicon (theme, icon, image_size,
GTK_ICON_LOOKUP_FORCE_SVG);
#endif
if (icon_info == NULL)
icon_info = gtk_icon_theme_lookup_by_gicon (theme, icon, image_size, 0);
if (icon_info)
{
pixbuf = gtk_icon_info_load_icon (icon_info, &error);
gtk_icon_info_free (icon_info);
if (error)
{
g_error_free (error);
error = NULL;
}
}
if (pixbuf == NULL)
pixbuf = _gtk_file_info_render_icon (info, GTK_WIDGET (impl), image_size);
return preview_panel_scale_pixbuf_to_fit (pixbuf, image_size);
}
static void
preview_panel_update_image (GtkFileChooserDefault *impl,
GFile *file,
GFileInfo *info)
{
const gchar *content_type;
gchar *path;
GdkPixbuf *pixbuf = NULL;
GError *error = NULL;
gint image_size;
if (!impl->preview_panel_image)
return;
if (!file || !info)
{
preview_panel_clear_image (impl);
return;
}
image_size = preview_panel_get_image_size (impl);
impl->preview_panel_last_image_size = image_size;
content_type = g_file_info_get_content_type (info);
if (content_type && g_str_has_prefix (content_type, "image/"))
{
path = g_file_get_path (file);
if (path)
{
pixbuf = gdk_pixbuf_new_from_file_at_scale (path,
image_size,
image_size,
TRUE,
&error);
g_free (path);
}
if (error)
{
g_error_free (error);
error = NULL;
}
pixbuf = preview_panel_scale_pixbuf_to_fit (pixbuf, image_size);
}
if (pixbuf == NULL)
pixbuf = preview_panel_render_icon (impl, info, image_size);
if (pixbuf == NULL)
{
preview_panel_clear_image (impl);
return;
}
gtk_image_clear (GTK_IMAGE (impl->preview_panel_image));
gtk_widget_queue_draw (impl->preview_panel_image);
gtk_widget_set_size_request (impl->preview_panel_image, -1, -1);
gtk_image_set_from_pixbuf (GTK_IMAGE (impl->preview_panel_image), pixbuf);
gtk_widget_show (impl->preview_panel_image);
gtk_widget_queue_resize (impl->preview_panel_image);
gtk_widget_queue_draw (impl->preview_panel);
g_object_unref (pixbuf);
}
static void
update_preview_panel (GtkFileChooserDefault *impl)
{
struct preview_panel_update_closure closure;
GFile *parent_file;
gchar *name;
gchar *escaped_name;
gchar *title_markup;
gchar *location;
gchar *type_name;
gchar *size;
gchar *modified;
gchar *details;
if (!impl->preview_panel_info_label)
if (!impl->preview_panel_title_label || !impl->preview_panel_info_label)
return;
if (!impl->preview_panel_active)
@ -4420,8 +4637,10 @@ update_preview_panel (GtkFileChooserDefault *impl)
if (closure.count != 1 || closure.file == NULL)
{
gtk_label_set_text (GTK_LABEL (impl->preview_panel_info_label),
gtk_label_set_text (GTK_LABEL (impl->preview_panel_title_label),
_("No file selected"));
gtk_label_set_text (GTK_LABEL (impl->preview_panel_info_label), "");
preview_panel_clear_image (impl);
if (closure.file)
g_object_unref (closure.file);
@ -4437,6 +4656,12 @@ update_preview_panel (GtkFileChooserDefault *impl)
else
name = g_file_get_basename (closure.file);
escaped_name = g_markup_escape_text (name ? name : _("Unknown"), -1);
title_markup = g_strdup_printf ("<b>%s</b>", escaped_name);
gtk_label_set_markup (GTK_LABEL (impl->preview_panel_title_label), title_markup);
preview_panel_update_image (impl, closure.file, closure.info);
parent_file = g_file_get_parent (closure.file);
if (parent_file)
{
@ -4450,12 +4675,11 @@ update_preview_panel (GtkFileChooserDefault *impl)
size = preview_panel_format_size (closure.info);
modified = preview_panel_format_modified_time (closure.info);
details = g_strdup_printf (_("Name: %s\nLocation: %s\nType: %s\nSize: %s\nModified: %s"),
name ? name : _("Unknown"),
location ? location : _("Unknown"),
details = g_strdup_printf (_("Type: %s\nSize: %s\nModified: %s\nLocation: %s"),
type_name ? type_name : _("Unknown"),
size ? size : _("Unknown"),
modified ? modified : _("Unknown"));
modified ? modified : _("Unknown"),
location ? location : _("Unknown"));
gtk_label_set_text (GTK_LABEL (impl->preview_panel_info_label), details);
@ -4464,6 +4688,8 @@ update_preview_panel (GtkFileChooserDefault *impl)
g_free (size);
g_free (type_name);
g_free (location);
g_free (title_markup);
g_free (escaped_name);
g_free (name);
g_object_unref (closure.file);
@ -4472,6 +4698,56 @@ update_preview_panel (GtkFileChooserDefault *impl)
g_object_unref (closure.info);
}
static gboolean
preview_panel_resize_timeout_cb (gpointer data)
{
GtkFileChooserDefault *impl = data;
gint image_size;
impl->preview_panel_resize_timeout_id = 0;
if (!impl->preview_panel_active || !impl->preview_panel_image)
return FALSE;
image_size = preview_panel_get_image_size (impl);
if (image_size == impl->preview_panel_last_image_size)
return FALSE;
update_preview_panel (impl);
return FALSE;
}
static void
preview_panel_queue_resize_update (GtkFileChooserDefault *impl)
{
if (!impl->preview_panel_active)
return;
if (impl->preview_panel_resize_timeout_id)
g_source_remove (impl->preview_panel_resize_timeout_id);
impl->preview_panel_resize_timeout_id =
gdk_threads_add_timeout (35, preview_panel_resize_timeout_cb, impl);
}
static void
preview_panel_size_allocate_cb (GtkWidget *widget,
GtkAllocation *allocation,
GtkFileChooserDefault *impl)
{
gint image_size;
if (!impl->preview_panel_active)
return;
image_size = preview_panel_get_image_size (impl);
if (ABS (image_size - impl->preview_panel_last_image_size) >= 8)
preview_panel_queue_resize_update (impl);
}
static void preview_panel_toggle_button_toggled_cb (GtkToggleButton *button,
GtkFileChooserDefault *impl);
static void show_preview_panel_toggled_cb (GtkCheckMenuItem *item,
@ -4483,6 +4759,12 @@ preview_panel_set_active (GtkFileChooserDefault *impl,
{
impl->preview_panel_active = active;
if (!active && impl->preview_panel_resize_timeout_id)
{
g_source_remove (impl->preview_panel_resize_timeout_id);
impl->preview_panel_resize_timeout_id = 0;
}
if (active)
update_preview_panel (impl);
@ -4523,6 +4805,8 @@ show_preview_panel_toggled_cb (GtkCheckMenuItem *item,
preview_panel_set_active (impl, gtk_check_menu_item_get_active (item));
}
/* Callback used when the "Show Hidden Files" menu item is toggled */
static void
show_hidden_toggled_cb (GtkCheckMenuItem *item,
@ -5026,6 +5310,7 @@ file_list_update_popup_menu (GtkFileChooserDefault *impl)
g_signal_handlers_unblock_by_func (impl->browse_files_popup_menu_hidden_files_item,
G_CALLBACK (show_hidden_toggled_cb), impl);
if (impl->view_mode == VIEW_MODE_LIST)
{
/* 'Show Size Column' */
@ -5709,16 +5994,42 @@ file_pane_create (GtkFileChooserDefault *impl,
gtk_widget_set_size_request (impl->preview_box, PREVIEW_PANEL_WIDTH, -1);
gtk_paned_pack2 (GTK_PANED (hbox), impl->preview_box, FALSE, FALSE);
impl->preview_panel = gtk_vbox_new (FALSE, 6);
impl->preview_panel = gtk_vbox_new (FALSE, 8);
gtk_widget_set_size_request (impl->preview_panel, PREVIEW_PANEL_WIDTH, -1);
impl->preview_panel_info_label = gtk_label_new (_("No file selected"));
gtk_container_set_border_width (GTK_CONTAINER (impl->preview_panel), 6);
g_signal_connect (impl->preview_panel, "size-allocate",
G_CALLBACK (preview_panel_size_allocate_cb), impl);
impl->preview_panel_image = gtk_image_new ();
gtk_widget_set_size_request (impl->preview_panel_image, -1, -1);
gtk_misc_set_alignment (GTK_MISC (impl->preview_panel_image), 0.5, 0.0);
gtk_box_pack_start (GTK_BOX (impl->preview_panel),
impl->preview_panel_image, FALSE, FALSE, 0);
impl->preview_panel_title_label = gtk_label_new (_("No file selected"));
gtk_widget_set_size_request (impl->preview_panel_title_label, PREVIEW_PANEL_WIDTH, -1);
gtk_misc_set_alignment (GTK_MISC (impl->preview_panel_title_label), 0.0, 0.0);
gtk_label_set_selectable (GTK_LABEL (impl->preview_panel_title_label), TRUE);
gtk_label_set_ellipsize (GTK_LABEL (impl->preview_panel_title_label), PANGO_ELLIPSIZE_MIDDLE);
gtk_box_pack_start (GTK_BOX (impl->preview_panel),
impl->preview_panel_title_label, FALSE, FALSE, 0);
widget = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_ETCHED_IN);
gtk_widget_set_size_request (widget, -1, 2);
gtk_widget_show (widget);
gtk_box_pack_start (GTK_BOX (impl->preview_panel), widget, FALSE, FALSE, 0);
impl->preview_panel_info_label = gtk_label_new ("");
gtk_widget_set_size_request (impl->preview_panel_info_label, PREVIEW_PANEL_WIDTH, -1);
gtk_misc_set_alignment (GTK_MISC (impl->preview_panel_info_label), 0.0, 0.0);
gtk_label_set_selectable (GTK_LABEL (impl->preview_panel_info_label), TRUE);
gtk_label_set_line_wrap (GTK_LABEL (impl->preview_panel_info_label), FALSE);
gtk_label_set_ellipsize (GTK_LABEL (impl->preview_panel_info_label), PANGO_ELLIPSIZE_MIDDLE);
gtk_label_set_line_wrap (GTK_LABEL (impl->preview_panel_info_label), TRUE);
gtk_label_set_width_chars (GTK_LABEL (impl->preview_panel_info_label), 28);
gtk_box_pack_start (GTK_BOX (impl->preview_panel),
impl->preview_panel_info_label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (impl->preview_box),
impl->preview_panel, FALSE, FALSE, 0);
gtk_widget_show_all (impl->preview_panel);
@ -5973,16 +6284,187 @@ location_toggle_popup_handler (GtkFileChooserDefault *impl)
}
}
static void
view_mode_selected_files_free (GSList *files)
{
g_slist_foreach (files, (GFunc) g_object_unref, NULL);
g_slist_free (files);
}
static GSList *
view_mode_get_selected_files (GtkFileChooserDefault *impl,
ViewMode view_mode)
{
GSList *files = NULL;
if (!impl->current_model)
return NULL;
if (view_mode == VIEW_MODE_LIST && impl->browse_files_tree_view)
{
GtkTreeSelection *selection;
GList *rows;
GList *l;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
rows = gtk_tree_selection_get_selected_rows (selection, NULL);
for (l = rows; l; l = l->next)
{
GtkTreePath *path = l->data;
GtkTreeIter iter;
GFile *file = NULL;
if (gtk_tree_model_get_iter (impl->current_model, &iter, path))
gtk_tree_model_get (impl->current_model, &iter,
MODEL_COL_FILE, &file,
-1);
if (file)
files = g_slist_prepend (files, file);
}
g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
g_list_free (rows);
}
else if (VIEW_MODE_USES_ICON_VIEW (view_mode) && impl->browse_files_icon_view)
{
GList *rows;
GList *l;
rows = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (impl->browse_files_icon_view));
for (l = rows; l; l = l->next)
{
GtkTreePath *path = l->data;
GtkTreeIter iter;
GFile *file = NULL;
if (gtk_tree_model_get_iter (impl->current_model, &iter, path))
gtk_tree_model_get (impl->current_model, &iter,
MODEL_COL_FILE, &file,
-1);
if (file)
files = g_slist_prepend (files, file);
}
g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
g_list_free (rows);
}
return files;
}
static gboolean
view_mode_file_is_selected (GSList *files,
GFile *file)
{
GSList *l;
if (!file)
return FALSE;
for (l = files; l; l = l->next)
{
if (g_file_equal (G_FILE (l->data), file))
return TRUE;
}
return FALSE;
}
static void
view_mode_restore_selected_files (GtkFileChooserDefault *impl,
GSList *files)
{
GtkTreeIter iter;
GtkTreePath *first_path = NULL;
gboolean valid;
if (!files || !impl->current_model)
return;
current_selection_unselect_all (impl);
valid = gtk_tree_model_get_iter_first (impl->current_model, &iter);
while (valid)
{
GFile *file = NULL;
gtk_tree_model_get (impl->current_model, &iter,
MODEL_COL_FILE, &file,
-1);
if (view_mode_file_is_selected (files, file))
{
GtkTreePath *path;
path = gtk_tree_model_get_path (impl->current_model, &iter);
if (impl->view_mode == VIEW_MODE_LIST)
{
GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view));
gtk_tree_selection_select_path (selection, path);
if (!first_path)
gtk_tree_view_set_cursor (GTK_TREE_VIEW (impl->browse_files_tree_view),
path, NULL, FALSE);
}
else if (VIEW_MODE_USES_ICON_VIEW (impl->view_mode))
{
gtk_icon_view_select_path (GTK_ICON_VIEW (impl->browse_files_icon_view), path);
if (!first_path)
gtk_icon_view_set_cursor (GTK_ICON_VIEW (impl->browse_files_icon_view),
path, NULL, FALSE);
}
else
{
gtk_tree_path_free (path);
g_assert_not_reached ();
}
if (!first_path)
first_path = gtk_tree_path_copy (path);
gtk_tree_path_free (path);
}
if (file)
g_object_unref (file);
valid = gtk_tree_model_iter_next (impl->current_model, &iter);
}
if (first_path)
{
if (impl->view_mode == VIEW_MODE_LIST)
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (impl->browse_files_tree_view),
first_path, NULL, FALSE, 0.0, 0.0);
else if (VIEW_MODE_USES_ICON_VIEW (impl->view_mode))
gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (impl->browse_files_icon_view),
first_path, FALSE, 0.0, 0.0);
gtk_tree_path_free (first_path);
}
}
static void
view_mode_set (GtkFileChooserDefault *impl, ViewMode view_mode)
{
GtkWidget *old_view;
ViewMode old_view_mode = impl->view_mode;
GSList *selected_files;
if (old_view_mode == view_mode)
return;
old_view = impl->browse_files_current_view;
selected_files = view_mode_get_selected_files (impl, old_view_mode);
impl->view_mode = view_mode;
gtk_combo_box_set_active (GTK_COMBO_BOX (impl->view_mode_combo_box),
@ -6005,6 +6487,8 @@ view_mode_set (GtkFileChooserDefault *impl, ViewMode view_mode)
/* Set model and selection */
current_view_set_file_model (impl, impl->current_model);
current_view_set_select_multiple (impl, impl->select_multiple);
view_mode_restore_selected_files (impl, selected_files);
view_mode_selected_files_free (selected_files);
copy_old_selection_to_current_view (impl, old_view_mode);
if (view_mode == VIEW_MODE_ICON)
@ -6543,7 +7027,7 @@ icon_view_scale_create (GtkFileChooserDefault *impl)
G_CALLBACK (icon_view_scale_value_changed_cb), impl);
}
/* Creates a toggle button for the location entry. */
/* Creates a toggle button for the preview panel. */
static void
preview_panel_toggle_button_create (GtkFileChooserDefault *impl)
{
@ -7833,6 +8317,8 @@ settings_load (GtkFileChooserDefault *impl)
view_mode = _gtk_file_chooser_settings_get_view_mode (settings);
icon_view_scale = _gtk_file_chooser_settings_get_icon_view_scale (settings);
show_hidden = _gtk_file_chooser_settings_get_show_hidden (settings);
preview_panel_set_active (impl,
_gtk_file_chooser_settings_get_show_preview_panel (settings));
show_size_column = _gtk_file_chooser_settings_get_show_size_column (settings);
sort_column = _gtk_file_chooser_settings_get_sort_column (settings);
sort_order = _gtk_file_chooser_settings_get_sort_order (settings);
@ -7903,6 +8389,7 @@ settings_save (GtkFileChooserDefault *impl)
_gtk_file_chooser_settings_set_view_mode (settings, impl->view_mode);
_gtk_file_chooser_settings_set_icon_view_scale (settings, impl->icon_view_icon_size);
_gtk_file_chooser_settings_set_show_hidden (settings, gtk_file_chooser_get_show_hidden (GTK_FILE_CHOOSER (impl)));
_gtk_file_chooser_settings_set_show_preview_panel (settings, impl->preview_panel_active);
_gtk_file_chooser_settings_set_show_size_column (settings, impl->show_size_column);
_gtk_file_chooser_settings_set_sort_column (settings, impl->sort_column);
_gtk_file_chooser_settings_set_sort_order (settings, impl->sort_order);
@ -12328,6 +12815,7 @@ show_hidden_handler (GtkFileChooserDefault *impl)
g_object_set (impl,
"show-hidden", !impl->show_hidden,
NULL);
}

View file

@ -229,7 +229,11 @@ struct _GtkFileChooserDefault
GtkWidget *preview_label;
GtkWidget *preview_widget;
GtkWidget *preview_panel;
GtkWidget *preview_panel_image;
GtkWidget *preview_panel_title_label;
GtkWidget *preview_panel_info_label;
guint preview_panel_resize_timeout_id;
gint preview_panel_last_image_size;
GtkWidget *extra_align;
GtkWidget *extra_widget;

View file

@ -42,6 +42,7 @@
#define VIEW_MODE_KEY "ViewMode"
#define ICON_VIEW_SCALE_KEY "IconViewScale"
#define SHOW_HIDDEN_KEY "ShowHidden"
#define SHOW_PREVIEW_PANEL_KEY "ShowPreviewPanel"
#define SHOW_SIZE_COLUMN_KEY "ShowSizeColumn"
#define GEOMETRY_X_KEY "GeometryX"
#define GEOMETRY_Y_KEY "GeometryY"
@ -197,6 +198,15 @@ ensure_settings_read (GtkFileChooserSettings *settings)
else
settings->show_hidden = value != FALSE;
/* Show preview panel */
value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
SHOW_PREVIEW_PANEL_KEY, &error);
if (error)
warn_if_invalid_key_and_clear_error (SHOW_PREVIEW_PANEL_KEY, &error);
else
settings->show_preview_panel = value != FALSE;
/* Show size column */
value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
@ -290,6 +300,7 @@ _gtk_file_chooser_settings_init (GtkFileChooserSettings *settings)
settings->sort_order = GTK_SORT_ASCENDING;
settings->sort_column = FILE_LIST_COL_NAME;
settings->show_hidden = FALSE;
settings->show_preview_panel = FALSE;
settings->show_size_column = TRUE;
settings->geometry_x = -1;
settings->geometry_y = -1;
@ -360,6 +371,20 @@ _gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
settings->show_hidden = show_hidden != FALSE;
}
gboolean
_gtk_file_chooser_settings_get_show_preview_panel (GtkFileChooserSettings *settings)
{
ensure_settings_read (settings);
return settings->show_preview_panel;
}
void
_gtk_file_chooser_settings_set_show_preview_panel (GtkFileChooserSettings *settings,
gboolean show_preview_panel)
{
settings->show_preview_panel = show_preview_panel != FALSE;
}
void
_gtk_file_chooser_settings_set_show_size_column (GtkFileChooserSettings *settings,
gboolean show_column)
@ -550,6 +575,8 @@ _gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
ICON_VIEW_SCALE_KEY, settings->icon_view_scale);
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
SHOW_HIDDEN_KEY, settings->show_hidden);
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
SHOW_PREVIEW_PANEL_KEY, settings->show_preview_panel);
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
SHOW_SIZE_COLUMN_KEY, settings->show_size_column);
g_key_file_set_integer (key_file, SETTINGS_GROUP,

View file

@ -56,9 +56,10 @@ struct _GtkFileChooserSettings
int geometry_width;
int geometry_height;
guint settings_read : 1;
guint show_hidden : 1;
guint show_size_column : 1;
guint settings_read : 1;
guint show_hidden : 1;
guint show_preview_panel : 1;
guint show_size_column : 1;
};
struct _GtkFileChooserSettingsClass
@ -86,6 +87,10 @@ gboolean _gtk_file_chooser_settings_get_show_hidden (GtkFileChooserSettings *set
void _gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
gboolean show_hidden);
gboolean _gtk_file_chooser_settings_get_show_preview_panel (GtkFileChooserSettings *settings);
void _gtk_file_chooser_settings_set_show_preview_panel (GtkFileChooserSettings *settings,
gboolean show_preview_panel);
gboolean _gtk_file_chooser_settings_get_show_size_column (GtkFileChooserSettings *settings);
void _gtk_file_chooser_settings_set_show_size_column (GtkFileChooserSettings *settings,
gboolean show_column);