Revision 1776 trunk/client/gui_qt/WidgetDownloadQueue.cpp

WidgetDownloadQueue.cpp (revision 1776)
17 17

                
18 18
    ui->setupUi(this);
19 19

                
20
    ui->treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents);
20
    ui->treeView->header()->setResizeMode(QHeaderView::ResizeToContents);
21 21

                
22
    this->model = new DownloadQueueModel(glue);
23
    ui->treeView->setModel(this->model);
24

                
22 25
    progressbarDelegate = new ProgressBarDelegateDownloadQueue(this);
23
    ui->treeWidget->setItemDelegateForColumn(FIELD_STATE_STR, progressbarDelegate);
26
    ui->treeView->setItemDelegateForColumn(DownloadQueueItem::FIELD_STATE_STR, progressbarDelegate);
24 27

                
25 28
    /* Connect the signal handlers for the download queue widgets */
26 29
    connect(ui->actionMoveSelectedItemsToTheTop, SIGNAL(triggered(void)), SLOT(btnQueueMoveToTop_clicked(void)));
... ...
28 31
    connect(ui->actionMoveSelectedItemsDown, SIGNAL(triggered(void)), SLOT(btnQueueMoveDown_clicked(void)));
29 32
    connect(ui->actionMoveSelectedItemsToTheBottom, SIGNAL(triggered(void)), SLOT(btnQueueMoveToBottom_clicked(void)));
30 33

                
31
    connect(ui->treeWidget, SIGNAL(itemSelectionChanged(void)), SLOT(onItemSelectionChanged(void)));
34
    connect(ui->treeView, SIGNAL(itemSelectionChanged(void)), SLOT(onItemSelectionChanged(void)));
32 35

                
33
    connect(glue, SIGNAL(fileDownloadStateUpdate(QString,QString,int,int,int,quint64,quint64,quint64,quint64)), SLOT(onFileDownloadStateUpdate(QString,QString,int,int,int,quint64,quint64,quint64,quint64)), Qt::QueuedConnection);
34
    connect(glue, SIGNAL(fileStateChanged(QString,QString,QString,QNNTPGrabGlue::TaskState,QNNTPGrabGlue::TaskState)), SLOT(onFileStateChanged(QString,QString,QString,QNNTPGrabGlue::TaskState,QNNTPGrabGlue::TaskState)), Qt::QueuedConnection);
35

                
36
    connect(glue, SIGNAL(fileAdded(QString,QString,QString,QDateTime,quint64,quint64,quint64,QNNTPGrabGlue::TaskState,int,QList)), SLOT(onFileAdded(QString,QString,QString,QDateTime,quint64,quint64,quint64,QNNTPGrabGlue::TaskState,int,QList)), Qt::QueuedConnection);
37
    connect(glue, SIGNAL(fileRemoved(QString,QString,quint64,quint64)), SLOT(onFileRemoved(QString,QString,quint64,quint64)), Qt::QueuedConnection);
38
    connect(glue, SIGNAL(fileMoved(QString,QString,QString,int,int)), SLOT(onFileMoved(QString,QString,QString,int,int)), Qt::QueuedConnection);
39

                
40
    connect(glue, SIGNAL(collectionAdded(QString,QString)), SLOT(onCollectionAdded(QString,QString)), Qt::QueuedConnection);
41
    connect(glue, SIGNAL(collectionRemoved(QString)), SLOT(onCollectionRemoved(QString)), Qt::QueuedConnection);
42
    connect(glue, SIGNAL(collectionModified(QString,QString)), SLOT(onCollectionModified(QString,QString)), Qt::QueuedConnection);
43
    connect(glue, SIGNAL(collectionMoved(QString,int,int)), SLOT(onCollectionMoved(QString,int,int)), Qt::QueuedConnection);
44

                
45
    connect(glue, SIGNAL(trafficMonitorUpdate(int,int,int,int,int,int,int,int,int,int,QDateTime,double)), SLOT(onTrafficMonitorUpdate(int,int,int,int,int,int,int,int,int,int,QDateTime,double)), Qt::QueuedConnection);
46

                
47 36
    connect(ui->actionMarkItemOptional, SIGNAL(triggered()), SLOT(actionMarkItemOptional_activated()));
48 37
    connect(ui->actionRestartSelectedItems, SIGNAL(triggered()), SLOT(actionRestartSelectedItems_activated()));
49 38
    connect(actionRemoveSelectedFiles, SIGNAL(triggered()), SLOT(actionRemoveSelectedFiles_activated()));
50 39
    connect(ui->actionOpenDownloadFolder, SIGNAL(triggered()), SLOT(actionOpenDownloadFolder_activated()));
51 40
    connect(ui->actionExecuteSelectedItem, SIGNAL(triggered()), SLOT(actionExecuteSelectedItem_activated()));
52 41

                
53
    ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
54
    connect(ui->treeWidget, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showContextMenu(const QPoint &)));
42
    ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
43
    connect(ui->treeView, SIGNAL(customContextMenuRequested(const QPoint &)), SLOT(showContextMenu(const QPoint &)));
55 44

                
56 45
    /* Add custom fields to the list */
