Statistics
| Revision:

root / trunk / client / gui_qt / WidgetNZBCreator.cpp @ 1788

History | View | Annotate | Download (9.5 KB)

1
#include "WidgetNZBCreator.h"
2
#include "ui_WidgetNZBCreator.h"
3
#include "DialogImportNZB.h"
4
#include 
5
#include 
6
#include 
7

                
8
enum {
9
    FIELD_IMPORT,
10
    FIELD_PERCENTAGE_COMPLETE,
11
    FIELD_SUBJECT,
12
    FIELD_POSTER,
13
    FIELD_NEWSGROUP,
14
    FIELD_FILE_SIZE,
15
    FIELD_STAMP,
16
    FIELD_FILE_ID,
17
    FIELD_COLLECTION_NAME_SHORT
18
};
19

                
20
WidgetNZBCreator::WidgetNZBCreator(QNNTPGrabGlue *glue, QWidget *parent) :
21
    QWidget(parent),
22
    ui(new Ui::WidgetNZBCreator)
23
{
24
    ui->setupUi(this);
25

                
26
    this->glue = glue;
27

                
28
    connect(ui->entryQuery, SIGNAL(textChanged(QString)), SLOT(entryQuery_textChanged(QString)));
29
    connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), SLOT(treeWidget_itemChanged(QTreeWidgetItem*,int)));
30
    connect(ui->btnSearch, SIGNAL(clicked()), SLOT(btnSearch_clicked()));
31
    connect(ui->btnImport, SIGNAL(clicked()), SLOT(btnImport_clicked()));
32
    connect(ui->btnSelectAll, SIGNAL(clicked()), SLOT(btnSelectAll_clicked()));
33
    connect(ui->btnSelectNone, SIGNAL(clicked()), SLOT(btnSelectNone_clicked()));
34

                
35
    ui->treeWidget->header()->setResizeMode(QHeaderView::ResizeToContents);
36

                
37
    progressbarDelegate = new ProgressBarDelegate(this);
38
    ui->treeWidget->setItemDelegateForColumn(FIELD_PERCENTAGE_COMPLETE, progressbarDelegate);
39

                
40
    ui->treeWidget->setColumnHidden(FIELD_FILE_ID, true);
41
    ui->treeWidget->setColumnHidden(FIELD_COLLECTION_NAME_SHORT, true);
42

                
43
    connect(&watcher_search, SIGNAL(finished()), SLOT(performSearch_finished()));
44
    connect(&watcher_import, SIGNAL(finished()), SLOT(performImport_finished()));
