[gthumb] folder tree: do not allow to expand a duplicate of an entry point
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] folder tree: do not allow to expand a duplicate of an entry point
- Date: Sun, 30 Dec 2012 10:19:36 +0000 (UTC)
commit bcc0ed40c2bc05aef78b28ed73becb13196bc4d6
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sat Dec 29 17:10:19 2012 +0100
folder tree: do not allow to expand a duplicate of an entry point
gthumb/gth-folder-tree.c | 68 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 66 insertions(+), 2 deletions(-)
---
diff --git a/gthumb/gth-folder-tree.c b/gthumb/gth-folder-tree.c
index c88dbf8..96a519b 100644
--- a/gthumb/gth-folder-tree.c
+++ b/gthumb/gth-folder-tree.c
@@ -74,6 +74,8 @@ enum {
struct _GthFolderTreePrivate
{
GFile *root;
+ GHashTable *entry_points; /* An entry point is a root child */
+ gboolean recalc_entry_points;
GtkTreeStore *tree_store;
GthIconCache *icon_cache;
GtkCellRenderer *text_renderer;
@@ -111,9 +113,11 @@ gth_folder_tree_finalize (GObject *object)
gtk_target_list_unref (folder_tree->priv->drag_target_list);
folder_tree->priv->drag_target_list = NULL;
}
+ g_hash_table_unref (folder_tree->priv->entry_points);
if (folder_tree->priv->root != NULL)
g_object_unref (folder_tree->priv->root);
gth_icon_cache_free (folder_tree->priv->icon_cache);
+
g_free (folder_tree->priv);
folder_tree->priv = NULL;
}
@@ -942,6 +946,59 @@ _gth_folder_tree_iter_has_no_child (GthFolderTree *folder_tree,
}
+static void
+_gth_folder_tree_update_entry_points (GthFolderTree *folder_tree)
+{
+ GtkTreeIter iter;
+
+ if (! folder_tree->priv->recalc_entry_points)
+ return;
+
+ folder_tree->priv->recalc_entry_points = FALSE;
+
+ g_hash_table_remove_all (folder_tree->priv->entry_points);
+
+ if (! gtk_tree_model_iter_children (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter, NULL))
+ return;
+
+ do {
+ GthFileData *file_data;
+ EntryType file_entry_type;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter,
+ COLUMN_FILE_DATA, &file_data,
+ COLUMN_TYPE, &file_entry_type,
+ -1);
+ if ((file_entry_type == ENTRY_TYPE_FILE) && (file_data != NULL))
+ g_hash_table_add (folder_tree->priv->entry_points, g_object_ref (file_data->file));
+
+ _g_object_unref (file_data);
+ }
+ while (gtk_tree_model_iter_next (GTK_TREE_MODEL (folder_tree->priv->tree_store), &iter));
+}
+
+
+/*
+ * Returns TRUE if file_data points to a folder contained in the entry point
+ * list but it's not real entry point, for example it returns TRUE for
+ * '/home/user/Images' or '/home/user/Documents'.
+ * This entries are duplicates of the entry points and are treated in a special
+ * way to avoid confusion.
+ * */
+static gboolean
+_gth_folder_tree_is_entry_point_dup (GthFolderTree *folder_tree,
+ GtkTreeIter *iter,
+ GthFileData *file_data)
+{
+ _gth_folder_tree_update_entry_points (folder_tree);
+
+ if (g_hash_table_lookup (folder_tree->priv->entry_points, file_data->file) == NULL)
+ return FALSE;
+
+ return ! g_file_info_get_attribute_boolean (file_data->info, "gthumb::entry-point");
+}
+
+
static gboolean
_gth_folder_tree_add_file (GthFolderTree *folder_tree,
GtkTreeIter *parent,
@@ -969,8 +1026,11 @@ _gth_folder_tree_add_file (GthFolderTree *folder_tree,
COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
-1);
- if (! g_file_info_get_attribute_boolean (fd->info, "gthumb::no-child"))
+ if (! g_file_info_get_attribute_boolean (fd->info, "gthumb::no-child")
+ && ! _gth_folder_tree_is_entry_point_dup (folder_tree, &iter, fd))
+ {
_gth_folder_tree_add_loading_item (folder_tree, &iter, TRUE);
+ }
return TRUE;
}
@@ -1318,8 +1378,8 @@ gth_folder_tree_set_children (GthFolderTree *folder_tree,
gtk_tree_store_set (folder_tree->priv->tree_store, p_parent_iter,
COLUMN_LOADED, TRUE,
-1);
-
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (folder_tree->priv->tree_store), COLUMN_NAME, GTK_SORT_ASCENDING);
+ folder_tree->priv->recalc_entry_points = TRUE;
emit_fake_motion_notify_event (folder_tree);
}
@@ -1422,6 +1482,8 @@ gth_folder_tree_add_children (GthFolderTree *folder_tree,
if (! is_empty)
_gth_folder_tree_remove_child_type (folder_tree, p_parent_iter, ENTRY_TYPE_EMPTY);
+
+ folder_tree->priv->recalc_entry_points = TRUE;
}
@@ -1517,6 +1579,8 @@ gth_folder_tree_delete_children (GthFolderTree *folder_tree,
if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (folder_tree->priv->tree_store), p_parent_iter) > 1)
_gth_folder_tree_remove_child_type (folder_tree, p_parent_iter, ENTRY_TYPE_EMPTY);
+
+ folder_tree->priv->recalc_entry_points = TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]