36
36
cd->getStats(stats);
39
bool ChunkDownloadModel::Item::changed() const
39
bool ChunkDownloadModel::Item::changed(int col,bool & modified) const
41
41
ChunkDownloadInterface::Stats s;
46
case 1: ret = s.pieces_downloaded != stats.pieces_downloaded; break;
47
case 2: ret = s.current_peer_id != stats.current_peer_id; break;
48
case 3: ret = s.download_speed != stats.download_speed; break;
44
if (s.pieces_downloaded != stats.pieces_downloaded ||
52
modified = s.pieces_downloaded != stats.pieces_downloaded ||
45
53
s.download_speed != stats.download_speed ||
46
s.num_downloaders != stats.num_downloaders ||
47
s.current_peer_id != stats.current_peer_id)
54
s.current_peer_id != stats.current_peer_id;
55
60
QVariant ChunkDownloadModel::Item::data(int col) const
59
64
case 0: return stats.chunk_index;
60
65
case 1: return QString("%1 / %2").arg(stats.pieces_downloaded).arg(stats.total_pieces);
61
66
case 2: return stats.current_peer_id;
62
case 3: return KBytesPerSecToString(stats.download_speed / 1024.0);
63
case 4: return stats.num_downloaders;
67
case 3: return BytesPerSecToString(stats.download_speed);
69
QVariant ChunkDownloadModel::Item::dataForSorting(int col) const
73
bool ChunkDownloadModel::Item::lessThan(int col,const Item* other) const
73
case 0: return stats.chunk_index;
74
case 1: return stats.pieces_downloaded;
75
case 2: return stats.current_peer_id;
76
case 3: return stats.download_speed;
77
case 4: return stats.num_downloaders;
77
case 0: return stats.chunk_index < other->stats.chunk_index;
78
case 1: return stats.pieces_downloaded < other->stats.pieces_downloaded;
79
case 2: return stats.current_peer_id < other->stats.current_peer_id;
80
case 3: return stats.download_speed < other->stats.download_speed;
81
case 4: return files < other->files;
83
86
/////////////////////////////////////////////////////////////
147
159
void ChunkDownloadModel::clear()
153
bool ChunkDownloadModel::update()
166
void ChunkDownloadModel::update()
157
foreach (const Item & i,items)
170
foreach (Item* i,items)
172
bool modified = false;
173
if (i->changed(sort_column,modified))
176
if (modified && !resort)
177
emit dataChanged(index(idx,1),index(idx,3));
182
sort(sort_column,sort_order);
166
int ChunkDownloadModel::rowCount ( const QModelIndex & parent ) const
185
int ChunkDownloadModel::rowCount(const QModelIndex & parent) const
168
187
if (parent.isValid())
171
190
return items.count();
174
int ChunkDownloadModel::columnCount ( const QModelIndex & parent ) const
193
int ChunkDownloadModel::columnCount(const QModelIndex & parent) const
176
195
if (parent.isValid())
182
QVariant ChunkDownloadModel::headerData ( int section, Qt::Orientation orientation,int role ) const
201
QVariant ChunkDownloadModel::headerData(int section,Qt::Orientation orientation,int role) const
184
if (role != Qt::DisplayRole || orientation != Qt::Horizontal)
203
if (orientation != Qt::Horizontal)
185
204
return QVariant();
189
case 0: return i18n("Chunk");
190
case 1: return i18n("Progress");
191
case 2: return i18n("Peer");
192
case 3: return i18n("Down Speed");
193
case 4: return i18n("Assigned Peers");
194
case 5: return i18n("Files");
195
default: return QVariant();
199
QVariant ChunkDownloadModel::data ( const QModelIndex & index,int role ) const
206
if (role == Qt::DisplayRole)
210
case 0: return i18n("Chunk");
211
case 1: return i18n("Progress");
212
case 2: return i18n("Peer");
213
case 3: return i18n("Down Speed");
214
case 4: return i18n("Files");
215
default: return QVariant();
218
else if (role == Qt::ToolTipRole)
222
case 0: return i18n("Number of the chunk");
223
case 1: return i18n("Download progress of the chunk");
224
case 2: return i18n("Which peer we are downloading it from");
225
case 3: return i18n("Download speed of the chunk");
226
case 4: return i18n("Which files the chunk is located in");
227
default: return QVariant();
234
QModelIndex ChunkDownloadModel::index(int row,int column,const QModelIndex & parent) const
236
if (!hasIndex(row,column,parent) || parent.isValid())
237
return QModelIndex();
239
return createIndex(row,column,items[row]);
242
QVariant ChunkDownloadModel::data(const QModelIndex & index,int role) const
201
244
if (!index.isValid() || index.row() >= items.count() || index.row() < 0)
202
245
return QVariant();
204
247
if (role == Qt::DisplayRole)
205
return items[index.row()].data(index.column());
206
else if (role == Qt::UserRole) // UserRole is for sorting
207
return items[index.row()].dataForSorting(index.column());
248
return items[index.row()]->data(index.column());
209
250
return QVariant();
212
bool ChunkDownloadModel::removeRows ( int row,int count,const QModelIndex & /*parent*/ )
253
bool ChunkDownloadModel::removeRows(int row,int count,const QModelIndex & /*parent*/ )
214
255
beginRemoveRows(QModelIndex(),row,row + count - 1);
219
bool ChunkDownloadModel::insertRows ( int row,int count,const QModelIndex & /*parent*/ )
260
bool ChunkDownloadModel::insertRows(int row,int count,const QModelIndex & /*parent*/ )
221
262
beginInsertRows(QModelIndex(),row,row + count - 1);
267
class ChunkDownloadModelItemCmp
270
ChunkDownloadModelItemCmp(int col,Qt::SortOrder order) : col(col),order(order)
273
bool operator()(ChunkDownloadModel::Item* a,ChunkDownloadModel::Item* b)
275
if (order == Qt::AscendingOrder)
276
return a->lessThan(col,b);
278
return !a->lessThan(col,b);
285
void ChunkDownloadModel::sort(int col, Qt::SortOrder order)
289
emit layoutAboutToBeChanged();
290
qStableSort(items.begin(),items.end(),ChunkDownloadModelItemCmp(col,order));
291
emit layoutChanged();