diff --git a/gtk/main.c b/gtk/main.c index b56811fc2..a6110924f 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -371,11 +371,12 @@ winclose( GtkWidget * w UNUSED, GdkEvent * event UNUSED, gpointer gdata ) static void rowChangedCB( GtkTreeModel * model UNUSED, - GtkTreePath * path UNUSED, + GtkTreePath * path, GtkTreeIter * iter UNUSED, gpointer sel) { - refreshTorrentActions( GTK_TREE_SELECTION(sel) ); + if( gtk_tree_selection_path_is_selected ( sel, path ) ) + refreshTorrentActions( GTK_TREE_SELECTION(sel) ); } static void @@ -394,6 +395,7 @@ winsetup( struct cbdata * cbdata, TrWindow * wind ) gtk_tree_view_set_model ( gtk_tree_selection_get_tree_view(sel), model ); g_signal_connect( model, "row-changed", G_CALLBACK(rowChangedCB), sel ); g_signal_connect( wind, "delete-event", G_CALLBACK( winclose ), cbdata ); + refreshTorrentActions( sel ); setupdrag( GTK_WIDGET(wind), cbdata ); } diff --git a/gtk/tr_core.c b/gtk/tr_core.c index 698be11aa..0726b882c 100644 --- a/gtk/tr_core.c +++ b/gtk/tr_core.c @@ -528,45 +528,61 @@ tr_core_delete_torrent( TrCore * self, GtkTreeIter * iter ) tr_torrent_sever( tor ); } -void -tr_core_update( TrCore * self ) +static gboolean +update_foreach( GtkTreeModel * model, + GtkTreePath * path UNUSED, + GtkTreeIter * iter, + gpointer data UNUSED) { - GtkTreeIter iter; TrTorrent * tor; const tr_stat * st; - TR_IS_CORE( self ); + gtk_tree_model_get( model, iter, MC_TORRENT, &tor, -1 ); + st = tr_torrent_stat( tor ); + tr_torrent_check_seeding_cap ( tor ); + g_object_unref( tor ); - if( gtk_tree_model_get_iter_first( self->model, &iter ) ) do - { - gtk_tree_model_get( self->model, &iter, MC_TORRENT, &tor, -1 ); - st = tr_torrent_stat( tor ); - g_object_unref( tor ); - tr_torrent_check_seeding_cap ( tor ); + gtk_list_store_set( GTK_LIST_STORE( model ), iter, + MC_STAT, st->status, + MC_ERR, st->error, + MC_TERR, st->errorString, + MC_PROG_C, st->percentComplete, + MC_PROG_D, st->percentDone, + MC_DRATE, st->rateDownload, + MC_URATE, st->rateUpload, + MC_ETA, st->eta, + MC_PEERS, st->peersConnected, + MC_UPEERS, st->peersGettingFromUs, + MC_DPEERS, st->peersSendingToUs, + MC_SEED, st->seeders, + MC_LEECH, st->leechers, + MC_DONE, st->completedFromTracker, + MC_DOWN, st->downloadedEver, + MC_UP, st->uploadedEver, + MC_RATIO, st->ratio, + MC_LEFT, st->leftUntilDone, + -1 ); - /* XXX find out if setting the same data emits changed signal */ - gtk_list_store_set( GTK_LIST_STORE( self->model ), &iter, - MC_STAT, st->status, - MC_ERR, st->error, - MC_TERR, st->errorString, - MC_PROG_C, st->percentComplete, - MC_PROG_D, st->percentDone, - MC_DRATE, st->rateDownload, - MC_URATE, st->rateUpload, - MC_ETA, st->eta, - MC_PEERS, st->peersConnected, - MC_UPEERS, st->peersGettingFromUs, - MC_DPEERS, st->peersSendingToUs, - MC_SEED, st->seeders, - MC_LEECH, st->leechers, - MC_DONE, st->completedFromTracker, - MC_DOWN, st->downloadedEver, - MC_UP, st->uploadedEver, - MC_RATIO, st->ratio, - MC_LEFT, st->leftUntilDone, - -1 ); - } - while( gtk_tree_model_iter_next( self->model, &iter ) ); + return FALSE; +} + +void +tr_core_update( TrCore * self ) +{ + int column; + GtkSortType order; + GtkTreeSortable * sortable; + + /* pause sorting */ + sortable = GTK_TREE_SORTABLE( self->model ); + gtk_tree_sortable_get_sort_column_id( sortable, &column, &order ); + gtk_tree_sortable_set_sort_column_id( sortable, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, order ); + + /* refresh the model */ + gtk_tree_model_foreach( self->model, update_foreach, NULL ); + + /* resume sorting */ + gtk_tree_sortable_set_sort_column_id( sortable, column, order ); } void