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"