Ignore:
Timestamp:
Apr 11, 2009, 6:25:12 PM (13 years ago)
Author:
charles
Message:

(qt) better integration of sort & filter modes into the preferences mechanism

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/qt/torrent-filter.cc

    r8213 r8216  
    1313#include <iostream>
    1414
     15#include "filters.h"
    1516#include "prefs.h"
    1617#include "torrent.h"
     
    2021TorrentFilter :: TorrentFilter( Prefs& prefs ):
    2122    myPrefs( prefs ),
    22     myShowMode( getShowModeFromName( prefs.getString( Prefs::FILTER_MODE ) ) ),
    23     myTextMode( FILTER_BY_NAME ),
    24     mySortMode( getSortModeFromName( prefs.getString( Prefs::SORT_MODE ) ) ),
    25     myIsAscending( prefs.getBool( Prefs::SORT_REVERSED ) )
     23    myTextMode( FILTER_BY_NAME )
    2624{
    27     resort( );
     25    // listen for changes to the preferences to know when to refilter / resort
     26    connect( &myPrefs, SIGNAL(changed(int)), this, SLOT(refreshPref(int)));
     27
     28    // initialize our state from the current prefs
     29    QList<int> initKeys;
     30    initKeys << Prefs :: SORT_MODE
     31             << Prefs :: FILTER_MODE;
     32    foreach( int key, initKeys )
     33        refreshPref( key );
    2834}
    2935
    3036TorrentFilter :: ~TorrentFilter( )
    3137{
     38}
     39
     40void
     41TorrentFilter :: refreshPref( int key )
     42{
     43    switch( key )
     44    {
     45        case Prefs :: SORT_MODE:
     46        case Prefs :: SORT_REVERSED:
     47            sort( 0, myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder );
     48            invalidate( );
     49            break;
     50        case Prefs :: FILTER_MODE:
     51            invalidateFilter( );
     52            break;
     53    }
    3254}
    3355
     
    3759
    3860void
    39 TorrentFilter :: setShowMode( int showMode )
     61TorrentFilter :: setTextMode( int i )
    4062{
    41     if( myShowMode != showMode )
     63    if( myTextMode != i )
    4264    {
    43         myPrefs.set( Prefs :: FILTER_MODE, getShowName( showMode ) );
    44         myShowMode = ShowMode( showMode );
    45         invalidateFilter( );
    46     }
    47 }
    48 
    49 void
    50 TorrentFilter :: setTextMode( int textMode )
    51 {
    52     if( myTextMode != textMode )
    53     {
    54         myTextMode = TextMode( textMode );
     65        myTextMode = TextMode( i );
    5566        invalidateFilter( );
    5667    }
     
    6980}
    7081
     82/***
     83****
     84***/
     85
     86bool
     87TorrentFilter :: lessThan( const QModelIndex& left, const QModelIndex& right ) const
     88{
     89    const Torrent * a = sourceModel()->data( left, TorrentModel::TorrentRole ).value<const Torrent*>();
     90    const Torrent * b = sourceModel()->data( right, TorrentModel::TorrentRole ).value<const Torrent*>();
     91    bool less;
     92
     93    switch( myPrefs.get<SortMode>(Prefs::SORT_MODE).mode() )
     94    {
     95        case SortMode :: SORT_BY_SIZE:
     96            less = a->sizeWhenDone() < b->sizeWhenDone();
     97            break;
     98        case SortMode :: SORT_BY_ACTIVITY:
     99            less = a->downloadSpeed() + a->uploadSpeed() < b->downloadSpeed() + b->uploadSpeed();
     100            break;
     101        case SortMode :: SORT_BY_AGE:
     102            less = a->dateAdded() < b->dateAdded();
     103            break;
     104        case SortMode :: SORT_BY_ID:
     105            less = a->id() < b->id();
     106            break;
     107        case SortMode :: SORT_BY_RATIO:
     108            less = a->compareRatio( *b ) < 0;
     109            break;
     110        case SortMode :: SORT_BY_PROGRESS:
     111            less = a->percentDone() < b->percentDone();
     112            break;
     113        case SortMode :: SORT_BY_ETA:
     114            less = a->compareETA( *b ) < 0;
     115            break;
     116        case SortMode :: SORT_BY_STATE:
     117            if( a->hasError() != b->hasError() )
     118                less = a->hasError();
     119            else
     120                less = a->getActivity() < b->getActivity();
     121            break;
     122        case SortMode :: SORT_BY_TRACKER:
     123            less = a->compareTracker( *b ) < 0;
     124            break;
     125        default:
     126            less = a->name().compare( b->name(), Qt::CaseInsensitive ) > 0;
     127            break;
     128    }
     129
     130    return less;
     131}
     132
     133
     134/***
     135****
     136***/
     137
    71138bool
    72139TorrentFilter :: filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const
     
    77144    bool accepts;
    78145
    79     switch( myShowMode )
     146    switch( myPrefs.get<FilterMode>(Prefs::FILTER_MODE).mode() )
    80147    {
    81         case SHOW_ALL:
     148        case FilterMode::SHOW_ALL:
    82149            accepts = true;
    83150            break;
    84         case SHOW_ACTIVE:
     151        case FilterMode::SHOW_ACTIVE:
    85152            accepts = tor->peersWeAreUploadingTo( ) > 0 || tor->peersWeAreDownloadingFrom( ) > 0 || tor->isVerifying( );
    86153            break;
    87         case SHOW_DOWNLOADING:
     154        case FilterMode::SHOW_DOWNLOADING:
    88155            accepts = activity == TR_STATUS_DOWNLOAD;
    89156            break;
    90         case SHOW_SEEDING:
     157        case FilterMode::SHOW_SEEDING:
    91158            accepts = activity == TR_STATUS_SEED;
    92159            break;
    93         case SHOW_PAUSED:
     160        case FilterMode::SHOW_PAUSED:
    94161            accepts = activity == TR_STATUS_STOPPED;
    95162            break;
     
    112179}
    113180
    114 /***
    115 ****
    116 ***/
    117 
    118 namespace
    119 {
    120     struct NameAndNum
    121     {
    122         const char * name;
    123         int num;
    124     };
    125 
    126     const struct NameAndNum showModes[] = {
    127         { "show-all",         TorrentFilter::SHOW_ALL },
    128         { "show-active",      TorrentFilter::SHOW_ACTIVE },
    129         { "show-downloading", TorrentFilter::SHOW_DOWNLOADING },
    130         { "show-seeding",     TorrentFilter::SHOW_SEEDING },
    131         { "show-paused",      TorrentFilter::SHOW_PAUSED }
    132     };
    133 
    134     const int showModeCount = sizeof(showModes) / sizeof(showModes[0]);
    135 
    136     const struct NameAndNum sortModes[] = {
    137         { "sort-by-name",     TorrentFilter::SORT_BY_NAME },
    138         { "sort-by-activity", TorrentFilter::SORT_BY_ACTIVITY },
    139         { "sort-by-age",      TorrentFilter::SORT_BY_AGE },
    140         { "sort-by-eta",      TorrentFilter::SORT_BY_ETA },
    141         { "sort-by-progress", TorrentFilter::SORT_BY_PROGRESS },
    142         { "sort-by-ratio",    TorrentFilter::SORT_BY_RATIO },
    143         { "sort-by-size",     TorrentFilter::SORT_BY_SIZE },
    144         { "sort-by-state",    TorrentFilter::SORT_BY_STATE },
    145         { "sort-by-tracker",  TorrentFilter::SORT_BY_TRACKER }
    146     };
    147 
    148     const int sortModeCount = sizeof(sortModes) / sizeof(sortModes[0]);
    149 
    150     int getNum( const struct NameAndNum * rows, int numRows, const QString& name )
    151     {
    152         for( int i=0; i<numRows; ++i )
    153             if( name == rows[i].name )
    154                 return rows[i].num;
    155         return rows[0].num; // fallback value
    156     }
    157 
    158     const char* getName( const struct NameAndNum * rows, int numRows, int num )
    159     {
    160         for( int i=0; i<numRows; ++i )
    161             if( num == rows[i].num )
    162                 return rows[i].name;
    163         return rows[0].name; // fallback value
    164     }
    165 }
    166 
    167 TorrentFilter :: ShowMode
    168 TorrentFilter :: getShowModeFromName( const QString& key ) const
    169 {
    170     return ShowMode( getNum( showModes, showModeCount, key ) );
    171 }
    172 
    173 const char*
    174 TorrentFilter :: getShowName( int mode ) const
    175 {
    176     if( mode < 0 ) mode = getShowMode( );
    177     return getName( showModes, showModeCount, mode );
    178 }
    179 
    180 TorrentFilter :: SortMode
    181 TorrentFilter :: getSortModeFromName( const QString& key ) const
    182 {
    183     return SortMode( getNum( sortModes, sortModeCount, key ) );
    184 }
    185 
    186 const char*
    187 TorrentFilter :: getSortName( int mode ) const
    188 {
    189     if( mode < 0 ) mode = getSortMode( );
    190     return getName( sortModes, sortModeCount, mode );
    191 }
    192 
    193 /***
    194 ****
    195 ***/
    196 
    197 void
    198 TorrentFilter :: resort( )
    199 {
    200     invalidate( );
    201     sort( 0, myIsAscending ? Qt::AscendingOrder : Qt::DescendingOrder );
    202 }
    203 
    204 void
    205 TorrentFilter :: setAscending( bool b )
    206 {
    207     if( myIsAscending != b )
    208     {
    209         myIsAscending = b;
    210         resort( );
    211     }
    212 }
    213 
    214 void
    215 TorrentFilter :: setSortMode( int sortMode )
    216 {
    217     if( mySortMode != sortMode )
    218     {
    219         myPrefs.set( Prefs :: SORT_MODE, getSortName( sortMode ) );
    220         mySortMode = SortMode( sortMode );
    221         setDynamicSortFilter ( true );
    222         resort( );
    223     }
    224 }
    225 
    226 void TorrentFilter :: sortByActivity ( ) { setSortMode( SORT_BY_ACTIVITY ); }
    227 void TorrentFilter :: sortByAge      ( ) { setSortMode( SORT_BY_AGE ); }
    228 void TorrentFilter :: sortByETA      ( ) { setSortMode( SORT_BY_ETA ); }
    229 void TorrentFilter :: sortById       ( ) { setSortMode( SORT_BY_ID ); }
    230 void TorrentFilter :: sortByName     ( ) { setSortMode( SORT_BY_NAME ); }
    231 void TorrentFilter :: sortByProgress ( ) { setSortMode( SORT_BY_PROGRESS ); }
    232 void TorrentFilter :: sortByRatio    ( ) { setSortMode( SORT_BY_RATIO ); }
    233 void TorrentFilter :: sortBySize     ( ) { setSortMode( SORT_BY_SIZE ); }
    234 void TorrentFilter :: sortByState    ( ) { setSortMode( SORT_BY_STATE ); }
    235 void TorrentFilter :: sortByTracker  ( ) { setSortMode( SORT_BY_TRACKER ); }
    236 
    237 bool
    238 TorrentFilter :: lessThan( const QModelIndex& left, const QModelIndex& right ) const
    239 {
    240     const Torrent * a = sourceModel()->data( left, TorrentModel::TorrentRole ).value<const Torrent*>();
    241     const Torrent * b = sourceModel()->data( right, TorrentModel::TorrentRole ).value<const Torrent*>();
    242     bool less;
    243 
    244     switch( getSortMode( ) )
    245     {
    246         case SORT_BY_SIZE:
    247             less = a->sizeWhenDone() < b->sizeWhenDone();
    248             break;
    249         case SORT_BY_ACTIVITY:
    250             less = a->downloadSpeed() + a->uploadSpeed() < b->downloadSpeed() + b->uploadSpeed();
    251             break;
    252         case SORT_BY_AGE:
    253             less = a->dateAdded() < b->dateAdded();
    254             break;
    255         case SORT_BY_ID:
    256             less = a->id() < b->id();
    257             break;
    258         case SORT_BY_RATIO:
    259             less = a->compareRatio( *b ) < 0;
    260             break;
    261         case SORT_BY_PROGRESS:
    262             less = a->percentDone() < b->percentDone();
    263             break;
    264         case SORT_BY_ETA:
    265             less = a->compareETA( *b ) < 0;
    266             break;
    267         case SORT_BY_STATE:
    268             if( a->hasError() != b->hasError() )
    269                 less = a->hasError();
    270             else
    271                 less = a->getActivity() < b->getActivity();
    272             break;
    273         case SORT_BY_TRACKER:
    274             less = a->compareTracker( *b ) < 0;
    275             break;
    276         default:
    277             less = a->name().compare( b->name(), Qt::CaseInsensitive ) > 0;
    278             break;
    279     }
    280 
    281     return less;
    282 }
    283 
    284181int
    285182TorrentFilter :: hiddenRowCount( ) const
     
    287184    return sourceModel()->rowCount( ) - rowCount( );
    288185}
    289 
Note: See TracChangeset for help on using the changeset viewer.