From 408179693ea842150b469cf2f88eea9434d19698 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Fri, 23 Dec 2011 11:10:49 +0000 Subject: "turtle" mode in the status bar. for easy activation of alternative speed limits. --- src/trg-status-bar.c | 126 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 77 insertions(+), 49 deletions(-) (limited to 'src/trg-status-bar.c') diff --git a/src/trg-status-bar.c b/src/trg-status-bar.c index 4f1ed64..86ffb01 100644 --- a/src/trg-status-bar.c +++ b/src/trg-status-bar.c @@ -21,9 +21,12 @@ #include #include +#include "trg-main-window.h" #include "trg-status-bar.h" #include "trg-torrent-model.h" #include "session-get.h" +#include "requests.h" +#include "json.h" #include "util.h" /* A subclass of GtkHBox which contains a status label on the left. @@ -44,37 +47,64 @@ typedef struct _TrgStatusBarPrivate TrgStatusBarPrivate; struct _TrgStatusBarPrivate { GtkWidget *speed_lbl; + GtkWidget *turtleImage, *turtleEventBox; GtkWidget *free_lbl; GtkWidget *info_lbl; + TrgClient *client; + TrgMainWindow *win; }; -static void trg_status_bar_class_init(TrgStatusBarClass * klass) -{ +static void trg_status_bar_class_init(TrgStatusBarClass * klass) { g_type_class_add_private(klass, sizeof(TrgStatusBarPrivate)); } -void trg_status_bar_clear_indicators(TrgStatusBar * sb) -{ +void trg_status_bar_clear_indicators(TrgStatusBar * sb) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(sb); gtk_label_set_text(GTK_LABEL(priv->free_lbl), ""); gtk_label_set_text(GTK_LABEL(priv->speed_lbl), ""); } -void trg_status_bar_reset(TrgStatusBar * sb) -{ +void trg_status_bar_reset(TrgStatusBar * sb) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(sb); trg_status_bar_clear_indicators(sb); gtk_label_set_text(GTK_LABEL(priv->info_lbl), _("Disconnected")); + gtk_widget_set_visible(priv->turtleImage, FALSE); } -static void trg_status_bar_init(TrgStatusBar * self) -{ +static void turtle_toggle(GtkWidget *w, GdkEventButton * event, gpointer data) { + TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(data); + JsonNode *req = session_set(); + JsonObject *args = node_get_arguments(req); + gchar *stockName; + gboolean altSpeedOn; + + gtk_image_get_stock(GTK_IMAGE(priv->turtleImage), &stockName, NULL); + altSpeedOn = g_strcmp0(stockName, "alt-speed-on") == 0; + + gtk_image_set_from_stock(GTK_IMAGE(priv->turtleImage), + altSpeedOn ? "alt-speed-off" : "alt-speed-on", + GTK_ICON_SIZE_SMALL_TOOLBAR); + json_object_set_boolean_member(args, SGET_ALT_SPEED_ENABLED, !altSpeedOn); + + dispatch_async(priv->client, req, on_session_set, priv->win); +} + +static void trg_status_bar_init(TrgStatusBar * self) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(self); gtk_container_set_border_width(GTK_CONTAINER(self), 2); priv->info_lbl = gtk_label_new(_("Disconnected")); gtk_box_pack_start(GTK_BOX(self), priv->info_lbl, FALSE, TRUE, 0); + priv->turtleImage = gtk_image_new(); + + priv->turtleEventBox = gtk_event_box_new(); + g_signal_connect(priv->turtleEventBox, "button-press-event", + G_CALLBACK(turtle_toggle), self); + gtk_widget_set_visible(priv->turtleEventBox, FALSE); + gtk_container_add(GTK_CONTAINER(priv->turtleEventBox), priv->turtleImage); + gtk_box_pack_end(GTK_BOX(self), priv->turtleEventBox, FALSE, TRUE, 5); + priv->speed_lbl = gtk_label_new(NULL); gtk_box_pack_end(GTK_BOX(self), priv->speed_lbl, FALSE, TRUE, 10); @@ -82,30 +112,25 @@ static void trg_status_bar_init(TrgStatusBar * self) gtk_box_pack_end(GTK_BOX(self), priv->free_lbl, FALSE, TRUE, 30); } -void trg_status_bar_push_connection_msg(TrgStatusBar * sb, - const gchar * msg) -{ +void trg_status_bar_push_connection_msg(TrgStatusBar * sb, const gchar * msg) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(sb); - gtk_label_set_text(GTK_LABEL(priv->info_lbl), msg); } -void trg_status_bar_connect(TrgStatusBar * sb, JsonObject * session) -{ +void trg_status_bar_connect(TrgStatusBar * sb, JsonObject * session) { gchar *statusMsg; float version; session_get_version(session, &version); - statusMsg = - g_strdup_printf - (_("Connected to Transmission %g, getting torrents..."), version); + statusMsg = g_strdup_printf( + _("Connected to Transmission %g, getting torrents..."), + version); g_message("%s", statusMsg); trg_status_bar_push_connection_msg(sb, statusMsg); g_free(statusMsg); } -void trg_status_bar_session_update(TrgStatusBar * sb, JsonObject * session) -{ +void trg_status_bar_session_update(TrgStatusBar * sb, JsonObject * session) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(sb); gint64 free = session_get_download_dir_free_space(session); gchar freeSpace[64]; @@ -119,12 +144,16 @@ void trg_status_bar_session_update(TrgStatusBar * sb, JsonObject * session) } else { gtk_label_set_text(GTK_LABEL(priv->free_lbl), ""); } + + gtk_image_set_from_stock( + GTK_IMAGE(priv->turtleImage), + session_get_alt_speed_enabled(session) ? "alt-speed-on" : + "alt-speed-off", GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_widget_set_visible(priv->turtleEventBox, TRUE); } void trg_status_bar_update(TrgStatusBar * sb, - trg_torrent_model_update_stats * stats, - TrgClient * client) -{ + trg_torrent_model_update_stats * stats, TrgClient * client) { TrgStatusBarPrivate *priv; JsonObject *session; gchar *speedText, *infoText; @@ -137,45 +166,42 @@ void trg_status_bar_update(TrgStatusBar * sb, // The session should always exist otherwise this function wouldn't be called downlimitraw = - json_object_get_boolean_member(session, - SGET_SPEED_LIMIT_DOWN_ENABLED) ? - json_object_get_int_member(session, SGET_SPEED_LIMIT_DOWN) : -1; + json_object_get_boolean_member(session, + SGET_SPEED_LIMIT_DOWN_ENABLED) ? json_object_get_int_member( + session, SGET_SPEED_LIMIT_DOWN) : + -1; uplimitraw = - json_object_get_boolean_member(session, - SGET_SPEED_LIMIT_UP_ENABLED) ? - json_object_get_int_member(session, SGET_SPEED_LIMIT_UP) : -1; + json_object_get_boolean_member(session, + SGET_SPEED_LIMIT_UP_ENABLED) ? json_object_get_int_member( + session, SGET_SPEED_LIMIT_UP) : + -1; - trg_strlspeed(downRateTotalString, - stats->downRateTotal / KILOBYTE_FACTOR); + trg_strlspeed(downRateTotalString, stats->downRateTotal / KILOBYTE_FACTOR); trg_strlspeed(upRateTotalString, stats->upRateTotal / KILOBYTE_FACTOR); if (uplimitraw >= 0) { gchar uplimitstring[32]; trg_strlspeed(uplimitstring, uplimitraw); - g_snprintf(uplimit, sizeof(uplimit), _(" (Limit: %s)"), - uplimitstring); + g_snprintf(uplimit, sizeof(uplimit), _(" (Limit: %s)"), uplimitstring); } if (downlimitraw >= 0) { gchar downlimitstring[32]; trg_strlspeed(downlimitstring, downlimitraw); g_snprintf(downlimit, sizeof(downlimit), _(" (Limit: %s)"), - downlimitstring); + downlimitstring); } - speedText = - g_strdup_printf(_("Down: %s%s, Up: %s%s"), downRateTotalString, - downlimitraw >= 0 ? downlimit : "", - upRateTotalString, uplimitraw >= 0 ? uplimit : ""); + speedText = g_strdup_printf(_("Down: %s%s, Up: %s%s"), downRateTotalString, + downlimitraw >= 0 ? downlimit : "", upRateTotalString, + uplimitraw >= 0 ? uplimit : ""); - infoText = - g_strdup_printf - (ngettext - ("%d torrent: %d seeding, %d downloading, %d paused", - "%d torrents: %d seeding, %d downloading, %d paused", - stats->count), stats->count, stats->seeding, stats->down, - stats->paused); + infoText = g_strdup_printf(ngettext + ("%d torrent: %d seeding, %d downloading, %d paused", + "%d torrents: %d seeding, %d downloading, %d paused", + stats->count), stats->count, stats->seeding, stats->down, + stats->paused); gtk_label_set_text(GTK_LABEL(priv->info_lbl), infoText); gtk_label_set_text(GTK_LABEL(priv->speed_lbl), speedText); @@ -184,13 +210,15 @@ void trg_status_bar_update(TrgStatusBar * sb, g_free(infoText); } -const gchar *trg_status_bar_get_speed_text(TrgStatusBar * s) -{ +const gchar *trg_status_bar_get_speed_text(TrgStatusBar * s) { TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(s); return gtk_label_get_text(GTK_LABEL(priv->speed_lbl)); } -TrgStatusBar *trg_status_bar_new() -{ - return TRG_STATUS_BAR(g_object_new(TRG_TYPE_STATUS_BAR, NULL)); +TrgStatusBar *trg_status_bar_new(TrgMainWindow *win, TrgClient *client) { + TrgStatusBar *sb = g_object_new(TRG_TYPE_STATUS_BAR, NULL); + TrgStatusBarPrivate *priv = TRG_STATUS_BAR_GET_PRIVATE(sb); + priv->client = client; + priv->win = win; + return sb; } -- cgit v1.2.3