57
    ui->treeWidget->setColumnCount(NUM_FIELDS);
58
    ui->treeWidget->setColumnHidden(FIELD_PROGRESS, true);
59
    ui->treeWidget->setColumnHidden(FIELD_FILE_SIZE, true);
60
    ui->treeWidget->setColumnHidden(FIELD_FILE_SIZE_REMAINING, true);
61
    ui->treeWidget->setColumnHidden(FIELD_REAL_FILENAME, true);
46
    //ui->treeView->setColumnCount(DownloadQueueItem::NUM_FIELDS);
47
    ui->treeView->setColumnHidden(DownloadQueueItem::FIELD_PROGRESS, true);
48
    ui->treeView->setColumnHidden(DownloadQueueItem::FIELD_FILE_SIZE, true);
49
    ui->treeView->setColumnHidden(DownloadQueueItem::FIELD_FILE_SIZE_REMAINING, true);
50
    ui->treeView->setColumnHidden(DownloadQueueItem::FIELD_REAL_FILENAME, true);
62 51

                
63
    /* Retrieve the download queue */
64
    QList collections = glue->schedularGetAllTasks();
65 52

                
66
    int i;
67
    for (i = 0; i < collections.count(); i++) {
68
        QNNTPGrabGlue::Collection collection = collections[i];
69

                
70
        QTreeWidgetItem *collection_item = new QTreeWidgetItem();
71

                
72
        int j;
73
        for (j = 0; j < collection.files.count(); j++) {
74
            QNNTPGrabGlue::File file = collection.files[j];
75

                
76
            QTreeWidgetItem *file_item = new QTreeWidgetItem(collection_item);
77
            file_item->setText(FIELD_SUBJECT, file.subject);
78
            file_item->setText(FIELD_POSTER, file.poster);
79
            file_item->setData(FIELD_FILE_SIZE, Qt::UserRole, QVariant(file.file_size));
80
            file_item->setText(FIELD_FILE_SIZE_STR, glue->utilsCalculateFileSize(file.file_size));
81
            file_item->setData(FIELD_FILE_SIZE_REMAINING, Qt::UserRole, QVariant(file.file_size_remaining));
82
            file_item->setText(FIELD_FILE_SIZE_REMAINING_STR, glue->utilsCalculateFileSize(file.file_size_remaining));
83
            file_item->setText(FIELD_STAMP, file.stamp.toString());
84
            file_item->setText(FIELD_REAL_FILENAME, file.filename);
85

                
86
            int k;
87
            QString groups;
88
            for (k = 0; k < file.groups.count(); k++) {
89
                if (groups.isEmpty()) {
90
                    groups = file.groups[k];
91
                } else {
92
                    groups += QString(",") + file.groups[k];
93
                }
94
            }
95
            file_item->setText(FIELD_GROUPS, groups);
96

                
97
            int progress;
98
            QString state_str;
99

                
100
            if (file.status == QNNTPGrabGlue::TASK_STATE_SKIPPED) {
101
                progress = 0;
102
            } else {
103
                progress = calculateProgress(file.file_size, file.file_size_remaining);
104
            }
105

                
106
            switch(file.status) {
107
                case QNNTPGrabGlue::TASK_STATE_WAITING_FOR_DOWNLOAD:
108
                case QNNTPGrabGlue::TASK_STATE_DOWNLOADING:
109
                    state_str = "";
110
                    break;
111

                
112
                case QNNTPGrabGlue::TASK_STATE_WAITING_FOR_DECODE:
113
                    state_str = tr("Waiting");
114
                    break;
115

                
116
                case QNNTPGrabGlue::TASK_STATE_DECODING:
117
                    state_str = tr("Decoding");
118
                    break;
119

                
120
                case QNNTPGrabGlue::TASK_STATE_FINISHED_COMPLETE:
121
                    state_str = tr("Done");
122
                    break;
123

                
124
                case QNNTPGrabGlue::TASK_STATE_FINISHED_INCOMPLETE:
125
                    state_str = tr("Incomplete");
126
                    break;
127

                
128
                case QNNTPGrabGlue::TASK_STATE_FINISHED_NO_PARTS_AVAIL:
129
                    state_str = tr("Not available");
130
                    break;
131

                
132
                case QNNTPGrabGlue::TASK_STATE_SKIPPED:
133
                    state_str = tr("Skipped");
134
                    break;
135

                
136
                default:
137
                    state_str = "";
138
                    break;
139
            };
140

                
141
            file_item->setText(FIELD_PROGRESS, QString("%1").arg(progress));
142
            file_item->setText(FIELD_STATE_STR, state_str);
143
        }
144

                
145
        collection_item->setText(FIELD_PROGRESS, QString("%1").arg(calculateProgress(collection.total_size, collection.total_size_remaining)));
146
        collection_item->setText(FIELD_SUBJECT, collection.collection_name);
147
        collection_item->setText(FIELD_POSTER, collection.poster);
148
        collection_item->setData(FIELD_FILE_SIZE, Qt::UserRole, collection.total_size);
149
        collection_item->setText(FIELD_FILE_SIZE_STR, glue->utilsCalculateFileSize(collection.total_size));
150
        collection_item->setData(FIELD_FILE_SIZE_REMAINING, Qt::UserRole, collection.total_size_remaining);
151
        collection_item->setText(FIELD_FILE_SIZE_REMAINING_STR, glue->utilsCalculateFileSize(collection.total_size_remaining));
152

                
153
        ui->treeWidget->addTopLevelItem(collection_item);
154
    }
