source: trunk/qt/torrent-filter.cc @ 11071

Last change on this file since 11071 was 11071, checked in by charles, 12 years ago

(trunk qt) minor code simplification

  • Property svn:keywords set to Date Rev Author Id
File size: 6.9 KB
Line 
1/*
2 * This file Copyright (C) 2009-2010 Mnemosyne LLC
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: torrent-filter.cc 11071 2010-07-30 22:24:48Z charles $
11 */
12
13#include <iostream>
14
15#include "filters.h"
16#include "hig.h"
17#include "prefs.h"
18#include "torrent.h"
19#include "torrent-filter.h"
20#include "torrent-model.h"
21#include "utils.h"
22
23TorrentFilter :: TorrentFilter( Prefs& prefs ):
24    myPrefs( prefs )
25{
26    // listen for changes to the preferences to know when to refilter / resort
27    connect( &myPrefs, SIGNAL(changed(int)), this, SLOT(refreshPref(int)));
28
29    setDynamicSortFilter( true );
30
31    // initialize our state from the current prefs
32    QList<int> initKeys;
33    initKeys << Prefs :: SORT_MODE
34             << Prefs :: FILTER_MODE
35             << Prefs :: FILTER_TRACKERS
36             << Prefs :: FILTER_TEXT;
37    foreach( int key, initKeys )
38        refreshPref( key );
39}
40
41TorrentFilter :: ~TorrentFilter( )
42{
43}
44
45void
46TorrentFilter :: refreshPref( int key )
47{
48    switch( key )
49    {
50        case Prefs :: FILTER_TEXT:
51        case Prefs :: FILTER_MODE:
52        case Prefs :: FILTER_TRACKERS:
53            invalidateFilter( );
54            /* force a re-sort */
55            sort( 0, !myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder );
56
57        case Prefs :: SORT_MODE:
58        case Prefs :: SORT_REVERSED:
59            sort( 0, myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder );
60            invalidate( );
61            break;
62    }
63}
64
65/***
66****
67***/
68
69namespace
70{
71    template <typename T> int compare( const T a, const T b )
72    {
73        if( a < b ) return -1;
74        if( b < a ) return 1;
75        return 0;
76    }
77}
78
79bool
80TorrentFilter :: lessThan( const QModelIndex& left, const QModelIndex& right ) const
81{
82    const Torrent * a = sourceModel()->data( left, TorrentModel::TorrentRole ).value<const Torrent*>();
83    const Torrent * b = sourceModel()->data( right, TorrentModel::TorrentRole ).value<const Torrent*>();
84    int less = 0;
85
86    switch( myPrefs.get<SortMode>(Prefs::SORT_MODE).mode() )
87    {
88        case SortMode :: SORT_BY_SIZE:
89            less = compare( a->sizeWhenDone(), b->sizeWhenDone() );
90            break;
91        case SortMode :: SORT_BY_ACTIVITY:
92            less = compare( a->downloadSpeed() + a->uploadSpeed(), b->downloadSpeed() + b->uploadSpeed() );
93            if( !less )
94                less = compare( a->uploadedEver(), b->uploadedEver() );
95            break;
96        case SortMode :: SORT_BY_AGE:
97            less = compare( a->dateAdded().toTime_t(), b->dateAdded().toTime_t() );
98            break;
99        case SortMode :: SORT_BY_ID:
100            less = compare( a->id(), b->id() );
101            break;
102        case SortMode :: SORT_BY_STATE:
103            if( a->hasError() != b->hasError() )
104                less = a->hasError();
105            else
106                less = compare( a->getActivity(), b->getActivity() );
107            if( less )
108                break;
109        case SortMode :: SORT_BY_PROGRESS:
110            less = compare( a->percentDone(), b->percentDone() );
111            if( less )
112                break;
113        case SortMode :: SORT_BY_RATIO:
114            less = a->compareRatio( *b );
115            break;
116        case SortMode :: SORT_BY_ETA:
117            less = a->compareETA( *b );
118            break;
119        case SortMode :: SORT_BY_TRACKER:
120            less = a->compareTracker( *b );
121            break;
122        default:
123            break;
124    }
125    if( less == 0 )
126        less = -a->name().compare( b->name(), Qt::CaseInsensitive );
127    if( less == 0 )
128        less = compare( a->hashString(), b->hashString() );
129    return less < 0;
130}
131
132
133/***
134****
135***/
136
137bool
138TorrentFilter :: trackerFilterAcceptsTorrent( const Torrent * tor, const QString& tracker ) const
139{
140    return tracker.isEmpty() || tor->hasTrackerSubstring( tracker );
141}
142
143bool
144TorrentFilter :: activityFilterAcceptsTorrent( const Torrent * tor, const FilterMode& m ) const
145{
146    bool accepts;
147    const tr_torrent_activity activity = tor->getActivity( );
148
149    switch( m.mode( ) )
150    {
151        case FilterMode::SHOW_ALL:
152            accepts = true;
153            break;
154        case FilterMode::SHOW_ACTIVE:
155            accepts = tor->peersWeAreUploadingTo( ) > 0 || tor->peersWeAreDownloadingFrom( ) > 0 || tor->isVerifying( );
156            break;
157        case FilterMode::SHOW_DOWNLOADING:
158            accepts = activity == TR_STATUS_DOWNLOAD;
159            break;
160        case FilterMode::SHOW_SEEDING:
161            accepts = activity == TR_STATUS_SEED;
162            break;
163        case FilterMode::SHOW_PAUSED:
164            accepts = activity == TR_STATUS_STOPPED;
165            break;
166        case FilterMode::SHOW_QUEUED:
167            accepts = activity == TR_STATUS_CHECK_WAIT;
168            break;
169        case FilterMode::SHOW_VERIFYING:
170            accepts = activity == TR_STATUS_CHECK;
171            break;
172        case FilterMode::SHOW_ERROR:
173            accepts = tor->hasError( );
174            break;
175    }
176
177    return accepts;
178}
179
180bool
181TorrentFilter :: filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const
182{
183    QModelIndex childIndex = sourceModel()->index( sourceRow, 0, sourceParent );
184    const Torrent * tor = childIndex.model()->data( childIndex, TorrentModel::TorrentRole ).value<const Torrent*>();
185    bool accepts = true;
186
187    if( accepts ) {
188        const FilterMode m = myPrefs.get<FilterMode>(Prefs::FILTER_MODE);
189        accepts = activityFilterAcceptsTorrent( tor, m );
190    }
191
192    if( accepts ) {
193        const QString trackers = myPrefs.getString(Prefs::FILTER_TRACKERS);
194        accepts = trackerFilterAcceptsTorrent( tor, trackers );
195    }
196
197    if( accepts ) {
198        const QString text = myPrefs.getString( Prefs::FILTER_TEXT );
199        if( !text.isEmpty( ) )
200            accepts = tor->name().contains( text, Qt::CaseInsensitive );
201    }
202
203#if 0
204    if( accepts && !myText.isEmpty( ) ) switch( myTextMode )
205    {
206        case FILTER_BY_NAME:
207            accepts = tor->name().contains( myText, Qt::CaseInsensitive );
208            break;
209        case FILTER_BY_FILES:
210            accepts = tor->hasFileSubstring( myText );
211            break;
212        case FILTER_BY_TRACKER:
213            accepts = tor->hasTrackerSubstring( myText );
214            break;
215    }
216#endif
217
218    return accepts;
219}
220
221int
222TorrentFilter :: hiddenRowCount( ) const
223{
224    return sourceModel()->rowCount( ) - rowCount( );
225}
226
227int
228TorrentFilter :: count( const FilterMode& mode ) const
229{
230    int count = 0;
231
232    for( int row=0; ; ++row ) {
233        QModelIndex index = sourceModel()->index( row, 0 );
234        if( !index.isValid( ) )
235            break;
236        const Torrent * tor = index.data( TorrentModel::TorrentRole ).value<const Torrent*>();
237        if( activityFilterAcceptsTorrent( tor, mode ) )
238            ++count;
239    }
240
241    return count;
242}
Note: See TracBrowser for help on using the repository browser.