From: Charles Kerr Date: Thu, 16 Apr 2009 16:35:00 +0000 (+0000) Subject: (trunk gtk/qt) #1502: Details' Addresses should "sort -n" X-Git-Tag: 1.60~87 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3f00d88ed8e26c0e401ad8bb72b9b849bb737c9e;p=transmission (trunk gtk/qt) #1502: Details' Addresses should "sort -n" --- diff --git a/gtk/details.c b/gtk/details.c index a697a6cf3..92fda59fb 100644 --- a/gtk/details.c +++ b/gtk/details.c @@ -83,6 +83,7 @@ webseed_model_new( const tr_torrent * tor ) enum { PEER_COL_ADDRESS, + PEER_COL_ADDRESS_COLLATED, PEER_COL_DOWNLOAD_RATE, PEER_COL_UPLOAD_RATE, PEER_COL_CLIENT, @@ -128,13 +129,21 @@ peer_row_set( GtkListStore * store, GtkTreeIter * iter, const tr_peer_stat * peer ) { + int quads[4]; + char buf[128]; const char * client = peer->client; if( !client || !strcmp( client, "Unknown Client" ) ) client = " "; + if( sscanf( peer->addr, "%d.%d.%d.%d", quads, quads+1, quads+2, quads+3 ) == 4 ) + g_snprintf( buf, sizeof( buf ), "%03d.%03d.%03d.%03d", quads[0], quads[1], quads[2], quads[3] ); + else + g_strlcpy( buf, peer->addr, sizeof( buf ) ); + gtk_list_store_set( store, iter, PEER_COL_ADDRESS, peer->addr, + PEER_COL_ADDRESS_COLLATED, buf, PEER_COL_CLIENT, client, PEER_COL_IS_ENCRYPTED, peer->isEncrypted, PEER_COL_PROGRESS, (int)( 100.0 * peer->progress ), @@ -163,12 +172,13 @@ static GtkTreeModel* peer_model_new( tr_torrent * tor ) { GtkListStore * m = gtk_list_store_new( N_PEER_COLS, - G_TYPE_STRING, /* addr */ - G_TYPE_FLOAT, /* downloadFromRate */ - G_TYPE_FLOAT, /* uploadToRate */ - G_TYPE_STRING, /* client */ - G_TYPE_INT, /* progress [0..100] */ - G_TYPE_BOOLEAN, /* isEncrypted */ + G_TYPE_STRING, /* address */ + G_TYPE_STRING, /* collated address */ + G_TYPE_FLOAT, /* downloadFromRate */ + G_TYPE_FLOAT, /* uploadToRate */ + G_TYPE_STRING, /* client */ + G_TYPE_INT, /* progress [0..100] */ + G_TYPE_BOOLEAN, /* isEncrypted */ G_TYPE_STRING ); /* flagString */ int n_peers = 0; @@ -485,6 +495,7 @@ peer_page_new( TrTorrent * gtor ) for( i = 0; i < G_N_ELEMENTS( view_columns ); ++i ) { const int col = view_columns[i]; + int sort_col = col; const char * t = _( peer_column_names[col] ); GtkTreeViewColumn * c; GtkCellRenderer * r; @@ -494,6 +505,7 @@ peer_page_new( TrTorrent * gtor ) case PEER_COL_ADDRESS: r = gtk_cell_renderer_text_new( ); c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); + sort_col = PEER_COL_ADDRESS_COLLATED; break; case PEER_COL_CLIENT: @@ -537,7 +549,7 @@ peer_page_new( TrTorrent * gtor ) } gtk_tree_view_column_set_resizable( c, FALSE ); - gtk_tree_view_column_set_sort_column_id( c, col ); + gtk_tree_view_column_set_sort_column_id( c, sort_col ); gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c ); } diff --git a/qt/details.cc b/qt/details.cc index 3c372edab..92494757b 100644 --- a/qt/details.cc +++ b/qt/details.cc @@ -80,17 +80,9 @@ namespace class PeerItem: public QTreeWidgetItem { Peer peer; - int quads[4]; + QString collatedAddress; QString status; - bool quadsLessThan( const PeerItem * that ) const { - for( int i=0; i<4; ++i ) { - if( quads[i] < that->quads[i] ) return true; - if( quads[i] > that->quads[i] ) return false; - } - return false; - } - public: PeerItem( ) { } virtual ~PeerItem( ) { } @@ -101,9 +93,11 @@ class PeerItem: public QTreeWidgetItem } void setPeer( const Peer& p ) { peer = p; - const QStringList tokens( p.address.split(".") ); - for( int i=0; i<4; ++i ) - quads[i] = tokens.at(i).toInt(); + int quads[4]; + if( sscanf( p.address.toUtf8().constData(), "%d.%d.%d.%d", quads+0, quads+1, quads+2, quads+3 ) == 4 ) + collatedAddress.sprintf( "%03d.%03d.%03d.%03d", quads[0], quads[1], quads[2], quads[3] ); + else + collatedAddress = p.address; } virtual bool operator< ( const QTreeWidgetItem & other ) const { const PeerItem * that = dynamic_cast(&other); @@ -114,7 +108,7 @@ class PeerItem: public QTreeWidgetItem case COL_DOWN: return peer.rateToClient < that->peer.rateToClient; case COL_PERCENT: return peer.progress < that->peer.progress; case COL_STATUS: return status < that->status; - case COL_ADDRESS: return quadsLessThan( that ); + case COL_ADDRESS: return collatedAddress < that->collatedAddress; case COL_CLIENT: return peer.clientName < that->peer.clientName; default: /*COL_LOCK*/ return peer.isEncrypted && !that->peer.isEncrypted; }