summaryrefslogtreecommitdiff
path: root/src/trg-torrent-model.c
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-21 22:17:01 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-04-21 22:17:01 +0000
commit682ae4d2444dfb7ddb4d35c578bf3656bca59922 (patch)
tree679bd4a5c136e951494a0b369e3452ed5135a1c8 /src/trg-torrent-model.c
parent004fe9ed03adf35a62ee714319cf3b49887afde0 (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.c42
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,