155

                
156
    ui->treeWidget->resizeColumnToContents(FIELD_PROGRESS);
53
    //ui->treeWidget->resizeColumnToContents(FIELD_PROGRESS);
157 54
}
158 55

                
159 56
WidgetDownloadQueue::~WidgetDownloadQueue()
... ...
216 113
    QList list_collections;
217 114
    MoveItemData move_data;
218 115

                
219
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
220
        collection_item = ui->treeWidget->topLevelItem(i);
116
#if 0
117
    for (int i = 0; i < ui->treeView->topLevelItemCount(); i++) {
118
        collection_item = ui->treeView->topLevelItem(i);
221 119

                
222 120
        if (collection_item->isSelected()) {
223 121
            if (i == ui->treeWidget->topLevelItemCount() - 1 && direction == MOVE_DIRECTION_DOWN) {
... ...
267 165
            }
268 166
        }
269 167
    }
168
#endif
270 169

                
271 170
    if (list_collections.count() > 0) {
272 171
        Q_FOREACH(move_data, list_collections) {
273
            doMoveItem(move_data.item->data(FIELD_SUBJECT, 0).toString(), NULL, calculateNewPosition(move_data.position, direction));
172
            doMoveItem(move_data.item->data(DownloadQueueItem::FIELD_SUBJECT, 0).toString(), NULL, calculateNewPosition(move_data.position, direction));
274 173
        }
275 174
    }
276 175
}
... ...
295 194
    processSelectionAndMoveItems(MOVE_DIRECTION_BOTTOM);
296 195
}
297 196

                
298
int WidgetDownloadQueue::calculateProgress(quint64 size, quint64 size_remaining)
299
{
300
    if (size == 0) {        /* Prevent a divide by zero */
301
        return 0;
302
    }
303

                
304
    int ret = (((double)size - size_remaining) / size) * 100;
305

                
306
    if (ret < 0 || ret > 100) {
307
        qWarning("Invalid progress detected, size = %lli, size_remaining = %lli", size, size_remaining);
308
    }
309

                
310
    return qMin(100, ret);
311
}
312

                
313
void WidgetDownloadQueue::onFileDownloadStateUpdate(QString collection_name, QString subject, int num_parts_total, int num_parts_done,
314
                                                    int num_parts_failed, quint64 file_size, quint64 file_size_remaining,
315
                                                    quint64 total_size, quint64 total_size_remaining)
316
{
317
    Q_UNUSED(num_parts_total);
318
    Q_UNUSED(num_parts_done);
319
    Q_UNUSED(num_parts_failed);
320
    QTreeWidgetItem *collection_node;
321
    QTreeWidgetItem *subject_node;
322

                
323
    collection_node = getTreeWidgetByCollection(collection_name);
324
    subject_node = getTreeWidgetBySubject(collection_node, subject);
325
    if (subject_node == NULL) {
326
        qWarning("onFileDownloadStateUpdate: Subject '%s' from collection '%s' could not found", collection_name.toUtf8().data(), subject.toUtf8().data());
327
        return;
328
    }
329

                
330
    collection_node->setText(FIELD_PROGRESS, QString("%1").arg(calculateProgress(total_size, total_size_remaining)));
331
    collection_node->setText(FIELD_STATE_STR, collection_node->text(FIELD_STATE_STR));    /* Force redraw */
332
    collection_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(total_size_remaining));
333
    collection_node->setText(FIELD_FILE_SIZE_REMAINING_STR, glue->utilsCalculateFileSize(total_size_remaining));
334

                
335
    subject_node->setText(FIELD_PROGRESS, QString("%1").arg(calculateProgress(file_size, file_size_remaining)));
336
    subject_node->setText(FIELD_STATE_STR, subject_node->text(FIELD_STATE_STR));    /* Force redraw */
337
    subject_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(file_size_remaining));
338
    subject_node->setText(FIELD_FILE_SIZE_REMAINING_STR, glue->utilsCalculateFileSize(file_size_remaining));
