summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-09-11 20:52:37 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-09-11 20:52:37 +0000
commitc5df8e2495dd23b432e6caf5f6e2b8b4ec263838 (patch)
tree4d2b7f4d14208c1142191356851917682720bf6b
parent2956059415014c3cee540371cb5ba293f87bf5c9 (diff)
more queues support
-rw-r--r--src/protocol-constants.h3
-rw-r--r--src/requests.c19
-rw-r--r--src/requests.h7
-rw-r--r--src/trg-main-window.c121
-rw-r--r--src/trg-menu-bar.c48
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,