{
di->trackers = NULL;
di->tracker_buffer = NULL;
- tr_core_torrent_changed( di->core, tr_torrentId( tor ) );
}
/* cleanup */
ACTIVITY_FILTER_SEEDING,
ACTIVITY_FILTER_ACTIVE,
ACTIVITY_FILTER_PAUSED,
+ ACTIVITY_FILTER_FINISHED,
ACTIVITY_FILTER_QUEUED,
ACTIVITY_FILTER_VERIFYING,
ACTIVITY_FILTER_ERROR,
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;
-
}
}
{ 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 }
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
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,
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;
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 )
/* cleanup */
g_object_unref( G_OBJECT( gtor ) );
g_free( collated );
+ g_free( trackers );
}
int
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 );
/* cleanup */
g_object_unref( gtor );
+ g_free( newTrackers );
+ g_free( oldTrackers );
return FALSE;
}
MC_SPEED_UP,
MC_SPEED_DOWN,
MC_ACTIVITY,
+ MC_FINISHED,
+ MC_PRIORITY,
+ MC_TRACKERS,
MC_ROW_COUNT
};
@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.
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 );
"show-downloading",
"show-seeding",
"show-paused",
+ "show-finished",
"show-queued",
"show-verifying",
"show-error",
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; }
TorrentFilter :: activityFilterAcceptsTorrent( const Torrent * tor, const FilterMode& m ) const
{
bool accepts;
- const tr_torrent_activity activity = tor->getActivity( );
switch( m.mode( ) )
{
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( );
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; }