transmission/gtk/stats.c

154 lines
4.9 KiB
C
Raw Normal View History

2007-11-27 03:29:51 +00:00
/*
2008-01-01 17:20:20 +00:00
* This file Copyright (C) 2007-2008 Charles Kerr <charles@rebelbase.com>
2007-11-27 03:29:51 +00:00
*
* This file is licensed by the GPL version 2. Works owned by the
* Transmission project are granted a special exemption to clause 2(b)
* so that the bulk of its code can remain under the MIT license.
* This exemption does not extend to derived works not owned by
* the Transmission project.
*
* $Id$
2007-11-27 03:29:51 +00:00
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include "hig.h"
#include "stats.h"
#include "tr-core.h"
2007-11-27 03:29:51 +00:00
2008-04-22 14:07:42 +00:00
enum
{
TR_RESPONSE_CLEAR = 1
};
2007-11-27 03:29:51 +00:00
struct stat_ui
{
GtkWidget * one_up_lb;
GtkWidget * one_down_lb;
GtkWidget * one_ratio_lb;
GtkWidget * one_time_lb;
GtkWidget * all_up_lb;
GtkWidget * all_down_lb;
GtkWidget * all_ratio_lb;
GtkWidget * all_time_lb;
GtkWidget * all_sessions_lb;
TrCore * core;
};
static void
setLabel( GtkWidget * w, const char * str )
2007-11-27 03:29:51 +00:00
{
gtk_label_set_text( GTK_LABEL(w), str );
2007-11-27 03:29:51 +00:00
}
static void
setLabelFromRatio( GtkWidget * w, double d )
{
char buf[128];
tr_strlratio( buf, d, sizeof( buf ) );
setLabel( w, buf );
2007-11-27 03:29:51 +00:00
}
static gboolean
updateStats( gpointer gdata )
{
const char * fmt;
char buf[128];
2007-11-27 03:29:51 +00:00
struct stat_ui * ui = gdata;
tr_session_stats one, all;
tr_sessionGetStats( tr_core_handle( ui->core ), &one );
tr_sessionGetCumulativeStats( tr_core_handle( ui->core ), &all );
2007-11-27 03:29:51 +00:00
setLabel( ui->one_up_lb, tr_strlsize( buf, one.uploadedBytes, sizeof(buf) ) );
setLabel( ui->one_down_lb, tr_strlsize( buf, one.downloadedBytes, sizeof(buf) ) );
setLabel( ui->one_time_lb, tr_strltime( buf, one.secondsActive, sizeof(buf) ) );
2007-11-27 03:29:51 +00:00
setLabelFromRatio( ui->one_ratio_lb, one.ratio );
fmt = ngettext( "Started %'d time", "Started %'d times", (int)all.sessionCount );
g_snprintf( buf, sizeof(buf), fmt, (int)all.sessionCount );
setLabel( ui->all_sessions_lb, buf );
setLabel( ui->all_up_lb, tr_strlsize( buf, all.uploadedBytes, sizeof(buf) ) );
setLabel( ui->all_down_lb, tr_strlsize( buf, all.downloadedBytes, sizeof(buf) ) );
setLabel( ui->all_time_lb, tr_strltime( buf, all.secondsActive, sizeof(buf) ) );
2007-11-27 03:29:51 +00:00
setLabelFromRatio( ui->all_ratio_lb, all.ratio );
return TRUE;
}
static void
dialogDestroyed( gpointer p, GObject * dialog UNUSED )
{
g_source_remove( GPOINTER_TO_UINT( p ) );
}
2007-11-27 03:29:51 +00:00
static void
2008-04-22 14:07:42 +00:00
dialogResponse( GtkDialog * dialog, gint response, gpointer gdata )
2007-11-27 03:29:51 +00:00
{
2008-04-22 14:07:42 +00:00
struct stat_ui * ui = gdata;
if( response == TR_RESPONSE_CLEAR )
{
tr_handle * handle = tr_core_handle( ui->core );
tr_sessionClearStats( handle );
2008-04-22 14:07:42 +00:00
updateStats( ui );
}
if( response == GTK_RESPONSE_CLOSE )
{
gtk_widget_destroy( GTK_WIDGET( dialog ) );
}
2007-11-27 03:29:51 +00:00
}
GtkWidget*
stats_dialog_create( GtkWindow * parent, TrCore * core )
{
guint i;
int row = 0;
GtkWidget * d;
GtkWidget * t;
GtkWidget * l;
struct stat_ui * ui = g_new0( struct stat_ui, 1 );
d = gtk_dialog_new_with_buttons( _("Statistics"),
parent,
GTK_DIALOG_DESTROY_WITH_PARENT,
2008-04-22 14:07:42 +00:00
GTK_STOCK_CLEAR, TR_RESPONSE_CLEAR,
2007-11-27 03:29:51 +00:00
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL );
t = hig_workarea_create( );
gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(d)->vbox), t );
ui->core = core;
hig_workarea_add_section_title( t, &row, _( "Current Session" ) );
l = ui->one_up_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Uploaded:"), l, NULL );
l = ui->one_down_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Downloaded:"), l, NULL );
l = ui->one_ratio_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Ratio:"), l, NULL );
l = ui->one_time_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Duration:"), l, NULL );
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _("Total") );
l = ui->all_sessions_lb = gtk_label_new( _("Started %'d time") );
2007-11-27 03:29:51 +00:00
hig_workarea_add_label_w( t, row++, l );
l = ui->all_up_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Uploaded:"), l, NULL );
l = ui->all_down_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Downloaded:"), l, NULL );
l = ui->all_ratio_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Ratio:"), l, NULL );
l = ui->all_time_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _("Duration:"), l, NULL );
hig_workarea_finish( t, &row );
gtk_widget_show_all( t );
updateStats( ui );
g_object_set_data_full( G_OBJECT(d), "data", ui, g_free );
2008-04-22 14:07:42 +00:00
g_signal_connect( d, "response", G_CALLBACK(dialogResponse), ui );
2007-11-27 03:29:51 +00:00
i = g_timeout_add( 1000, updateStats, ui );
g_object_weak_ref( G_OBJECT( d ), dialogDestroyed, GUINT_TO_POINTER( i ) );
2007-11-27 03:29:51 +00:00
return d;
}