339
}
340

                
341
void WidgetDownloadQueue::onFileStateChanged(QString collection_name, QString subject, QString real_filename, QNNTPGrabGlue::TaskState old_state, QNNTPGrabGlue::TaskState new_state)
342
{
343
    Q_UNUSED(old_state);
344

                
345
    QTreeWidgetItem *collection_node;
346
    QTreeWidgetItem *subject_node;
347

                
348
    collection_node = getTreeWidgetByCollection(collection_name);
349
    subject_node = getTreeWidgetBySubject(collection_node, subject);
350

                
351
    if (!subject_node) {
352
        qWarning("onFileStateChanged: Subject '%s' from collection '%s' could not be found", subject.toUtf8().data(), collection_name.toUtf8().data());
353
        return;
354
    }
355

                
356
    quint64 file_size;
357
    quint64 file_size_remaining;
358
    QString size_remaining;
359
    quint64 total_size;
360
    quint64 total_size_remaining;
361
    int progress;
362

                
363
    switch(new_state) {
364
        case QNNTPGrabGlue::TASK_STATE_WAITING_FOR_DOWNLOAD:
365
            /* The task was restarted */
366

                
367
            /* Update the row itself */
368
            file_size = subject_node->data(FIELD_FILE_SIZE, Qt::DisplayRole).toLongLong();
369
            file_size_remaining = subject_node->data(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole).toLongLong();
370

                
371
            size_remaining = glue->utilsCalculateFileSize(file_size);
372

                
373
            subject_node->setText(FIELD_PROGRESS, "0");
374
            subject_node->setText(FIELD_STATE_STR, "");
375
            subject_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(file_size));
376
            subject_node->setText(FIELD_FILE_SIZE_REMAINING_STR, size_remaining);
377

                
378
            /* Update the parent */
379
            total_size = collection_node->data(FIELD_FILE_SIZE, Qt::DisplayRole).toLongLong();
380
            total_size_remaining = collection_node->data(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole).toLongLong();
381

                
382
            total_size_remaining += file_size - file_size_remaining;
383

                
384
            progress = calculateProgress(total_size, total_size_remaining);
385
            size_remaining = glue->utilsCalculateFileSize(total_size_remaining);
386

                
387
            collection_node->setText(FIELD_PROGRESS, QString("%1").arg(progress));
388
            collection_node->setText(FIELD_STATE_STR, collection_node->text(FIELD_STATE_STR));    /* Force redraw */
389
            collection_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(total_size_remaining));
390
            collection_node->setText(FIELD_FILE_SIZE_REMAINING_STR, size_remaining);
391

                
392
            break;
393
        case QNNTPGrabGlue::TASK_STATE_DOWNLOADING:
394
            subject_node->setText(FIELD_PROGRESS, "0");
395
            subject_node->setText(FIELD_STATE_STR, "");     /* The state message should be empty. In that case the value of the progress bar will be shown */
396
            break;
397
        case QNNTPGrabGlue::TASK_STATE_WAITING_FOR_DECODE:
398
            size_remaining = glue->utilsCalculateFileSize(0);
399
            subject_node->setText(FIELD_PROGRESS, "100");
400
            subject_node->setText(FIELD_FILE_SIZE_REMAINING_STR, size_remaining);
401
            subject_node->setText(FIELD_STATE_STR, tr("Waiting"));
402
            break;
403
        case QNNTPGrabGlue::TASK_STATE_DECODING:
404
            subject_node->setText(FIELD_PROGRESS, "100");
405
            subject_node->setText(FIELD_STATE_STR, tr("Decoding"));
406
            break;
407
        case QNNTPGrabGlue::TASK_STATE_FINISHED_COMPLETE:
408
            Q_ASSERT(real_filename != NULL);
409

                
410
            subject_node->setText(FIELD_STATE_STR, tr("Done"));
411
            subject_node->setText(FIELD_REAL_FILENAME, real_filename);
412
            break;
413
        case QNNTPGrabGlue::TASK_STATE_FINISHED_INCOMPLETE:
414
            Q_ASSERT(real_filename != NULL);
415

                
416
            subject_node->setText(FIELD_STATE_STR, tr("Incomplete"));
417
            subject_node->setText(FIELD_REAL_FILENAME, real_filename);
418
            break;
419
        case QNNTPGrabGlue::TASK_STATE_FINISHED_NO_PARTS_AVAIL:
420
            subject_node->setText(FIELD_STATE_STR, tr("Not available"));
421
            break;
422
        case QNNTPGrabGlue::TASK_STATE_SKIPPED:
423
            subject_node->setText(FIELD_STATE_STR, tr("Skipped"));
424
            subject_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayPropertyRole, QVariant(0));
425
            subject_node->setText(FIELD_FILE_SIZE_REMAINING_STR, "");
426
            break;
427
    }
428

                
429
    ui->treeWidget->resizeColumnToContents(FIELD_PROGRESS);
430
}
431

                
432
void WidgetDownloadQueue::onFileAdded(QString collection_name, QString subject, QString poster, QDateTime stamp, quint64 file_size, quint64 total_size, quint64 total_size_remaining, QNNTPGrabGlue::TaskState state, int num_parts, QList groups)
433
{
434
    Q_UNUSED(num_parts);
435

                
436
    QTreeWidgetItem *collection_node =  NULL;
437

                
438
    collection_node = getTreeWidgetByCollection(collection_name);
439
    if (collection_node == NULL) {
440
        qWarning("file added: Collection %s could not be found", collection_name.toUtf8().data());
441
        return;
442
    }
443

                
444
    QTreeWidgetItem *file_node =  new QTreeWidgetItem();
445
    file_node->setText(FIELD_SUBJECT, subject);
446
    file_node->setText(FIELD_POSTER, poster);
447
    file_node->setData(FIELD_FILE_SIZE, Qt::DisplayRole, QVariant(file_size));
448
    file_node->setText(FIELD_FILE_SIZE_STR, glue->utilsCalculateFileSize(file_size));
449
    file_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayPropertyRole, QVariant(file_size));
