diff options
author | 2011-04-21 22:17:01 +0000 | |
---|---|---|
committer | 2011-04-21 22:17:01 +0000 | |
commit | 682ae4d2444dfb7ddb4d35c578bf3656bca59922 (patch) | |
tree | 679bd4a5c136e951494a0b369e3452ed5135a1c8 /src/trg-torrent-model.c | |
parent | 004fe9ed03adf35a62ee714319cf3b49887afde0 (diff) |
only lookup the selected torrent id when it changes, remember it until checking every update, use the hash table instead. also fix a crash on multiple consecutive deletes caused by gtktreemodel weirdness.
Diffstat (limited to 'src/trg-torrent-model.c')
-rw-r--r-- | src/trg-torrent-model.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c index c32e585..4c8add8 100644 --- a/src/trg-torrent-model.c +++ b/src/trg-torrent-model.c @@ -37,6 +37,8 @@ enum { TMODEL_SIGNAL_COUNT }; +#define PROP_REMOVE_IN_PROGRESS "remove-in-progress" + static guint signals[TMODEL_SIGNAL_COUNT] = { 0 }; G_DEFINE_TYPE(TrgTorrentModel, trg_torrent_model, GTK_TYPE_LIST_STORE) @@ -94,7 +96,6 @@ static void trg_torrent_model_class_init(TrgTorrentModelClass * klass) G_STRUCT_OFFSET(TrgTorrentModelClass, torrent_removed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - } static void trg_torrent_model_count_peers(TrgTorrentModel * model, @@ -132,8 +133,14 @@ static void trg_torrent_model_ref_free(gpointer data) GtkTreePath *path = gtk_tree_row_reference_get_path(rr); if (path) { GtkTreeIter iter; - if (gtk_tree_model_get_iter(model, &iter, path)) + JsonObject *json; + if (gtk_tree_model_get_iter(model, &iter, path)) { + gtk_tree_model_get(model, &iter, TORRENT_COLUMN_JSON, &json, -1); + json_object_unref(json); + g_object_set_data(G_OBJECT(model), PROP_REMOVE_IN_PROGRESS, GINT_TO_POINTER(TRUE)); gtk_list_store_remove(GTK_LIST_STORE(model), &iter); + g_object_set_data(G_OBJECT(model), PROP_REMOVE_IN_PROGRESS, GINT_TO_POINTER(FALSE)); + } gtk_tree_path_free(path); } @@ -173,6 +180,13 @@ static void trg_torrent_model_init(TrgTorrentModel * self) g_hash_table_new_full(g_int64_hash, g_int64_equal, (GDestroyNotify) g_free, trg_torrent_model_ref_free); + + g_object_set_data(G_OBJECT(self), PROP_REMOVE_IN_PROGRESS, GINT_TO_POINTER(FALSE)); +} + +gboolean trg_torrent_model_is_remove_in_progress(TrgTorrentModel *model) +{ + return (gboolean)GPOINTER_TO_INT(g_object_get_data(G_OBJECT(model), PROP_REMOVE_IN_PROGRESS)); } static guint32 torrent_get_flags(JsonObject * t, gint64 status) @@ -384,6 +398,30 @@ GList *trg_torrent_model_find_removed(GtkTreeModel * model, return args.toRemove; } +gboolean get_torrent_data(GHashTable *table, gint64 id, JsonObject **t, GtkTreeIter *out_iter) +{ + gpointer result = g_hash_table_lookup(table, &id); + gboolean found = FALSE; + + if (result) { + GtkTreeRowReference *rr = (GtkTreeRowReference*)result; + GtkTreePath *path = gtk_tree_row_reference_get_path(rr); + GtkTreeIter iter; + if (path) { + GtkTreeModel *model = gtk_tree_row_reference_get_model(rr); + gtk_tree_model_get_iter(model, &iter, path); + if (out_iter) + *out_iter = iter; + if (t) + gtk_tree_model_get(model, &iter, TORRENT_COLUMN_JSON, t, -1); + found = TRUE; + gtk_tree_path_free(path); + } + } + + return found; +} + void trg_torrent_model_update(TrgTorrentModel * model, trg_client * tc, JsonObject * response, trg_torrent_model_update_stats * stats, |