[gtk+/multiroot-filechooser: 2/30] Update the sidebar entries based on the root URI.
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/multiroot-filechooser: 2/30] Update the sidebar entries based on the root URI.
- Date: Wed, 6 Oct 2010 18:34:53 +0000 (UTC)
commit 40669f960a2ecca059c02e262450eb5246f1aadc
Author: Christian Hammond <chipx86 chipx86 com>
Date: Mon Feb 1 21:50:59 2010 -0800
Update the sidebar entries based on the root URI.
The sidebar generation code has been made more flexible so that it can be
run more than once, instead of assuming it will only ever be run once.
Various sidebar entries are now dependent on the type of root. Search, for
example, only shows up with a file:-based root.
When deciding whether a volume can be added, the root URI is checked to make
sure the volume resides within that root.
gtk/gtkfilechooserdefault.c | 185 +++++++++++++++++++++++++++----------------
1 files changed, 117 insertions(+), 68 deletions(-)
---
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index cb2d196..15f44ea 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -1733,25 +1733,37 @@ shortcuts_insert_file (GtkFileChooserDefault *impl,
static void
shortcuts_append_search (GtkFileChooserDefault *impl)
{
- GdkPixbuf *pixbuf;
- GtkTreeIter iter;
+ gboolean old_changing_folders = impl->changing_folder;
+ impl->changing_folder = TRUE;
+ int start_row = shortcuts_get_index (impl, SHORTCUTS_SEARCH);
- pixbuf = render_search_icon (impl);
+ if (impl->has_search)
+ shortcuts_remove_rows (impl, start_row, 1);
- gtk_list_store_append (impl->shortcuts_model, &iter);
- gtk_list_store_set (impl->shortcuts_model, &iter,
- SHORTCUTS_COL_PIXBUF, pixbuf,
- SHORTCUTS_COL_PIXBUF_VISIBLE, TRUE,
- SHORTCUTS_COL_NAME, _("Search"),
- SHORTCUTS_COL_DATA, NULL,
- SHORTCUTS_COL_TYPE, SHORTCUT_TYPE_SEARCH,
- SHORTCUTS_COL_REMOVABLE, FALSE,
- -1);
+ if (impl->root_uri == NULL || g_str_has_prefix (impl->root_uri, "file:"))
+ {
+ GtkTreeIter iter;
+ GdkPixbuf *pixbuf = render_search_icon (impl);
+
+ gtk_list_store_insert (impl->shortcuts_model, &iter, start_row);
+ gtk_list_store_set (impl->shortcuts_model, &iter,
+ SHORTCUTS_COL_PIXBUF, pixbuf,
+ SHORTCUTS_COL_PIXBUF_VISIBLE, TRUE,
+ SHORTCUTS_COL_NAME, _("Search"),
+ SHORTCUTS_COL_DATA, NULL,
+ SHORTCUTS_COL_TYPE, SHORTCUT_TYPE_SEARCH,
+ SHORTCUTS_COL_REMOVABLE, FALSE,
+ -1);
- if (pixbuf)
- g_object_unref (pixbuf);
+ if (pixbuf)
+ g_object_unref (pixbuf);
- impl->has_search = TRUE;
+ impl->has_search = TRUE;
+ }
+ else
+ impl->has_search = FALSE;
+
+ impl->changing_folder = old_changing_folders;
}
static void
@@ -1759,10 +1771,21 @@ shortcuts_append_recent (GtkFileChooserDefault *impl)
{
GdkPixbuf *pixbuf;
GtkTreeIter iter;
+ gboolean old_changing_folders = impl->changing_folder;
+ int start_row = shortcuts_get_index (impl, SHORTCUTS_RECENT);
+
+ impl->changing_folder = TRUE;
+
+ if (impl->has_recent)
+ {
+ shortcuts_remove_rows (impl,
+ shortcuts_get_index (impl, SHORTCUTS_RECENT_SEPARATOR), 1);
+ shortcuts_remove_rows (impl, start_row, 1);
+ }
pixbuf = render_recent_icon (impl);
- gtk_list_store_append (impl->shortcuts_model, &iter);
+ gtk_list_store_insert (impl->shortcuts_model, &iter, start_row);
gtk_list_store_set (impl->shortcuts_model, &iter,
SHORTCUTS_COL_PIXBUF, pixbuf,
SHORTCUTS_COL_PIXBUF_VISIBLE, TRUE,
@@ -1771,11 +1794,13 @@ shortcuts_append_recent (GtkFileChooserDefault *impl)
SHORTCUTS_COL_TYPE, SHORTCUT_TYPE_RECENT,
SHORTCUTS_COL_REMOVABLE, FALSE,
-1);
-
+
if (pixbuf)
g_object_unref (pixbuf);
impl->has_recent = TRUE;
+
+ impl->changing_folder = old_changing_folders;
}
/* Appends an item for the user's home directory to the shortcuts model */
@@ -1784,12 +1809,24 @@ shortcuts_append_home (GtkFileChooserDefault *impl)
{
const char *home_path;
GFile *home;
+ gboolean old_changing_folders;
+ int start_row;
profile_start ("start", NULL);
+ old_changing_folders = impl->changing_folder;
+ impl->changing_folder = TRUE;
+
+ start_row = shortcuts_get_index (impl, SHORTCUTS_HOME);
+
+ if (impl->has_home)
+ shortcuts_remove_rows (impl, start_row, 1);
+
home_path = g_get_home_dir ();
if (home_path == NULL)
{
+ impl->has_home = FALSE;
+ impl->changing_folder = old_changing_folders;
profile_end ("end - no home directory!?", NULL);
return;
}
@@ -1798,7 +1835,7 @@ shortcuts_append_home (GtkFileChooserDefault *impl)
if (_gtk_file_chooser_is_file_in_root (GTK_FILE_CHOOSER (impl), home))
{
- shortcuts_insert_file (impl, -1, SHORTCUT_TYPE_FILE, NULL, home,
+ shortcuts_insert_file (impl, start_row, SHORTCUT_TYPE_FILE, NULL, home,
NULL, FALSE, SHORTCUTS_HOME);
impl->has_home = TRUE;
}
@@ -1807,6 +1844,8 @@ shortcuts_append_home (GtkFileChooserDefault *impl)
g_object_unref (home);
+ impl->changing_folder = old_changing_folders;
+
profile_end ("end", NULL);
}
@@ -1816,15 +1855,27 @@ shortcuts_append_desktop (GtkFileChooserDefault *impl)
{
const char *name;
GFile *file;
+ gboolean old_changing_folders;
+ int start_row;
profile_start ("start", NULL);
+ old_changing_folders = impl->changing_folder;
+ impl->changing_folder = TRUE;
+
+ start_row = shortcuts_get_index (impl, SHORTCUTS_DESKTOP);
+
+ if (impl->has_desktop)
+ shortcuts_remove_rows (impl, start_row, 1);
+
name = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP);
/* "To disable a directory, point it to the homedir."
* See http://freedesktop.org/wiki/Software/xdg-user-dirs
**/
if (!g_strcmp0 (name, g_get_home_dir ()))
{
+ impl->has_desktop = FALSE;
+ impl->changing_folder = old_changing_folders;
profile_end ("end", NULL);
return;
}
@@ -1833,7 +1884,7 @@ shortcuts_append_desktop (GtkFileChooserDefault *impl)
if (_gtk_file_chooser_is_file_in_root (GTK_FILE_CHOOSER (impl), file))
{
- shortcuts_insert_file (impl, -1, SHORTCUT_TYPE_FILE, NULL,
+ shortcuts_insert_file (impl, start_row, SHORTCUT_TYPE_FILE, NULL,
file, _("Desktop"), FALSE, SHORTCUTS_DESKTOP);
impl->has_desktop = TRUE;
}
@@ -1846,6 +1897,8 @@ shortcuts_append_desktop (GtkFileChooserDefault *impl)
g_object_unref (file);
+ impl->changing_folder = old_changing_folders;
+
profile_end ("end", NULL);
}
@@ -1987,34 +2040,24 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl)
{
GtkFileSystemVolume *volume;
gboolean skip = FALSE;
+ GFile *base_file;
volume = l->data;
- if (impl->local_only)
- {
- if (_gtk_file_system_volume_is_mounted (volume))
- {
- GFile *base_file;
+ base_file = _gtk_file_system_volume_get_root (volume);
- base_file = _gtk_file_system_volume_get_root (volume);
- if (base_file != NULL)
- {
- skip = !g_file_is_native (base_file);
- g_object_unref (base_file);
- }
- }
- }
- else if (impl->root_uri != NULL)
- {
- GFile *base_file = _gtk_file_system_volume_get_root (volume);
+ if (impl->local_only &&
+ _gtk_file_system_volume_is_mounted (volume) &&
+ !g_file_is_native (base_file))
+ skip = TRUE;
+ else if (impl->root_uri != NULL &&
+ (base_file == NULL ||
+ !_gtk_file_chooser_is_file_in_root (GTK_FILE_CHOOSER (impl),
+ base_file)))
+ skip = TRUE;
- if (base_file != NULL)
- {
- skip = !_gtk_file_chooser_is_file_in_root (GTK_FILE_CHOOSER (impl),
- base_file);
- g_object_unref (base_file);
- }
- }
+ if (base_file != NULL)
+ g_object_unref (base_file);
if (skip)
continue;
@@ -2262,39 +2305,45 @@ shortcuts_pane_filter_cb (GtkTreeModel *model,
static void
shortcuts_model_create (GtkFileChooserDefault *impl)
{
- /* Keep this order in sync with the SHORCUTS_COL_* enum values */
- impl->shortcuts_model = gtk_list_store_new (SHORTCUTS_COL_NUM_COLUMNS,
- GDK_TYPE_PIXBUF, /* pixbuf */
- G_TYPE_STRING, /* name */
- G_TYPE_POINTER, /* path or volume */
- G_TYPE_INT, /* ShortcutType */
- G_TYPE_BOOLEAN, /* removable */
- G_TYPE_BOOLEAN, /* pixbuf cell visibility */
- G_TYPE_POINTER); /* GCancellable */
+ if (impl->shortcuts_model == NULL)
+ {
+ /* Keep this order in sync with the SHORCUTS_COL_* enum values */
+ impl->shortcuts_model = gtk_list_store_new (SHORTCUTS_COL_NUM_COLUMNS,
+ GDK_TYPE_PIXBUF, /* pixbuf */
+ G_TYPE_STRING, /* name */
+ G_TYPE_POINTER, /* path or volume */
+ G_TYPE_INT, /* ShortcutType */
+ G_TYPE_BOOLEAN, /* removable */
+ G_TYPE_BOOLEAN, /* pixbuf cell visibility */
+ G_TYPE_POINTER); /* GCancellable */
+ }
shortcuts_append_search (impl);
if (impl->recent_manager)
- {
- shortcuts_append_recent (impl);
- shortcuts_insert_separator (impl, SHORTCUTS_RECENT_SEPARATOR);
- }
+ {
+ shortcuts_append_recent (impl);
+ shortcuts_insert_separator (impl, SHORTCUTS_RECENT_SEPARATOR);
+ }
if (impl->file_system)
- {
- shortcuts_append_home (impl);
- shortcuts_append_desktop (impl);
+ {
+ shortcuts_append_home (impl);
+ shortcuts_append_desktop (impl);
shortcuts_add_volumes (impl);
- }
+ }
- impl->shortcuts_pane_filter_model = shortcuts_pane_model_filter_new (impl,
- GTK_TREE_MODEL (impl->shortcuts_model),
- NULL);
+ if (impl->shortcuts_pane_filter_model == NULL)
+ {
+ impl->shortcuts_pane_filter_model = shortcuts_pane_model_filter_new (impl,
+ GTK_TREE_MODEL (impl->shortcuts_model),
+ NULL);
- gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (impl->shortcuts_pane_filter_model),
- shortcuts_pane_filter_cb,
- impl,
- NULL);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (impl->shortcuts_pane_filter_model),
+ shortcuts_pane_filter_cb,
+ impl,
+ NULL);
+ }
}
/* Callback used when the "New Folder" button is clicked */
@@ -5128,7 +5177,7 @@ set_local_only (GtkFileChooserDefault *impl,
if (impl->shortcuts_model && impl->file_system)
{
- shortcuts_add_volumes (impl);
+ shortcuts_model_create (impl);
shortcuts_add_bookmarks (impl);
}
@@ -5176,7 +5225,7 @@ set_root_uri (GtkFileChooserDefault *impl,
if (impl->shortcuts_model && impl->file_system)
{
/* Update all the sidebar entries to filter the root URI. */
- shortcuts_add_volumes (impl);
+ shortcuts_model_create (impl);
shortcuts_add_bookmarks (impl);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]