source: trunk/qt/torrent-model.cc @ 8188

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

(trunk) add the Qt beta into svn

File size: 5.3 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 <cassert>
14#include <iostream>
15
16#include <libtransmission/transmission.h>
17#include <libtransmission/bencode.h>
18
19#include "torrent-delegate.h"
20#include "torrent-model.h"
21
22int
23TorrentModel :: rowCount( const QModelIndex& parent ) const
24{
25    Q_UNUSED( parent );
26
27    return myTorrents.size( );
28}
29
30QVariant
31TorrentModel :: data( const QModelIndex& index, int role ) const
32{
33    QVariant var;
34    const int row = index.row( );
35    if( row<0 || row>=myTorrents.size() )
36        return QVariant( );
37
38    const Torrent* t = myTorrents.at( row );
39
40    switch( role )
41    {
42        case Qt::DisplayRole:
43            var = QString( t->name() );
44            break;
45
46        case Qt::DecorationRole:
47            var = t->getMimeTypeIcon( );
48            break;
49
50        case TorrentRole:
51            var = qVariantFromValue( t );
52            break;
53
54        default:
55            //std::cerr << "Unhandled role: " << role << std::endl;
56            break;
57    }
58
59    return var;
60}
61
62/***
63****
64***/
65
66void
67TorrentModel :: addTorrent( Torrent * t )
68{
69    myIdToTorrent.insert( t->id( ), t );
70    myIdToRow.insert( t->id( ), myTorrents.size( ) );
71    myTorrents.append( t );
72}
73
74TorrentModel :: TorrentModel( Prefs& prefs ):
75    myPrefs( prefs )
76{
77}
78
79TorrentModel :: ~TorrentModel( )
80{
81    foreach( Torrent * tor, myTorrents )
82        delete tor;
83    myTorrents.clear( );
84}
85
86/***
87****
88***/
89
90Torrent*
91TorrentModel :: getTorrentFromId( int id )
92{
93    id_to_torrent_t::iterator it( myIdToTorrent.find( id ) );
94    return it == myIdToTorrent.end() ? 0 : it.value( );
95}
96
97const Torrent*
98TorrentModel :: getTorrentFromId( int id ) const
99{
100    id_to_torrent_t::const_iterator it( myIdToTorrent.find( id ) );
101    return it == myIdToTorrent.end() ? 0 : it.value( );
102}
103
104/***
105****
106***/
107
108void
109TorrentModel :: onTorrentChanged( int torrentId )
110{
111    const int row( myIdToRow.value( torrentId, -1 ) );
112    if( row >= 0 ) {
113        QModelIndex qmi( index( row, 0 ) );
114        dataChanged( qmi, qmi );
115    }
116}
117
118void
119TorrentModel :: removeTorrents( tr_benc * torrents )
120{
121    int i = 0;
122    tr_benc * child;
123    while(( child = tr_bencListChild( torrents, i++ ))) {
124        int64_t intVal;
125        if( tr_bencGetInt( child, &intVal ) )
126            removeTorrent( intVal );
127    }
128}
129
130void
131TorrentModel :: updateTorrents( tr_benc * torrents, bool isCompleteList )
132{
133    QList<Torrent*> newTorrents;
134    QSet<int> oldIds( getIds( ) );
135    QSet<int> newIds;
136    int updatedCount = 0;
137
138    if( tr_bencIsList( torrents ) )
139    {
140        size_t i( 0 );
141        tr_benc * child;
142        while(( child = tr_bencListChild( torrents, i++ )))
143        {
144            int64_t id;
145            if( tr_bencDictFindInt( child, "id", &id ) )
146            {
147                newIds.insert( id );
148
149                Torrent * tor = getTorrentFromId( id );
150                if( tor == 0 )
151                {
152                    tor = new Torrent( myPrefs, id );
153                    tor->update( child );
154                    newTorrents.append( tor );
155                    connect( tor, SIGNAL(torrentChanged(int)), this, SLOT(onTorrentChanged(int)));
156                }
157                else
158                {
159                    tor->update( child );
160                    ++updatedCount;
161                }
162            }
163        }
164    }
165
166    if( !newTorrents.isEmpty( ) )
167    {
168        const int oldCount( rowCount( ) );
169        const int newCount( oldCount + newTorrents.size( ) );
170        QSet<int> ids;
171
172        beginInsertRows( QModelIndex(), oldCount, newCount - 1 );
173
174        foreach( Torrent * tor, newTorrents ) {
175            addTorrent( tor );
176            ids.insert( tor->id( ) );
177        }
178        endInsertRows( );
179
180        emit torrentsAdded( ids );
181    }
182
183    if( isCompleteList )
184    {
185        QSet<int> removedIds( oldIds );
186        removedIds -= newIds;
187        foreach( int id, removedIds )
188            removeTorrent( id );
189    }
190}
191
192void
193TorrentModel :: removeTorrent( int id )
194{
195    const int row = myIdToRow.value( id, -1 );
196    if( row >= 0 )
197    {
198        Torrent * tor = myIdToTorrent.value( id, 0 );
199        std::cerr << "removing torrent " << id << std::endl;
200
201        beginRemoveRows( QModelIndex(), row, row );
202        myIdToRow.remove( id );
203        myIdToTorrent.remove( id );
204        myTorrents.remove( myTorrents.indexOf( tor ) );
205        endRemoveRows( );
206
207        delete tor;
208    }
209}
210
211Speed
212TorrentModel :: getUploadSpeed( ) const
213{
214    Speed up;
215    foreach( const Torrent * tor, myTorrents )
216        up += tor->uploadSpeed( );
217    return up;
218}
219
220Speed
221TorrentModel :: getDownloadSpeed( ) const
222{
223    Speed down;
224    foreach( const Torrent * tor, myTorrents )
225        down += tor->downloadSpeed( );
226    return down;
227}
228
229QSet<int>
230TorrentModel :: getIds( ) const
231{
232    QSet<int> ids;
233    foreach( const Torrent * tor, myTorrents )
234        ids.insert( tor->id( ) );
235    return ids;
236}
237
238bool
239TorrentModel :: hasTorrent( const QString& hashString ) const
240{
241    foreach( const Torrent * tor, myTorrents )
242        if( tor->hashString( ) == hashString )
243            return true;
244    return false;
245}
Note: See TracBrowser for help on using the repository browser.