Changeset 5212


Ignore:
Timestamp:
Mar 7, 2008, 3:16:25 PM (15 years ago)
Author:
charles
Message:

(gtk) use g_format_size_for_display() for file size, and behave like nautilus for displaying ETA

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/util.c

    r5169 r5212  
    6363}
    6464
     65#define KILOBYTE_FACTOR 1024.0
     66#define MEGABYTE_FACTOR (1024.0 * 1024.0)
     67#define GIGABYTE_FACTOR (1024.0 * 1024.0 * 1024.0)
     68
    6569char*
    6670tr_strlsize( char * buf, guint64 size, size_t buflen )
    6771{
    68     if( !size )
    69         g_strlcpy( buf, _( "None" ), buflen );
     72    const goffset s = (goffset)size;
     73#if GLIB_CHECK_VERSION(2,16,0)
     74    char * tmp = g_format_size_for_display( s );
     75    g_strlcpy( buf, tmp, buflen );
     76    g_free( tmp );
     77#else
     78    if ( s < (goffset)KILOBYTE_FACTOR )
     79        g_snprintf( buf, buflen, ngettext("%u byte", "%u bytes", (guint)s), (guint)s );
    7080    else {
    71         static const char *units[] = {
    72             N_("B"), N_("KiB"), N_("MiB"), N_("GiB"), N_("TiB"),
    73             N_("PiB"), N_("EiB"), N_("ZiB"), N_("YiB")
    74         };
    75         unsigned int i;
    76         double small = size;
    77         for( i=0; i<G_N_ELEMENTS(units) && (small>=1024.0); ++i )
    78             small /= 1024.0;
    79         if( i < 2 ) /* B & KiB */
    80             g_snprintf( buf, buflen, "%d %s", (int)small, _(units[i]) );
    81         else
    82             g_snprintf( buf, buflen, "%.1f %s", small, _(units[i]) );
    83     }
     81        gdouble displayed_size;
     82        if (size < (goffset) MEGABYTE_FACTOR) {
     83            displayed_size = (gdouble) size / KILOBYTE_FACTOR;
     84            g_snprintf( buf, buflen, _("%.1f KB"), displayed_size );
     85        } else if (size < (goffset) GIGABYTE_FACTOR) {
     86            displayed_size = (gdouble) size / MEGABYTE_FACTOR;
     87            g_snprintf( buf, buflen, _("%.1f MB"), displayed_size );
     88        } else {
     89            displayed_size = (gdouble) size / GIGABYTE_FACTOR;
     90            g_snprintf( buf, buflen, _("%.1f GB"), displayed_size );
     91        }
     92    }
     93#endif
    8494    return buf;
    8595}
     
    8898tr_strlspeed( char * buf, double KiBps, size_t buflen )
    8999{
    90     const guint64 bps = KiBps * 1024;
    91     if( !bps )
    92         g_strlcpy( buf, _( "None" ), buflen );
    93     else {
    94         char bbuf[64];
    95         tr_strlsize( bbuf, (guint64)(KiBps*1024), sizeof(bbuf) );
    96         g_snprintf( buf, buflen, _("%s/s"), bbuf );
    97     }
     100    const double speed = KiBps;
     101
     102    if ( speed < 1000.0 ) /* 0.0 KB to 999.9 KB */
     103        g_snprintf( buf, buflen, _( "%.1f KB/s" ), speed );
     104    else if( speed < 102400.0 ) /* 0.98 MB to 99.99 MB */
     105        g_snprintf( buf, buflen, _( "%.2f MB/s" ), (speed/1024) );
     106    else if( speed < 1024000.0 ) /* 100.0 MB to 999.9 MB */
     107        g_snprintf( buf, buflen, _( "%.1f MB/s" ), (speed/1024) );
     108    else /* insane speeds */
     109        g_snprintf( buf, buflen, _( "%.2f GB/s" ), (speed/1048576) );
     110
    98111    return buf;
    99112}
    100113
    101 #define SECONDS(s)              ((s) % 60)
    102 #define MINUTES(s)              ((s) / 60 % 60)
    103 #define HOURS(s)                ((s) / 60 / 60 % 24)
    104 #define DAYS(s)                 ((s) / 60 / 60 / 24 % 7)
    105 
    106114char*
    107 tr_strltime( char * buf, int secs, size_t buflen )
    108 {
    109     if( secs < 60 )
    110     {
    111         g_snprintf( buf, buflen, _( "%i %s" ),
    112                     SECONDS(secs), ngettext("sec", "secs", SECONDS(secs)));
    113     }
    114     else if( secs < 60*60 )
    115     {
    116         g_snprintf( buf, buflen, _("%i %s %i %s"),
    117                     MINUTES(secs), ngettext("min", "mins", MINUTES(secs)),
    118                     SECONDS(secs), ngettext("sec", "secs", SECONDS(secs)));
    119     }
    120     else if( secs < 60*60*24 )
    121     {
    122         g_snprintf( buf, buflen, _("%i %s %i %s"),
    123                     HOURS(secs),   ngettext("hr", "hrs", HOURS(secs)),
    124                     MINUTES(secs), ngettext("min", "mins", MINUTES(secs)));
    125     }
    126     else
    127     {
    128         g_snprintf( buf, buflen, _("%i %s %i %s"),
    129                     DAYS(secs),  ngettext("day", "days", DAYS(secs)),
    130                     HOURS(secs), ngettext("hr", "hrs", HOURS(secs)));
    131     }
    132 
     115tr_strltime( char * buf, int seconds, size_t buflen )
     116{
     117    int hours;
     118
     119    if( seconds < 0 )
     120        seconds = 0;
     121
     122    if( seconds < 60 )
     123    {
     124        g_snprintf( buf, sizeof( buf ), ngettext( "%'d second", "%'d seconds", (int)seconds ), (int) seconds );
     125        return buf;
     126    }
     127
     128    if( seconds < ( 60 * 60 ) )
     129    {
     130        const int minutes = ( seconds + 30 ) / 60;
     131        g_snprintf( buf, sizeof( buf ), ngettext( "%'d minute", "%'d minutes", minutes ), minutes );
     132        return buf;
     133    }
     134
     135    hours = seconds / ( 60 *60 );
     136
     137    if( seconds < ( 60 * 60 * 4 ) )
     138    {
     139        char h[64];
     140        char m[64];
     141
     142        const int minutes = ( seconds - hours * 60 * 60 + 30 ) / 60;
     143
     144        g_snprintf( h, sizeof(h), ngettext( "%'d hour", "%'d hours", hours ), hours );
     145        g_snprintf( m, sizeof(m), ngettext( "%'d minute", "%'d minutes", minutes ), minutes );
     146        g_snprintf( buf, buflen, "%s, %s", h, m );
     147        return buf;
     148    }
     149
     150    g_snprintf( buf, sizeof( buf ), ngettext( "%'d hour", "%'d hours", hours ), hours );
    133151    return buf;
    134152}
Note: See TracChangeset for help on using the changeset viewer.