Changeset 4248


Ignore:
Timestamp:
Dec 20, 2007, 7:21:21 PM (15 years ago)
Author:
charles
Message:

(gtk) yin/yang icon: add a pulldown menu for {total,session}{ratio,transfer}

Location:
trunk/gtk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/main.c

    r4222 r4248  
    749749updatemodel(gpointer gdata) {
    750750  struct cbdata *data = gdata;
    751   float up, down;
    752751
    753752  if( !data->closing && 0 < global_sigcount )
     
    761760
    762761  /* update the main window's statusbar and toolbar buttons */
    763   if( NULL != data->wind )
    764   {
    765       tr_torrentRates( tr_core_handle( data->core ), &down, &up );
    766       tr_window_update( data->wind, down, up );
    767   }
     762  if( data->wind )
     763      tr_window_update( data->wind );
    768764
    769765  /* update the message window */
  • trunk/gtk/tr_prefs.c

    r4240 r4248  
    3030    cf_check_older_configs( );
    3131
     32    pref_string_set_default ( PREF_KEY_STATUS_BAR_STATS, "total-ratio" );
    3233    pref_flag_set_default   ( PREF_KEY_STATUS_BAR, TRUE );
    3334    pref_flag_set_default   ( PREF_KEY_TOOLBAR, TRUE );
  • trunk/gtk/tr_prefs.h

    r4240 r4248  
    4040#define PREF_KEY_MINIMAL_VIEW      "minimal-view"
    4141#define PREF_KEY_STATUS_BAR        "show-status-bar"
     42#define PREF_KEY_STATUS_BAR_STATS  "status-bar-stats"
    4243#define PREF_KEY_TOOLBAR           "show-toolbar"
    4344
  • trunk/gtk/tr_window.c

    r4240 r4248  
    5555    GtkWidget * toolbar;
    5656    GtkWidget * status;
     57    GtkWidget * status_menu;
    5758    GtkWidget * ul_lb;
    5859    GtkWidget * dl_lb;
     
    164165        g_object_set( p->toolbar, "visible", isEnabled, NULL );
    165166    }
     167    else if( !strcmp( key, PREF_KEY_STATUS_BAR_STATS ) )
     168    {
     169        tr_window_update( (TrWindow*)wind );
     170    }
    166171}
    167172
     
    169174privateFree( gpointer vprivate )
    170175{
    171     PrivateData * p = (PrivateData*) vprivate;
     176    PrivateData * p = ( PrivateData * ) vprivate;
    172177    g_signal_handler_disconnect( p->core, p->pref_handler_id );
    173178    g_free( p );
     179}
     180
     181static void
     182onYinYangReleased( GtkWidget * w UNUSED, GdkEventButton * button UNUSED, gpointer vprivate )
     183{
     184    PrivateData * p = ( PrivateData * ) vprivate;
     185    gtk_menu_popup( GTK_MENU( p->status_menu ), 0, 0, 0, 0, 0, gtk_get_current_event_time( ) );
     186}
     187
     188#define STATS_MODE "stats-mode"
     189
     190static struct {
     191    const char *val, *i18n;
     192} stats_modes[] = {
     193    { "total-ratio",      N_("Total Ratio") },
     194    { "session-ratio",    N_("Session Ratio") },
     195    { "total-transfer",   N_("Total Transfer") },
     196    { "session-transfer", N_("Session Transfer") }
     197};
     198
     199static void
     200status_menu_toggled_cb( GtkCheckMenuItem  * menu_item,
     201                        gpointer            vprivate )
     202{
     203    if( gtk_check_menu_item_get_active( menu_item ) )
     204    {
     205        PrivateData * p = (PrivateData*) vprivate;
     206        const char * val = g_object_get_data( G_OBJECT( menu_item ), STATS_MODE );
     207        tr_core_set_pref( p->core, PREF_KEY_STATUS_BAR_STATS, val );
     208    }
    174209}
    175210
     
    181216tr_window_new( GtkUIManager * ui_manager, TrCore * core )
    182217{
     218    int i, n;
     219    int status_stats_mode;
     220    char * pch;
    183221    PrivateData * p = g_new( PrivateData, 1 );
    184     GtkWidget *vbox, *w, *self, *h;
     222    GtkWidget *vbox, *w, *self, *h, *c;
    185223
    186224    /* make the window */
     
    205243    gtk_box_pack_start( GTK_BOX(vbox), w, FALSE, FALSE, 0 );
    206244
     245    /* status menu */
     246    GtkWidget * menu = p->status_menu = gtk_menu_new( );
     247    status_stats_mode = 0;
     248    GSList * l = NULL;
     249    pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS );
     250    for( i=0, n=G_N_ELEMENTS(stats_modes); i<n; ++i )
     251    {
     252        const char * val = stats_modes[i].val;
     253        w = gtk_radio_menu_item_new_with_label( l, _( stats_modes[i].i18n ) );
     254        l = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(w) );
     255        gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(w), !strcmp( val, pch ) );
     256        g_object_set_data( G_OBJECT(w), STATS_MODE, (gpointer)stats_modes[i].val );
     257        g_signal_connect( w, "toggled", G_CALLBACK(status_menu_toggled_cb), p );
     258        gtk_menu_shell_append( GTK_MENU_SHELL(menu), w );
     259        gtk_widget_show( w );
     260    }
     261    g_free( pch );
     262
    207263    /* statusbar */
    208264    h = p->status = gtk_hbox_new( FALSE, GUI_PAD );
     
    222278
    223279    w = gtk_image_new_from_stock( "tr-yin-yang", (GtkIconSize)-1 );
     280    c = gtk_event_box_new( );
     281    gtk_container_add( GTK_CONTAINER(c), w );
     282    w = c;
     283    g_signal_connect( w, "button-release-event", G_CALLBACK(onYinYangReleased), p );
    224284    gtk_box_pack_start( GTK_BOX(h), w, FALSE, FALSE, 0 );
    225285    w = p->stats_lb = gtk_label_new( NULL );
     
    246306    prefsChanged( core, PREF_KEY_MINIMAL_VIEW, self );
    247307    prefsChanged( core, PREF_KEY_STATUS_BAR, self );
     308    prefsChanged( core, PREF_KEY_STATUS_BAR_STATS, self );
    248309    prefsChanged( core, PREF_KEY_TOOLBAR, self );
    249310    p->core = core;
     
    255316
    256317void
    257 tr_window_update( TrWindow * self, float downspeed, float upspeed )
     318tr_window_update( TrWindow * self )
    258319{
    259320    PrivateData * p = get_private_data( self );
    260     char up[32], down[32], buf[64];
    261     struct tr_session_stats stats;
    262     tr_handle * handle = tr_core_handle( p->core );
    263 
    264     tr_strlspeed( buf, downspeed, sizeof( buf ) );
    265     gtk_label_set_text( GTK_LABEL( p->dl_lb ), buf );
    266 
    267     tr_strlspeed( buf, upspeed, sizeof( buf ) );
    268     gtk_label_set_text( GTK_LABEL( p->ul_lb ), buf );
    269 
    270     tr_getCumulativeSessionStats( handle, &stats );
    271     tr_strlsize( up, stats.uploadedBytes, sizeof( up ) );
    272     tr_strlsize( down, stats.downloadedBytes, sizeof( down ) );
    273     g_snprintf( buf, sizeof( buf ), _( "Down: %s  Up: %s" ), down, up );
    274     gtk_label_set_text( GTK_LABEL( p->stats_lb ), buf );
     321    tr_handle * handle = NULL;
     322
     323    if( p && p->core )
     324        handle = tr_core_handle( p->core );
     325
     326    if( handle )
     327    {
     328        char * pch;
     329        float u, d;
     330        char up[32], down[32], buf[64];
     331        struct tr_session_stats stats;
     332
     333        tr_torrentRates( handle, &d, &u );
     334        tr_strlspeed( buf, d, sizeof( buf ) );
     335        gtk_label_set_text( GTK_LABEL( p->dl_lb ), buf );
     336        tr_strlspeed( buf, u, sizeof( buf ) );
     337        gtk_label_set_text( GTK_LABEL( p->ul_lb ), buf );
     338
     339        pch = pref_string_get( PREF_KEY_STATUS_BAR_STATS );
     340        if( !strcmp( pch, "session-ratio" ) ) {
     341            tr_getSessionStats( handle, &stats );
     342            g_snprintf( buf, sizeof(buf), _("Ratio: %.1f"), stats.ratio );
     343        } else if( !strcmp( pch, "session-transfer" ) ) {
     344            tr_getSessionStats( handle, &stats );
     345            tr_strlsize( up, stats.uploadedBytes, sizeof( up ) );
     346            tr_strlsize( down, stats.downloadedBytes, sizeof( down ) );
     347            g_snprintf( buf, sizeof( buf ), _( "Down: %s  Up: %s" ), down, up );
     348        } else if( !strcmp( pch, "total-transfer" ) ) {
     349            tr_getCumulativeSessionStats( handle, &stats );
     350            tr_strlsize( up, stats.uploadedBytes, sizeof( up ) );
     351            tr_strlsize( down, stats.downloadedBytes, sizeof( down ) );
     352            g_snprintf( buf, sizeof( buf ), _( "Down: %s  Up: %s" ), down, up );
     353        } else { /* default is total-ratio */
     354            tr_getCumulativeSessionStats( handle, &stats );
     355            g_snprintf( buf, sizeof(buf), _("Ratio: %.1f"), stats.ratio );
     356        }
     357        g_free( pch );
     358        gtk_label_set_text( GTK_LABEL( p->stats_lb ), buf );
     359    }
    275360}
    276361
  • trunk/gtk/tr_window.h

    r4222 r4248  
    3535GtkWidget * tr_window_new( GtkUIManager*, TrCore * core );
    3636
    37 void tr_window_update( TrWindow * wind, float downspeed, float upspeed );
     37void tr_window_update( TrWindow * wind );
    3838
    3939#endif
Note: See TracChangeset for help on using the changeset viewer.