From 5db4ca7fa36ea821e9d8d9770f5955d5e2d15985 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 2 Jun 2008 04:41:55 +0000 Subject: [PATCH] #981: add tr_stat.dateAdded to libT; add "sort by age" to gtk+ client --- gtk/actions.c | 3 ++- gtk/hig.c | 12 ++++++++++-- gtk/hig.h | 4 ++++ gtk/makemeta-ui.c | 30 ++++++++++++++++++------------ gtk/tr-core.c | 23 +++++++++++++++++++++++ gtk/ui.h | 1 + libtransmission/resume.c | 9 +++++++++ libtransmission/resume.h | 3 ++- libtransmission/torrent.c | 4 ++++ libtransmission/torrent.h | 1 + libtransmission/transmission.h | 3 +++ 11 files changed, 77 insertions(+), 16 deletions(-) diff --git a/gtk/actions.c b/gtk/actions.c index f1e3257e5..7506dce52 100644 --- a/gtk/actions.c +++ b/gtk/actions.c @@ -49,7 +49,8 @@ static GtkRadioActionEntry sort_radio_entries[] = { "sort-by-progress", NULL, N_("Sort by _Progress"), NULL, NULL, 2 }, { "sort-by-ratio", NULL, N_("Sort by _Ratio"), NULL, NULL, 3 }, { "sort-by-state", NULL, N_("Sort by _State"), NULL, NULL, 4 }, - { "sort-by-tracker", NULL, N_("Sort by _Tracker"), NULL, NULL, 5 } + { "sort-by-tracker", NULL, N_("Sort by _Tracker"), NULL, NULL, 5 }, + { "sort-by-age", NULL, N_("Sort by A_ge"), NULL, NULL, 6 } }; static void diff --git a/gtk/hig.c b/gtk/hig.c index 449021500..845a74748 100644 --- a/gtk/hig.c +++ b/gtk/hig.c @@ -33,6 +33,15 @@ hig_workarea_add_section_divider( GtkWidget * t, ++*row; } +void +hig_workarea_add_section_title_widget( GtkWidget * t, + int * row, + GtkWidget * w ) +{ + gtk_table_attach( GTK_TABLE( t ), w, 0, 2, *row, *row+1, ~0, 0, 0, 0 ); + ++*row; +} + void hig_workarea_add_section_title( GtkWidget * t, int * row, @@ -45,8 +54,7 @@ hig_workarea_add_section_title( GtkWidget * t, l = gtk_label_new( buf ); gtk_misc_set_alignment( GTK_MISC( l ), 0.0f, 0.5f ); gtk_label_set_use_markup( GTK_LABEL( l ), TRUE ); - gtk_table_attach( GTK_TABLE( t ), l, 0, 2, *row, *row+1, ~0, 0, 0, 0 ); - ++*row; + hig_workarea_add_section_title_widget( t, row, l ); } static GtkWidget* diff --git a/gtk/hig.h b/gtk/hig.h index a19662b50..2c0663616 100644 --- a/gtk/hig.h +++ b/gtk/hig.h @@ -25,6 +25,10 @@ GtkWidget* hig_workarea_create( void ); void hig_workarea_add_section_divider( GtkWidget * table, int * row ); +void hig_workarea_add_section_title_widget( GtkWidget * t, + int * row, + GtkWidget * w ); + void hig_workarea_add_section_title( GtkWidget * table, int * row, const char * section_title ); diff --git a/gtk/makemeta-ui.c b/gtk/makemeta-ui.c index 0048eb546..3b135c86a 100644 --- a/gtk/makemeta-ui.c +++ b/gtk/makemeta-ui.c @@ -211,14 +211,14 @@ refreshFromBuilder( MakeMetaUI * ui ) const char * filename = builder ? builder->top : NULL; if( !filename ) - g_snprintf( buf, sizeof( buf ), _( "No files selected" ) ); + g_snprintf( buf, sizeof( buf ), _( "No source selected" ) ); else g_snprintf( buf, sizeof(buf), "%s.torrent (%d%%)", filename, 0 ); gtk_progress_bar_set_text( GTK_PROGRESS_BAR( ui->progressbar ), buf ); refreshButtons( ui ); if( !filename ) - g_snprintf( buf, sizeof( buf ), _( "No files selected" ) ); + g_snprintf( buf, sizeof( buf ), _( "No source selected" ) ); else { tr_strlsize( sizeStr, builder->totalSize, sizeof(sizeStr) ); g_snprintf( buf, sizeof( buf ), @@ -305,7 +305,7 @@ GtkWidget* make_meta_ui( GtkWindow * parent, tr_handle * handle ) { int row = 0; - GtkWidget *d, *t, *w, *h, *h2, *v, *focusMe; + GtkWidget *d, *t, *w, *h, *h2, *v, *focusMe, *extras; GtkBox * main_vbox; MakeMetaUI * ui = g_new0 ( MakeMetaUI, 1 ); ui->handle = handle; @@ -313,9 +313,9 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) d = gtk_dialog_new_with_buttons( _("New Torrent"), parent, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_NEW, GTK_RESPONSE_ACCEPT, + GTK_STOCK_STOP, GTK_RESPONSE_CANCEL, NULL ); g_signal_connect( d, "response", G_CALLBACK(response_cb), ui ); g_object_set_data_full( G_OBJECT(d), "ui", ui, freeMetaUI ); @@ -334,7 +334,7 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) gtk_box_pack_start( GTK_BOX( v ), w, FALSE, FALSE, 0 ); h2 = gtk_hbox_new( FALSE, GUI_PAD_SMALL ); w = ui->size_lb = gtk_label_new (NULL); - gtk_label_set_markup ( GTK_LABEL(w), _( "No files selected" ) ); + gtk_label_set_markup ( GTK_LABEL(w), _( "No source selected" ) ); gtk_box_pack_start( GTK_BOX(h2), w, FALSE, FALSE, GUI_PAD_SMALL ); w = ui->pieces_lb = gtk_label_new (NULL); gtk_box_pack_end( GTK_BOX(h2), w, FALSE, FALSE, GUI_PAD_SMALL ); @@ -362,14 +362,20 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) hig_workarea_add_wide_control( t, &row, w ); hig_workarea_add_section_divider( t, &row ); - hig_workarea_add_section_title( t, &row, _( "Options" ) ); + w = extras = gtk_expander_new_with_mnemonic( _( "E_xtras" ) ); + gtk_expander_set_use_markup( GTK_EXPANDER( w ), TRUE ); + hig_workarea_add_section_title_widget( t, &row, w ); + { + int row2 = 0; + GtkWidget * t2 = hig_workarea_create( ); w = ui->comment_entry = gtk_entry_new( ); - hig_workarea_add_row (t, &row, _( "Commen_t:" ), w, NULL ); - - w = hig_workarea_add_wide_checkbutton( t, &row, _( "_Private torrent" ), FALSE ); + hig_workarea_add_row( t2, &row2, _( "Commen_t:" ), w, NULL ); + w = hig_workarea_add_wide_checkbutton( t2, &row2, _( "_Private torrent" ), FALSE ); ui->private_check = w; - + hig_workarea_finish( t2, &row2 ); + gtk_container_add( GTK_CONTAINER( extras ), t2 ); + } hig_workarea_finish( t, &row ); gtk_box_pack_start_defaults( main_vbox, t ); @@ -379,10 +385,10 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) gtk_container_set_border_width( GTK_CONTAINER( w ), GUI_PAD_BIG ); ui->progressbar = gtk_progress_bar_new( ); - gtk_progress_bar_set_text( GTK_PROGRESS_BAR( ui->progressbar), _( "No files selected" ) ); + gtk_progress_bar_set_text( GTK_PROGRESS_BAR( ui->progressbar), _( "No source selected" ) ); gtk_container_add( GTK_CONTAINER( w ), ui->progressbar ); - gtk_box_pack_start( main_vbox, w, FALSE, FALSE, GUI_PAD_BIG ); + gtk_box_pack_start( main_vbox, w, FALSE, FALSE, 0 ); gtk_window_set_default_size( GTK_WINDOW(d), 500, 0 ); gtk_widget_show_all( GTK_DIALOG(d)->vbox ); diff --git a/gtk/tr-core.c b/gtk/tr-core.c index b5b304c57..f86574976 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -210,6 +210,14 @@ compareRatio( double a, double b ) return compareDouble( a, b ); } +static int +compareTime( time_t a, time_t b ) +{ + if( a < b ) return -1; + if( a > b ) return 1; + return 0; +} + static int compareByRatio( GtkTreeModel * model, GtkTreeIter * a, @@ -270,6 +278,19 @@ compareByName( GtkTreeModel * model, return ret; } +static int +compareByAge( GtkTreeModel * model, + GtkTreeIter * a, + GtkTreeIter * b, + gpointer user_data UNUSED ) +{ + tr_torrent *ta, *tb; + gtk_tree_model_get( model, a, MC_TORRENT_RAW, &ta, -1 ); + gtk_tree_model_get( model, b, MC_TORRENT_RAW, &tb, -1 ); + return compareTime( tr_torrentStatCached(ta)->addedDate, + tr_torrentStatCached(tb)->addedDate ); +} + static int compareByProgress( GtkTreeModel * model, GtkTreeIter * a, @@ -332,6 +353,8 @@ setSort( TrCore * core, const char * mode, gboolean isReversed ) if( !strcmp( mode, "sort-by-activity" ) ) sort_func = compareByActivity; + else if( !strcmp( mode, "sort-by-age" ) ) + sort_func = compareByAge; else if( !strcmp( mode, "sort-by-progress" ) ) sort_func = compareByProgress; else if( !strcmp( mode, "sort-by-ratio" ) ) diff --git a/gtk/ui.h b/gtk/ui.h index 00f7d93a8..83851c21c 100644 --- a/gtk/ui.h +++ b/gtk/ui.h @@ -32,6 +32,7 @@ const char * fallback_ui_file = " \n" " \n" " \n" +" \n" " \n" " \n" " \n" diff --git a/libtransmission/resume.c b/libtransmission/resume.c index f967e783d..c4edfc68a 100644 --- a/libtransmission/resume.c +++ b/libtransmission/resume.c @@ -35,6 +35,7 @@ #define KEY_PROGRESS "progress" #define KEY_SPEEDLIMIT "speed-limit" #define KEY_UPLOADED "uploaded" +#define KEY_ADDED_DATE "added-date" #define KEY_SPEEDLIMIT_DOWN_SPEED "down-speed" #define KEY_SPEEDLIMIT_DOWN_MODE "down-mode" @@ -359,6 +360,8 @@ tr_torrentSaveResume( const tr_torrent * tor ) tor->maxConnectedPeers ); tr_bencDictAddInt( &top, KEY_PAUSED, tor->isRunning ? 0 : 1 ); + tr_bencDictAddInt( &top, KEY_ADDED_DATE, + tor->addedDate ); savePeers( &top, tor ); savePriorities( &top, tor ); saveDND( &top, tor ); @@ -437,6 +440,12 @@ loadFromFile( tr_torrent * tor, fieldsLoaded |= TR_FR_RUN; } + if( ( fieldsToLoad & TR_FR_ADDED_DATE ) + && tr_bencDictFindInt( &top, KEY_ADDED_DATE, &i ) ) { + tor->addedDate = i; + fieldsLoaded |= TR_FR_ADDED_DATE; + } + if( fieldsToLoad & TR_FR_PEERS ) fieldsLoaded |= loadPeers( &top, tor ); diff --git a/libtransmission/resume.h b/libtransmission/resume.h index 7c1169d5b..84909c81c 100644 --- a/libtransmission/resume.h +++ b/libtransmission/resume.h @@ -25,7 +25,8 @@ enum TR_FR_SPEEDLIMIT = (1<<7), TR_FR_RUN = (1<<8), TR_FR_DOWNLOAD_DIR = (1<<9), - TR_FR_MAX_PEERS = (1<<10) + TR_FR_MAX_PEERS = (1<<10), + TR_FR_ADDED_DATE = (1<<11) }; /** diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index 2dcbb345e..87436ad95 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -474,6 +474,9 @@ torrentRealInit( tr_handle * h, tor->checkedPieces = tr_bitfieldNew( tor->info.pieceCount ); tr_torrentUncheck( tor ); + + tor->addedDate = time( NULL ); /* this is a default value to be + overwritten by the resume file */ loaded = tr_torrentLoadResume( tor, ~0, ctor ); doStart = tor->isRunning; @@ -736,6 +739,7 @@ tr_torrentStat( tr_torrent * tor ) s->startDate = tor->startDate; s->activityDate = tor->activityDate; + s->addedDate = tor->addedDate; s->corruptEver = tor->corruptCur + tor->corruptPrev; s->downloadedEver = tor->downloadedCur + tor->downloadedPrev; diff --git a/libtransmission/torrent.h b/libtransmission/torrent.h index 2a42a9f74..609750d43 100644 --- a/libtransmission/torrent.h +++ b/libtransmission/torrent.h @@ -159,6 +159,7 @@ struct tr_torrent uint64_t corruptCur; uint64_t corruptPrev; + time_t addedDate; time_t startDate; time_t activityDate; diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 49236653d..780ef5f39 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -1213,6 +1213,9 @@ typedef struct tr_stat #define TR_RATIO_INF -2 /** TR_RATIO_INF, TR_RATIO_NA, or a regular ratio */ float ratio; + + /** When the torrent was first added. */ + time_t addedDate; /** When the torrent was last started. */ time_t startDate; -- 2.40.0