From b51af2e799b345945f840499a18cfdc0bee92081 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 20 Dec 2007 19:21:21 +0000 Subject: [PATCH] (gtk) yin/yang icon: add a pulldown menu for {total,session}{ratio,transfer} --- gtk/main.c | 8 +--- gtk/tr_prefs.c | 1 + gtk/tr_prefs.h | 1 + gtk/tr_window.c | 115 +++++++++++++++++++++++++++++++++++++++++------- gtk/tr_window.h | 2 +- 5 files changed, 105 insertions(+), 22 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index dd65739c8..af0d62ff7 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -748,7 +748,6 @@ setpex( tr_torrent * tor, void * arg ) gboolean updatemodel(gpointer gdata) { struct cbdata *data = gdata; - float up, down; if( !data->closing && 0 < global_sigcount ) { @@ -760,11 +759,8 @@ updatemodel(gpointer gdata) { tr_core_update( data->core ); /* update the main window's statusbar and toolbar buttons */ - if( NULL != data->wind ) - { - tr_torrentRates( tr_core_handle( data->core ), &down, &up ); - tr_window_update( data->wind, down, up ); - } + if( data->wind ) + tr_window_update( data->wind ); /* update the message window */ msgwin_update(); diff --git a/gtk/tr_prefs.c b/gtk/tr_prefs.c index cd5927a74..14bdc268a 100644 --- a/gtk/tr_prefs.c +++ b/gtk/tr_prefs.c @@ -29,6 +29,7 @@ tr_prefs_init_global( void ) { cf_check_older_configs( ); + pref_string_set_default ( PREF_KEY_STATUS_BAR_STATS, "total-ratio" ); pref_flag_set_default ( PREF_KEY_STATUS_BAR, TRUE ); pref_flag_set_default ( PREF_KEY_TOOLBAR, TRUE ); diff --git a/gtk/tr_prefs.h b/gtk/tr_prefs.h index d25305015..88614bc7b 100644 --- a/gtk/tr_prefs.h +++ b/gtk/tr_prefs.h @@ -39,6 +39,7 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent ); #define PREF_KEY_SORT_REVERSED "sort-reversed" #define PREF_KEY_MINIMAL_VIEW "minimal-view" #define PREF_KEY_STATUS_BAR "show-status-bar" +#define PREF_KEY_STATUS_BAR_STATS "status-bar-stats" #define PREF_KEY_TOOLBAR "show-toolbar" void tr_prefs_init_global( void ); diff --git a/gtk/tr_window.c b/gtk/tr_window.c index 9d16d5a63..9c5c1c445 100644 --- a/gtk/tr_window.c +++ b/gtk/tr_window.c @@ -54,6 +54,7 @@ typedef struct GtkWidget * view; GtkWidget * toolbar; GtkWidget * status; + GtkWidget * status_menu; GtkWidget * ul_lb; GtkWidget * dl_lb; GtkWidget * stats_lb; @@ -163,16 +164,50 @@ prefsChanged( TrCore * core UNUSED, const char * key, gpointer wind ) const gboolean isEnabled = pref_flag_get( key ); g_object_set( p->toolbar, "visible", isEnabled, NULL ); } + else if( !strcmp( key, PREF_KEY_STATUS_BAR_STATS ) ) + { + tr_window_update( (TrWindow*)wind ); + } } static void privateFree( gpointer vprivate ) { - PrivateData * p = (PrivateData*) vprivate; + PrivateData * p = ( PrivateData * ) vprivate; g_signal_handler_disconnect( p->core, p->pref_handler_id ); g_free( p ); } +static void +onYinYangReleased( GtkWidget * w UNUSED, GdkEventButton * button UNUSED, gpointer vprivate ) +{ + PrivateData * p = ( PrivateData * ) vprivate; + gtk_menu_popup( GTK_MENU( p->status_menu ), 0, 0, 0, 0, 0, gtk_get_current_event_time( ) ); +} + +#define STATS_MODE "stats-mode" + +static struct { + const char *val, *i18n; +} stats_modes[] = { + { "total-ratio", N_("Total Ratio") }, + { "session-ratio", N_("Session Ratio") }, + { "total-transfer", N_("Total Transfer") }, + { "session-transfer", N_("Session Transfer") } +}; + +static void +status_menu_toggled_cb( GtkCheckMenuItem * menu_item, + gpointer vprivate ) +{ + if( gtk_check_menu_item_get_active( menu_item ) ) + { + PrivateData * p = (PrivateData*) vprivate; + const char * val = g_object_get_data( G_OBJECT( menu_item ), STATS_MODE ); + tr_core_set_pref( p->core, PREF_KEY_STATUS_BAR_STATS, val ); + } +} + /*** **** PUBLIC ***/ @@ -180,8 +215,11 @@ privateFree( gpointer vprivate ) GtkWidget * tr_window_new( GtkUIManager * ui_manager, TrCore * core ) { + int i, n; + int status_stats_mode; + char * pch; PrivateData * p = g_new( PrivateData, 1 ); - GtkWidget *vbox, *w, *self, *h; + GtkWidget *vbox, *w, *self, *h, *c; /* make the window */ self = gtk_window_new (GTK_WINDOW_TOPLEVEL); @@ -204,6 +242,24 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) w = p->toolbar = action_get_widget( "/main-window-toolbar" ); gtk_box_pack_start( GTK_BOX(vbox), w, FALSE, FALSE, 0 ); + /* status menu */ + GtkWidget * menu = p->status_menu = gtk_menu_new( ); + status_stats_mode = 0; + GSList * l = NULL; + pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS ); + for( i=0, n=G_N_ELEMENTS(stats_modes); istatus = gtk_hbox_new( FALSE, GUI_PAD ); gtk_container_set_border_width( GTK_CONTAINER(h), GUI_PAD ); @@ -221,6 +277,10 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) gtk_box_pack_end( GTK_BOX(h), w, FALSE, FALSE, 0 ); w = gtk_image_new_from_stock( "tr-yin-yang", (GtkIconSize)-1 ); + c = gtk_event_box_new( ); + gtk_container_add( GTK_CONTAINER(c), w ); + w = c; + g_signal_connect( w, "button-release-event", G_CALLBACK(onYinYangReleased), p ); gtk_box_pack_start( GTK_BOX(h), w, FALSE, FALSE, 0 ); w = p->stats_lb = gtk_label_new( NULL ); gtk_box_pack_start( GTK_BOX(h), w, FALSE, FALSE, 0 ); @@ -245,6 +305,7 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) /* listen for prefs changes that affect the window */ prefsChanged( core, PREF_KEY_MINIMAL_VIEW, self ); prefsChanged( core, PREF_KEY_STATUS_BAR, self ); + prefsChanged( core, PREF_KEY_STATUS_BAR_STATS, self ); prefsChanged( core, PREF_KEY_TOOLBAR, self ); p->core = core; p->pref_handler_id = g_signal_connect( core, "prefs-changed", @@ -254,24 +315,48 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) } void -tr_window_update( TrWindow * self, float downspeed, float upspeed ) +tr_window_update( TrWindow * self ) { PrivateData * p = get_private_data( self ); - char up[32], down[32], buf[64]; - struct tr_session_stats stats; - tr_handle * handle = tr_core_handle( p->core ); + tr_handle * handle = NULL; - tr_strlspeed( buf, downspeed, sizeof( buf ) ); - gtk_label_set_text( GTK_LABEL( p->dl_lb ), buf ); + if( p && p->core ) + handle = tr_core_handle( p->core ); - tr_strlspeed( buf, upspeed, sizeof( buf ) ); - gtk_label_set_text( GTK_LABEL( p->ul_lb ), buf ); + if( handle ) + { + char * pch; + float u, d; + char up[32], down[32], buf[64]; + struct tr_session_stats stats; - tr_getCumulativeSessionStats( handle, &stats ); - tr_strlsize( up, stats.uploadedBytes, sizeof( up ) ); - tr_strlsize( down, stats.downloadedBytes, sizeof( down ) ); - g_snprintf( buf, sizeof( buf ), _( "Down: %s Up: %s" ), down, up ); - gtk_label_set_text( GTK_LABEL( p->stats_lb ), buf ); + tr_torrentRates( handle, &d, &u ); + tr_strlspeed( buf, d, sizeof( buf ) ); + gtk_label_set_text( GTK_LABEL( p->dl_lb ), buf ); + tr_strlspeed( buf, u, sizeof( buf ) ); + gtk_label_set_text( GTK_LABEL( p->ul_lb ), buf ); + + pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS ); + if( !strcmp( pch, "session-ratio" ) ) { + tr_getSessionStats( handle, &stats ); + g_snprintf( buf, sizeof(buf), _("Ratio: %.1f"), stats.ratio ); + } else if( !strcmp( pch, "session-transfer" ) ) { + tr_getSessionStats( handle, &stats ); + tr_strlsize( up, stats.uploadedBytes, sizeof( up ) ); + tr_strlsize( down, stats.downloadedBytes, sizeof( down ) ); + g_snprintf( buf, sizeof( buf ), _( "Down: %s Up: %s" ), down, up ); + } else if( !strcmp( pch, "total-transfer" ) ) { + tr_getCumulativeSessionStats( handle, &stats ); + tr_strlsize( up, stats.uploadedBytes, sizeof( up ) ); + tr_strlsize( down, stats.downloadedBytes, sizeof( down ) ); + g_snprintf( buf, sizeof( buf ), _( "Down: %s Up: %s" ), down, up ); + } else { /* default is total-ratio */ + tr_getCumulativeSessionStats( handle, &stats ); + g_snprintf( buf, sizeof(buf), _("Ratio: %.1f"), stats.ratio ); + } + g_free( pch ); + gtk_label_set_text( GTK_LABEL( p->stats_lb ), buf ); + } } GtkTreeSelection* diff --git a/gtk/tr_window.h b/gtk/tr_window.h index 042d996fe..f0e0baff9 100644 --- a/gtk/tr_window.h +++ b/gtk/tr_window.h @@ -34,6 +34,6 @@ GtkTreeSelection * tr_window_get_selection( TrWindow* wind ); GtkWidget * tr_window_new( GtkUIManager*, TrCore * core ); -void tr_window_update( TrWindow * wind, float downspeed, float upspeed ); +void tr_window_update( TrWindow * wind ); #endif