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

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

happy new year!

  • Property svn:keywords set to Date Rev Author Id
File size: 5.0 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 9868 2010-01-04 21:00:47Z charles $
11 */
12
13#include <iostream>
14
15#include "filters.h"
16#include "prefs.h"
17#include "torrent.h"
18#include "torrent-filter.h"
19#include "torrent-model.h"
20
21TorrentFilter :: TorrentFilter( Prefs& prefs ):
22    myPrefs( prefs ),
23    myTextMode( FILTER_BY_NAME )
24{
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    setDynamicSortFilter( true );
29
30    // initialize our state from the current prefs
31    QList<int> initKeys;
32    initKeys << Prefs :: SORT_MODE
33             << Prefs :: FILTER_MODE;
34    foreach( int key, initKeys )
35        refreshPref( key );
36}
37
38TorrentFilter :: ~TorrentFilter( )
39{
40}
41
42void
43TorrentFilter :: refreshPref( int key )
44{
45    switch( key )
46    {
47        case Prefs :: SORT_MODE:
48        case Prefs :: SORT_REVERSED:
49            sort( 0, myPrefs.getBool(Prefs::SORT_REVERSED) ? Qt::AscendingOrder : Qt::DescendingOrder );
50            invalidate( );
51            break;
52        case Prefs :: FILTER_MODE:
53            invalidateFilter( );
54            break;
55    }
56}
57
58/***
59****
60***/
61
62void
63TorrentFilter :: setTextMode( int i )
64{
65    if( myTextMode != i )
66    {
67        myTextMode = TextMode( i );
68        invalidateFilter( );
69    }
70}
71
72void
73TorrentFilter :: setText( QString text )
74{
75    QString trimmed = text.trimmed( );
76
77    if( myText != trimmed )
78    {
79        myText = trimmed;
80        invalidateFilter( );
81    }
82}
83
84/***
85****
86***/
87
88bool
89TorrentFilter :: lessThan( const QModelIndex& left, const QModelIndex& right ) const
90{
91    const Torrent * a = sourceModel()->data( left, TorrentModel::TorrentRole ).value<const Torrent*>();
92    const Torrent * b = sourceModel()->data( right, TorrentModel::TorrentRole ).value<const Torrent*>();
93    bool less;
94
95    switch( myPrefs.get<SortMode>(Prefs::SORT_MODE).mode() )
96    {
97        case SortMode :: SORT_BY_SIZE:
98            less = a->sizeWhenDone() < b->sizeWhenDone();
99            break;
100        case SortMode :: SORT_BY_ACTIVITY:
101            less = a->downloadSpeed() + a->uploadSpeed() < b->downloadSpeed() + b->uploadSpeed();
102            break;
103        case SortMode :: SORT_BY_AGE:
104            less = a->dateAdded() < b->dateAdded();
105            break;
106        case SortMode :: SORT_BY_ID:
107            less = a->id() < b->id();
108            break;
109        case SortMode :: SORT_BY_RATIO:
110            less = a->compareRatio( *b ) < 0;
111            break;
112        case SortMode :: SORT_BY_PROGRESS:
113            less = a->percentDone() < b->percentDone();
114            break;
115        case SortMode :: SORT_BY_ETA:
116            less = a->compareETA( *b ) < 0;
117            break;
118        case SortMode :: SORT_BY_STATE:
119            if( a->hasError() != b->hasError() )
120                less = a->hasError();
121            else
122                less = a->getActivity() < b->getActivity();
123            break;
124        case SortMode :: SORT_BY_TRACKER:
125            less = a->compareTracker( *b ) < 0;
126            break;
127        default:
128            less = a->name().compare( b->name(), Qt::CaseInsensitive ) > 0;
129            break;
130    }
131
132    return less;
133}
134
135
136/***
137****
138***/
139
140bool
141TorrentFilter :: filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const
142{
143    QModelIndex childIndex = sourceModel()->index( sourceRow, 0, sourceParent );
144    const Torrent * tor = childIndex.model()->data( childIndex, TorrentModel::TorrentRole ).value<const Torrent*>();
145    const tr_torrent_activity activity = tor->getActivity( );
146    bool accepts;
147
148    switch( myPrefs.get<FilterMode>(Prefs::FILTER_MODE).mode() )
149    {
150        case FilterMode::SHOW_ALL:
151            accepts = true;
152            break;
153        case FilterMode::SHOW_ACTIVE:
154            accepts = tor->peersWeAreUploadingTo( ) > 0 || tor->peersWeAreDownloadingFrom( ) > 0 || tor->isVerifying( );
155            break;
156        case FilterMode::SHOW_DOWNLOADING:
157            accepts = activity == TR_STATUS_DOWNLOAD;
158            break;
159        case FilterMode::SHOW_SEEDING:
160            accepts = activity == TR_STATUS_SEED;
161            break;
162        case FilterMode::SHOW_PAUSED:
163            accepts = activity == TR_STATUS_STOPPED;
164            break;
165    }
166
167    if( accepts && !myText.isEmpty( ) ) switch( myTextMode )
168    {
169        case FILTER_BY_NAME:
170            accepts = tor->name().contains( myText, Qt::CaseInsensitive );
171            break;
172        case FILTER_BY_FILES:
173            accepts = tor->hasFileSubstring( myText );
174            break;
175        case FILTER_BY_TRACKER:
176            accepts = tor->hasTrackerSubstring( myText );
177            break;
178    }
179
180    return accepts;
181}
182
183int
184TorrentFilter :: hiddenRowCount( ) const
185{
186    return sourceModel()->rowCount( ) - rowCount( );
187}
Note: See TracBrowser for help on using the repository browser.