summaryrefslogtreecommitdiff
path: root/src/trg-files-model.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.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.c')
-rw-r--r--src/trg-files-model.c92
1 files changed, 23 insertions, 69 deletions
diff --git a/src/trg-files-model.c b/src/trg-files-model.c
index b5dc34e..2280d49 100644
--- a/src/trg-files-model.c
+++ b/src/trg-files-model.c
@@ -44,78 +44,33 @@ struct _TrgFilesModelPrivate {
gboolean accept;
};
-static void iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter,
- GtkTreeRowReference ** rr)
-{
- GtkTreePath *path = gtk_tree_model_get_path(model, iter);
-
- if (*rr)
- gtk_tree_row_reference_free(*rr);
-
- *rr = gtk_tree_row_reference_new(model, path);
- gtk_tree_path_free(path);
-}
-
-static void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr,
- GtkTreeIter * iter)
-{
- GtkTreePath *path = gtk_tree_row_reference_get_path(rr);
- gtk_tree_model_get_iter(model, iter, path);
- gtk_tree_path_free(path);
-}
-
-struct UpdateParentProgressForeachData {
- GtkTreeIter *descendentIter;
- gint64 increment;
-};
-
-static gboolean trg_files_update_parent_progress_foreachfunc(GtkTreeModel *
- model,
- GtkTreePath *
- path,
- GtkTreeIter *
- iter,
- gpointer data)
+static void trg_files_update_parent_progress(GtkTreeModel * model,
+ GtkTreeIter * iter,
+ gint64 increment)
{
- struct UpdateParentProgressForeachData *args =
- (struct UpdateParentProgressForeachData *) data;
+ GtkTreeIter back_iter = *iter;
- GtkTreePath *descendentPath = gtk_tree_model_get_path(model,
- args->
- descendentIter);
+ if (increment < 1)
+ return;
- if (gtk_tree_path_is_ancestor(path, descendentPath)) {
+ while (1) {
+ GtkTreeIter tmp_iter;
gint64 lastCompleted, newCompleted, length;
- gtk_tree_model_get(model, iter, FILESCOL_BYTESCOMPLETED,
+ if (!gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter))
+ break;
+
+ gtk_tree_model_get(model, &tmp_iter, FILESCOL_BYTESCOMPLETED,
&lastCompleted, FILESCOL_SIZE, &length, -1);
- newCompleted = lastCompleted + args->increment;
+ newCompleted = lastCompleted + increment;
- gtk_tree_store_set(GTK_TREE_STORE(model), iter,
+ gtk_tree_store_set(GTK_TREE_STORE(model), &tmp_iter,
FILESCOL_BYTESCOMPLETED, newCompleted,
FILESCOL_PROGRESS, file_get_progress(length,
newCompleted),
-1);
- }
-
- gtk_tree_path_free(descendentPath);
-
- return FALSE;
-}
-
-static void trg_files_update_parent_progress(GtkTreeModel * model,
- GtkTreeIter * iter,
- gint64 increment)
-{
- if (increment > 0) {
- struct UpdateParentProgressForeachData args;
- args.descendentIter = iter;
- args.increment = increment;
-
- gtk_tree_model_foreach(GTK_TREE_MODEL(model),
- trg_files_update_parent_progress_foreachfunc,
- &args);
+ back_iter = tmp_iter;
}
}
@@ -234,8 +189,7 @@ static void trg_files_model_iter_update(TrgFilesModel * model,
gboolean wanted =
json_node_get_int(json_array_get_element(wantedArray, id))
== 1;
- gint priority =
- (gint)
+ gint priority = (gint)
json_node_get_int(json_array_get_element(prioritiesArray, id));
gdouble progress = file_get_progress(fileLength, fileCompleted);
@@ -261,13 +215,13 @@ static void trg_files_model_iter_update(TrgFilesModel * model,
priority, -1);
if (isFirst) {
- trg_files_tree_model_propogateChangeUp(GTK_TREE_MODEL(model),
- filesIter,
- FILESCOL_PRIORITY,
- priority);
- trg_files_tree_model_propogateChangeUp(GTK_TREE_MODEL(model),
- filesIter, FILESCOL_WANTED,
- wanted);
+ trg_files_tree_model_propogate_change_up(GTK_TREE_MODEL(model),
+ filesIter,
+ FILESCOL_PRIORITY,
+ priority);
+ trg_files_tree_model_propogate_change_up(GTK_TREE_MODEL(model),
+ filesIter,
+ FILESCOL_WANTED, wanted);
}
}