Changeset 1509


Ignore:
Timestamp:
Feb 23, 2007, 11:27:59 AM (15 years ago)
Author:
joshe
Message:

Display progress in file window as well as updating periodically.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/dialogs.c

    r1507 r1509  
    3232#include "conf.h"
    3333#include "dialogs.h"
     34#include "tr_cell_renderer_progress.h"
    3435#include "tr_icon.h"
    3536#include "tr_prefs.h"
     
    3839#include "transmission.h"
    3940
     41#define UPDATE_INTERVAL         1000
    4042#define PREFNAME                "transmission-dialog-pref-name"
    4143#define FILESWIND_EXTRA_INDENT  4
     
    6971struct fileswind
    7072{
     73    GtkWidget    * widget;
    7174    TrTorrent    * tor;
    7275    GtkTreeModel * model;
     76    guint          timer;
    7377};
    7478
     
    8387static void
    8488quitresp( GtkWidget * widget, gint resp, gpointer data );
     89static void
     90setscroll( void * arg );
     91static void
     92fileswindresp( GtkWidget * widget, gint resp, gpointer data );
     93static void
     94filestorclosed( gpointer data, GObject * tor );
    8595static void
    8696parsepath( GtkTreeStore * store, GtkTreeIter * ret,
    8797           const char * path, int index, uint64_t size );
    8898static uint64_t
    89 getdirtotals( GtkTreeStore * store, GtkTreeIter * parent, tr_file_t * files );
    90 static void
    91 setscroll( void * arg );
    92 static void
    93 fileswindresp( GtkWidget * widget, gint resp SHUTUP, gpointer data );
     99getdirtotals( GtkTreeStore * store, GtkTreeIter * parent );
     100static gboolean
     101fileswindupdate( gpointer data );
     102static float
     103updateprogress( GtkTreeModel * model, GtkTreeIter * parent,
     104                uint64_t total, float * progress );
    94105
    95106void
     
    393404}
    394405
    395 enum filescols { FC_INDEX = 0, FC_LABEL, FC_KEY, FC_STOCK, FC__COUNT };
     406enum filescols
     407{
     408    FC_STOCK = 0, FC_LABEL, FC_PROG, FC_KEY, FC_INDEX, FC_SIZE, FC__MAX
     409};
    396410
    397411void
    398412makefileswind( GtkWindow * parent, TrTorrent * tor )
    399413{
    400     GType cols[] = { G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING };
     414    GType cols[] =
     415    {
     416        G_TYPE_STRING, G_TYPE_STRING, G_TYPE_FLOAT,
     417        G_TYPE_STRING, G_TYPE_INT, G_TYPE_UINT64
     418    };
    401419    tr_info_t         * inf;
    402420    GtkTreeStore      * store;
     
    409427    struct fileswind  * fw;
    410428
    411     g_assert( ALEN( cols ) == FC__COUNT );
     429    g_assert( ALEN( cols ) == FC__MAX );
    412430
    413431    /* set up the model */
    414432    inf   = tr_torrent_info( tor );
    415     store = gtk_tree_store_newv( FC__COUNT, cols );
     433    store = gtk_tree_store_newv( FC__MAX, cols );
    416434    for( ii = 0; ii < inf->fileCount; ii++ )
    417435    {
     
    419437                   ii, inf->files[ii].length );
    420438    }
    421     getdirtotals( store, NULL, inf->files );
     439    getdirtotals( store, NULL );
    422440    gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE( store ),
    423441                                          FC_KEY, GTK_SORT_ASCENDING );
     
    425443    /* create the view */
    426444    view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
     445    /* add file column */
    427446    col = gtk_tree_view_column_new();
    428447    gtk_tree_view_column_set_title( col, _("File") );
     
    436455    gtk_tree_view_column_add_attribute( col, rend, "markup", FC_LABEL );
    437456    gtk_tree_view_append_column( GTK_TREE_VIEW( view ), col );
     457    /* add progress column */
     458    col = gtk_tree_view_column_new();
     459    gtk_tree_view_column_set_title( col, _("Progress") );
     460    rend = tr_cell_renderer_progress_new();
     461    /* this string is only used to determing the size of the progress bar */
     462    label = g_markup_printf_escaped( "<small>%s</small>", _("  fnord    fnord  ") );
     463    g_object_set( rend, "show-text", FALSE, "bar-sizing", label, NULL );
     464    g_free( label );
     465    gtk_tree_view_column_pack_start( col, rend, FALSE );
     466    gtk_tree_view_column_add_attribute( col, rend, "progress", FC_PROG );
     467    gtk_tree_view_append_column( GTK_TREE_VIEW( view ), col );
    438468    /* set up view */
    439469    sel = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) );
     
    457487
    458488    /* create the window */
    459     label = g_strdup_printf( _("Files for %s"), inf->name );
     489    label = g_strdup_printf( _("%s - Files for %s"),
     490                             g_get_application_name(), inf->name );
    460491    wind = gtk_dialog_new_with_buttons( label, parent,
    461492                                        GTK_DIALOG_DESTROY_WITH_PARENT |
     
    469500
    470501    /* set up the callback data */
    471     fw        = g_new0( struct fileswind, 1 );
    472     fw->tor   = tor;
    473     fw->model = GTK_TREE_MODEL( store );
    474     g_object_add_weak_pointer( G_OBJECT( tor ), ( gpointer * )&fw->tor );
     502    fw         = g_new0( struct fileswind, 1 );
     503    fw->widget = wind;
     504    fw->tor    = tor;
     505    fw->model  = GTK_TREE_MODEL( store );
     506    fw->timer  = g_timeout_add( UPDATE_INTERVAL, fileswindupdate, fw );
     507
     508    g_object_weak_ref( G_OBJECT( tor ), filestorclosed, fw );
    475509    g_signal_connect( wind, "response", G_CALLBACK( fileswindresp ), fw );
     510    fileswindupdate( fw );
    476511
    477512    /* show the window with a nice initial size */
     
    480515
    481516static void
     517setscroll( void * arg )
     518{
     519    gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( arg ),
     520        GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
     521}
     522
     523static void
     524fileswindresp( GtkWidget * widget SHUTUP, gint resp SHUTUP, gpointer data )
     525{
     526    struct fileswind * fw = data;
     527
     528    g_object_weak_unref( G_OBJECT( fw->tor ), filestorclosed, fw );
     529    filestorclosed( fw, G_OBJECT( fw->tor ) );
     530}
     531
     532static void
     533filestorclosed( gpointer data, GObject * tor SHUTUP )
     534{
     535    struct fileswind * fw = data;
     536
     537    g_source_remove( fw->timer );
     538    g_object_unref( fw->model );
     539    gtk_widget_destroy( fw->widget );
     540    g_free( fw );
     541}
     542
     543static void
    482544parsepath( GtkTreeStore * store, GtkTreeIter * ret,
    483545           const char * path, int index, uint64_t size )
     
    485547    GtkTreeModel * model;
    486548    GtkTreeIter  * parent, start, iter;
    487     char         * file, * dir, * mykey, * modelkey, * label, * sizestr;
     549    char         * file, * dir, * mykey, * modelkey;
    488550    const char   * stock;
    489551
     
    516578    if( NULL == ret )
    517579    {
    518         sizestr = readablesize( size );
    519         label = g_markup_printf_escaped( _("<small>%s (%s)</small>"),
    520                                          file, sizestr );
    521         g_free( file );
    522         file = label;
    523         g_free( sizestr );
    524580        stock = GTK_STOCK_FILE;
    525581    }
     
    527583    {
    528584        stock = GTK_STOCK_DIRECTORY;
     585        size  = 0;
    529586        index = -1;
    530587    }
    531588    gtk_tree_store_set( store, &iter, FC_INDEX, index, FC_LABEL, file,
    532                         FC_KEY, mykey, FC_STOCK, stock, -1 );
     589                        FC_KEY, mykey, FC_STOCK, stock, FC_SIZE, size, -1 );
    533590  done:
    534591    g_free( mykey );
     
    541598
    542599static uint64_t
    543 getdirtotals( GtkTreeStore * store, GtkTreeIter * parent, tr_file_t * files )
     600getdirtotals( GtkTreeStore * store, GtkTreeIter * parent )
    544601{
    545602    GtkTreeModel * model;
    546603    GtkTreeIter    iter;
    547     int            index;
    548604    uint64_t       mysize, subsize;
    549605    char         * sizestr, * name, * label;
     
    557613            if( gtk_tree_model_iter_has_child( model, &iter ) )
    558614            {
    559                 subsize = getdirtotals( store, &iter, files );
    560                 mysize += subsize;
    561                 gtk_tree_model_get( model, &iter, FC_LABEL, &name, -1 );
    562                 sizestr = readablesize( subsize );
    563                 label = g_markup_printf_escaped( _("<small>%s (%s)</small>"),
    564                                                  name, sizestr );
    565                 g_free( sizestr );
    566                 g_free( name );
    567                 gtk_tree_store_set( store, &iter, FC_LABEL, label, -1 );
    568                 g_free( label );
     615                subsize = getdirtotals( store, &iter );
     616                gtk_tree_store_set( store, &iter, FC_SIZE, subsize, -1 );
    569617            }
    570618            else
    571619            {
    572                 gtk_tree_model_get( model, &iter, FC_INDEX, &index, -1 );
    573                 g_assert( 0 <= index );
    574                 mysize += files[index].length;
     620                gtk_tree_model_get( model, &iter, FC_SIZE, &subsize, -1 );
    575621            }
     622            gtk_tree_model_get( model, &iter, FC_LABEL, &name, -1 );
     623            sizestr = readablesize( subsize );
     624            label = g_markup_printf_escaped( "<small>%s (%s)</small>",
     625                                             name, sizestr );
     626            g_free( sizestr );
     627            g_free( name );
     628            gtk_tree_store_set( store, &iter, FC_LABEL, label, -1 );
     629            g_free( label );
     630            mysize += subsize;
    576631        }
    577632        while( gtk_tree_model_iter_next( model, &iter ) );
     
    581636}
    582637
    583 static void
    584 setscroll( void * arg )
    585 {
    586     gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( arg ),
    587         GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
    588 }
    589 
    590 static void
    591 fileswindresp( GtkWidget * widget, gint resp SHUTUP, gpointer data )
     638static gboolean
     639fileswindupdate( gpointer data )
    592640{
    593641    struct fileswind * fw;
    594 
    595     fw = data;
    596 
    597     g_object_unref( fw->model );
    598     g_object_remove_weak_pointer( G_OBJECT( fw->tor ),
    599                                   ( gpointer * )&fw->tor );
    600     g_free( fw );
    601     gtk_widget_destroy( widget );
    602 }
     642    tr_info_t        * inf;
     643    float            * progress;
     644
     645    fw       = data;
     646    inf      = tr_torrent_info( fw->tor );
     647    progress = tr_torrentCompletion( tr_torrent_handle( fw->tor ) );
     648    updateprogress( fw->model, NULL, inf->totalSize, progress );
     649    free( progress );
     650
     651    return TRUE;
     652}
     653
     654static float
     655updateprogress( GtkTreeModel * model, GtkTreeIter * parent,
     656                uint64_t total, float * progress )
     657{
     658    GtkTreeIter    iter;
     659    float          myprog, subprog;
     660    int            index;
     661    uint64_t       size;
     662
     663    myprog = 0.0;
     664    if( gtk_tree_model_iter_children( model, &iter, parent ) )
     665    {
     666        do
     667        {
     668            if( gtk_tree_model_iter_has_child( model, &iter ) )
     669            {
     670                gtk_tree_model_get( model, &iter, FC_SIZE, &size, -1 );
     671                subprog = updateprogress( model, &iter, size, progress );
     672            }
     673            else
     674            {
     675                gtk_tree_model_get( model, &iter,
     676                                    FC_SIZE, &size, FC_INDEX, &index, -1 );
     677                g_assert( 0 <= index );
     678                subprog = progress[index];
     679            }
     680            gtk_tree_store_set( GTK_TREE_STORE( model ), &iter,
     681                                FC_PROG, subprog, -1 );
     682            myprog += subprog * ( total ? ( float )size / ( float )total : 1 );
     683        }
     684        while( gtk_tree_model_iter_next( model, &iter ) );
     685    }
     686
     687    return myprog;
     688}
Note: See TracChangeset for help on using the changeset viewer.