(trunk GTK+, Qt) #2645 "add torrent availability to Properties->Information" -- added for 1.90

This commit is contained in:
Charles Kerr 2010-02-02 05:34:26 +00:00
parent 2ff4c36fda
commit 803225bf10
5 changed files with 36 additions and 5 deletions

View File

@ -65,6 +65,7 @@ struct DetailsImpl
GtkWidget * size_lb; GtkWidget * size_lb;
GtkWidget * state_lb; GtkWidget * state_lb;
GtkWidget * have_lb; GtkWidget * have_lb;
GtkWidget * availability_lb;
GtkWidget * dl_lb; GtkWidget * dl_lb;
GtkWidget * ul_lb; GtkWidget * ul_lb;
GtkWidget * ratio_lb; GtkWidget * ratio_lb;
@ -624,6 +625,8 @@ refreshInfo( struct DetailsImpl * di, tr_torrent ** torrents, int n )
const char * none = _( "None" ); const char * none = _( "None" );
const char * mixed = _( "Mixed" ); const char * mixed = _( "Mixed" );
char buf[512]; char buf[512];
double available = 0;
double sizeWhenDone = 0;
const tr_stat ** stats = g_new( const tr_stat*, n ); const tr_stat ** stats = g_new( const tr_stat*, n );
const tr_info ** infos = g_new( const tr_info*, n ); const tr_info ** infos = g_new( const tr_info*, n );
for( i=0; i<n; ++i ) { for( i=0; i<n; ++i ) {
@ -800,18 +803,19 @@ refreshInfo( struct DetailsImpl * di, tr_torrent ** torrents, int n )
if( n <= 0 ) if( n <= 0 )
str = none; str = none;
else { else {
double sizeWhenDone = 0;
double leftUntilDone = 0; double leftUntilDone = 0;
double haveUnchecked = 0; double haveUnchecked = 0;
double haveValid = 0; double haveValid = 0;
double verifiedPieces = 0; double verifiedPieces = 0;
for( i=0; i<n; ++i ) { for( i=0; i<n; ++i ) {
const double v = stats[i]->haveValid; const tr_stat * st = stats[i];
haveUnchecked += stats[i]->haveUnchecked; const double v = st->haveValid;
haveUnchecked += st->haveUnchecked;
haveValid += v; haveValid += v;
verifiedPieces += v / tr_torrentInfo(torrents[i])->pieceSize; verifiedPieces += v / tr_torrentInfo(torrents[i])->pieceSize;
sizeWhenDone += stats[i]->sizeWhenDone; sizeWhenDone += st->sizeWhenDone;
leftUntilDone += stats[i]->leftUntilDone; leftUntilDone += st->leftUntilDone;
available += st->sizeWhenDone - st->leftUntilDone + st->desiredAvailable;
} }
if( !haveValid && !haveUnchecked ) if( !haveValid && !haveUnchecked )
str = none; str = none;
@ -829,6 +833,15 @@ refreshInfo( struct DetailsImpl * di, tr_torrent ** torrents, int n )
} }
gtr_label_set_text( GTK_LABEL( di->have_lb ), str ); gtr_label_set_text( GTK_LABEL( di->have_lb ), str );
/* availability_lb */
if( sizeWhenDone )
str = none;
else {
const double d = ( 100.0 * available ) / sizeWhenDone;
g_snprintf( buf, sizeof( buf ), _( "%1$.1f%%" ), d );
str = buf;
}
gtr_label_set_text( GTK_LABEL( di->availability_lb ), str );
/* dl_lb */ /* dl_lb */
if( n <= 0 ) if( n <= 0 )
@ -949,6 +962,10 @@ info_page_new( struct DetailsImpl * di )
l = di->have_lb = gtk_label_new( NULL ); l = di->have_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _( "Have:" ), l, NULL ); hig_workarea_add_row( t, &row, _( "Have:" ), l, NULL );
/* availability */
l = di->availability_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _( "Availability:" ), l, NULL );
/* downloaded */ /* downloaded */
l = di->dl_lb = gtk_label_new( NULL ); l = di->dl_lb = gtk_label_new( NULL );
hig_workarea_add_row( t, &row, _( "Downloaded:" ), l, NULL ); hig_workarea_add_row( t, &row, _( "Downloaded:" ), l, NULL );

View File

