]> granicus.if.org Git - transmission/commitdiff
(trunk gtk/qt) #1502: Details' Addresses should "sort -n"
authorCharles Kerr <charles@transmissionbt.com>
Thu, 16 Apr 2009 16:35:00 +0000 (16:35 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Thu, 16 Apr 2009 16:35:00 +0000 (16:35 +0000)
gtk/details.c
qt/details.cc

index a697a6cf3e810144598fb97fef0bca6d899ee488..92fda59fbacc2c4a2621338f83580d33fa7f18c2 100644 (file)
@@ -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 );
     }
 
index 3c372edab951b8f4616139ea26c0446ef7d6765e..92494757b91390d19f6f79f33facd91da171c540 100644 (file)
@@ -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<const PeerItem*>(&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;
             }