From ff23406f38fe1f1fd1e6fbf4d389dd2425c44e89 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Sun, 1 Aug 2010 17:43:35 +0000 Subject: [PATCH] (trunk) #3471:Add 'finished' to filterbar --- gtk/details.c | 1 - gtk/filter.c | 11 +++++--- gtk/tr-core.c | 47 ++++++++++++++++++++++++++++++++-- gtk/tr-core.h | 3 +++ libtransmission/transmission.h | 4 +-- qt/filterbar.cc | 4 +++ qt/filters.cc | 1 + qt/filters.h | 2 +- qt/torrent-filter.cc | 14 +++++----- qt/torrent.h | 1 + 10 files changed, 72 insertions(+), 16 deletions(-) diff --git a/gtk/details.c b/gtk/details.c index 393727100..b3332c79d 100644 --- a/gtk/details.c +++ b/gtk/details.c @@ -2160,7 +2160,6 @@ onEditTrackersResponse( GtkDialog * dialog, int response, gpointer data ) { di->trackers = NULL; di->tracker_buffer = NULL; - tr_core_torrent_changed( di->core, tr_torrentId( tor ) ); } /* cleanup */ diff --git a/gtk/filter.c b/gtk/filter.c index 39cb6dcaf..b0b0af6b3 100644 --- a/gtk/filter.c +++ b/gtk/filter.c @@ -589,6 +589,7 @@ enum ACTIVITY_FILTER_SEEDING, ACTIVITY_FILTER_ACTIVE, ACTIVITY_FILTER_PAUSED, + ACTIVITY_FILTER_FINISHED, ACTIVITY_FILTER_QUEUED, ACTIVITY_FILTER_VERIFYING, ACTIVITY_FILTER_ERROR, @@ -633,19 +634,20 @@ test_torrent_activity( tr_torrent * tor, int type ) case ACTIVITY_FILTER_PAUSED: return st->activity == TR_STATUS_STOPPED; + case ACTIVITY_FILTER_FINISHED: + return st->finished == TRUE; + case ACTIVITY_FILTER_QUEUED: - return FALSE; + return st->activity == TR_STATUS_CHECK_WAIT; case ACTIVITY_FILTER_VERIFYING: - return ( st->activity == TR_STATUS_CHECK_WAIT ) - || ( st->activity == TR_STATUS_CHECK ); + return st->activity == TR_STATUS_CHECK ; case ACTIVITY_FILTER_ERROR: return st->error != 0; default: /* ACTIVITY_FILTER_ALL */ return TRUE; - } } @@ -720,6 +722,7 @@ activity_filter_model_new( GtkTreeModel * tmodel ) { ACTIVITY_FILTER_DOWNLOADING, N_( "Downloading" ), GTK_STOCK_GO_DOWN }, { ACTIVITY_FILTER_SEEDING, N_( "Seeding" ), GTK_STOCK_GO_UP }, { ACTIVITY_FILTER_PAUSED, N_( "Paused" ), GTK_STOCK_MEDIA_PAUSE }, + { ACTIVITY_FILTER_FINISHED, N_( "Finished" ), NULL }, { ACTIVITY_FILTER_QUEUED, N_( "Queued" ), NULL }, { ACTIVITY_FILTER_VERIFYING, N_( "Verifying" ), GTK_STOCK_REFRESH }, { ACTIVITY_FILTER_ERROR, N_( "Error" ), GTK_STOCK_DIALOG_ERROR } diff --git a/gtk/tr-core.c b/gtk/tr-core.c index b79ddf640..bc66285c9 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -552,6 +552,22 @@ tr_strcmp( const void * a, return 0; } +static char * +torrentTrackerString( tr_torrent * tor ) +{ + int i; + GString * str = g_string_new( "" ); + const tr_info * inf = tr_torrentInfo( tor ); + + for( i = 0; i < inf->trackerCount; ++i ) + { + const tr_tracker_info * t = &inf->trackers[i]; + str = g_string_append( str, t->announce ); + } + + return g_string_free( str, FALSE ); +} + #ifdef HAVE_GIO struct watchdir_file @@ -779,7 +795,10 @@ tr_core_init( GTypeInstance * instance, G_TYPE_POINTER, /* tr_torrent* */ G_TYPE_DOUBLE, /* tr_stat.pieceUploadSpeed_KBps */ G_TYPE_DOUBLE, /* tr_stat.pieceDownloadSpeed_KBps */ - G_TYPE_INT }; /* tr_stat.status */ + G_TYPE_INT, /* tr_stat.activity */ + G_TYPE_UCHAR, /* tr_stat.finished */ + G_TYPE_CHAR, /* tr_priority_t */ + G_TYPE_STRING }; /* concatenated trackers string */ p = self->priv = G_TYPE_INSTANCE_GET_PRIVATE( self, TR_CORE_TYPE, @@ -886,6 +905,7 @@ tr_core_add_torrent( TrCore * self, const tr_stat * st = tr_torrent_stat( gtor ); tr_torrent * tor = tr_torrent_handle( gtor ); char * collated = g_utf8_strdown( inf->name, -1 ); + char * trackers = torrentTrackerString( tor ); GtkListStore * store = GTK_LIST_STORE( tr_core_model( self ) ); GtkTreeIter unused; @@ -897,6 +917,9 @@ tr_core_add_torrent( TrCore * self, MC_SPEED_UP, st->pieceUploadSpeed_KBps, MC_SPEED_DOWN, st->pieceDownloadSpeed_KBps, MC_ACTIVITY, st->activity, + MC_FINISHED, st->finished, + MC_PRIORITY, tr_torrentGetPriority( tor ), + MC_TRACKERS, trackers, -1 ); if( doNotify ) @@ -905,6 +928,7 @@ tr_core_add_torrent( TrCore * self, /* cleanup */ g_object_unref( G_OBJECT( gtor ) ); g_free( collated ); + g_free( trackers ); } int @@ -1296,33 +1320,50 @@ update_foreach( GtkTreeModel * model, gpointer data UNUSED ) { int oldActivity, newActivity; + tr_bool oldFinished, newFinished; + tr_priority_t oldPriority, newPriority; + char * oldTrackers, * newTrackers; double oldUpSpeed, newUpSpeed; double oldDownSpeed, newDownSpeed; const tr_stat * st; TrTorrent * gtor; + tr_torrent * tor; /* get the old states */ gtk_tree_model_get( model, iter, MC_TORRENT, >or, MC_ACTIVITY, &oldActivity, + MC_FINISHED, &oldFinished, + MC_PRIORITY, &oldPriority, + MC_TRACKERS, &oldTrackers, MC_SPEED_UP, &oldUpSpeed, MC_SPEED_DOWN, &oldDownSpeed, -1 ); /* get the new states */ - st = tr_torrentStat( tr_torrent_handle( gtor ) ); + tor = tr_torrent_handle( gtor ); + st = tr_torrentStat( tor ); newActivity = st->activity; + newFinished = st->finished; + newPriority = tr_torrentGetPriority( tor ); + newTrackers = torrentTrackerString( tor ); newUpSpeed = st->pieceUploadSpeed_KBps; newDownSpeed = st->pieceDownloadSpeed_KBps; /* updating the model triggers off resort/refresh, so don't do it unless something's actually changed... */ if( ( newActivity != oldActivity ) + || ( newFinished != oldFinished ) + || ( newPriority != oldPriority ) + || tr_strcmp( oldTrackers, newTrackers ) || gtr_compare_double( newUpSpeed, oldUpSpeed, 3 ) || gtr_compare_double( newDownSpeed, oldDownSpeed, 3 ) ) { gtk_list_store_set( GTK_LIST_STORE( model ), iter, MC_ACTIVITY, newActivity, + MC_FINISHED, newFinished, + MC_PRIORITY, newPriority, + MC_TRACKERS, newTrackers, MC_SPEED_UP, newUpSpeed, MC_SPEED_DOWN, newDownSpeed, -1 ); @@ -1330,6 +1371,8 @@ update_foreach( GtkTreeModel * model, /* cleanup */ g_object_unref( gtor ); + g_free( newTrackers ); + g_free( oldTrackers ); return FALSE; } diff --git a/gtk/tr-core.h b/gtk/tr-core.h index aadc256a8..56cbd8739 100644 --- a/gtk/tr-core.h +++ b/gtk/tr-core.h @@ -197,6 +197,9 @@ enum MC_SPEED_UP, MC_SPEED_DOWN, MC_ACTIVITY, + MC_FINISHED, + MC_PRIORITY, + MC_TRACKERS, MC_ROW_COUNT }; diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index e2787e82e..dec8f1b49 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -1768,11 +1768,11 @@ typedef struct tr_stat @see error */ char errorString[512]; - /** When tr_stat.status is TR_STATUS_CHECK or TR_STATUS_CHECK_WAIT, + /** When tr_stat.activity is TR_STATUS_CHECK or TR_STATUS_CHECK_WAIT, this is the percentage of how much of the files has been verified. When it gets to 1, the verify process is done. Range is [0..1] - @see tr_stat.status */ + @see tr_stat.activity */ double recheckProgress; /** How much has been downloaded of the entire torrent. diff --git a/qt/filterbar.cc b/qt/filterbar.cc index b0a61e289..9cf0bfbb0 100644 --- a/qt/filterbar.cc +++ b/qt/filterbar.cc @@ -243,6 +243,10 @@ FilterBar :: createActivityCombo( ) row->setData( FilterMode::SHOW_PAUSED, ActivityRole ); model->appendRow( row ); + row = new QStandardItem( blankIcon, tr( "Finished" ) ); + row->setData( FilterMode::SHOW_FINISHED, ActivityRole ); + model->appendRow( row ); + row = new QStandardItem( blankIcon, tr( "Queued" ) ); row->setData( FilterMode::SHOW_QUEUED, ActivityRole ); model->appendRow( row ); diff --git a/qt/filters.cc b/qt/filters.cc index 1f253edf5..0e53772ba 100644 --- a/qt/filters.cc +++ b/qt/filters.cc @@ -19,6 +19,7 @@ const QString FilterMode::names[NUM_MODES] = "show-downloading", "show-seeding", "show-paused", + "show-finished", "show-queued", "show-verifying", "show-error", diff --git a/qt/filters.h b/qt/filters.h index e2bc331d5..7b6a07cb3 100644 --- a/qt/filters.h +++ b/qt/filters.h @@ -26,7 +26,7 @@ class FilterMode FilterMode( const QString& name ): myMode(modeFromName(name)) { } static const QString names[]; enum { SHOW_ALL, SHOW_ACTIVE, SHOW_DOWNLOADING, SHOW_SEEDING, SHOW_PAUSED, - SHOW_QUEUED, SHOW_VERIFYING, SHOW_ERROR, NUM_MODES }; + SHOW_FINISHED, SHOW_QUEUED, SHOW_VERIFYING, SHOW_ERROR, NUM_MODES }; static int modeFromName( const QString& name ); static const QString& nameFromMode( int mode ) { return names[mode]; } int mode() const { return myMode; } diff --git a/qt/torrent-filter.cc b/qt/torrent-filter.cc index 3185038cc..a623393bc 100644 --- a/qt/torrent-filter.cc +++ b/qt/torrent-filter.cc @@ -144,7 +144,6 @@ bool TorrentFilter :: activityFilterAcceptsTorrent( const Torrent * tor, const FilterMode& m ) const { bool accepts; - const tr_torrent_activity activity = tor->getActivity( ); switch( m.mode( ) ) { @@ -155,19 +154,22 @@ TorrentFilter :: activityFilterAcceptsTorrent( const Torrent * tor, const Filter accepts = tor->peersWeAreUploadingTo( ) > 0 || tor->peersWeAreDownloadingFrom( ) > 0 || tor->isVerifying( ); break; case FilterMode::SHOW_DOWNLOADING: - accepts = activity == TR_STATUS_DOWNLOAD; + accepts = tor->isDownloading( ); break; case FilterMode::SHOW_SEEDING: - accepts = activity == TR_STATUS_SEED; + accepts = tor->isSeeding( ); break; case FilterMode::SHOW_PAUSED: - accepts = activity == TR_STATUS_STOPPED; + accepts = tor->isPaused( ); + break; + case FilterMode::SHOW_FINISHED: + accepts = tor->isFinished( ); break; case FilterMode::SHOW_QUEUED: - accepts = activity == TR_STATUS_CHECK_WAIT; + accepts = tor->isWaitingToVerify( ); break; case FilterMode::SHOW_VERIFYING: - accepts = activity == TR_STATUS_CHECK; + accepts = tor->isVerifying( ); break; case FilterMode::SHOW_ERROR: accepts = tor->hasError( ); diff --git a/qt/torrent.h b/qt/torrent.h index a2e6594d3..ca6e4f879 100644 --- a/qt/torrent.h +++ b/qt/torrent.h @@ -308,6 +308,7 @@ class Torrent: public QObject tr_torrent_activity getActivity( ) const { return (tr_torrent_activity) getInt( ACTIVITY ); } bool isFinished( ) const { return getBool( IS_FINISHED ); } bool isPaused( ) const { return getActivity( ) == TR_STATUS_STOPPED; } + bool isWaitingToVerify( ) const { return getActivity( ) == TR_STATUS_CHECK_WAIT; } bool isVerifying( ) const { return getActivity( ) == TR_STATUS_CHECK; } bool isDownloading( ) const { return getActivity( ) == TR_STATUS_DOWNLOAD; } bool isSeeding( ) const { return getActivity( ) == TR_STATUS_SEED; } -- 2.40.0