diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/transmission-remote-gtk.schemas | 13 | ||||
-rw-r--r-- | src/trg-client.c | 10 | ||||
-rw-r--r-- | src/trg-client.h | 2 | ||||
-rw-r--r-- | src/trg-files-model.c | 4 | ||||
-rw-r--r-- | src/trg-main-window.c | 9 | ||||
-rw-r--r-- | src/trg-preferences-dialog.c | 37 | ||||
-rw-r--r-- | src/trg-preferences.h | 1 | ||||
-rw-r--r-- | src/trg-torrent-tree-view.c | 2 | ||||
-rw-r--r-- | src/trg-trackers-model.c | 47 | ||||
-rw-r--r-- | src/trg-trackers-model.h | 7 | ||||
-rw-r--r-- | src/trg-trackers-tree-view.c | 123 | ||||
-rw-r--r-- | src/trg-trackers-tree-view.h | 3 |
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 |