450
    file_node->setText(FIELD_FILE_SIZE_REMAINING_STR, glue->utilsCalculateFileSize(file_size));
451
    file_node->setText(FIELD_STAMP, stamp.toString());
452

                
453
    int i;
454
    QString groups_str;
455
    for (i = 0; i < groups.count(); i++) {
456
        if (groups_str.isEmpty()) {
457
            groups_str = groups[i];
458
        } else {
459
            groups_str += QString(",") + groups[i];
460
        }
461
    }
462
    file_node->setText(FIELD_GROUPS, groups_str);
463

                
464
    if (state == QNNTPGrabGlue::TASK_STATE_SKIPPED) {
465
        file_node->setText(FIELD_STATE_STR, tr("Skipped"));
466
        file_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(0));
467
        file_node->setText(FIELD_FILE_SIZE_REMAINING_STR, "");
468
    }
469

                
470
    /* Update the parent */
471
    collection_node->addChild(file_node);
472

                
473
    QString size = glue->utilsCalculateFileSize(total_size);
474
    QString size_remaining = glue->utilsCalculateFileSize(total_size_remaining);
475

                
476
    int progress = calculateProgress(total_size, total_size_remaining);
477

                
478
    collection_node->setData(FIELD_FILE_SIZE, Qt::DisplayRole, QVariant(total_size));
479
    collection_node->setText(FIELD_FILE_SIZE_STR, size);
480
    collection_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(total_size_remaining));
481
    collection_node->setText(FIELD_FILE_SIZE_REMAINING_STR, size_remaining);
482
    collection_node->setText(FIELD_PROGRESS, QString("%1").arg(progress));
483
    collection_node->setText(FIELD_STATE_STR, collection_node->text(FIELD_STATE_STR));    /* Force redraw */
