From 5d019aa0e7ee5178d697162403819b8cce2f91f8 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Fri, 13 Jan 2012 15:29:10 +0000 Subject: a torrent priority right click menu. change the refresh on interactive action behavior to make sure priority/other changes are refreshed immediately. --- src/requests.c | 13 ++--- src/trg-files-model.c | 11 ++-- src/trg-files-model.h | 5 +- src/trg-main-window.c | 115 ++++++++++++++++++++++++++++++++--------- src/trg-preferences-dialog.c | 3 +- src/trg-remote-prefs-dialog.c | 6 +-- src/trg-torrent-move-dialog.c | 1 - src/trg-torrent-props-dialog.c | 7 +-- src/trg-tree-view.c | 33 ++++-------- 9 files changed, 123 insertions(+), 71 deletions(-) diff --git a/src/requests.c b/src/requests.c index a600396..38e3480 100644 --- a/src/requests.c +++ b/src/requests.c @@ -39,9 +39,11 @@ JsonNode *generic_request(gchar * method, JsonArray * ids) { JsonNode *root = base_request(method); - if (ids) - json_object_set_array_member(node_get_arguments(root), - PARAM_IDS, ids); + if (ids) { + JsonObject *args = node_get_arguments(root); + json_object_set_array_member(args, PARAM_IDS, ids); + request_set_tag_from_ids(root, ids); + } return root; } @@ -273,8 +275,7 @@ void request_set_tag(JsonNode * req, gint64 tag) void request_set_tag_from_ids(JsonNode * req, JsonArray * ids) { gint64 id = - json_array_get_length(ids) == 1 ? json_array_get_int_element(ids, - 0) : - -1; + json_array_get_length(ids) == 1 ? + json_array_get_int_element(ids, 0) : TORRENT_GET_TAG_MODE_FULL; request_set_tag(req, id); } diff --git a/src/trg-files-model.c b/src/trg-files-model.c index 8675237..fc79c73 100644 --- a/src/trg-files-model.c +++ b/src/trg-files-model.c @@ -248,11 +248,8 @@ static void trg_files_model_iter_update(TrgFilesModel * model, gint64 fileCompleted = file_get_bytes_completed(file); gint64 lastCompleted; - gboolean wanted = - json_node_get_int(json_array_get_element(wantedArray, id)) - == 1; - gint priority = (gint) - json_node_get_int(json_array_get_element(prioritiesArray, id)); + gint wanted = (gint) json_array_get_int_element(wantedArray, id); + gint priority = (gint) json_array_get_int_element(prioritiesArray, id); gdouble progress = file_get_progress(fileLength, fileCompleted); gtk_tree_model_get(GTK_TREE_MODEL(model), filesIter, @@ -373,8 +370,8 @@ static gpointer trg_files_model_buildtree_threadfunc(gpointer data) return NULL; } -void trg_files_model_update(TrgFilesModel * model, GtkTreeView *tv, - gint64 updateSerial, JsonObject * t, gint mode) +void trg_files_model_update(TrgFilesModel * model, GtkTreeView * tv, + gint64 updateSerial, JsonObject * t, gint mode) { TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model); JsonArray *files = torrent_get_files(t); diff --git a/src/trg-files-model.h b/src/trg-files-model.h index 1b98246..b76b456 100644 --- a/src/trg-files-model.h +++ b/src/trg-files-model.h @@ -62,8 +62,9 @@ G_END_DECLS enum { #define TRG_FILES_MODEL_CREATE_THREAD_IF_GT 600 -void trg_files_model_update(TrgFilesModel * model, GtkTreeView *tv, - gint64 updateSerial, JsonObject * t, gint mode); +void trg_files_model_update(TrgFilesModel * model, GtkTreeView * tv, + gint64 updateSerial, JsonObject * t, + gint mode); gint64 trg_files_model_get_torrent_id(TrgFilesModel * model); void trg_files_model_set_accept(TrgFilesModel * model, gboolean accept); diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 1c97dd6..d152479 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -143,9 +143,9 @@ static void open_about_cb(GtkWidget * w, GtkWindow * parent); static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model, GtkTreeIter * iter, gpointer data); -static TrgTorrentTreeView * -trg_main_window_torrent_tree_view_new(TrgMainWindow * win, - GtkTreeModel * model); +static TrgTorrentTreeView + *trg_main_window_torrent_tree_view_new(TrgMainWindow * win, + GtkTreeModel * model); static gboolean trg_dialog_error_handler(TrgMainWindow * win, trg_response * response); static gboolean torrent_selection_changed(GtkTreeSelection * selection, @@ -296,7 +296,8 @@ static void update_selected_torrent_notebook(TrgMainWindow * win, trg_general_panel_update(priv->genDetails, t, &iter); trg_trackers_model_update(priv->trackersModel, trg_client_get_serial(client), t, mode); - trg_files_model_update(priv->filesModel, GTK_TREE_VIEW(priv->filesTreeView), + trg_files_model_update(priv->filesModel, + GTK_TREE_VIEW(priv->filesTreeView), trg_client_get_serial(client), t, mode); trg_peers_model_update(priv->peersModel, TRG_TREE_VIEW(priv->peersTreeView), @@ -430,8 +431,7 @@ static void add_url_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); TrgTorrentAddUrlDialog *dlg = trg_torrent_add_url_dialog_new(win, - priv-> - client); + priv->client); gtk_widget_show_all(GTK_WIDGET(dlg)); } @@ -1065,8 +1065,8 @@ TRANSMISSION_MIN_SUPPORTED, version); if (refreshSpeed) trg_status_bar_update_speed(priv->statusBar, - trg_torrent_model_get_stats(priv-> - torrentModel), + trg_torrent_model_get_stats + (priv->torrentModel), priv->client); } @@ -1209,9 +1209,8 @@ static gboolean on_torrent_get(gpointer data, int mode) update_selected_torrent_notebook(win, mode, priv->selectedTorrentId); trg_status_bar_update(priv->statusBar, stats, client); update_whatever_statusicon(win, - trg_status_bar_get_speed_text(priv-> - statusBar), - stats); + trg_status_bar_get_speed_text + (priv->statusBar), stats); #ifndef TRG_NO_GRAPH if (priv->graphNotebookIndex >= 0) @@ -1322,8 +1321,7 @@ static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model, matchesTracker = (!json || !torrent_has_tracker(json, trg_state_selector_get_url_host_regex - (priv-> - stateSelector), + (priv->stateSelector), text)); g_free(text); if (matchesTracker) @@ -1375,8 +1373,8 @@ void trg_main_window_reload_dir_aliases(TrgMainWindow * win) } static TrgTorrentTreeView - *trg_main_window_torrent_tree_view_new(TrgMainWindow * win, - GtkTreeModel * model) + * trg_main_window_torrent_tree_view_new(TrgMainWindow * win, + GtkTreeModel * model) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); TrgTorrentTreeView *torrentTreeView = @@ -1459,7 +1457,6 @@ gboolean on_generic_interactive_action(gpointer data) TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(response->cb_data); TrgClient *tc = priv->client; - TrgPrefs *prefs = trg_client_get_prefs(tc); if (trg_client_is_connected(tc)) { trg_dialog_error_handler(win, response); @@ -1468,10 +1465,6 @@ gboolean on_generic_interactive_action(gpointer data) gint64 id; if (json_object_has_member(response->obj, PARAM_TAG)) id = json_object_get_int_member(response->obj, PARAM_TAG); - else if (trg_prefs_get_bool - (prefs, TRG_PREFS_KEY_UPDATE_ACTIVE_ONLY, - TRG_PREFS_CONNECTION)) - id = TORRENT_GET_TAG_MODE_UPDATE; else id = TORRENT_GET_TAG_MODE_FULL; @@ -1796,6 +1789,28 @@ static void set_limit_cb(GtkWidget * w, gpointer data) dispatch_async(priv->client, req, on_session_set, data); } +static void set_priority_cb(GtkWidget * w, gpointer data) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + + GtkWidget *parent = gtk_widget_get_parent(w); + + gint priority = + GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "priority")); + gpointer limitIds = g_object_get_data(G_OBJECT(parent), "pri-ids"); + + JsonNode *req = NULL; + JsonObject *args; + + req = torrent_set((JsonArray *) limitIds); + + args = node_get_arguments(req); + + json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY, priority); + + dispatch_async(priv->client, req, on_generic_interactive_action, data); +} + static GtkWidget *limit_item_new(TrgMainWindow * win, GtkWidget * menu, gint64 currentLimit, gfloat limit) { @@ -1816,6 +1831,58 @@ static GtkWidget *limit_item_new(TrgMainWindow * win, GtkWidget * menu, return item; } +static GtkWidget *priority_menu_item_new(TrgMainWindow * win, + GtkMenuShell * menu, + const gchar * label, gint value, + gint current_value) +{ + GtkWidget *item = gtk_check_menu_item_new_with_label(label); + + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), + value == current_value); + g_object_set_data(G_OBJECT(item), "priority", GINT_TO_POINTER(value)); + g_signal_connect(item, "activate", G_CALLBACK(set_priority_cb), win); + + gtk_menu_shell_append(menu, item); + + return item; +} + +static GtkWidget *priority_menu_new(TrgMainWindow * win, JsonArray * ids) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + TrgClient *client = priv->client; + JsonObject *t = NULL; + gint selected_pri = TR_PRI_UNSET; + GtkWidget *toplevel, *menu; + + if (get_torrent_data(trg_client_get_torrent_table(client), + priv->selectedTorrentId, &t, NULL)) + selected_pri = torrent_get_bandwidth_priority(t); + + toplevel = gtk_image_menu_item_new_with_label(GTK_STOCK_NETWORK); + gtk_image_menu_item_set_use_stock(GTK_IMAGE_MENU_ITEM(toplevel), TRUE); + gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM + (toplevel), TRUE); + gtk_menu_item_set_label(GTK_MENU_ITEM(toplevel), _("Priority")); + + menu = gtk_menu_new(); + + g_object_set_data_full(G_OBJECT(menu), "pri-ids", ids, + (GDestroyNotify) json_array_unref); + + priority_menu_item_new(win, GTK_MENU_SHELL(menu), _("High"), + TR_PRI_HIGH, selected_pri); + priority_menu_item_new(win, GTK_MENU_SHELL(menu), _("Normal"), + TR_PRI_NORMAL, selected_pri); + priority_menu_item_new(win, GTK_MENU_SHELL(menu), _("Low"), TR_PRI_LOW, + selected_pri); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(toplevel), menu); + + return toplevel; +} + static GtkWidget *limit_menu_new(TrgMainWindow * win, gchar * title, gchar * enabledKey, gchar * speedKey, JsonArray * ids) @@ -2055,6 +2122,8 @@ static void trg_torrent_tv_view_menu(GtkWidget * treeview, _("Up Limit"), FIELD_UPLOAD_LIMITED, FIELD_UPLOAD_LIMIT, ids)); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), + priority_menu_new(TRG_MAIN_WINDOW(data), ids)); gtk_widget_show_all(menu); @@ -2436,8 +2505,7 @@ static GObject *trg_main_window_constructor(GType type, self, NULL); priv->torrentTreeView = trg_main_window_torrent_tree_view_new(self, - priv-> - filteredTorrentModel); + priv->filteredTorrentModel); g_signal_connect(priv->torrentTreeView, "popup-menu", G_CALLBACK(torrent_tv_popup_menu_cb), self); g_signal_connect(priv->torrentTreeView, "button-press-event", @@ -2485,8 +2553,7 @@ static GObject *trg_main_window_constructor(GType type, FALSE, FALSE); gtk_paned_pack2(GTK_PANED(priv->hpaned), my_scrolledwin_new(GTK_WIDGET - (priv-> - torrentTreeView)), + (priv->torrentTreeView)), TRUE, TRUE); g_signal_connect(G_OBJECT(priv->stateSelector), diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c index 4c774ec..89ea325 100644 --- a/src/trg-preferences-dialog.c +++ b/src/trg-preferences-dialog.c @@ -385,8 +385,7 @@ static void trgp_double_special_dependent(GtkWidget * widget, (priv->fullUpdateCheck) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv-> - fullUpdateCheck))); + (priv->fullUpdateCheck))); } static GtkWidget *trg_prefs_generalPage(TrgPreferencesDialog * dlg) diff --git a/src/trg-remote-prefs-dialog.c b/src/trg-remote-prefs-dialog.c index 8f866ea..8c921e4 100644 --- a/src/trg-remote-prefs-dialog.c +++ b/src/trg-remote-prefs-dialog.c @@ -159,12 +159,10 @@ static void trg_remote_prefs_double_special_dependent(GtkWidget * widget, gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv-> - alt_time_check)) + (priv->alt_time_check)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON - (priv-> - alt_check))); + (priv->alt_check))); } static void trg_rprefs_time_widget_savefunc(GtkWidget * w, diff --git a/src/trg-torrent-move-dialog.c b/src/trg-torrent-move-dialog.c index 5091120..21a76fe 100644 --- a/src/trg-torrent-move-dialog.c +++ b/src/trg-torrent-move-dialog.c @@ -67,7 +67,6 @@ trg_torrent_move_response_cb(GtkDialog * dlg, gint res_id, gpointer data) (GTK_TOGGLE_BUTTON (priv->move_check))); g_free(location); - request_set_tag_from_ids(request, priv->ids); trg_destination_combo_save_selection(TRG_DESTINATION_COMBO (priv->location_combo)); dispatch_async(priv->client, request, diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c index 05ebaa8..a0ae22a 100644 --- a/src/trg-torrent-props-dialog.c +++ b/src/trg-torrent-props-dialog.c @@ -132,15 +132,16 @@ trg_torrent_props_response_cb(GtkDialog * dlg, gint res_id, } request = torrent_set(priv->targetIds); - request_set_tag_from_ids(request, priv->targetIds); args = node_get_arguments(request); json_object_set_int_member(args, FIELD_SEED_RATIO_MODE, gtk_combo_box_get_active(GTK_COMBO_BOX - (priv->seedRatioMode))); + (priv-> + seedRatioMode))); json_object_set_int_member(args, FIELD_BANDWIDTH_PRIORITY, gtk_combo_box_get_active(GTK_COMBO_BOX - (priv->bandwidthPriorityCombo)) + (priv-> + bandwidthPriorityCombo)) - 1); trg_json_widgets_save(priv->widgets, args); diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 4265c7d..54c5cf5 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -313,8 +313,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "text", - desc-> - model_column, + desc->model_column, NULL); break; @@ -323,8 +322,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "speed-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_EPOCH: @@ -332,8 +330,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "epoch-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_ETA: @@ -341,8 +338,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "eta-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_SIZE: @@ -350,8 +346,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "size-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_PROG: @@ -359,8 +354,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_RATIO: @@ -368,8 +362,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "ratio-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_WANTED: @@ -394,8 +387,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "priority-value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_NUMGTZERO: @@ -403,8 +395,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc-> - model_column, + desc->model_column, NULL); break; case TRG_COLTYPE_NUMGTEQZERO: @@ -412,8 +403,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, column = gtk_tree_view_column_new_with_attributes(desc->header, renderer, "value", - desc-> - model_column, + desc->model_column, NULL); break; } @@ -567,8 +557,7 @@ void trg_tree_view_setup_columns(TrgTreeView * tv) json_node_get_string ((JsonNode *) - cli-> - data)); + cli->data)); if (desc) { gint64 width = json_node_get_int((JsonNode *) wli->data); trg_tree_view_add_column(tv, desc, width); -- cgit v1.2.3