diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-09-11 20:52:37 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-09-11 20:52:37 +0000 |
commit | c5df8e2495dd23b432e6caf5f6e2b8b4ec263838 (patch) | |
tree | 4d2b7f4d14208c1142191356851917682720bf6b | |
parent | 2956059415014c3cee540371cb5ba293f87bf5c9 (diff) |
more queues support
-rw-r--r-- | src/protocol-constants.h | 3 | ||||
-rw-r--r-- | src/requests.c | 19 | ||||
-rw-r--r-- | src/requests.h | 7 | ||||
-rw-r--r-- | src/trg-main-window.c | 121 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 48 |
5 files changed, 161 insertions, 37 deletions
diff --git a/src/protocol-constants.h b/src/protocol-constants.h index 4a0d6ed..09faab0 100644 --- a/src/protocol-constants.h +++ b/src/protocol-constants.h @@ -118,8 +118,11 @@ #define METHOD_PORT_TEST "port-test" #define METHOD_BLOCKLIST_UPDATE "blocklist-update" #define METHOD_SESSION_STATS "session-stats" +#define METHOD_QUEUE_MOVE_TOP "queue-move-top" #define METHOD_QUEUE_MOVE_UP "queue-move-up" +#define METHOD_QUEUE_MOVE_BOTTOM "queue-move-bottom" #define METHOD_QUEUE_MOVE_DOWN "queue-move-down" +#define METHOD_TORRENT_START_NOW "torrent-start-now" #define PARAM_IDS "ids" #define PARAM_DELETE_LOCAL_DATA "delete-local-data" diff --git a/src/requests.c b/src/requests.c index e6b7639..6732bd7 100644 --- a/src/requests.c +++ b/src/requests.c @@ -92,16 +92,31 @@ JsonNode *torrent_verify(JsonArray * array) return generic_request(METHOD_TORRENT_VERIFY, array); } -JsonNode *torrent_move_up_queue(JsonArray * array) +JsonNode *torrent_queue_move_up(JsonArray * array) { return generic_request(METHOD_QUEUE_MOVE_UP, array); } -JsonNode *torrent_move_down_queue(JsonArray * array) +JsonNode *torrent_queue_move_down(JsonArray * array) { return generic_request(METHOD_QUEUE_MOVE_DOWN, array); } +JsonNode *torrent_start_now(JsonArray * array) +{ + return generic_request(METHOD_TORRENT_START_NOW, array); +} + +JsonNode *torrent_queue_move_bottom(JsonArray * array) +{ + return generic_request(METHOD_QUEUE_MOVE_BOTTOM, array); +} + +JsonNode *torrent_queue_move_top(JsonArray * array) +{ + return generic_request(METHOD_QUEUE_MOVE_TOP, array); +} + JsonNode *session_set(void) { return generic_request(METHOD_SESSION_SET, NULL); diff --git a/src/requests.h b/src/requests.h index 352e3ca..4d08a88 100644 --- a/src/requests.h +++ b/src/requests.h @@ -41,8 +41,11 @@ JsonNode *torrent_set_location(JsonArray * array, gchar * location, JsonNode *blocklist_update(void); JsonNode *port_test(void); JsonNode *session_stats(void); -JsonNode *torrent_move_down_queue(JsonArray * array); -JsonNode *torrent_move_up_queue(JsonArray * array); +JsonNode *torrent_queue_move_down(JsonArray * array); +JsonNode *torrent_queue_move_up(JsonArray * array); +JsonNode *torrent_queue_move_bottom(JsonArray * array); +JsonNode *torrent_queue_move_top(JsonArray * array); +JsonNode *torrent_start_now(JsonArray * array); void request_set_tag(JsonNode * req, gint64 tag); void request_set_tag_from_ids(JsonNode * req, JsonArray * ids); diff --git a/src/trg-main-window.c b/src/trg-main-window.c index b6b5542..d762303 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -482,10 +482,12 @@ static void open_remote_prefs_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { static void main_window_toggle_filter_dirs(GtkCheckMenuItem * w, gpointer win) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); - trg_state_selector_set_show_dirs(priv->stateSelector, gtk_check_menu_item_get_active(w)); + trg_state_selector_set_show_dirs(priv->stateSelector, + gtk_check_menu_item_get_active(w)); } -static void main_window_toggle_filter_trackers(GtkCheckMenuItem * w, gpointer win) { +static void main_window_toggle_filter_trackers(GtkCheckMenuItem * w, + gpointer win) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); trg_state_selector_set_show_trackers(priv->stateSelector, gtk_check_menu_item_get_active(w)); @@ -536,19 +538,46 @@ static void verify_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { on_generic_interactive_action, data); } +static void start_now_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + + dispatch_async(priv->client, + torrent_start_now(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); +} + static void up_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); dispatch_async(priv->client, - torrent_move_up_queue(build_json_id_array(priv->torrentTreeView)), + torrent_queue_move_up(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); +} + +static void top_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + + dispatch_async( + priv->client, + torrent_queue_move_top(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); +} + +static void bottom_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + + dispatch_async( + priv->client, + torrent_queue_move_bottom(build_json_id_array(priv->torrentTreeView)), on_generic_interactive_action, data); } static void down_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_move_down_queue(build_json_id_array(priv->torrentTreeView)), + dispatch_async( + priv->client, + torrent_queue_move_down(build_json_id_array(priv->torrentTreeView)), on_generic_interactive_action, data); } @@ -692,8 +721,7 @@ static void trg_main_window_toggle_graph_cb(GtkCheckMenuItem * w, gpointer win) } } -void trg_main_window_notebook_set_visible(TrgMainWindow *win, gboolean visible) -{ +void trg_main_window_notebook_set_visible(TrgMainWindow *win, gboolean visible) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); trg_widget_set_visible(priv->notebook, visible); } @@ -706,8 +734,8 @@ static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) { gtk_widget_set_size_request(notebook, -1, 185); - priv->genDetails - = trg_general_panel_new(GTK_TREE_MODEL(priv->torrentModel), priv->client); + priv->genDetails = trg_general_panel_new( + GTK_TREE_MODEL(priv->torrentModel), priv->client); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), GTK_WIDGET(priv->genDetails), gtk_label_new(_("General"))); @@ -808,7 +836,8 @@ static void on_session_get(JsonObject * response, int status, gpointer data) { if (!isConnected) { int firstStatus; - JsonObject *firstResponse = dispatch(client, torrent_get(-1), &firstStatus); + JsonObject *firstResponse = dispatch(client, torrent_get(-1), + &firstStatus); on_torrent_get_first(firstResponse, firstStatus, data); } } @@ -834,8 +863,10 @@ static void on_torrent_get(JsonObject * response, int mode, int status, trg_client_updatelock(client); gdk_threads_enter(); - interval = gtk_widget_get_visible(GTK_WIDGET(data)) ? trg_client_get_interval( - client) : trg_client_get_minimised_interval(client); + interval + = gtk_widget_get_visible(GTK_WIDGET(data)) ? trg_client_get_interval( + client) + : trg_client_get_minimised_interval(client); if (status != CURLE_OK) { if (trg_client_inc_failcount(client) >= TRG_MAX_RETRIES) { @@ -1188,7 +1219,9 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win) { *b_remove, *b_delete, *b_props, *b_local_prefs, *b_remote_prefs, *b_about, *b_view_states, *b_view_notebook, *b_view_stats, *b_add_url, *b_quit, *b_move, *b_reannounce, *b_pause_all, - *b_resume_all, *b_dir_filters, *b_tracker_filters, *b_show_graph, *b_up_queue, *b_down_queue; + *b_resume_all, *b_dir_filters, *b_tracker_filters, *b_show_graph, + *b_up_queue, *b_down_queue, *b_top_queue, *b_bottom_queue, + *b_start_now; TrgMenuBar *menuBar; @@ -1204,9 +1237,11 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win) { &b_local_prefs, "view-notebook-button", &b_view_notebook, "view-states-button", &b_view_states, "view-stats-button", &b_view_stats, "about-button", &b_about, "quit-button", &b_quit, - "dir-filters", &b_dir_filters, "tracker-filters", &b_tracker_filters, - "show-graph", &b_show_graph, "up-queue", &b_up_queue, "down-queue", - &b_down_queue, NULL); + "dir-filters", &b_dir_filters, "tracker-filters", + &b_tracker_filters, "show-graph", &b_show_graph, "up-queue", + &b_up_queue, "down-queue", &b_down_queue, "top-queue", + &b_top_queue, "bottom-queue", &b_bottom_queue, "start-now", + &b_start_now, NULL); g_signal_connect(b_connect, "activate", G_CALLBACK(connect_cb), win); g_signal_connect(b_disconnect, "activate", @@ -1226,6 +1261,9 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win) { g_signal_connect(b_remove, "activate", G_CALLBACK(remove_cb), win); g_signal_connect(b_up_queue, "activate", G_CALLBACK(up_queue_cb), win); g_signal_connect(b_down_queue, "activate", G_CALLBACK(down_queue_cb), win); + g_signal_connect(b_top_queue, "activate", G_CALLBACK(top_queue_cb), win); + g_signal_connect(b_bottom_queue, "activate", G_CALLBACK(bottom_queue_cb), win); + g_signal_connect(b_start_now, "activate", G_CALLBACK(start_now_cb), win); g_signal_connect(b_move, "activate", G_CALLBACK(move_cb), win); g_signal_connect(b_about, "activate", G_CALLBACK(open_about_cb), win); g_signal_connect(b_local_prefs, "activate", @@ -1410,6 +1448,7 @@ static GtkWidget *limit_menu_new(TrgMainWindow * win, gchar * title, static void trg_torrent_tv_view_menu(GtkWidget * treeview, GdkEventButton * event, gpointer data) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); GtkWidget *menu; JsonArray *ids; @@ -1433,6 +1472,24 @@ static void trg_torrent_tv_view_menu(GtkWidget * treeview, trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Remove & Delete"), GTK_STOCK_DELETE, TRUE, G_CALLBACK(delete_cb), data); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), + gtk_separator_menu_item_new()); + + if (priv->queuesEnabled) { + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Start Now"), + GTK_STOCK_MEDIA_PLAY, TRUE, G_CALLBACK(start_now_cb), data); + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Move Up Queue"), + GTK_STOCK_GO_UP, TRUE, G_CALLBACK(up_queue_cb), data); + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Move Down Queue"), + GTK_STOCK_GO_DOWN, TRUE, G_CALLBACK(down_queue_cb), data); + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Bottom Of Queue"), + GTK_STOCK_GOTO_BOTTOM, TRUE, G_CALLBACK(bottom_queue_cb), data); + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), _("Top Of Queue"), + GTK_STOCK_GOTO_TOP, TRUE, G_CALLBACK(top_queue_cb), data); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), + gtk_separator_menu_item_new()); + } + gtk_menu_shell_append( GTK_MENU_SHELL(menu), limit_menu_new(TRG_MAIN_WINDOW(data), _("Down Limit"), @@ -1621,32 +1678,29 @@ TrgStateSelector *trg_main_window_get_state_selector(TrgMainWindow * win) { } static gboolean trg_main_window_config_event(GtkWidget *widget, - GdkEvent *event, - gpointer user_data G_GNUC_UNUSED) -{ + GdkEvent *event, gpointer user_data G_GNUC_UNUSED) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(widget); priv->width = event->configure.width; priv->height = event->configure.height; return FALSE; } -static void trg_client_session_updated_cb(TrgClient *tc, JsonObject *session, gpointer data) -{ +static void trg_client_session_updated_cb(TrgClient *tc, JsonObject *session, + gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); gboolean queuesEnabled; trg_status_bar_session_update(priv->statusBar, session); if (json_object_has_member(session, SGET_DOWNLOAD_QUEUE_ENABLED)) { - queuesEnabled = - json_object_get_boolean_member(session, SGET_DOWNLOAD_QUEUE_ENABLED) - || json_object_get_boolean_member(session, SGET_SEED_QUEUE_ENABLED); + queuesEnabled = json_object_get_boolean_member(session, + SGET_DOWNLOAD_QUEUE_ENABLED) || json_object_get_boolean_member( + session, SGET_SEED_QUEUE_ENABLED); } else { queuesEnabled = FALSE; } - if (priv->queuesEnabled != queuesEnabled) - { + if (priv->queuesEnabled != queuesEnabled) { trg_menu_bar_set_supports_queues(priv->menuBar, queuesEnabled); } @@ -1814,10 +1868,14 @@ static GObject *trg_main_window_constructor(GType type, gtk_widget_show_all(GTK_WIDGET(self)); - trg_widget_set_visible(priv->stateSelectorScroller, - trg_prefs_get_bool(prefs, TRG_PREFS_KEY_SHOW_STATE_SELECTOR, TRG_PREFS_GLOBAL)); - trg_widget_set_visible(priv->notebook, - trg_prefs_get_bool(prefs, TRG_PREFS_KEY_SHOW_NOTEBOOK, TRG_PREFS_GLOBAL)); + trg_widget_set_visible( + priv->stateSelectorScroller, + trg_prefs_get_bool(prefs, TRG_PREFS_KEY_SHOW_STATE_SELECTOR, + TRG_PREFS_GLOBAL)); + trg_widget_set_visible( + priv->notebook, + trg_prefs_get_bool(prefs, TRG_PREFS_KEY_SHOW_NOTEBOOK, + TRG_PREFS_GLOBAL)); if (tray && priv->min_on_start) gtk_widget_hide(GTK_WIDGET(self)); @@ -1873,5 +1931,6 @@ void auto_connect_if_required(TrgMainWindow * win, TrgClient * tc) { } TrgMainWindow *trg_main_window_new(TrgClient * tc, gboolean minonstart) { - return g_object_new(TRG_TYPE_MAIN_WINDOW, "trg-client", tc, "min-on-start", minonstart, NULL); + return g_object_new(TRG_TYPE_MAIN_WINDOW, "trg-client", tc, "min-on-start", + minonstart, NULL); } diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index 42d350c..a206179 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -51,7 +51,10 @@ enum { PROP_TRACKER_FILTERS, PROP_VIEW_SHOW_GRAPH, PROP_MOVE_DOWN_QUEUE, - PROP_MOVE_UP_QUEUE + PROP_MOVE_UP_QUEUE, + PROP_MOVE_BOTTOM_QUEUE, + PROP_MOVE_TOP_QUEUE, + PROP_START_NOW }; G_DEFINE_TYPE(TrgMenuBar, trg_menu_bar, GTK_TYPE_MENU_BAR) @@ -86,6 +89,10 @@ struct _TrgMenuBarPrivate { GtkWidget *mb_view_graph; GtkWidget *mb_down_queue; GtkWidget *mb_up_queue; + GtkWidget *mb_bottom_queue; + GtkWidget *mb_top_queue; + GtkWidget *mb_start_now; + GtkWidget *mb_queues_seperator; TrgPrefs *prefs; }; @@ -95,6 +102,10 @@ void trg_menu_bar_set_supports_queues(TrgMenuBar *mb, gboolean supportsQueues) gtk_widget_set_visible(priv->mb_down_queue, supportsQueues); gtk_widget_set_visible(priv->mb_up_queue, supportsQueues); + gtk_widget_set_visible(priv->mb_top_queue, supportsQueues); + gtk_widget_set_visible(priv->mb_bottom_queue, supportsQueues); + gtk_widget_set_visible(priv->mb_queues_seperator, supportsQueues); + gtk_widget_set_visible(priv->mb_start_now, supportsQueues); } void trg_menu_bar_connected_change(TrgMenuBar * mb, gboolean connected) @@ -124,8 +135,11 @@ void trg_menu_bar_torrent_actions_sensitive(TrgMenuBar * mb, gtk_widget_set_sensitive(priv->mb_verify, sensitive); gtk_widget_set_sensitive(priv->mb_reannounce, sensitive); gtk_widget_set_sensitive(priv->mb_move, sensitive); + gtk_widget_set_sensitive(priv->mb_start_now, sensitive); gtk_widget_set_sensitive(priv->mb_up_queue, sensitive); gtk_widget_set_sensitive(priv->mb_down_queue, sensitive); + gtk_widget_set_sensitive(priv->mb_top_queue, sensitive); + gtk_widget_set_sensitive(priv->mb_bottom_queue, sensitive); } static void trg_menu_bar_set_property(GObject * object, @@ -169,6 +183,15 @@ trg_menu_bar_get_property(GObject * object, guint property_id, case PROP_MOVE_DOWN_QUEUE: g_value_set_object(value, priv->mb_down_queue); break; + case PROP_MOVE_TOP_QUEUE: + g_value_set_object(value, priv->mb_top_queue); + break; + case PROP_MOVE_BOTTOM_QUEUE: + g_value_set_object(value, priv->mb_bottom_queue); + break; + case PROP_START_NOW: + g_value_set_object(value, priv->mb_start_now); + break; case PROP_MOVE_BUTTON: g_value_set_object(value, priv->mb_move); break; @@ -424,6 +447,14 @@ GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv) _("Remove and Delete"), GTK_STOCK_DELETE, FALSE); + priv->mb_queues_seperator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(torrentMenu), + priv->mb_queues_seperator); + + priv->mb_start_now = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), + _("Start Now"), GTK_STOCK_MEDIA_PLAY, + FALSE); + priv->mb_up_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Move Up Queue"), GTK_STOCK_GO_UP, FALSE); @@ -432,6 +463,14 @@ GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv) _("Move Down Queue"), GTK_STOCK_GO_DOWN, FALSE); + priv->mb_bottom_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), + _("Bottom Of Queue"), GTK_STOCK_GOTO_BOTTOM, + FALSE); + + priv->mb_top_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), + _("Top Of Queue"), GTK_STOCK_GOTO_TOP, + FALSE); + gtk_menu_shell_append(GTK_MENU_SHELL(torrentMenu), gtk_separator_menu_item_new()); @@ -559,7 +598,12 @@ static void trg_menu_bar_class_init(TrgMenuBarClass * klass) "down-queue", "Down Queue"); trg_menu_bar_install_widget_prop(object_class, PROP_MOVE_UP_QUEUE, "up-queue", "Up Queue"); - + trg_menu_bar_install_widget_prop(object_class, PROP_MOVE_BOTTOM_QUEUE, + "bottom-queue", "Bottom Queue"); + trg_menu_bar_install_widget_prop(object_class, PROP_MOVE_TOP_QUEUE, + "top-queue", "Top Queue"); + trg_menu_bar_install_widget_prop(object_class, PROP_START_NOW, + "start-now", "Start Now"); g_object_class_install_property(object_class, PROP_PREFS, |