45
}
46

                
47
WidgetNZBCreator::~WidgetNZBCreator()
48
{
49
    delete ui;
50
}
51

                
52
void WidgetNZBCreator::changeEvent(QEvent *e)
53
{
54
    QWidget::changeEvent(e);
55
    switch (e->type()) {
56
    case QEvent::LanguageChange:
57
        ui->retranslateUi(this);
58
        break;
59
    default:
60
        break;
61
    }
62
}
63

                
64
void WidgetNZBCreator::btnSearch_clicked()
65
{
66
    QNZBCreator::SearchOpts opts;
67
    QNZBCreator::SearchResult result;
68
    QString errmsg;
69

                
70
    opts.query = ui->entryQuery->text();
71
    opts.username = "guest";
72
    opts.password = "guest";
73
    opts.search_only_in = QNZBCreator::SEARCH_ONLY_IN_FILENAMES;
74
    opts.max_age = 14;
75
    opts.minimal_file_size = 0;
76
    opts.maximal_file_size = 0;
77
    opts.percentage_complete = 0;
78
    opts.group_to_search = 0;
79
    opts.file_type = QNZBCreator::FILE_TYPE_UNKNOWN;
80

                
81
    ui->treeWidget->clear();
82
    ui->btnSearch->setEnabled(false);
83
    ui->btnSelectAll->setEnabled(false);
84
    ui->btnSelectNone->setEnabled(false);
85
    ui->btnImport->setEnabled(false);
86

                
87
    future_search = QtConcurrent::run(this, &WidgetNZBCreator::performSearch, opts);
88
    watcher_search.setFuture(future_search);
89
}
90

                
91
WidgetNZBCreator::SearchResult WidgetNZBCreator::performSearch(QNZBCreator::SearchOpts opts)
92
{
93
    WidgetNZBCreator::SearchResult ret;
94
    ret.ret = nzbcreator.performSearch(opts, ret.errmsg, ret.result);
95
    return ret;
96
}
97

                
98
void WidgetNZBCreator::performSearch_finished()
99
{
100
    WidgetNZBCreator::SearchResult result = future_search.result();
101

                
102
    ui->btnSelectAll->setEnabled(true);
103
    ui->btnSelectNone->setEnabled(true);
104

                
105
    if (!result.ret) {
106
        qWarning((tr("Performing Online Search failed: ") + result.errmsg).toUtf8());
107
        return;
108
    }
109

                
110
    if (result.result.number_of_results == 0) {
111
        qWarning((tr("Search query returned no results")).toUtf8());
112
        return;
113
    }
114

                
115
    ui->btnImport->setEnabled(true);
116

                
117
    Q_FOREACH(QNZBCreator::Collection collection, result.result.collections) {
118
        QTreeWidgetItem *collection_item = new QTreeWidgetItem();
119

                
120
        collection_item->setCheckState(FIELD_IMPORT, Qt::Unchecked);
121
        collection_item->setText(FIELD_SUBJECT, collection.collection_name);
122
        collection_item->setText(FIELD_COLLECTION_NAME_SHORT, collection.short_collection_name);
123
        collection_item->setText(FIELD_NEWSGROUP, collection.newsgroup);
124
        collection_item->setText(FIELD_FILE_SIZE, QNNTPGrabGlue::utilsCalculateFileSize(collection.total_file_size));
125
        collection_item->setText(FIELD_STAMP, collection.stamp.toString());
126

                
127
        int percentage_total = 0;
128
        QString poster = "";
129
        bool unique_poster = true;
130

                
131
        /* Don't show an expander for collections with only one file */
132
        if (collection.files.count() == 1) {
133
            collection_item->setText(FIELD_FILE_ID, QString("%1").arg(collection.files.at(0).file_id));
134
            percentage_total = collection.files.at(0).complete_percentage;
135
        } else {
136
            Q_FOREACH(QNZBCreator::File file, collection.files) {
137
                QTreeWidgetItem *file_item = new QTreeWidgetItem(collection_item);
138

                
139
                file_item->setCheckState(FIELD_IMPORT, Qt::Unchecked);
140
                file_item->setText(FIELD_PERCENTAGE_COMPLETE, QString("%1").arg(file.complete_percentage));
141
                file_item->setText(FIELD_SUBJECT, file.subject);
142
                file_item->setText(FIELD_POSTER, file.poster);
143
                file_item->setText(FIELD_NEWSGROUP, collection.newsgroup);
144
                file_item->setText(FIELD_FILE_SIZE, QNNTPGrabGlue::utilsCalculateFileSize(file.file_size));
145
                file_item->setText(FIELD_STAMP, file.stamp.toString());
146
                file_item->setText(FIELD_FILE_ID, QString("%1").arg(file.file_id));
147
                percentage_total += file.complete_percentage;
148

                
149
                if (poster.isEmpty()) {
150
                    poster = file.poster;
151
                } else if (poster != file.poster) {
152
                    unique_poster = false;
153
                }
154
            }
155
        }
156

                
157
        int percentage_avg = percentage_total;
158
        percentage_avg /= collection.files.count();
159
        collection_item->setText(FIELD_PERCENTAGE_COMPLETE, QString("%1").arg(percentage_avg));
160

                
161
        if (unique_poster) {
162
            collection_item->setText(FIELD_POSTER, collection.files.at(0).poster);
163
        }
164

                
165
        ui->treeWidget->addTopLevelItem(collection_item);
166
    }
167
}
168

                
169
void WidgetNZBCreator::btnImport_clicked()
170
{
171
    bool multiple_collections = FALSE;
172
    QList<int> file_ids;
173

                
174
    collection_name = "";
175

                
176
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
177
        QTreeWidgetItem *collection_item = ui->treeWidget->topLevelItem(i);
178

                
179
        /* Does this collection have any children? */
180
        if (collection_item->childCount() == 0) {
181
            if (collection_item->checkState(FIELD_IMPORT) == Qt::Checked) {
182
                file_ids.append(collection_item->text(FIELD_FILE_ID).toInt());
183

                
184
                if (collection_name.isEmpty()) {
185
                    collection_name = collection_item->text(FIELD_COLLECTION_NAME_SHORT);
186
                } else if (collection_name != collection_item->text(FIELD_COLLECTION_NAME_SHORT)) {
187
                    multiple_collections = TRUE;
188
                }
189
            }
190
            continue;
191
        }
192

                
193
        for (int j = 0; j < collection_item->childCount(); j++) {
194
            QTreeWidgetItem *file_item = collection_item->child(j);
195

                
196
            if (file_item->checkState(FIELD_IMPORT) == Qt::Checked) {
197
                file_ids.append(file_item->text(FIELD_FILE_ID).toInt());
198

                
199
                if (collection_name.isEmpty()) {
200
                    collection_name = collection_item->text(FIELD_COLLECTION_NAME_SHORT);
201
                } else if (collection_name != collection_item->text(FIELD_COLLECTION_NAME_SHORT)) {
202
                    multiple_collections = TRUE;
203
                }
204
            }
205
        }
206
    }
