summaryrefslogtreecommitdiff
path: root/src/trg-files-model-common.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-08 00:52:56 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-08 00:52:56 +0000
commite1b13312f975f38d3d7437f28299912eff6947e0 (patch)
tree563d1d7937ce87915e2055d9b2f1dae37d2b9b71 /src/trg-files-model-common.c
parent0a1fa495bd2186c2004fbc0f8977fe52a5f82168 (diff)
fix the performance problems with the torrent add dialog on torrents with many files/dirs. the parent size updates just walks up parents rather than a full foreach, and the inserts try to use the previous update to speed up finding/creating the directories. I'll probably do something similar to the main files treeview.
Diffstat (limited to 'src/trg-files-model-common.c')
-rw-r--r--src/trg-files-model-common.c80
1 files changed, 27 insertions, 53 deletions
diff --git a/src/trg-files-model-common.c b/src/trg-files-model-common.c
index ea23c03..6c4e41f 100644
--- a/src/trg-files-model-common.c
+++ b/src/trg-files-model-common.c
@@ -41,8 +41,8 @@ static void set_wanted_foreachfunc(GtkTreeModel * model,
gtk_tree_store_set(GTK_TREE_STORE(model), iter, args->column,
args->new_value, -1);
- trg_files_tree_model_setSubtree(model, path, iter, args->column,
- args->new_value);
+ trg_files_tree_model_set_subtree(model, path, iter, args->column,
+ args->new_value);
}
static void set_priority_foreachfunc(GtkTreeModel * model,
@@ -58,8 +58,8 @@ static void set_priority_foreachfunc(GtkTreeModel * model,
gtk_tree_store_set_value(GTK_TREE_STORE(model), iter, args->column,
&value);
- trg_files_tree_model_setSubtree(model, path, iter, args->column,
- args->new_value);
+ trg_files_tree_model_set_subtree(model, path, iter, args->column,
+ args->new_value);
}
void trg_files_model_set_wanted(GtkTreeView * tv, gint column,
@@ -108,9 +108,9 @@ static gboolean setSubtreeForeach(GtkTreeModel * model, GtkTreePath * path,
return FALSE; /* keep walking */
}
-void trg_files_tree_model_propogateChangeUp(GtkTreeModel * model,
- GtkTreeIter * iter,
- gint column, gint new_value)
+void trg_files_tree_model_propogate_change_up(GtkTreeModel * model,
+ GtkTreeIter * iter,
+ gint column, gint new_value)
{
GtkTreeIter back_iter = *iter;
gint result = new_value;
@@ -146,10 +146,10 @@ void trg_files_tree_model_propogateChangeUp(GtkTreeModel * model,
}
}
-void trg_files_tree_model_setSubtree(GtkTreeModel * model,
- GtkTreePath * path,
- GtkTreeIter * iter, gint column,
- gint new_value)
+void trg_files_tree_model_set_subtree(GtkTreeModel * model,
+ GtkTreePath * path,
+ GtkTreeIter * iter, gint column,
+ gint new_value)
{
GtkTreeIter back_iter = *iter;
@@ -166,52 +166,26 @@ void trg_files_tree_model_setSubtree(GtkTreeModel * model,
new_value, -1);
}
- trg_files_tree_model_propogateChangeUp(model, iter, column, new_value);
+ trg_files_tree_model_propogate_change_up(model, iter, column,
+ new_value);
}
-struct UpdateParentsSizeForeachData {
- gint size_column;
- GtkTreeIter *descendent_iter;
-};
-
-static gboolean trg_files_model_update_parents_size_foreach(GtkTreeModel *
- model,
- GtkTreePath *
- path,
- GtkTreeIter *
- iter,
- gpointer data)
+void trg_files_model_update_parents(GtkTreeModel * model,
+ GtkTreeIter * iter, gint size_column)
{
- struct UpdateParentsSizeForeachData *args =
- (struct UpdateParentsSizeForeachData *) data;
-
- GtkTreePath *descendentPath = gtk_tree_model_get_path(model,
- args->
- descendent_iter);
-
- if (gtk_tree_path_is_ancestor(path, descendentPath)
- && gtk_tree_model_get_iter(model, args->descendent_iter,
- descendentPath)) {
- gint64 size, oldSize;
- gtk_tree_model_get(model, args->descendent_iter, args->size_column,
- &size, -1);
- gtk_tree_model_get(model, iter, args->size_column, &oldSize, -1);
- gtk_tree_store_set(GTK_TREE_STORE(model), iter, args->size_column,
- size + oldSize, -1);
- }
+ GtkTreeIter back_iter = *iter;
+ GtkTreeIter tmp_iter;
+ gint64 size, oldSize;
- gtk_tree_path_free(descendentPath);
+ if (!gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter))
+ return;
- return FALSE;
-}
+ gtk_tree_model_get(model, iter, size_column, &size, -1);
-void trg_files_model_update_parents(GtkTreeModel * model,
- GtkTreeIter * iter, gint size_column)
-{
- struct UpdateParentsSizeForeachData args;
- args.descendent_iter = iter;
- args.size_column = size_column;
- gtk_tree_model_foreach(model,
- trg_files_model_update_parents_size_foreach,
- &args);
+ do {
+ gtk_tree_model_get(model, &tmp_iter, size_column, &oldSize, -1);
+ gtk_tree_store_set(GTK_TREE_STORE(model), &tmp_iter, size_column,
+ size + oldSize, -1);
+ back_iter = tmp_iter;
+ } while (gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter));
}