summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-17 23:36:41 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-17 23:36:41 +0000
commitbfff941cb7fdb428de57971831e39e3cf660112b (patch)
treee74ff5edb16e7c296f89e9d895a927de80916188
parent973aaa9d9a020e1644ce2fe45fd3613422f6ada9 (diff)
tracker manipulation almost complete, addition needs some work. configurable update interval.
-rw-r--r--src/transmission-remote-gtk.schemas13
-rw-r--r--src/trg-client.c10
-rw-r--r--src/trg-client.h2
-rw-r--r--src/trg-files-model.c4
-rw-r--r--src/trg-main-window.c9
-rw-r--r--src/trg-preferences-dialog.c37
-rw-r--r--src/trg-preferences.h1
-rw-r--r--src/trg-torrent-tree-view.c2
-rw-r--r--src/trg-trackers-model.c47
-rw-r--r--src/trg-trackers-model.h7
-rw-r--r--src/trg-trackers-tree-view.c123
-rw-r--r--src/trg-trackers-tree-view.h3
12 files changed, 234 insertions, 24 deletions
diff --git a/src/transmission-remote-gtk.schemas b/src/transmission-remote-gtk.schemas
index 81b6fc6..6e8f784 100644
--- a/src/transmission-remote-gtk.schemas
+++ b/src/transmission-remote-gtk.schemas
@@ -80,6 +80,19 @@
</schema>
<schema>
+ <key>/schemas/apps/transmission-remote-gtk/update-interval</key>
+ <applyto>/apps/transmission-remote-gtk/update-interval</applyto>
+ <owner>transmission-remote-gtk</owner>
+ <type>int</type>
+ <default>3</default>
+
+ <locale name="C">
+ <short>Update interval seconds</short>
+ <long>Update interval seconds</long>
+ </locale>
+ </schema>
+
+ <schema>
<key>/schemas/apps/transmission-remote-gtk/window-height</key>
<applyto>/apps/transmission-remote-gtk/window-height</applyto>
<owner>transmission-remote-gtk</owner>
diff --git a/src/trg-client.c b/src/trg-client.c
index bb8dd68..8e7c46a 100644
--- a/src/trg-client.c
+++ b/src/trg-client.c
@@ -24,6 +24,11 @@
#include "trg-client.h"
#include "trg-preferences.h"
+gboolean trg_client_supports_tracker_edit(trg_client *tc)
+{
+ return tc->session != NULL && tc->version >= 2.10;
+}
+
trg_client *trg_init_client()
{
trg_client *client;
@@ -78,6 +83,11 @@ int trg_client_populate_with_settings(trg_client * tc, GConfClient * gconf)
tc->ssl ? "https" : "http", host, port);
g_free(host);
+ tc->interval = gconf_client_get_int(gconf, TRG_GCONF_KEY_UPDATE_INTERVAL, &error);
+ check_for_error(error);
+ if (tc->interval < 1)
+ tc->interval = 3;
+
tc->username =
gconf_client_get_string(gconf, TRG_GCONF_KEY_USERNAME, &error);
check_for_error(error);
diff --git a/src/trg-client.h b/src/trg-client.h
index 51f3100..60086e6 100644
--- a/src/trg-client.h
+++ b/src/trg-client.h
@@ -31,6 +31,7 @@
typedef struct {
char *session_id;
gint failCount;
+ gint interval;
gint64 updateSerial;
JsonObject *session;
gboolean ssl;
@@ -47,5 +48,6 @@ trg_client *trg_init_client();
int trg_client_populate_with_settings(trg_client * tc,
GConfClient * gconf);
void trg_client_set_session(trg_client *tc, JsonObject *session);
+gboolean trg_client_supports_tracker_edit(trg_client *tc);
#endif /* TRG_CLIENT_H_ */
diff --git a/src/trg-files-model.c b/src/trg-files-model.c
index 874ddf7..3800545 100644
--- a/src/trg-files-model.c
+++ b/src/trg-files-model.c
@@ -80,7 +80,7 @@ trg_files_model_iter_update(TrgFilesModel * model,
FILESCOL_PROGRESS, progress, -1);
if (priv->updateBarrier < 0
- || priv->currentSerial >= priv->updateBarrier) {
+ || priv->currentSerial > priv->updateBarrier) {
gtk_list_store_set(GTK_LIST_STORE(model), filesIter,
FILESCOL_ICON,
wanted ? GTK_STOCK_FILE :
@@ -139,7 +139,7 @@ trg_files_model_update(TrgFilesModel * model, gint64 updateSerial,
TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model);
guint j;
- if (first == TRUE)
+ if (first)
gtk_list_store_clear(GTK_LIST_STORE(model));
priv->torrentId = torrent_get_id(t);
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 6ef29c5..20e3185 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -771,7 +771,7 @@ GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win)
priv->trackersModel = trg_trackers_model_new();
priv->trackersTreeView =
- trg_trackers_tree_view_new(priv->trackersModel, priv->client);
+ trg_trackers_tree_view_new(priv->trackersModel, priv->client, win);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
my_scrolledwin_new(GTK_WIDGET
(priv->trackersTreeView)),
@@ -988,6 +988,9 @@ torrent_selection_changed(GtkWidget * w G_GNUC_UNUSED, gpointer data)
trg_toolbar_torrent_actions_sensitive(priv->toolBar, isSelected);
trg_menu_bar_torrent_actions_sensitive(priv->menuBar, isSelected);
+ if (!isSelected)
+ trg_trackers_model_set_no_selection(TRG_TRACKERS_MODEL(priv->trackersModel));
+
return TRUE;
}
@@ -1051,7 +1054,7 @@ on_torrent_get_multipurpose(JsonObject * response, gboolean first,
statusBarMsg);
g_free((gpointer) msg);
g_free(statusBarMsg);
- g_timeout_add_seconds(3, trg_update_torrents_timerfunc, data);
+ g_timeout_add_seconds(client->interval, trg_update_torrents_timerfunc, data);
}
gdk_threads_leave();
response_unref(response);
@@ -1078,7 +1081,7 @@ on_torrent_get_multipurpose(JsonObject * response, gboolean first,
trg_status_bar_update(priv->statusBar, &stats);
- g_timeout_add_seconds(3, trg_update_torrents_timerfunc, data);
+ g_timeout_add_seconds(client->interval, trg_update_torrents_timerfunc, data);
gdk_threads_leave();
response_unref(response);
diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c
index 15616af..141fb8c 100644
--- a/src/trg-preferences-dialog.c
+++ b/src/trg-preferences-dialog.c
@@ -41,6 +41,7 @@ G_DEFINE_TYPE(TrgPreferencesDialog, trg_preferences_dialog,
enum {
PROP_0,
PROP_GCONF_CLIENT,
+ PROP_TRG_CLIENT,
PROP_MAIN_WINDOW
};
@@ -49,6 +50,7 @@ enum {
struct _TrgPreferencesDialogPrivate {
GConfClient *gconf;
TrgMainWindow *win;
+ trg_client *client;
};
static GObject *instance = NULL;
@@ -69,6 +71,9 @@ trg_preferences_dialog_set_property(GObject * object,
case PROP_MAIN_WINDOW:
priv->win = g_value_get_object(value);
break;
+ case PROP_TRG_CLIENT:
+ priv->client = g_value_get_pointer(value);
+ break;
}
}
@@ -76,11 +81,8 @@ static void
trg_preferences_response_cb(GtkDialog * dlg, gint res_id,
gpointer data G_GNUC_UNUSED)
{
- switch (res_id) {
- default:
gtk_widget_destroy(GTK_WIDGET(dlg));
instance = NULL;
- }
}
static void
@@ -99,6 +101,9 @@ trg_preferences_dialog_get_property(GObject * object,
case PROP_MAIN_WINDOW:
g_value_set_object(value, priv->win);
break;
+ case PROP_TRG_CLIENT:
+ g_value_set_pointer(value, priv->client);
+ break;
}
}
@@ -127,6 +132,12 @@ static GtkWidget *new_check_button(GConfClient * gconf,
return w;
}
+static void interval_changed_cb(GtkWidget *w, gpointer data)
+{
+ trg_client *client = (trg_client*)data;
+ client->interval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(w));
+}
+
static void spun_cb_int(GtkWidget * widget, gpointer gconf)
{
gchar *key;
@@ -251,7 +262,7 @@ static GtkWidget *trg_prefs_desktopPage(GConfClient * gconf,
return t;
}
-static GtkWidget *trg_prefs_serverPage(GConfClient * gconf)
+static GtkWidget *trg_prefs_serverPage(GConfClient * gconf, trg_client *client)
{
GtkWidget *w, *t;
gint row = 0;
@@ -273,6 +284,10 @@ static GtkWidget *trg_prefs_serverPage(GConfClient * gconf)
w = new_check_button(gconf, "SSL", TRG_GCONF_KEY_SSL);
hig_workarea_add_wide_control(t, &row, w);
+ w = new_spin_button(gconf, TRG_GCONF_KEY_UPDATE_INTERVAL, 1, 60, 1);
+ g_signal_connect(w, "value-changed", G_CALLBACK(interval_changed_cb), client);
+ hig_workarea_add_row(t, &row, "Update interval:", w, NULL);
+
hig_workarea_add_section_divider(t, &row);
hig_workarea_add_section_title(t, &row, "Authentication");
@@ -318,7 +333,7 @@ static GObject *trg_preferences_dialog_constructor(GType type,
notebook = gtk_notebook_new();
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
- trg_prefs_serverPage(priv->gconf),
+ trg_prefs_serverPage(priv->gconf, priv->client),
gtk_label_new("Connection"));
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
@@ -345,6 +360,17 @@ trg_preferences_dialog_class_init(TrgPreferencesDialogClass * class)
g_object_class->get_property = trg_preferences_dialog_get_property;
g_object_class_install_property(g_object_class,
+ PROP_TRG_CLIENT,
+ g_param_spec_pointer
+ ("trg-client", "TClient",
+ "Client",
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_NAME |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property(g_object_class,
PROP_GCONF_CLIENT,
g_param_spec_object("gconf-client",
"GConf Client",
@@ -385,6 +411,7 @@ GtkWidget *trg_preferences_dialog_get_instance(TrgMainWindow * win,
if (instance == NULL) {
instance = g_object_new(TRG_TYPE_PREFERENCES_DIALOG,
"main-window", win,
+ "trg-client", client,
"gconf-client", client, NULL);
}
diff --git a/src/trg-preferences.h b/src/trg-preferences.h
index d2a53a4..b43f85b 100644
--- a/src/trg-preferences.h
+++ b/src/trg-preferences.h
@@ -26,6 +26,7 @@
#define TRG_GCONF_KEY_PASSWORD "/apps/transmission-remote-gtk/password"
#define TRG_GCONF_KEY_AUTO_CONNECT "/apps/transmission-remote-gtk/auto-connect"
#define TRG_GCONF_KEY_SSL "/apps/transmission-remote-gtk/ssl"
+#define TRG_GCONF_KEY_UPDATE_INTERVAL "/apps/transmission-remote-gtk/update-interval"
#define TRG_GCONF_KEY_COMPLETE_NOTIFY "/apps/transmission-remote-gtk/complete-notify"
#define TRG_GCONF_KEY_ADD_NOTIFY "/apps/transmission-remote-gtk/add-notify"
#define TRG_GCONF_KEY_WINDOW_WIDTH "/apps/transmission-remote-gtk/window-width"
diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c
index b68bead..8f9e8c4 100644
--- a/src/trg-torrent-tree-view.c
+++ b/src/trg-torrent-tree-view.c
@@ -94,7 +94,7 @@ gint get_first_selected(trg_client * client, TrgTorrentTreeView * view,
return id;
}
-void
+static void
trg_torrent_model_get_json_id_array_foreach(GtkTreeModel * model,
GtkTreePath *
path G_GNUC_UNUSED,
diff --git a/src/trg-trackers-model.c b/src/trg-trackers-model.c
index 739efd6..500adcd 100644
--- a/src/trg-trackers-model.c
+++ b/src/trg-trackers-model.c
@@ -28,16 +28,44 @@
G_DEFINE_TYPE(TrgTrackersModel, trg_trackers_model, GTK_TYPE_LIST_STORE)
+#define TRG_TRACKERS_MODEL_GET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_TRACKERS_MODEL, TrgTrackersModelPrivate))
+typedef struct _TrgTrackersModelPrivate TrgTrackersModelPrivate;
+
+struct _TrgTrackersModelPrivate {
+ gint64 torrentId;
+ gint64 updateBarrier;
+};
+
+void trg_trackers_model_set_no_selection(TrgTrackersModel * model)
+{
+ TrgTrackersModelPrivate *priv = TRG_TRACKERS_MODEL_GET_PRIVATE(model);
+ priv->torrentId = -1;
+}
+
+gint64 trg_trackers_model_get_torrent_id(TrgTrackersModel * model)
+{
+ TrgTrackersModelPrivate *priv = TRG_TRACKERS_MODEL_GET_PRIVATE(model);
+ return priv->torrentId;
+}
+
void trg_trackers_model_update(TrgTrackersModel * model, gint64 updateSerial, JsonObject * t, gboolean first)
{
+ TrgTrackersModelPrivate *priv = TRG_TRACKERS_MODEL_GET_PRIVATE(model);
+
guint j;
JsonArray *trackers;
const gchar *announce;
const gchar *scrape;
- trackers = torrent_get_trackers(t);
+ if (first) {
+ gtk_list_store_clear(GTK_LIST_STORE(model));
+ priv->torrentId = torrent_get_id(t);
+ } else if (priv->updateBarrier == TRACKERS_UPDATE_BARRIER_FULL || (priv->updateBarrier >= 0 && priv->updateBarrier > updateSerial)) {
+ return;
+ }
- gtk_list_store_clear(GTK_LIST_STORE(model));
+ trackers = torrent_get_trackers(t);
for (j = 0; j < json_array_get_length(trackers); j++) {
GtkTreeIter trackIter;
@@ -80,12 +108,22 @@ void trg_trackers_model_update(TrgTrackersModel * model, gint64 updateSerial, Js
}
static void
-trg_trackers_model_class_init(TrgTrackersModelClass * klass G_GNUC_UNUSED)
+trg_trackers_model_class_init(TrgTrackersModelClass * klass)
+{
+ g_type_class_add_private(klass, sizeof(TrgTrackersModelPrivate));
+}
+
+void trg_trackers_model_set_update_barrier(TrgTrackersModel * model,
+ gint64 barrier)
{
+ TrgTrackersModelPrivate *priv = TRG_TRACKERS_MODEL_GET_PRIVATE(model);
+ priv->updateBarrier = barrier;
}
static void trg_trackers_model_init(TrgTrackersModel * self)
{
+ TrgTrackersModelPrivate *priv = TRG_TRACKERS_MODEL_GET_PRIVATE(self);
+
GType column_types[TRACKERCOL_COLUMNS];
column_types[TRACKERCOL_ICON] = G_TYPE_STRING;
@@ -95,6 +133,9 @@ static void trg_trackers_model_init(TrgTrackersModel * self)
column_types[TRACKERCOL_ID] = G_TYPE_INT64;
column_types[TRACKERCOL_UPDATESERIAL] = G_TYPE_INT64;
+ priv->updateBarrier = TRACKERS_UPDATE_BARRIER_NONE;
+ priv->torrentId = -1;
+
gtk_list_store_set_column_types(GTK_LIST_STORE(self),
TRACKERCOL_COLUMNS, column_types);
}
diff --git a/src/trg-trackers-model.h b/src/trg-trackers-model.h
index 13e6c56..735249b 100644
--- a/src/trg-trackers-model.h
+++ b/src/trg-trackers-model.h
@@ -23,6 +23,9 @@
#include <glib-object.h>
#include <json-glib/json-glib.h>
+#define TRACKERS_UPDATE_BARRIER_NONE -1
+#define TRACKERS_UPDATE_BARRIER_FULL -2
+
G_BEGIN_DECLS
#define TRG_TYPE_TRACKERS_MODEL trg_trackers_model_get_type()
#define TRG_TRACKERS_MODEL(obj) \
@@ -50,6 +53,10 @@ TrgTrackersModel *trg_trackers_model_new(void);
G_END_DECLS
void trg_trackers_model_update(TrgTrackersModel * model, gint64 updateSerial, JsonObject * t, gboolean first);
+void trg_trackers_model_set_update_barrier(TrgTrackersModel * model,
+ gint64 serial);
+gint64 trg_trackers_model_get_torrent_id(TrgTrackersModel * model);
+void trg_trackers_model_set_no_selection(TrgTrackersModel * model);
enum {
TRACKERCOL_ICON,
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 <gtk/gtk.h>
-#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);
}
diff --git a/src/trg-trackers-tree-view.h b/src/trg-trackers-tree-view.h
index 2b58c2a..0f03bfa 100644
--- a/src/trg-trackers-tree-view.h
+++ b/src/trg-trackers-tree-view.h
@@ -26,6 +26,7 @@
#include "trg-trackers-model.h"
#include "trg-tree-view.h"
#include "trg-client.h"
+#include "trg-main-window.h"
G_BEGIN_DECLS
#define TRG_TYPE_TRACKERS_TREE_VIEW trg_trackers_tree_view_get_type()
@@ -49,7 +50,7 @@ typedef struct {
GType trg_trackers_tree_view_get_type(void);
-TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, trg_client *client);
+TrgTrackersTreeView *trg_trackers_tree_view_new(TrgTrackersModel * model, trg_client *client, TrgMainWindow *win);
void trg_trackers_tree_view_new_connection(TrgTrackersTreeView *tv, trg_client *tc);
G_END_DECLS