@ -249,6 +249,7 @@ Details :: refresh( )
// myHaveLabel // myHaveLabel
double sizeWhenDone = 0; double sizeWhenDone = 0;
double leftUntilDone = 0; double leftUntilDone = 0;
double available = 0;
int64_t haveTotal = 0; int64_t haveTotal = 0;
int64_t haveVerified = 0; int64_t haveVerified = 0;
int64_t haveUnverified = 0; int64_t haveUnverified = 0;
@ -262,6 +263,7 @@ Details :: refresh( )
verifiedPieces += v / t->pieceSize( ); verifiedPieces += v / t->pieceSize( );
sizeWhenDone += t->sizeWhenDone( ); sizeWhenDone += t->sizeWhenDone( );
leftUntilDone += t->leftUntilDone( ); leftUntilDone += t->leftUntilDone( );
available += t->sizeWhenDone() - t->leftUntilDone() + t->desiredAvailable();
} }
} }
if( !haveVerified && !haveUnverified ) if( !haveVerified && !haveUnverified )
@ -281,6 +283,13 @@ Details :: refresh( )
} }
myHaveLabel->setText( string ); myHaveLabel->setText( string );
// myAvailabilityLabel
if( sizeWhenDone < 1 )
string = none;
else
string.sprintf( "%'.1f%%", ( 100.0 * available ) / sizeWhenDone );
myAvailabilityLabel->setText( string );
// myDownloadedLabel // myDownloadedLabel
if( torrents.empty( ) ) if( torrents.empty( ) )
string = none; string = none;
@ -809,6 +818,7 @@ Details :: createInfoTab( )
hig->addSectionTitle( tr( "Activity" ) ); hig->addSectionTitle( tr( "Activity" ) );
hig->addRow( tr( "Torrent size:" ), mySizeLabel = new SqueezeLabel ); hig->addRow( tr( "Torrent size:" ), mySizeLabel = new SqueezeLabel );
hig->addRow( tr( "Have:" ), myHaveLabel = new SqueezeLabel ); hig->addRow( tr( "Have:" ), myHaveLabel = new SqueezeLabel );
hig->addRow( tr( "Availability:" ), myAvailabilityLabel = new SqueezeLabel );
hig->addRow( tr( "Downloaded:" ), myDownloadedLabel = new SqueezeLabel ); hig->addRow( tr( "Downloaded:" ), myDownloadedLabel = new SqueezeLabel );
hig->addRow( tr( "Uploaded:" ), myUploadedLabel = new SqueezeLabel ); hig->addRow( tr( "Uploaded:" ), myUploadedLabel = new SqueezeLabel );
hig->addRow( tr( "Ratio:" ), myRatioLabel = new SqueezeLabel ); hig->addRow( tr( "Ratio:" ), myRatioLabel = new SqueezeLabel );

View File

@ -71,6 +71,7 @@ class Details: public QDialog
QLabel * myStateLabel; QLabel * myStateLabel;
QLabel * myHaveLabel; QLabel * myHaveLabel;
QLabel * myAvailabilityLabel;
QLabel * myDownloadedLabel; QLabel * myDownloadedLabel;
QLabel * myUploadedLabel; QLabel * myUploadedLabel;
QLabel * myRatioLabel; QLabel * myRatioLabel;

View File

@ -64,6 +64,7 @@ Torrent :: myProperties[] =
{ LEFT_UNTIL_DONE, "leftUntilDone", QVariant::ULongLong, STAT }, { LEFT_UNTIL_DONE, "leftUntilDone", QVariant::ULongLong, STAT },
{ HAVE_UNCHECKED, "haveUnchecked", QVariant::ULongLong, STAT }, { HAVE_UNCHECKED, "haveUnchecked", QVariant::ULongLong, STAT },
{ HAVE_VERIFIED, "haveValid", QVariant::ULongLong, STAT }, { HAVE_VERIFIED, "haveValid", QVariant::ULongLong, STAT },
{ DESIRED_AVAILABLE, "desiredAvailable", QVariant::ULongLong, STAT },
{ TOTAL_SIZE, "totalSize", QVariant::ULongLong, INFO }, { TOTAL_SIZE, "totalSize", QVariant::ULongLong, INFO },
{ PIECE_SIZE, "pieceSize", QVariant::ULongLong, INFO }, { PIECE_SIZE, "pieceSize", QVariant::ULongLong, INFO },
{ PIECE_COUNT, "pieceCount", QVariant::Int, INFO }, { PIECE_COUNT, "pieceCount", QVariant::Int, INFO },

View File

@ -94,6 +94,7 @@ class Torrent: public QObject
LEFT_UNTIL_DONE, LEFT_UNTIL_DONE,
HAVE_UNCHECKED, HAVE_UNCHECKED,
HAVE_VERIFIED, HAVE_VERIFIED,
DESIRED_AVAILABLE,
TOTAL_SIZE, TOTAL_SIZE,
PIECE_SIZE, PIECE_SIZE,
PIECE_COUNT, PIECE_COUNT,
@ -218,6 +219,7 @@ class Torrent: public QObject
bool getSeedRatio( double& setme ) const; bool getSeedRatio( double& setme ) const;
uint64_t haveVerified( ) const { return getSize( HAVE_VERIFIED ); } uint64_t haveVerified( ) const { return getSize( HAVE_VERIFIED ); }
uint64_t haveUnverified( ) const { return getSize( HAVE_UNCHECKED ); } uint64_t haveUnverified( ) const { return getSize( HAVE_UNCHECKED ); }
uint64_t desiredAvailable( ) const { return getSize( DESIRED_AVAILABLE ); }
uint64_t haveTotal( ) const { return haveVerified( ) + haveUnverified(); } uint64_t haveTotal( ) const { return haveVerified( ) + haveUnverified(); }
uint64_t totalSize( ) const { return getSize( TOTAL_SIZE ); } uint64_t totalSize( ) const { return getSize( TOTAL_SIZE ); }
uint64_t sizeWhenDone( ) const { return getSize( SIZE_WHEN_DONE ); } uint64_t sizeWhenDone( ) const { return getSize( SIZE_WHEN_DONE ); }