gtkfilechooser: improve preview panel
This commit is contained in:
parent
2a67316003
commit
281f231d73
4 changed files with 538 additions and 14 deletions
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue