diff --git a/gtk/main.c b/gtk/main.c index f31b1e7d0..2770cad4e 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -650,6 +650,7 @@ initializeFromPrefs( struct cbdata * cbdata ) PREF_KEY_NAT, PREF_KEY_PEX, PREF_KEY_SYSTRAY, + PREF_KEY_SORT_COLUMN, PREF_KEY_ENCRYPTED_ONLY }; @@ -711,6 +712,10 @@ prefschanged( TrCore * core UNUSED, const char * key, gpointer data ) cbdata->icon = NULL; } } + else if( !strcmp( key, PREF_KEY_SORT_COLUMN ) ) + { + tr_core_set_sort_column_from_prefs( cbdata->core ); + } else if( !strcmp( key, PREF_KEY_PEX ) ) { gboolean enabled = pref_flag_get( key ); diff --git a/gtk/tr_core.c b/gtk/tr_core.c index 122a11d27..f77357fa5 100644 --- a/gtk/tr_core.c +++ b/gtk/tr_core.c @@ -236,6 +236,48 @@ compareProgress( GtkTreeModel * model, return 0; } +#define STR_REVERSE "reverse-" +#define STR_PROGRESS "progress" +#define STR_NAME "name" + +static void +onSortColumnChanged( GtkTreeSortable * sortable, gpointer unused UNUSED ) +{ + int column; + GtkSortType order; + if( gtk_tree_sortable_get_sort_column_id( sortable, &column, &order ) ) + { + GString * gstr = g_string_new( NULL ); + switch( column ) { + case MC_PROG_D: g_string_assign( gstr, STR_PROGRESS ); break; + default: g_string_assign( gstr, STR_NAME ); break; + } + if( order == GTK_SORT_DESCENDING ) + g_string_prepend( gstr, STR_REVERSE ); + pref_string_set( PREF_KEY_SORT_COLUMN, gstr->str ); + g_string_free( gstr, TRUE ); + } +} + +void +tr_core_set_sort_column_from_prefs( TrCore * core ) +{ + char * val = pref_string_get( PREF_KEY_SORT_COLUMN ); + char * freeme = val; + gint column; + GtkSortType order = GTK_SORT_ASCENDING; + if( g_str_has_prefix( val, STR_REVERSE ) ) { + order = GTK_SORT_DESCENDING; + val += strlen( STR_REVERSE ); + } + if( !strcmp( val, STR_PROGRESS ) ) + column = MC_PROG_D; + else /* default */ + column = MC_NAME; + gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE( core->model ), column, order ); + g_free( freeme ); +} + static void tr_core_init( GTypeInstance * instance, gpointer g_class SHUTUP ) { @@ -265,6 +307,7 @@ tr_core_init( GTypeInstance * instance, gpointer g_class SHUTUP ) /* create the model used to store torrent data */ g_assert( ALEN( types ) == MC_ROW_COUNT ); store = gtk_list_store_newv( MC_ROW_COUNT, types ); + g_signal_connect( store, "sort-column-changed", G_CALLBACK(onSortColumnChanged), NULL ); gtk_tree_sortable_set_sort_func( GTK_TREE_SORTABLE(store), MC_PROG_D, diff --git a/gtk/tr_core.h b/gtk/tr_core.h index 9e38ae04d..293ebc968 100644 --- a/gtk/tr_core.h +++ b/gtk/tr_core.h @@ -180,6 +180,9 @@ tr_core_set_pref_bool( TrCore * self, const char * key, gboolean val ); void tr_core_set_pref_int( TrCore * self, const char * key, int val ); +void +tr_core_set_sort_column_from_prefs( TrCore * core ); + /* column names for the model used to store torrent information */ /* keep this in sync with the type array in tr_core_init() in tr_core.c */ enum { diff --git a/gtk/tr_prefs.c b/gtk/tr_prefs.c index 18c6a52b3..49e7b68c2 100644 --- a/gtk/tr_prefs.c +++ b/gtk/tr_prefs.c @@ -47,6 +47,8 @@ tr_prefs_init_global( void ) pref_int_set_default ( PREF_KEY_MSGLEVEL, TR_MSG_INF ); + pref_string_set_default ( PREF_KEY_SORT_COLUMN, "name" ); + pref_save( NULL ); } diff --git a/gtk/tr_prefs.h b/gtk/tr_prefs.h index 69b47b9d7..030fe6b6f 100644 --- a/gtk/tr_prefs.h +++ b/gtk/tr_prefs.h @@ -35,6 +35,7 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent ); #define PREF_KEY_ASKQUIT "prompt-before-exit" #define PREF_KEY_ENCRYPTED_ONLY "encrypted-connections-only" #define PREF_KEY_MSGLEVEL "debug-message-level" +#define PREF_KEY_SORT_COLUMN "sort-column" void tr_prefs_init_global( void ); diff --git a/gtk/tr_window.c b/gtk/tr_window.c index 9f0b89f83..20a31f58b 100644 --- a/gtk/tr_window.c +++ b/gtk/tr_window.c @@ -173,7 +173,7 @@ makeview( PrivateData * p ) GtkCellRenderer * namerend, * progrend; char * str; - view = gtk_tree_view_new(); + view = gtk_tree_view_new(); p->selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(view) ); namerend = gtk_cell_renderer_text_new();