484
}
485

                
486
void WidgetDownloadQueue::onFileRemoved(QString collection_name, QString subject, quint64 total_size, quint64 total_size_remaining)
487
{
488
    QTreeWidgetItem *collection_node;
489
    QTreeWidgetItem *subject_node;
490

                
491
    collection_node = getTreeWidgetByCollection(collection_name);
492
    subject_node = getTreeWidgetBySubject(collection_node, subject);
493
    if (subject_node == NULL) {
494
        qWarning("onFileRemoved: Subject '%s' in collection '%s' could not be found", subject.toUtf8().data(), collection_name.toUtf8().data());
495
        return;
496
    }
497

                
498
    QString size = glue->utilsCalculateFileSize(total_size);
499
    QString size_remaining = glue->utilsCalculateFileSize(total_size_remaining);
500

                
501
    collection_node->setData(FIELD_FILE_SIZE, Qt::DisplayRole, QVariant(total_size));
502
    collection_node->setText(FIELD_FILE_SIZE_STR, size);
503
    collection_node->setData(FIELD_FILE_SIZE_REMAINING, Qt::DisplayRole, QVariant(total_size_remaining));
504
    collection_node->setText(FIELD_FILE_SIZE_REMAINING_STR, size_remaining);
505
    collection_node->setText(FIELD_PROGRESS, QString("%1").arg(calculateProgress(total_size, total_size_remaining)));
506
    collection_node->setText(FIELD_STATE_STR, collection_node->text(FIELD_STATE_STR));    /* Force redraw */
507

                
508
    delete subject_node;
509
}
510

                
511
void WidgetDownloadQueue::onFileMoved(QString orig_collection_name, QString subject, QString new_collection_name, int old_position, int new_position)
512
{
513
    Q_UNUSED(subject);
514
    Q_UNUSED(new_collection_name);
515

                
516
    bool was_selected;
517
    QTreeWidgetItem *subject_node;
518
    QTreeWidgetItem *collection_node = getTreeWidgetByCollection(orig_collection_name);
519

                
520
    qDebug("file moved: old_position: %i, new position: %i", old_position, new_position);
521

                
522
    if (collection_node == NULL) {
523
        qWarning("onFileMoved: Collection '%s' not found", orig_collection_name.toUtf8().data());
524
        return;
525
    }
526

                
527
    was_selected = collection_node->child(old_position)->isSelected();
528
    subject_node = collection_node->takeChild(old_position);
529

                
530
    if (new_position == -1) {
531
        collection_node->addChild(subject_node);
532
    } else {
533
        collection_node->insertChild(new_position, subject_node);
534
    }
535

                
536
    if (was_selected) {
537
        subject_node->setSelected(true);
538
    }
539
}
540

                
541
void WidgetDownloadQueue::onCollectionAdded(QString collection_name, QString poster)
542
{
543
    qDebug("Collection added");
544
    QTreeWidgetItem *collection_node =  new QTreeWidgetItem();
545
    collection_node->setText(FIELD_SUBJECT, collection_name);
546
    collection_node->setText(FIELD_POSTER, poster);
547
    ui->treeWidget->addTopLevelItem(collection_node);
548
}
549

                
550
void WidgetDownloadQueue::onCollectionRemoved(QString collection_name)
551
{
552
    qDebug("collection removed: %s", collection_name.toUtf8().data());
553
    QTreeWidgetItem *collection_node =  NULL;
554
    collection_node = getTreeWidgetByCollection(collection_name);
555

                
556
    if (collection_node == NULL) {
557
        qWarning("collectionmodified: Collection %s not found", collection_name.toUtf8().data());
558
        return;
559
    }
560

                
561
    delete collection_node;
562
}
563

                
564
void WidgetDownloadQueue::onCollectionModified(QString collection_name, QString poster)
565
{
566
    qDebug("Collection modified");
567
    QTreeWidgetItem *collection_node =  NULL;
568
    collection_node = getTreeWidgetByCollection(collection_name);
569

                
570
    if (collection_node == NULL) {
571
        qWarning("collectionmodified: Collection %s not found", collection_name.toUtf8().data());
572
        return;
573
    }
574

                
575
    collection_node->setText(FIELD_POSTER, poster);
576
}
577

                
578
void WidgetDownloadQueue::onCollectionMoved(QString collection_name, int old_position, int new_position)
579
{
580
    qDebug("collection moved: old_position: %i, new position: %i", old_position, new_position);
581
    bool was_selected;
582
    bool was_expanded;
583
    QTreeWidgetItem *collection_node;
584

                
585
    was_selected = ui->treeWidget->topLevelItem(old_position)->isSelected();
586
    was_expanded = ui->treeWidget->topLevelItem(old_position)->isExpanded();
587
    collection_node = ui->treeWidget->takeTopLevelItem(old_position);
588

                
589
    if (collection_node->text(FIELD_SUBJECT).compare(collection_name) != 0) {
590
        qWarning("onCollectionMoved: %s != %s", collection_name.toUtf8().data(), collection_node->text(FIELD_SUBJECT).toUtf8().data());
591
        return;
592
    }
593

                
594
    if (new_position == -1) { // To bottom
595
        ui->treeWidget->addTopLevelItem(collection_node);
596
    } else {
597
        ui->treeWidget->insertTopLevelItem(new_position, collection_node);
598
    }
599

                
600
    if (was_selected) {
601
        collection_node->setSelected(true);
602
    }
603

                
604
    if (was_expanded) {
605
        collection_node->setExpanded(true);
606
    }
607
}
608

                
609
void WidgetDownloadQueue::onTrafficMonitorUpdate(int bytes_received1, int bytes_received2, int bytes_received3, int bytes_received4, int bytes_received5, int bytes_received6, int bytes_received7, int bytes_received8, int bytes_received9, int bytes_received10, QDateTime stamp, double average)
610
{
611
    Q_UNUSED(stamp);
612
    Q_UNUSED(average);
613

                
614
    static int times_been_here = 10;
615
    bool no_data_received = FALSE;
616
    quint64 total_estimated_time_remaining;
617

                
618
    if (ui->treeWidget->children().count() == 0) {
619
        return;
620
    }
621

                
622
    if (bytes_received1 == 0 && bytes_received2 == 0 && bytes_received3 == 0 && bytes_received4 == 0 && bytes_received5 == 0 &&
623
        bytes_received6 == 0 && bytes_received7 == 0 && bytes_received8 == 0 && bytes_received9 == 0 && bytes_received10 == 0) {
624
            no_data_received = TRUE;
625
    }
626

                
627
    /* Only update on startup, on every 3 seconds, and when there has no data been received in the last 10 seconds */
628
    if (times_been_here < 3 && !no_data_received) {
629
        times_been_here += 1;
630
        return;
631
    }
632

                
633
    if (no_data_received) {
634
        times_been_here = 3;    /* update the time remaining the next time we get here */
635
    } else {
636
        times_been_here = 0;    /* perform the next update in 10 seconds */
637
    }
638

                
639
    total_estimated_time_remaining = 0;
640

                
641
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
642
        QTreeWidgetItem *collection_item;
643
        int estimated_time_remaining;
644
        quint64 file_size;
645

                
646
        collection_item = ui->treeWidget->topLevelItem(i);
647
        file_size = collection_item->data(FIELD_FILE_SIZE_REMAINING, Qt::UserRole).toULongLong();
648
        estimated_time_remaining = glue->utilsCalculateEstimatedTimeRemaining(bytes_received1, bytes_received2, bytes_received3, bytes_received4, bytes_received5,
649
                                                                              bytes_received6, bytes_received7, bytes_received8, bytes_received9, bytes_received10, file_size);
650

                
651
        if (estimated_time_remaining == -1) {
652
            /* Not enough data received to make an estimation */
653
            return;
654
        }
655

                
656
        if (estimated_time_remaining == 0) {
657
            /* Collection is already downloaded */
658
            collection_item->setText(FIELD_ESTIMATED_TIME_REMAINING_STR, "");
659
            collection_item->setText(FIELD_ESTIMATED_TIME_TO_FINISH_STR, "");
660
        } else {
661
            collection_item->setText(FIELD_ESTIMATED_TIME_REMAINING_STR, glue->utilsGetReadableTimeRemaining(total_estimated_time_remaining + estimated_time_remaining));
662
            collection_item->setText(FIELD_ESTIMATED_TIME_TO_FINISH_STR, glue->utilsGetReadableFinishedTime(total_estimated_time_remaining + estimated_time_remaining));
663
        }
664

                
665
        total_estimated_time_remaining += estimated_time_remaining;
666

                
667
/* Disabled for now as it causes too much load */
668 197
#if 0
669
        /* Walk through all the children */
670
        for (int j = 0; j < collection_item->childCount(); j++) {
671
            QTreeWidgetItem *subject_item = collection_item->child(j);
672

                
673
            file_size = subject_item->data(FIELD_FILE_SIZE_REMAINING, Qt::UserRole).toLongLong();
674
            if (file_size == 0) {
675
                /* File is already downloaded */
676
                subject_item->setText(FIELD_ESTIMATED_TIME_REMAINING_STR, "");
677
                subject_item->setText(FIELD_ESTIMATED_TIME_TO_FINISH_STR, "");
678
            } else {
679
                estimated_time_remaining = glue->utilsCalculateEstimatedTimeRemaining(bytes_received1, bytes_received2, bytes_received3, bytes_received4, bytes_received5,
680
                                                                                      bytes_received6, bytes_received7, bytes_received8, bytes_received9, bytes_received10, file_size);
681

                
682
                subject_item->setText(FIELD_ESTIMATED_TIME_REMAINING_STR, glue->utilsGetReadableTimeRemaining(total_estimated_time_remaining));
683
                subject_item->setText(FIELD_ESTIMATED_TIME_TO_FINISH_STR, glue->utilsGetReadableFinishedTime(total_estimated_time_remaining));
684
            }
685
        }
686
#endif
687
    }
