Changeset 8295


Ignore:
Timestamp:
Apr 26, 2009, 3:41:04 PM (13 years ago)
Author:
charles
Message:

(trunk qt) copy some of the ideas from the gtk inspector rewrite

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/qt/details.cc

    r8256 r8295  
    9696        void setPeer( const Peer& p ) {
    9797            peer = p;
    98             int quads[4];
    99             if( sscanf( p.address.toUtf8().constData(), "%d.%d.%d.%d", quads+0, quads+1, quads+2, quads+3 ) == 4 )
    100                 collatedAddress.sprintf( "%03d.%03d.%03d.%03d", quads[0], quads[1], quads[2], quads[3] );
     98            int q[4];
     99            if( sscanf( p.address.toUtf8().constData(), "%d.%d.%d.%d", q+0, q+1, q+2, q+3 ) == 4 )
     100                collatedAddress.sprintf( "%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3] );
    101101            else
    102102                collatedAddress = p.address;
    103103        }
    104104        virtual bool operator< ( const QTreeWidgetItem & other ) const {
    105             const PeerItem * that = dynamic_cast<const PeerItem*>(&other);
     105            const PeerItem * i = dynamic_cast<const PeerItem*>(&other);
    106106            QTreeWidget * tw( treeWidget( ) );
    107107            const int column = tw ? tw->sortColumn() : 0;
    108108            switch( column ) {
    109                 case COL_UP: return peer.rateToPeer < that->peer.rateToPeer;
    110                 case COL_DOWN: return peer.rateToClient < that->peer.rateToClient;
    111                 case COL_PERCENT: return peer.progress < that->peer.progress;
    112                 case COL_STATUS: return status < that->status;
    113                 case COL_ADDRESS: return collatedAddress < that->collatedAddress;
    114                 case COL_CLIENT: return peer.clientName < that->peer.clientName;
    115                 default: /*COL_LOCK*/ return peer.isEncrypted && !that->peer.isEncrypted;
     109                case COL_UP: return peer.rateToPeer < i->peer.rateToPeer;
     110                case COL_DOWN: return peer.rateToClient < i->peer.rateToClient;
     111                case COL_PERCENT: return peer.progress < i->peer.progress;
     112                case COL_STATUS: return status < i->status;
     113                case COL_CLIENT: return peer.clientName < i->peer.clientName;
     114                case COL_LOCK: return peer.isEncrypted && !i->peer.isEncrypted;
     115                default: return collatedAddress < i->collatedAddress;
    116116            }
    117117        }
     
    149149
    150150    QDialogButtonBox * buttons = new QDialogButtonBox( QDialogButtonBox::Close, Qt::Horizontal, this );
    151     connect( buttons, SIGNAL(rejected()), this, SLOT(deleteLater()) ); // "close" triggers rejected
     151    connect( buttons, SIGNAL(rejected()), this, SLOT(deleteLater()));
    152152    layout->addWidget( buttons );
    153153
    154     connect( &myTimer, SIGNAL(timeout()), this, SLOT(onTimer()) );
     154    connect( &myTimer, SIGNAL(timeout()), this, SLOT(onTimer()));
    155155
    156156    onTimer( );
     
    221221    const QString blank;
    222222    const QFontMetrics fm( fontMetrics( ) );
    223     QSet<const Torrent*> torrents;
    224     const Torrent * tor;
    225     QSet<QString> strings;
     223    QList<const Torrent*> torrents;
    226224    QString string;
     225    const QString none = tr( "None" );
     226    const QString mixed = tr( "Mixed" );
     227    const QString unknown = tr( "Unknown" );
    227228
    228229    // build a list of torrents
     
    239240    // myStateLabel
    240241    if( torrents.empty( ) )
    241         string = tr( "None" );
    242     else {
    243         strings.clear( );
    244         foreach( tor, torrents ) strings.insert( tor->activityString( ) );
    245         string = strings.size()==1 ? *strings.begin() : blank;
     242        string = none;
     243    else {
     244        string = torrents[0]->activityString( );
     245        foreach( const Torrent* t, torrents ) {
     246            if( string != t->activityString( ) ) {
     247                string = mixed;
     248                break;
     249            }
     250        }
    246251    }
    247252    myStateLabel->setText( string );
     
    253258        double sizeWhenDone = 0;
    254259        double leftUntilDone = 0;
    255         foreach( tor, torrents ) {
    256             sizeWhenDone += tor->sizeWhenDone( );
    257             leftUntilDone += tor->leftUntilDone( );
     260        foreach( const Torrent * t, torrents ) {
     261            sizeWhenDone += t->sizeWhenDone( );
     262            leftUntilDone += t->leftUntilDone( );
    258263        }
    259264        string = locale.toString( 100.0*((sizeWhenDone-leftUntilDone)/sizeWhenDone), 'f', 2 );
     
    265270    int64_t haveVerified = 0;
    266271    int64_t verifiedPieces = 0;
    267     foreach( tor, torrents ) {
    268         haveTotal += tor->haveTotal( );
    269         haveVerified += tor->haveVerified( );
    270         verifiedPieces += tor->haveVerified( ) / tor->pieceSize( );
     272    foreach( const Torrent * t, torrents ) {
     273        haveTotal += t->haveTotal( );
     274        const uint64_t v = t->haveVerified( );
     275        haveVerified += v;
     276        verifiedPieces += v / t->pieceSize( );
    271277    }
    272278    myHaveLabel->setText( tr( "%1 (%2 verified in %L3 pieces)" )
     
    275281                            .arg( verifiedPieces ) );
    276282
    277     int64_t num = 0;
    278     foreach( tor, torrents ) num += tor->downloadedEver( );
    279     myDownloadedLabel->setText( Utils::sizeToString( num ) );
    280 
    281     num = 0;
    282     foreach( tor, torrents ) num += tor->uploadedEver( );
    283     myUploadedLabel->setText( Utils::sizeToString( num ) );
    284 
    285     num = 0;
    286     foreach( tor, torrents ) num += tor->failedEver( );
    287     myFailedLabel->setText( Utils::sizeToString( num ) );
     283    int64_t sum = 0;
     284    foreach( const Torrent * t, torrents ) sum += t->downloadedEver( );
     285    myDownloadedLabel->setText( Utils::sizeToString( sum ) );
     286
     287    sum = 0;
     288    foreach( const Torrent * t, torrents ) sum += t->uploadedEver( );
     289    myUploadedLabel->setText( Utils::sizeToString( sum ) );
     290
     291    sum = 0;
     292    foreach( const Torrent *t, torrents ) sum += t->failedEver( );
     293    myFailedLabel->setText( Utils::sizeToString( sum ) );
    288294
    289295    double d = 0;
    290     foreach( tor, torrents ) d += tor->ratio( );
     296    foreach( const Torrent *t, torrents ) d += t->ratio( );
    291297    myRatioLabel->setText( Utils :: ratioToString( d / n ) );
    292298
    293299    Speed speed;
    294     foreach( tor, torrents ) speed += tor->swarmSpeed( );
     300    foreach( const Torrent *t, torrents ) speed += t->swarmSpeed( );
    295301    mySwarmSpeedLabel->setText( Utils::speedToString( speed ) );
    296302
    297     strings.clear( );
    298     foreach( tor, torrents ) strings.insert( tor->dateAdded().toString() );
    299     string = strings.size()==1 ? *strings.begin() : blank;
     303    if( torrents.empty( ) )
     304        string = none;
     305    else {
     306        string = torrents[0]->dateAdded().toString();
     307        foreach( const Torrent * t, torrents ) {
     308            if( string != t->dateAdded().toString() ) {
     309                string = mixed;
     310                break;
     311            }
     312        }
     313    }
    300314    myAddedDateLabel->setText( string );
    301315
    302     strings.clear( );
    303     foreach( tor, torrents ) {
    304         QDateTime dt = tor->lastActivity( );
    305         strings.insert( dt.isNull() ? tr("Never") : dt.toString() );
    306     }
    307     string = strings.size()==1 ? *strings.begin() : blank;
     316
     317    if( torrents.empty( ) )
     318        string = none;
     319    else {
     320        QDateTime latest = torrents[0]->lastActivity( );
     321        foreach( const Torrent * t, torrents ) {
     322            const QDateTime dt = t->lastActivity( );
     323            if( latest < dt )
     324                latest = dt;
     325        }
     326        string = latest.toString( );
     327    }
    308328    myActivityLabel->setText( string );
    309329
    310     if( torrents.empty( ) )
    311         string = tr( "None" );
    312     else {
    313         strings.clear( );
    314         foreach( tor, torrents ) strings.insert( tor->getError( ) );
    315         string = strings.size()==1 ? *strings.begin() : blank;
     330
     331    if( torrents.empty( ) )
     332        string = none;
     333    else {
     334        string = torrents[0]->getError( );
     335        foreach( const Torrent * t, torrents ) {
     336            if( string != t->getError( ) ) {
     337                string = mixed;
     338                break;
     339            }
     340        }
    316341    }
    317342    myErrorLabel->setText( string );
     343
    318344
    319345    ///
     
    322348
    323349    // myPiecesLabel
    324     int64_t pieceCount = 0;
    325     int64_t pieceSize = 0;
    326     foreach( tor, torrents ) {
    327         pieceCount += tor->pieceCount( );
    328         pieceSize += tor->pieceSize( );
    329     }
    330     myPiecesLabel->setText( tr( "%L1 Pieces @ %2" ).arg( pieceCount )
    331                                                    .arg( Utils::sizeToString( pieceSize ) ) );
     350    if( torrents.empty( ) )
     351        string = none;
     352    else {
     353        int64_t pieceCount = 0;
     354        uint64_t baseSize = torrents[0]->pieceSize( );
     355        foreach( const Torrent * t, torrents ) {
     356            pieceCount += t->pieceCount( );
     357            if( baseSize != t->pieceSize( ) )
     358                baseSize = 0;
     359        }
     360        if( !baseSize ) // mixed piece size
     361            string = tr( "%L1 Pieces" ).arg( pieceCount );
     362        else
     363            string = tr( "%L1 Pieces @ %2" ).arg( pieceCount )
     364                                            .arg( Utils::sizeToString( baseSize ) );
     365    }
     366    myPiecesLabel->setText( string );
    332367
    333368    // myHashLabel
    334     strings.clear( );
    335     foreach( tor, torrents ) strings.insert( tor->hashString( ) );
    336     string = strings.size()==1 ? *strings.begin() : blank;
     369    if( torrents.empty( ) )
     370        string = none;
     371    else {
     372        string = torrents[0]->hashString( );
     373        foreach( const Torrent * t, torrents ) {
     374            if( string != t->hashString( ) ) {
     375                string = mixed;
     376                break;
     377            }
     378        }
     379    }
    337380    myHashLabel->setText( string );
    338381
    339382    // myPrivacyLabel
    340     strings.clear( );
    341     foreach( tor, torrents )
    342         strings.insert( tor->isPrivate( ) ? tr( "Private to this tracker -- PEX disabled" )
    343                                           : tr( "Public torrent" ) );
    344     string = strings.size()==1 ? *strings.begin() : blank;
     383    if( torrents.empty( ) )
     384        string = none;
     385    else {
     386        bool b = torrents[0]->isPrivate( );
     387        string = b ? tr( "Private to this tracker -- PEX disabled" )
     388                   : tr( "Public torrent" );
     389        foreach( const Torrent * t, torrents ) {
     390            if( b != t->isPrivate( ) ) {
     391                string = mixed;
     392                break;
     393            }
     394        }
     395    }
    345396    myPrivacyLabel->setText( string );
    346397
    347398    // myCommentBrowser
    348     strings.clear( );
    349     foreach( tor, torrents ) strings.insert( tor->comment( ) );
    350     string = strings.size()==1 ? *strings.begin() : blank;
     399    if( torrents.empty( ) )
     400        string = none;
     401    else {
     402        string = torrents[0]->comment( );
     403        foreach( const Torrent * t, torrents ) {
     404            if( string != t->comment( ) ) {
     405                string = mixed;
     406                break;
     407            }
     408        }
     409    }
    351410    myCommentBrowser->setText( string );
    352411
    353412    // myCreatorLabel
    354     strings.clear( );
    355     foreach( tor, torrents ) strings.insert( tor->creator().isEmpty() ? tr( "Unknown" ) : tor->creator() );
    356     string = strings.size()==1 ? *strings.begin() : blank;
    357     myCreatorLabel->setText( string );
     413    if( torrents.empty( ) )
     414        string = none;
     415    else {
     416        string = torrents[0]->creator( );
     417        foreach( const Torrent * t, torrents ) {
     418            if( string != t->creator( ) ) {
     419                string = mixed;
     420                break;
     421            }
     422        }
     423    }
     424    myCreatorLabel->setText( string.isEmpty() ? unknown : string );
    358425
    359426    // myDateCreatedLabel
    360     strings.clear( );
    361     foreach( tor, torrents ) strings.insert( tor->dateCreated().toString() );
    362     string = strings.size()==1 ? *strings.begin() : blank;
     427    if( torrents.empty( ) )
     428        string = none;
     429    else {
     430        string = torrents[0]->dateCreated().toString();
     431        foreach( const Torrent * t, torrents ) {
     432            if( string != t->dateCreated().toString() ) {
     433                string = mixed;
     434                break;
     435            }
     436        }
     437    }
    363438    myDateCreatedLabel->setText( string );
    364439
    365440    // myDestinationLabel
    366     strings.clear( );
    367     foreach( tor, torrents ) strings.insert( tor->getPath( ) );
    368     string = strings.size()==1 ? *strings.begin() : blank;
     441    if( torrents.empty( ) )
     442        string = none;
     443    else {
     444        string = torrents[0]->getPath( );
     445        foreach( const Torrent * t, torrents ) {
     446            if( string != t->getPath( ) ) {
     447                string = mixed;
     448                break;
     449            }
     450        }
     451    }
    369452    myDestinationLabel->setText( string );
    370453
    371454    // myTorrentFileLabel
    372     strings.clear( );
    373     foreach( tor, torrents ) strings.insert( tor->torrentFile( ) );
    374     string = strings.size()==1 ? *strings.begin() : blank;
     455    if( torrents.empty( ) )
     456        string = none;
     457    else {
     458        string = torrents[0]->torrentFile( );
     459        foreach( const Torrent * t, torrents ) {
     460            if( string != t->torrentFile( ) ) {
     461                string = mixed;
     462                break;
     463            }
     464        }
     465    }
    375466    myTorrentFileLabel->setText( string );
    376467
     
    383474        int i;
    384475        const Torrent * baseline = *torrents.begin();
     476        const Torrent * tor;
    385477        bool uniform;
    386478        bool baselineFlag;
     
    453545
    454546    // tracker tab
     547    //
    455548    const time_t now( time( 0 ) );
    456     myScrapeTimePrevLabel->setText( tor ? tor->lastScrapeTime().toString() : blank );
    457     myScrapeResponseLabel->setText( tor ? tor->scrapeResponse() : blank );
    458     myScrapeTimeNextLabel->setText( Utils :: timeToString( tor ? tor->nextScrapeTime().toTime_t() - now : 0 ) );
    459     myAnnounceTimePrevLabel->setText( tor ? tor->lastScrapeTime().toString() : blank );
    460     myAnnounceTimeNextLabel->setText( Utils :: timeToString( tor ? tor->nextAnnounceTime().toTime_t() - now : 0  ) );
    461     myAnnounceManualLabel->setText( Utils :: timeToString( tor ? tor->manualAnnounceTime().toTime_t() - now : 0 ) );
    462     myAnnounceResponseLabel->setText( tor ? tor->announceResponse( ) : blank );
     549
     550    // myScrapeTimePrevLabel
     551    if( torrents.empty( ) )
     552        string = none;
     553    else {
     554        QDateTime latest = torrents[0]->lastScrapeTime();
     555        foreach( const Torrent * t, torrents ) {
     556            const QDateTime e = t->lastScrapeTime();
     557            if( latest < e )
     558                latest = e;
     559        }
     560        string = latest.toString();
     561    }
     562    myScrapeTimePrevLabel->setText( string );
     563
     564    // myScrapeResponseLabel
     565    if( torrents.empty( ) )
     566        string = none;
     567    else {
     568        string = torrents[0]->scrapeResponse( );
     569        foreach( const Torrent * t, torrents ) {
     570           if( string != t->scrapeResponse( ) ) {
     571               string = mixed;
     572               break;
     573           }
     574        }
     575    }
     576    myScrapeResponseLabel->setText( string );
     577
     578    // myScrapeTimeNextLabel
     579    if( torrents.empty( ) )
     580        string = none;
     581    else {
     582        QDateTime soonest = torrents[0]->nextScrapeTime( );
     583        foreach( const Torrent * t, torrents ) {
     584            const QDateTime e = t->nextScrapeTime( );
     585            if( soonest > e )
     586                soonest = e;
     587        }
     588        string = Utils::timeToString( soonest.toTime_t() - now );
     589    }
     590    myScrapeTimeNextLabel->setText( string );
     591
     592    // myAnnounceTimePrevLabel
     593    if( torrents.empty( ) )
     594        string = none;
     595    else {
     596        QDateTime latest = torrents[0]->lastAnnounceTime();
     597        foreach( const Torrent * t, torrents ) {
     598            const QDateTime e = t->lastAnnounceTime();
     599            if( latest < e )
     600                latest = e;
     601        }
     602        string = latest.toString();
     603    }
     604    myAnnounceTimePrevLabel->setText( string );
     605
     606    // myAnnounceTimeNextLabel
     607    if( torrents.empty( ) )
     608        string = none;
     609    else {
     610        QDateTime soonest = torrents[0]->nextAnnounceTime( );
     611        foreach( const Torrent * t, torrents ) {
     612            const QDateTime e = t->nextAnnounceTime( );
     613            if( soonest > e )
     614                soonest = e;
     615        }
     616        string = Utils::timeToString( soonest.toTime_t() - now );
     617    }
     618    myAnnounceTimeNextLabel->setText( string );
     619
     620    // myAnnounceManualLabel
     621    if( torrents.empty( ) )
     622        string = none;
     623    else {
     624        QDateTime soonest = torrents[0]->nextAnnounceTime( );
     625        foreach( const Torrent * t, torrents ) {
     626            const QDateTime e = t->nextAnnounceTime( );
     627            if( soonest > e )
     628                soonest = e;
     629        }
     630        if( soonest <= QDateTime::currentDateTime( ) )
     631            string = tr( "Now" );
     632        else
     633            string = Utils::timeToString( soonest.toTime_t() - now );
     634    }
     635    myAnnounceManualLabel->setText( string );
     636
     637    // myAnnounceResponseLabel
     638    if( torrents.empty( ) )
     639        string = none;
     640    else {
     641        string = torrents[0]->announceResponse( );
     642        foreach( const Torrent * t, torrents ) {
     643           if( string != t->announceResponse( ) ) {
     644               string = mixed;
     645               break;
     646           }
     647        }
     648    }
     649    myAnnounceResponseLabel->setText( string );
    463650
    464651    // myTrackerLabel
    465     strings.clear( );
    466     foreach( tor, torrents ) strings.insert( QUrl(tor->announceUrl()).host() );
    467     string = strings.size()==1 ? *strings.begin() : blank;
     652    if( torrents.empty( ) )
     653        string = none;
     654    else {
     655        string = QUrl(torrents[0]->announceUrl()).host();
     656        foreach( const Torrent * t, torrents ) {
     657            if( string != QUrl(t->announceUrl()).host() ) {
     658                string = mixed;
     659                break;
     660            }
     661        }
     662    }
    468663    myTrackerLabel->setText( string );
    469664
     
    473668
    474669    i = 0;
    475     foreach( tor, torrents ) i += tor->seeders( );
     670    foreach( const Torrent * t, torrents ) i += t->seeders( );
    476671    mySeedersLabel->setText( locale.toString( i ) );
    477672
    478673    i = 0;
    479     foreach( tor, torrents ) i += tor->leechers( );
     674    foreach( const Torrent * t, torrents ) i += t->leechers( );
    480675    myLeechersLabel->setText( locale.toString( i ) );
    481676
    482677    i = 0;
    483     foreach( tor, torrents ) i += tor->timesCompleted( );
     678    foreach( const Torrent * t, torrents ) i += t->timesCompleted( );
    484679    myTimesCompletedLabel->setText( locale.toString( i ) );
    485680
    486681    PeerList peers;
    487     foreach( tor, torrents ) peers << tor->peers( );
     682    foreach( const Torrent * t, torrents ) peers << t->peers( );
    488683    QMap<QString,QTreeWidgetItem*> peers2;
    489684    QList<QTreeWidgetItem*> newItems;
     
    556751    myPeers = peers2;
    557752
    558     if( single ) {
    559         tor = *torrents.begin();
    560         myFileTreeView->update( tor->files( ) );
    561     } else {
     753    if( single )
     754        myFileTreeView->update( torrents[0]->files( ) );
     755    else
    562756        myFileTreeView->clear( );
    563     }
    564757
    565758    myHavePendingRefresh = false;
     
    612805Details :: onHonorsSessionLimitsToggled( bool val )
    613806{
    614 std::cerr << " honorsSessionLimits clicked to " << val << std::endl;
    615807    mySession.torrentSet( myIds, "honorsSessionLimits", val );
    616808}
     
    8611053    size = m.size( 0, "Some BitTorrent Client" );
    8621054    myPeerTree->setColumnWidth( COL_CLIENT, size.width( ) );
    863     //myPeerTree->sortItems( myTorrent.isDone() ? COL_UP : COL_DOWN, Qt::DescendingOrder );
    8641055    myPeerTree->setAlternatingRowColors( true );
    8651056
Note: See TracChangeset for help on using the changeset viewer.