From bfff941cb7fdb428de57971831e39e3cf660112b Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Thu, 17 Feb 2011 23:36:41 +0000 Subject: tracker manipulation almost complete, addition needs some work. configurable update interval. --- src/trg-trackers-tree-view.c | 123 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 9 deletions(-) (limited to 'src/trg-trackers-tree-view.c') diff --git a/src/trg-trackers-tree-view.c b/src/trg-trackers-tree-view.c index ff08a5e..6d9bbdd 100644 --- a/src/trg-trackers-tree-view.c +++ b/src/trg-trackers-tree-view.c @@ -18,11 +18,16 @@ */ #include -#include "trg-trackers-tree-view.h" +#include "trg-trackers-tree-view.h" #include "trg-tree-view.h" #include "trg-client.h" #include "trg-menu-bar.h" +#include "requests.h" +#include "dispatch.h" +#include "json.h" +#include "trg-trackers-model.h" +#include "trg-main-window.h" G_DEFINE_TYPE(TrgTrackersTreeView, trg_trackers_tree_view, TRG_TYPE_TREE_VIEW) @@ -35,19 +40,52 @@ typedef struct _TrgTrackersTreeViewPrivate TrgTrackersTreeViewPrivate; struct _TrgTrackersTreeViewPrivate { trg_client *client; GtkCellRenderer *announceRenderer; + TrgMainWindow *win; }; static void -trg_trackers_tree_view_class_init(TrgTrackersTreeViewClass * - klass G_GNUC_UNUSED) +trg_trackers_tree_view_class_init(TrgTrackersTreeViewClass *klass) { g_type_class_add_private(klass, sizeof(TrgTrackersTreeViewPrivate)); } +static void +trg_trackers_tree_view_json_id_array_foreach(GtkTreeModel * model, + GtkTreePath * + path G_GNUC_UNUSED, + GtkTreeIter * iter, + gpointer data) +{ + JsonArray *output = (JsonArray *) data; + gint64 id; + gtk_tree_model_get(model, iter, TRACKERCOL_ID, &id, -1); + json_array_add_int_element(output, id); +} + +static JsonArray *trackers_build_json_id_array(TrgTrackersTreeView * tv) +{ + GtkTreeSelection *selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); + + JsonArray *ids = json_array_new(); + gtk_tree_selection_selected_foreach(selection, + (GtkTreeSelectionForeachFunc) + trg_trackers_tree_view_json_id_array_foreach, + ids); + + if (json_array_get_length(ids) < 1) + { + json_array_unref(ids); + return NULL; + } + + return ids; +} + void trg_trackers_tree_view_new_connection(TrgTrackersTreeView *tv, trg_client *tc) { TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(tv); - gboolean editable = tc->version >= 2.10; + gboolean editable = trg_client_supports_tracker_edit(tc); g_object_set(priv->announceRenderer, "editable", editable, NULL); g_object_set(priv->announceRenderer, "mode", editable ? GTK_CELL_RENDERER_MODE_EDITABLE : GTK_CELL_RENDERER_MODE_INERT, NULL); @@ -58,12 +96,51 @@ static void trg_tracker_announce_edited(GtkCellRendererText *renderer, gchar *new_text, gpointer user_data) { - GtkTreeView *tv = GTK_TREE_VIEW(user_data); - GtkTreeModel *model = gtk_tree_view_get_model(tv); + TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(user_data); + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(user_data)); + gint64 torrentId = trg_trackers_model_get_torrent_id(TRG_TRACKERS_MODEL(model)); + JsonArray *torrentIds = json_array_new(); + JsonArray *modPairs = json_array_new(); + + gint64 trackerId; + JsonNode *req; + JsonObject *args; GtkTreeIter iter; gtk_tree_model_get_iter_from_string(model, &iter, path); gtk_list_store_set(GTK_LIST_STORE(model), &iter, TRACKERCOL_ANNOUNCE, new_text, -1); + gtk_tree_model_get(model, &iter, TRACKERCOL_ID, &trackerId, -1); + + json_array_add_int_element(torrentIds, torrentId); + + req = torrent_set(torrentIds); + args = node_get_arguments(req); + + json_array_add_int_element(modPairs, trackerId); + json_array_add_string_element(modPairs, new_text); + + json_object_set_array_member(args, "trackerReplace", modPairs); + + trg_trackers_model_set_update_barrier(TRG_TRACKERS_MODEL(model), priv->client->updateSerial+1); + + dispatch_async(priv->client, req, on_generic_interactive_action, priv->win); +} + +static void trg_tracker_announce_editing_started(GtkCellRenderer *renderer, + GtkCellEditable *editable, + gchar *path, + gpointer user_data) +{ + TrgTrackersModel *model = TRG_TRACKERS_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(user_data))); + trg_trackers_model_set_update_barrier(model, TRACKERS_UPDATE_BARRIER_FULL); +} + +static void trg_tracker_announce_editing_canceled(GtkWidget *w, gpointer data) +{ + TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(data); + TrgTrackersModel *model = TRG_TRACKERS_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(data))); + + trg_trackers_model_set_update_barrier(model, priv->client->updateSerial+1); } static void trg_trackers_tree_view_init(TrgTrackersTreeView * self) @@ -77,6 +154,8 @@ static void trg_trackers_tree_view_init(TrgTrackersTreeView * self) priv->announceRenderer = trg_tree_view_add_column(TRG_TREE_VIEW(self), "Announce URL", TRACKERCOL_ANNOUNCE); g_signal_connect(priv->announceRenderer, "edited", G_CALLBACK(trg_tracker_announce_edited), self); + g_signal_connect(priv->announceRenderer, "editing-canceled", G_CALLBACK(trg_tracker_announce_editing_canceled), self); + g_signal_connect(priv->announceRenderer, "editing-started", G_CALLBACK(trg_tracker_announce_editing_started), self); trg_tree_view_add_column(TRG_TREE_VIEW(self), "Scrape URL", TRACKERCOL_SCRAPE); @@ -84,12 +163,36 @@ static void trg_trackers_tree_view_init(TrgTrackersTreeView * self) static void add_tracker(GtkWidget *w, gpointer data) { + GtkTreeView *tv = GTK_TREE_VIEW(data); + GtkTreeModel *model = gtk_tree_view_get_model(tv); + GtkTreeIter iter; + gtk_list_store_append(GTK_LIST_STORE(model), &iter); } static void delete_tracker(GtkWidget *w, gpointer data) { + TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(data); + TrgTrackersTreeView *tv = TRG_TRACKERS_TREE_VIEW(data); + TrgTrackersModel *model = TRG_TRACKERS_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(data))); + + JsonArray *trackerIds, *torrentIds; + JsonNode *req; + JsonObject *args; + + if ((trackerIds = trackers_build_json_id_array(tv)) == NULL) + return; + + torrentIds = json_array_new(); + json_array_add_int_element(torrentIds, trg_trackers_model_get_torrent_id(model)); + + req = torrent_set(torrentIds); + + args = node_get_arguments(req); + + json_object_set_array_member(args, "trackerRemove", trackerIds); + dispatch_async(priv->client, req, on_generic_interactive_action, priv->win); } static void @@ -136,10 +239,11 @@ view_onButtonPressed(GtkWidget * treeview, GdkEventButton * event, gpointer userdata) { TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(treeview); + TrgTrackersModel *model = TRG_TRACKERS_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(treeview))); GtkTreeSelection *selection; GtkTreePath *path; - if (priv->client->version < 2.10) + if (!trg_client_supports_tracker_edit(priv->client)) return FALSE; if (event->type == GDK_BUTTON_PRESS && event->button == 3) { @@ -157,7 +261,7 @@ view_onButtonPressed(GtkWidget * treeview, GdkEventButton * event, view_popup_menu(treeview, event, userdata); return TRUE; - } else { + } else if (trg_trackers_model_get_torrent_id(model) >= 0) { view_popup_menu_add_only(treeview, event, userdata); } } @@ -171,7 +275,7 @@ static gboolean view_onPopupMenu(GtkWidget * treeview, gpointer userdata) return TRUE; } -TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, trg_client *client) +TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, trg_client *client, TrgMainWindow *win) { GObject *obj = g_object_new(TRG_TYPE_TRACKERS_TREE_VIEW, NULL); TrgTrackersTreeViewPrivate *priv = TRG_TRACKERS_TREE_VIEW_GET_PRIVATE(obj); @@ -183,6 +287,7 @@ TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, trg_cl gtk_tree_view_set_model(GTK_TREE_VIEW(obj), GTK_TREE_MODEL(model)); priv->client = client; + priv->win = win; return TRG_TRACKERS_TREE_VIEW(obj); } -- cgit v1.2.3