• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • transfer-plugins
  • bittorrent
  • advanceddetails
trackermodel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2008 by Joris Guisson and Ivan Vasic *
3  * joris.guisson@gmail.com *
4  * ivasic@gmail.com *
5  * *
6  * This program is free software; you can redistribute it and/or modify *
7  * it under the terms of the GNU General Public License as published by *
8  * the Free Software Foundation; either version 2 of the License, or *
9  * (at your option) any later version. *
10  * *
11  * This program is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU General Public License *
17  * along with this program; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20  ***************************************************************************/
21 #include "trackermodel.h"
22 #include <QList>
23 #include <klocale.h>
24 #include <interfaces/torrentinterface.h>
25 #include <interfaces/trackerinterface.h>
26 
27 namespace kt
28 {
29 
30  TrackerModel::TrackerModel(QObject* parent)
31  : QAbstractTableModel(parent),tc(0)
32  {
33  running = false;
34  }
35 
36 
37  TrackerModel::~TrackerModel()
38  {
39  qDeleteAll(trackers);
40  }
41 
42  void TrackerModel::changeTC(bt::TorrentInterface* tc)
43  {
44  qDeleteAll(trackers);
45  trackers.clear();
46  this->tc = tc;
47  if (tc)
48  {
49  QList<bt::TrackerInterface*> tracker_list = tc->getTrackersList()->getTrackers();
50  foreach (bt::TrackerInterface* trk,tracker_list)
51  {
52  trackers.append(new Item(trk));
53  }
54  }
55 
56  reset();
57  }
58 
59  void TrackerModel::update()
60  {
61  if (!tc)
62  return;
63 
64  int idx = 0;
65  foreach (Item* t,trackers)
66  {
67  if (t->update())
68  emit dataChanged(index(idx,1),index(idx,5));
69  idx++;
70  }
71 
72  running = tc->getStats().running;
73  }
74 
75 
76  int TrackerModel::rowCount(const QModelIndex &parent) const
77  {
78  if (parent.isValid() || !tc)
79  return 0;
80  else
81  return trackers.count();
82  }
83 
84  int TrackerModel::columnCount(const QModelIndex& parent) const
85  {
86  if (parent.isValid())
87  return 0;
88  else
89  return 6;
90  }
91 
92 
93  QVariant TrackerModel::data(const QModelIndex &index, int role) const
94  {
95  if (!tc || !index.isValid() || index.row() < 0 || index.row() >= trackers.count())
96  return QVariant();
97 
98  Item* item = (Item*)index.internalPointer();
99  if (!item)
100  return QVariant();
101 
102  bt::TrackerInterface* trk = item->trk;
103 
104  if (role == Qt::CheckStateRole && index.column() == 0)
105  {
106  return trk->isEnabled() ? Qt::Checked : Qt::Unchecked;
107  }
108  else if (role == Qt::DisplayRole)
109  {
110  return item->displayData(index.column());
111  }
112  else if (role == Qt::UserRole)
113  {
114  return item->sortData(index.column());
115  }
116  else if (role == Qt::ForegroundRole && index.column() == 1 && trk->trackerStatus() == bt::TRACKER_ERROR)
117  {
118  return Qt::red;
119  }
120 
121  return QVariant();
122  }
123 
124  bool TrackerModel::setData(const QModelIndex & index,const QVariant & value,int role)
125  {
126  if (!tc || !index.isValid() || index.row() < 0 || index.row() >= trackers.count())
127  return false;
128 
129  if (role == Qt::CheckStateRole)
130  {
131  KUrl url = trackers.at(index.row())->trk->trackerURL();
132  tc->getTrackersList()->setTrackerEnabled(url,(Qt::CheckState)value.toUInt() == Qt::Checked);
133  return true;
134  }
135  return false;
136  }
137 
138  QVariant TrackerModel::headerData(int section, Qt::Orientation orientation,int role) const
139  {
140  if (orientation != Qt::Horizontal)
141  return QVariant();
142 
143  if (role == Qt::DisplayRole)
144  {
145  switch (section)
146  {
147  case 0: return i18n("Url");
148  case 1: return i18n("Status");
149  case 2: return i18n("Seeders");
150  case 3: return i18n("Leechers");
151  case 4: return i18n("Times Downloaded");
152  case 5: return i18n("Next Update");
153  }
154  }
155  return QVariant();
156  }
157 
158  bool TrackerModel::insertRows(int row,int count,const QModelIndex & parent)
159  {
160  Q_UNUSED(parent)
161  beginInsertRows(QModelIndex(),row,row + count - 1);
162  if (tc)
163  {
164  QList<bt::TrackerInterface*> tracker_list = tc->getTrackersList()->getTrackers();
165  QList<Item*>::iterator i = trackers.begin();
166  foreach (bt::TrackerInterface* trk,tracker_list)
167  {
168  if (i != trackers.end())
169  {
170  Item* item = *i;
171  item->trk = trk;
172  }
173  else
174  trackers.append(new Item(trk));
175  i++;
176  }
177  }
178  endInsertRows();
179  return true;
180  }
181 
182  bool TrackerModel::removeRows(int row,int count,const QModelIndex & parent)
183  {
184  Q_UNUSED(parent)
185  beginRemoveRows(QModelIndex(),row,row + count - 1);
186  if (tc)
187  {
188  for (int i = 0;i < count;i++)
189  {
190  Item* item = trackers.takeAt(row);
191  KUrl url = item->trk->trackerURL();
192  tc->getTrackersList()->removeTracker(url);
193  delete item;
194  }
195  }
196  endRemoveRows();
197  return true;
198  }
199 
200  Qt::ItemFlags TrackerModel::flags(const QModelIndex & index) const
201  {
202  if (!tc || !index.isValid() || index.row() >= trackers.count() || index.row() < 0 || index.column() != 0)
203  return QAbstractItemModel::flags(index);
204  else
205  return QAbstractItemModel::flags(index) | Qt::ItemIsUserCheckable;
206  }
207 
208  QModelIndex TrackerModel::index(int row, int column, const QModelIndex& parent) const
209  {
210  if (parent.isValid() || row < 0 || row >= trackers.count() || column < 0 || column >= 6)
211  return QModelIndex();
212  else
213  return createIndex(row,column,trackers.at(row));
214  }
215 
216 
217  KUrl TrackerModel::trackerUrl(const QModelIndex & index)
218  {
219  if (!tc || !index.isValid() || index.row() < 0 || index.row() >= trackers.count())
220  return KUrl();
221 
222  return ((Item*)index.internalPointer())->trk->trackerURL();
223  }
224 
225  bt::TrackerInterface* TrackerModel::tracker(const QModelIndex & index)
226  {
227  if (!tc || !index.isValid() || index.row() < 0 || index.row() >= trackers.count())
228  return 0;
229 
230  return ((Item*)index.internalPointer())->trk;
231  }
232 
234 
235  TrackerModel::Item::Item(bt::TrackerInterface* tracker) : trk(tracker)
236  {
237  seeders = leechers = -1;
238  times_downloaded = -1;
239  time_to_next_update = 0;
240  status = tracker->trackerStatus();
241  }
242 
243  bool TrackerModel::Item::update()
244  {
245  bool ret = false;
246  if (status != trk->trackerStatus())
247  {
248  status = trk->trackerStatus();
249  ret = true;
250  }
251 
252  if (seeders != trk->getNumSeeders())
253  {
254  seeders = trk->getNumSeeders();
255  ret = true;
256  }
257 
258  if (leechers != trk->getNumLeechers())
259  {
260  leechers = trk->getNumLeechers();
261  ret = true;
262  }
263 
264  if (times_downloaded != trk->getTotalTimesDownloaded())
265  {
266  times_downloaded = trk->getTotalTimesDownloaded();
267  ret = true;
268  }
269 
270  if (static_cast<bt::Uint32>(time_to_next_update) != trk->timeToNextUpdate())
271  {
272  time_to_next_update = trk->timeToNextUpdate();
273  ret = true;
274  }
275 
276  return ret;
277  }
278 
279  QVariant TrackerModel::Item::displayData(int column) const
280  {
281  switch (column)
282  {
283  case 0: return trk->trackerURL().prettyUrl();
284  case 1: return trk->trackerStatusString();
285  case 2: return seeders >= 0 ? seeders : QVariant();
286  case 3: return leechers >= 0 ? leechers : QVariant();
287  case 4: return times_downloaded >= 0 ? times_downloaded : QVariant();
288  case 5:
289  {
290  int secs = time_to_next_update;
291  if (secs)
292  return QTime().addSecs(secs).toString("mm:ss");
293  else
294  return QVariant();
295  }
296  default: return QVariant();
297  }
298  }
299 
300  QVariant TrackerModel::Item::sortData(int column) const
301  {
302  switch (column)
303  {
304  case 0: return trk->trackerURL().prettyUrl();
305  case 1: return status;
306  case 2: return seeders;
307  case 3: return leechers;
308  case 4: return times_downloaded;
309  case 5: return time_to_next_update;
310  default: return QVariant();
311  }
312  }
313 
314 }
kt::TrackerModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: trackermodel.cpp:208
trackermodel.h
kt::TrackerModel::columnCount
virtual int columnCount(const QModelIndex &parent) const
Definition: trackermodel.cpp:84
QObject
kt::TrackerModel::~TrackerModel
virtual ~TrackerModel()
Definition: trackermodel.cpp:37
kt::TrackerModel::update
void update()
Definition: trackermodel.cpp:59
kt::TrackerModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
Definition: trackermodel.cpp:76
kt::TrackerModel::tracker
bt::TrackerInterface * tracker(const QModelIndex &idx)
Get a tracker given a model index.
Definition: trackermodel.cpp:225
kt::TrackerModel::data
virtual QVariant data(const QModelIndex &index, int role) const
Definition: trackermodel.cpp:93
kt::TrackerModel::flags
virtual Qt::ItemFlags flags(const QModelIndex &index) const
Definition: trackermodel.cpp:200
kt::TrackerModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
Definition: trackermodel.cpp:124
kt::TrackerModel::headerData
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
Definition: trackermodel.cpp:138
kt::TrackerModel::trackerUrl
KUrl trackerUrl(const QModelIndex &idx)
Get a tracker url given a model index.
Definition: trackermodel.cpp:217
kt::TrackerModel::removeRows
virtual bool removeRows(int row, int count, const QModelIndex &parent)
Definition: trackermodel.cpp:182
kt::TrackerModel::changeTC
void changeTC(bt::TorrentInterface *tc)
Definition: trackermodel.cpp:42
kt::TrackerModel::TrackerModel
TrackerModel(QObject *parent)
Definition: trackermodel.cpp:30
kt::TrackerModel::insertRows
virtual bool insertRows(int row, int count, const QModelIndex &parent)
Definition: trackermodel.cpp:158
QAbstractTableModel
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal