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

Last change on this file since 8213 was 8213, checked in by charles, 13 years ago

(trunk qt) ensure that the sort mode is applied correctly on startup

File size: 8.0 KB
Line 
1/*
2 * This file Copyright (C) 2009 Charles Kerr <charles@transmissionbt.com>
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:$
11 */
12
13#include <iostream>
14
15#include "prefs.h"
16#include "torrent.h"
17#include "torrent-filter.h"
18#include "torrent-model.h"
19
20TorrentFilter :: TorrentFilter( Prefs& prefs ):
21    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 ) )
26{
27    resort( );
28}
29
30TorrentFilter :: ~TorrentFilter( )
31{
32}
33
34/***
35****
36***/
37
38void
39TorrentFilter :: setShowMode( int showMode )
40{
41    if( myShowMode != showMode )
42    {
43        myPrefs.set( Prefs :: FILTER_MODE, getShowName( showMode ) );
44        myShowMode = ShowMode( showMode );
45        invalidateFilter( );
46    }
47}
48
49void
50TorrentFilter :: setTextMode( int textMode )
51{
52    if( myTextMode != textMode )
53    {
54        myTextMode = TextMode( textMode );
55        invalidateFilter( );
56    }
57}
58
59void
60TorrentFilter :: setText( QString text )
61{
62    QString trimmed = text.trimmed( );
63
64    if( myText != trimmed )
65    {
66        myText = trimmed;
67        invalidateFilter( );
68    }
69}
70
71bool
72TorrentFilter :: filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const
73{
74    QModelIndex childIndex = sourceModel()->index( sourceRow, 0, sourceParent );
75    const Torrent * tor = childIndex.model()->data( childIndex, TorrentModel::TorrentRole ).value<const Torrent*>();
76    const tr_torrent_activity activity = tor->getActivity( );
77    bool accepts;
78
79    switch( myShowMode )
80    {
81        case SHOW_ALL:
82            accepts = true;
83            break;
84        case SHOW_ACTIVE:
85            accepts = tor->peersWeAreUploadingTo( ) > 0 || tor->peersWeAreDownloadingFrom( ) > 0 || tor->isVerifying( );
86            break;
87        case SHOW_DOWNLOADING:
88            accepts = activity == TR_STATUS_DOWNLOAD;
89            break;
90        case SHOW_SEEDING:
91            accepts = activity == TR_STATUS_SEED;
92            break;
93        case SHOW_PAUSED:
94            accepts = activity == TR_STATUS_STOPPED;
95            break;
96    }
97
98    if( accepts && !myText.isEmpty( ) ) switch( myTextMode )
99    {
100        case FILTER_BY_NAME:
101            accepts = tor->name().contains( myText, Qt::CaseInsensitive );
102            break;
103        case FILTER_BY_FILES:
104            accepts = tor->hasFileSubstring( myText );
105            break;
106        case FILTER_BY_TRACKER:
107            accepts = tor->hasTrackerSubstring( myText );
108            break;
109    }
110
111    return accepts;
112}
113
114/***
115****
116***/
117
118namespace
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
167TorrentFilter :: ShowMode
168TorrentFilter :: getShowModeFromName( const QString& key ) const
169{
170    return ShowMode( getNum( showModes, showModeCount, key ) );
171}
172
173const char*
174TorrentFilter :: getShowName( int mode ) const
175{
176    if( mode < 0 ) mode = getShowMode( );
177    return getName( showModes, showModeCount, mode );
178}
179
180TorrentFilter :: SortMode
181TorrentFilter :: getSortModeFromName( const QString& key ) const
182{
183    return SortMode( getNum( sortModes, sortModeCount, key ) );
184}
185
186const char*
187TorrentFilter :: getSortName( int mode ) const
188{
189    if( mode < 0 ) mode = getSortMode( );
190    return getName( sortModes, sortModeCount, mode );
191}
192
193/***
194****
195***/
196
197void
198TorrentFilter :: resort( )
199{
200    invalidate( );
201    sort( 0, myIsAscending ? Qt::AscendingOrder : Qt::DescendingOrder );
202}
203
204void
205TorrentFilter :: setAscending( bool b )
206{
207    if( myIsAscending != b )
208    {
209        myIsAscending = b;
210        resort( );
211    }
212}
213
214void
215TorrentFilter :: 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
226void TorrentFilter :: sortByActivity ( ) { setSortMode( SORT_BY_ACTIVITY ); }
227void TorrentFilter :: sortByAge      ( ) { setSortMode( SORT_BY_AGE ); }
228void TorrentFilter :: sortByETA      ( ) { setSortMode( SORT_BY_ETA ); }
229void TorrentFilter :: sortById       ( ) { setSortMode( SORT_BY_ID ); }
230void TorrentFilter :: sortByName     ( ) { setSortMode( SORT_BY_NAME ); }
231void TorrentFilter :: sortByProgress ( ) { setSortMode( SORT_BY_PROGRESS ); }
232void TorrentFilter :: sortByRatio    ( ) { setSortMode( SORT_BY_RATIO ); }
233void TorrentFilter :: sortBySize     ( ) { setSortMode( SORT_BY_SIZE ); }
234void TorrentFilter :: sortByState    ( ) { setSortMode( SORT_BY_STATE ); }
235void TorrentFilter :: sortByTracker  ( ) { setSortMode( SORT_BY_TRACKER ); }
236
237bool
238TorrentFilter :: 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
284int
285TorrentFilter :: hiddenRowCount( ) const
286{
287    return sourceModel()->rowCount( ) - rowCount( );
288}
289
Note: See TracBrowser for help on using the repository browser.