688

                
689
    ui->treeWidget->resizeColumnToContents(FIELD_ESTIMATED_TIME_REMAINING_STR);
690
    ui->treeWidget->resizeColumnToContents(FIELD_ESTIMATED_TIME_TO_FINISH_STR);
691
}
692

                
693 198
QTreeWidgetItem *WidgetDownloadQueue::getTreeWidgetByCollection(QString collection_name)
694 199
{
695 200
    QTreeWidgetItem *collection_node =  NULL;
... ...
721 226
    }
722 227
    return subject_node;
723 228
}
229
#endif
724 230

                
725 231
void WidgetDownloadQueue::onItemSelectionChanged(void)
726 232
{
727
    if (ui->treeWidget->selectedItems().count() == 0) {
233
#if 0
234
    if (ui->treeView->selectedItems().count() == 0) {
728 235
        ui->btnQueueMoveToTop->setEnabled(false);
729 236
        ui->btnQueueMoveUp->setEnabled(false);
730 237
        ui->btnQueueMoveDown->setEnabled(false);
... ...
737 244
        ui->btnQueueMoveToBottom->setEnabled(true);
738 245
        actionRemoveSelectedFiles->setEnabled(true);
739 246
    }
247
#endif
740 248
}
741 249

                
742 250
void WidgetDownloadQueue::actionMarkItemOptional_activated(void)
743 251
{
252
#if 0
744 253
    bool flag_set = FALSE;
745 254
    bool is_optional = FALSE;
746 255

                
747
    for (int i = 0; i < ui->treeWidget->selectedItems().count(); i++) {
256
    for (int i = 0; i < ui->treeView->selectedItems().count(); i++) {
748 257
        QString collection_name = "";
749 258
        QString subject = "";
750 259
        QString errmsg = "";
751 260

                
752
        QTreeWidgetItem *item = ui->treeWidget->selectedItems().at(i);
261
        QTreeWidgetItem *item = ui->treeView->selectedItems().at(i);
753 262

                
754 263
        if (item->childCount() != 0) {
755 264
            /* This is a collection, ignore */
... ...
774 283
            qWarning("%s", tr("Unable to change the status of the selected file(s)").toUtf8().data());
775 284
        }
776 285
    }
286
#endif
777 287
}
778 288

                
779 289
void WidgetDownloadQueue::actionRemoveSelectedFiles_activated(void)
780 290
{
781
    for (int i = 0; i < ui->treeWidget->selectedItems().count(); i++) {
291
#if 0
292
    for (int i = 0; i < ui->treeView->selectedItems().count(); i++) {
782 293
        QString collection_name = "";
783 294
        QString subject = "";
784 295
        QString errmsg = "";
785 296

                
786
        QTreeWidgetItem *item = ui->treeWidget->selectedItems().at(i);
297
        QTreeWidgetItem *item = ui->treeView->selectedItems().at(i);
787 298

                
788 299
        if (item->childCount() == 0) {
789 300
            /* This is a subject */
... ...
798 309
            qWarning(tr("Error occured while removing file(s):\n%s").toUtf8().data(), errmsg.toUtf8().data());
799 310
        }
800 311
    }
312
#endif
801 313
}
802 314

                
803 315
void WidgetDownloadQueue::actionRestartSelectedItems_activated(void)
804 316
{
805
    for (int i = 0; i < ui->treeWidget->selectedItems().count(); i++) {
317
#if 0
318
    for (int i = 0; i < ui->treeView->selectedItems().count(); i++) {
806 319
        QString collection_name = "";
807 320
        QString subject = "";
808 321
        QString errmsg = "";
809 322

                
810
        QTreeWidgetItem *item = ui->treeWidget->selectedItems().at(i);
323
        QTreeWidgetItem *item = ui->treeView->selectedItems().at(i);
811 324

                
812 325
        if (item->childCount() == 0) {
813 326
            /* This is a subject */
... ...
822 335
            qWarning(tr("Error occured while restarting file(s):\n%s").toUtf8().data(), errmsg.toUtf8().data());
823 336
        }
824 337
    }
338
#endif
825 339
}
826 340

                
827 341
void WidgetDownloadQueue::actionOpenDownloadFolder_activated(void)
828 342
{
343
#if 0
829 344
    QString folder = "";
830 345
    QNNTPGrabGlue::ConfigOpts opts = glue->configGetOpts();
831 346

                
832
    if (ui->treeWidget->selectedItems().count() == 1) {
347
    if (ui->treeView->selectedItems().count() == 1) {
833 348
        QString collection_name;
834
        QTreeWidgetItem *item = ui->treeWidget->selectedItems().at(0);
349
        QTreeWidgetItem *item = ui->treeView->selectedItems().at(0);
835 350

                
836 351
        if (item->childCount() == 0) {
837 352
            /* This is a subject */
... ...
861 376
#else
862 377
    QDesktopServices::openUrl(QUrl(QString("file://") + location.absoluteFilePath()));
863 378
#endif
379
#endif
864 380
}
865 381

                
866 382
void WidgetDownloadQueue::actionExecuteSelectedItem_activated(void)
867 383
{
384
#if 0
868 385
    QNNTPGrabGlue::ConfigOpts opts = glue->configGetOpts();
869 386

                
870
    if (ui->treeWidget->selectedItems().count() != 1) {
387
    if (ui->treeView->selectedItems().count() != 1) {
871 388
        return;
872 389
    }
873 390

                
874
    QTreeWidgetItem *item = ui->treeWidget->selectedItems().at(0);
391
    QTreeWidgetItem *item = ui->treeView->selectedItems().at(0);
875 392

                
876 393
    if (item->childCount() != 0) {
877 394
        return;
... ...
897 414
#else
898 415
    QDesktopServices::openUrl(QUrl(QString("file://") + location.absoluteFilePath()));
899 416
#endif
417
#endif
900 418
}
901 419

                
902 420
void WidgetDownloadQueue::showContextMenu(const QPoint &position)
903 421
{
422
#if 0
904 423
    QList actions;
905 424
    QAction *a = new QAction(this);
906 425

                
907
    if (!ui->treeWidget->indexAt(position).isValid()) {
426
    if (!ui->treeView->indexAt(position).isValid()) {
908 427
        return;
909 428
    }
910 429

                
911
    if (ui->treeWidget->selectedItems().count() == 0) {
430
    if (ui->treeView->selectedItems().count() == 0) {
912 431
        return;
913 432
    }
914 433

                
... ...
935 454

                
936 455
    /* Do we have exactly one selected item and is this item already downloaded? */
937 456
    ui->actionExecuteSelectedItem->setEnabled(false);
938
    if (glue->getIsStandalone() && ui->treeWidget->selectedItems().count() == 1) {
939
        item = ui->treeWidget->selectedItems().at(0);
457
    if (glue->getIsStandalone() && ui->treeView->selectedItems().count() == 1) {
458
        item = ui->treeView->selectedItems().at(0);
940 459

                
941 460
        if (item->text(FIELD_STATE_STR).compare(tr("Done")) == 0 ||
942 461
            item->text(FIELD_STATE_STR).compare(tr("Incomplete")) == 0) {
... ...
946 465
    }
947 466

                
948 467
    /* Enable the forcefully download / skip option */
949
    item = ui->treeWidget->selectedItems().at(0);
468
    item = ui->treeView->selectedItems().at(0);
950 469
    if (item->text(FIELD_STATE_STR).compare(tr("Skipped")) == 0) {
951 470
        ui->actionMarkItemOptional->setText(tr("Forcefully download file(s)"));
952 471
        ui->actionMarkItemOptional->setEnabled(true);
... ...
960 479
        ui->actionMarkItemOptional->setEnabled(false);
961 480
    }
962 481

                
963
    QMenu::exec(actions, ui->treeWidget->mapToGlobal(position));
482
    QMenu::exec(actions, ui->treeView->mapToGlobal(position));
964 483

                
965 484
    delete a;
485
#endif
966 486
}
967 487

                
968
void WidgetDownloadQueue::hideField(field f)
488
void WidgetDownloadQueue::hideField(DownloadQueueItem::field f)
969 489
{
970
    ui->treeWidget->hideColumn(f);
490
    ui->treeView->hideColumn(f);
971 491
}
972 492

                
973
void WidgetDownloadQueue::showField(field f)
493
void WidgetDownloadQueue::showField(DownloadQueueItem::field f)
974 494
{
975
    ui->treeWidget->showColumn(f);
495
    ui->treeView->showColumn(f);
976 496
}

Also available in: Unified diff