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 |
} |
NNTPGrab

