diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2011-02-10 22:46:33 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2011-02-10 22:46:33 +0000 |
commit | 35a8841fb865b0b3ba9cd779dc5a5d19691a07af (patch) | |
tree | ff4f781201ad1e5ee5e7bcac96e3ad6b66ad6fd6 /src | |
parent | cd80ecf7db43141bbf3be4228b3d75f3604a8e93 (diff) |
speed limits from a status icon menu
Diffstat (limited to 'src')
-rw-r--r-- | src/trg-main-window.c | 114 |
1 files changed, 103 insertions, 11 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 6826c8c..0181b44 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -1210,6 +1210,89 @@ trg_torrent_tv_view_menu(GtkWidget * treeview G_GNUC_UNUSED, gdk_event_get_time((GdkEvent *) event)); } +static void set_limit_cb(GtkWidget *w, gpointer data) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + + GtkWidget *parent = gtk_widget_get_parent(w); + JsonNode *req = session_set(); + JsonObject *args = node_get_arguments(req); + + gint speed = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "limit")); + gchar *speedKey = g_object_get_data(G_OBJECT(parent), "speedKey"); + gchar *enabledKey = g_object_get_data(G_OBJECT(parent), "enabledKey"); + + if (speed >= 0) + json_object_set_int_member(args, speedKey, speed); + + json_object_set_boolean_member(args, enabledKey, speed >= 0); + + dispatch_async(priv->client, req, on_session_set, data); +} + +static GtkWidget *limit_item_new(TrgMainWindow *win, GtkWidget *menu, + gint64 currentLimit, gint limit) +{ + char speed[32]; + GtkWidget *item; + gboolean active = limit < 0 ? FALSE : (currentLimit == (gint64)limit); + + g_snprintf(speed, sizeof(speed), "%d KB/s", limit); + item = gtk_check_menu_item_new_with_label (speed); + + g_object_set_data(G_OBJECT(item), "limit", GINT_TO_POINTER(limit)); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), active); + g_signal_connect(item, "activate", G_CALLBACK(set_limit_cb), win); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + return item; +} + +static GtkWidget *limit_menu_new(TrgMainWindow *win, gchar *title, gchar *enabledKey, gchar *speedKey) +{ + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + JsonObject *session = priv->client->session; + + GtkWidget *toplevel, *menu, *item; + gint64 limit = json_object_get_boolean_member(session, enabledKey) ? + json_object_get_int_member(session, speedKey) : -1; + 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), title); + + menu = gtk_menu_new(); + + g_object_set_data_full(G_OBJECT(menu), "speedKey", + g_strdup(speedKey), g_free); + g_object_set_data_full(G_OBJECT(menu), "enabledKey", + g_strdup(enabledKey), g_free); + + item = gtk_check_menu_item_new_with_label("No Limit"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), limit < 0); + g_object_set_data(G_OBJECT(item), "limit", GINT_TO_POINTER(-1)); + g_signal_connect(item, "activate", G_CALLBACK(set_limit_cb), win); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); + + limit_item_new(win, menu, limit, 5); + limit_item_new(win, menu, limit, 10); + limit_item_new(win, menu, limit, 25); + limit_item_new(win, menu, limit, 50); + limit_item_new(win, menu, limit, 75); + limit_item_new(win, menu, limit, 100); + limit_item_new(win, menu, limit, 150); + limit_item_new(win, menu, limit, 200); + limit_item_new(win, menu, limit, 300); + limit_item_new(win, menu, limit, 500); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(toplevel), menu); + + return toplevel; +} + static void trg_status_icon_view_menu(GtkStatusIcon * icon G_GNUC_UNUSED, GdkEventButton * event, gpointer data) @@ -1220,17 +1303,26 @@ trg_status_icon_view_menu(GtkStatusIcon * icon G_GNUC_UNUSED, menu = gtk_menu_new(); - trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Connect", - GTK_STOCK_CONNECT, !connected, - G_CALLBACK(connect_cb), data); - trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Disconnect", - GTK_STOCK_DISCONNECT, connected, - G_CALLBACK(disconnect_cb), data); - trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add", GTK_STOCK_ADD, - connected, G_CALLBACK(add_cb), data); - trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add from URL", - GTK_STOCK_ADD, connected, G_CALLBACK(add_url_cb), - data); + if (!connected) { + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Connect", + GTK_STOCK_CONNECT, !connected, + G_CALLBACK(connect_cb), data); + } else { + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Disconnect", + GTK_STOCK_DISCONNECT, connected, + G_CALLBACK(disconnect_cb), data); + + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add", GTK_STOCK_ADD, + connected, G_CALLBACK(add_cb), data); + trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add from URL", + GTK_STOCK_ADD, connected, G_CALLBACK(add_url_cb), + data); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), limit_menu_new(TRG_MAIN_WINDOW(data), "Down Limit", SGET_SPEED_LIMIT_DOWN_ENABLED, SGET_SPEED_LIMIT_DOWN)); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), limit_menu_new(TRG_MAIN_WINDOW(data), "Up Limit", SGET_SPEED_LIMIT_UP_ENABLED, SGET_SPEED_LIMIT_UP)); + } + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Quit", GTK_STOCK_QUIT, TRUE, G_CALLBACK(quit_cb), data); |