207

                
208
    if (collection_name.isEmpty()) {
209
        qWarning(tr("Please select one or more files which you want to import").toUtf8());
210
        return;
211
    }
212

                
213
    if (multiple_collections) {
214
        collection_name = ui->entryQuery->text();
215
    }
216

                
217
    ui->btnImport->setEnabled(false);
218
    ui->treeWidget->setEnabled(false);
219

                
220
    future_import = QtConcurrent::run(this, &WidgetNZBCreator::performImport, file_ids);
221
    watcher_import.setFuture(future_import);
222
}
223

                
224
WidgetNZBCreator::ImportResult WidgetNZBCreator::performImport(QList<int> file_ids)
225
{
226
    WidgetNZBCreator::ImportResult res;
227
    res.nzb_data = nzbcreator.generateNZB(file_ids, res.errmsg);
228
    return res;
229
}
230

                
231
void WidgetNZBCreator::performImport_finished()
232
{
233
    WidgetNZBCreator::ImportResult res = future_import.result();
234

                
235
    if (res.nzb_data.isEmpty()) {
236
        qWarning((tr("Unable to import files: ") + res.errmsg).toUtf8());
237
        return;
238
    }
239

                
240
    DialogImportNZB d(glue);
241
    d.quickImport(collection_name, res.nzb_data, true);
242

                
243
    ui->btnImport->setEnabled(true);
244
    ui->treeWidget->setEnabled(true);
245
}
246

                
247
void WidgetNZBCreator::btnSelectAll_clicked()
248
{
249
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
250
        ui->treeWidget->topLevelItem(i)->setCheckState(FIELD_IMPORT, Qt::Checked);
251
    }
252
}
253

                
254
void WidgetNZBCreator::btnSelectNone_clicked()
255
{
256
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
257
        ui->treeWidget->topLevelItem(i)->setCheckState(FIELD_IMPORT, Qt::Unchecked);
258
    }
259
}
260

                
261
void WidgetNZBCreator::entryQuery_textChanged(QString text)
262
{
263
    if (text.isEmpty()) {
264
        ui->btnSearch->setEnabled(false);
265
    } else {
266
        ui->btnSearch->setEnabled(true);
267
    }
268
}
269

                
270
void WidgetNZBCreator::treeWidget_itemChanged(QTreeWidgetItem *item, int column)
271
{
272
    /* Automatically check files when the collection item is checked */
273
    if (column != FIELD_IMPORT || item->childCount() == 0) {
274
        return;
275
    }
276

                
277
    if (item->checkState(column) == Qt::Checked) {
278
        for (int i = 0; i < item->childCount(); i++) {
279
            item->child(i)->setCheckState(FIELD_IMPORT, Qt::Checked);
280
        }
281
    } else {
282
        for (int i = 0; i < item->childCount(); i++) {
283
            item->child(i)->setCheckState(FIELD_IMPORT, Qt::Unchecked);
284
        }
285
    }
286
}