diff --git a/gtk/actions.c b/gtk/actions.c index 58f31bce8..148fba4dc 100644 --- a/gtk/actions.c +++ b/gtk/actions.c @@ -44,22 +44,15 @@ action_cb( GtkAction * a, static GtkRadioActionEntry sort_radio_entries[] = { - { "sort-by-activity", NULL, N_( "Sort by _Activity" ), NULL, - NULL, 0 }, - { "sort-by-name", NULL, N_( "Sort by _Name" ), NULL, - NULL, 1 }, - { "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-age", NULL, N_( "Sort by A_ge" ), NULL, - NULL, 6 }, - { "sort-by-eta", NULL, N_( "Sort by _ETA" ), NULL, - NULL, 7 } + { "sort-by-activity", NULL, N_( "Sort by _Activity" ), NULL, NULL, 0 }, + { "sort-by-name", NULL, N_( "Sort by _Name" ), NULL, NULL, 1 }, + { "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-age", NULL, N_( "Sort by A_ge" ), NULL, NULL, 6 }, + { "sort-by-eta", NULL, N_( "Sort by _ETA" ), NULL, NULL, 7 }, + { "sort-by-size", NULL, N_( "Sort by Si_ze" ), NULL, NULL, 8 } }; static void diff --git a/gtk/tr-core.c b/gtk/tr-core.c index 0b1465b27..e23f15541 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -350,10 +350,10 @@ compareByName( GtkTreeModel * model, } static int -compareByAge( GtkTreeModel * model, - GtkTreeIter * a, - GtkTreeIter * b, - gpointer user_data UNUSED ) +compareByAge( GtkTreeModel * model, + GtkTreeIter * a, + GtkTreeIter * b, + gpointer user_data UNUSED ) { tr_torrent *ta, *tb; @@ -363,20 +363,39 @@ compareByAge( GtkTreeModel * model, tr_torrentStatCached( tb )->addedDate ); } +static int +compareBySize( GtkTreeModel * model, + GtkTreeIter * a, + GtkTreeIter * b, + gpointer user_data UNUSED ) +{ + tr_torrent *t; + const tr_info *ia, *ib; + + gtk_tree_model_get( model, a, MC_TORRENT_RAW, &t, -1 ); + ia = tr_torrentInfo( t ); + gtk_tree_model_get( model, b, MC_TORRENT_RAW, &t, -1 ); + ib = tr_torrentInfo( t ); + + if( ia->totalSize < ib->totalSize ) return 1; + if( ia->totalSize > ib->totalSize ) return -1; + return 0; +} + static int compareByProgress( GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data UNUSED ) { - int ret; - tr_torrent * ta, *tb; + int ret; + tr_torrent * t; const tr_stat *sa, *sb; - gtk_tree_model_get( model, a, MC_TORRENT_RAW, &ta, -1 ); - gtk_tree_model_get( model, b, MC_TORRENT_RAW, &tb, -1 ); - sa = tr_torrentStatCached( ta ); - sb = tr_torrentStatCached( tb ); + gtk_tree_model_get( model, a, MC_TORRENT_RAW, &t, -1 ); + sa = tr_torrentStatCached( t ); + gtk_tree_model_get( model, b, MC_TORRENT_RAW, &t, -1 ); + sb = tr_torrentStatCached( t ); ret = compareDouble( sa->percentDone, sb->percentDone ); if( !ret ) ret = compareRatio( sa->ratio, sb->ratio ); @@ -419,10 +438,10 @@ compareByState( GtkTreeModel * model, } static int -compareByTracker( GtkTreeModel * model, - GtkTreeIter * a, - GtkTreeIter * b, - gpointer user_data UNUSED ) +compareByTracker( GtkTreeModel * model, + GtkTreeIter * a, + GtkTreeIter * b, + gpointer user_data UNUSED ) { const tr_torrent *ta, *tb; @@ -458,8 +477,9 @@ setSort( TrCore * core, sort_func = compareByState; else if( !strcmp( mode, "sort-by-tracker" ) ) sort_func = compareByTracker; - else - { + else if( !strcmp( mode, "sort-by-size" ) ) + sort_func = compareBySize; + else { sort_func = compareByName; type = isReversed ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING; } diff --git a/gtk/ui.h b/gtk/ui.h index 36f8fdf39..81085e21d 100644 --- a/gtk/ui.h +++ b/gtk/ui.h @@ -35,10 +35,11 @@ static const char * fallback_ui_file = " \n" " \n" " \n" + " \n" " \n" " \n" - " \n" " \n" + " \n" " \n" " \n" " \n"