mirror of
https://github.com/transmission/transmission.git
synced 2025-12-24 20:35:36 +00:00
(trunk) #3471:Add 'finished' to filterbar
This commit is contained in:
@@ -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 */
|
||||
|
||||
11
gtk/filter.c
11
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 }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +197,9 @@ enum
|
||||
MC_SPEED_UP,
|
||||
MC_SPEED_DOWN,
|
||||
MC_ACTIVITY,
|
||||
MC_FINISHED,
|
||||
MC_PRIORITY,
|
||||
MC_TRACKERS,
|
||||
MC_ROW_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -19,6 +19,7 @@ const QString FilterMode::names[NUM_MODES] =
|
||||
"show-downloading",
|
||||
"show-seeding",
|
||||
"show-paused",
|
||||
"show-finished",
|
||||
"show-queued",
|
||||
"show-verifying",
|
||||
"show-error",
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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( );
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user