QString DownloadQueue::getCID(const VarMap &map){ if (map.size() < 1) return ""; auto it = map.constBegin(); return (it.value()).toString(); }
void DownloadQueue::slotContextMenu(const QPoint &){ QModelIndexList list = treeView_TARGET->selectionModel()->selectedRows(0); QList<DownloadQueueItem*> items; if (list.isEmpty()) return; getItems(list, items); if (items.isEmpty()) return; DownloadQueueItem *item = reinterpret_cast<DownloadQueueItem*>(items.at(0)); QString target = item->data(COLUMN_DOWNLOADQUEUE_PATH).toString() + item->data(COLUMN_DOWNLOADQUEUE_NAME).toString(); if (target.isEmpty()) return; Q_D(DownloadQueue); Menu::Action act = d->menu->exec(d->sources, target, items.size() > 1); QueueManager *QM = QueueManager::getInstance(); QVariant arg = d->menu->getArg(); VarMap rmap; /** Now re-read selected indexes and remove broken items */ list = treeView_TARGET->selectionModel()->selectedRows(0); getItems(list, items); if (items.isEmpty()) return; switch (act){ case Menu::Alternates: { SearchFrame *sf = ArenaWidgetFactory().create<SearchFrame>(); for (const auto &i : items) sf->searchAlternates(i->data(COLUMN_DOWNLOADQUEUE_TTH).toString()); break; } case Menu::Magnet: { QString magnet = ""; for (const auto &i : items) magnet += WulforUtil::getInstance()->makeMagnet( i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(), i->data(COLUMN_DOWNLOADQUEUE_ESIZE).toLongLong(), i->data(COLUMN_DOWNLOADQUEUE_TTH).toString()) + "\n"; if (!magnet.isEmpty()) qApp->clipboard()->setText(magnet, QClipboard::Clipboard); break; } case Menu::MagnetWeb: { QString magnet = ""; for (const auto &i : items){ magnet += "[magnet=\"" + WulforUtil::getInstance()->makeMagnet( i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(), i->data(COLUMN_DOWNLOADQUEUE_ESIZE).toLongLong(), i->data(COLUMN_DOWNLOADQUEUE_TTH).toString()) + "\"]"+i->data(COLUMN_DOWNLOADQUEUE_NAME).toString()+"[/magnet]\n"; } if (!magnet.isEmpty()) qApp->clipboard()->setText(magnet, QClipboard::Clipboard); break; } case Menu::MagnetInfo: { QString magnet = ""; for (const auto &i : items){ magnet = WulforUtil::getInstance()->makeMagnet( i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(), i->data(COLUMN_DOWNLOADQUEUE_ESIZE).toLongLong(), i->data(COLUMN_DOWNLOADQUEUE_TTH).toString()) + "\n"; if (!magnet.isEmpty()){ Magnet m(this); m.setLink(magnet); m.exec(); } } break; } case Menu::RenameMove: { for (const auto &i : items){ QString target = i->data(COLUMN_DOWNLOADQUEUE_PATH).toString() + i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(); QString new_target = QFileDialog::getSaveFileName(this, tr("Choose filename"), target, tr("All files (*.*)")); if (!new_target.isEmpty() && new_target != target){ new_target = QDir::toNativeSeparators(new_target); try { QM->move(target.toStdString(), new_target.toStdString()); } catch (const Exception &){} } } break; } case Menu::SetPriority: { for (const auto &i : items){ QString target = i->data(COLUMN_DOWNLOADQUEUE_PATH).toString() + i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(); try { QM->setPriority(target.toStdString(), static_cast<QueueItem::Priority>(arg.toInt())); } catch (const Exception&) {} } break; } case Menu::Browse: { rmap = arg.toMap(); QString cid = getCID(rmap); if (d->sources.contains(target) && !cid.isEmpty()){ UserPtr user = ClientManager::getInstance()->findUser(CID(cid.toStdString())); if (user){ try { QM->addList(HintedUser(user, ""), QueueItem::FLAG_CLIENT_VIEW, ""); } catch (const Exception&){} } } break; } case Menu::SendPM: { rmap = arg.toMap(); auto it = rmap.constBegin(); dcpp::CID cid(_tq(getCID(rmap))); QString nick = ((++it).key()); QList<QObject*> list = HubManager::getInstance()->getHubs(); for (const auto &obj : list){ HubFrame *fr = qobject_cast<HubFrame*>(obj); if (!fr) continue; if (fr->hasCID(cid, nick)){ fr->createPMWindow(cid); break; } } break; } case Menu::RemoveSource: { rmap = arg.toMap(); QString cid = getCID(rmap); if (d->sources.contains(target) && !cid.isEmpty()){ UserPtr user = ClientManager::getInstance()->findUser(CID(cid.toStdString())); if (user){ try { QM->removeSource(target.toStdString(), user, QueueItem::Source::FLAG_REMOVED); } catch (const Exception&){} } } break; } case Menu::RemoveUser: { rmap = arg.toMap(); QString cid = getCID(rmap); if (d->sources.contains(target) && !cid.isEmpty()){ UserPtr user = ClientManager::getInstance()->findUser(CID(cid.toStdString())); if (user){ try { QM->removeSource(user, QueueItem::Source::FLAG_REMOVED); } catch (const Exception&){} } } break; } case Menu::Remove: { for (const auto &i : items){ QString target = i->data(COLUMN_DOWNLOADQUEUE_PATH).toString() + i->data(COLUMN_DOWNLOADQUEUE_NAME).toString(); try { QM->remove(target.toStdString()); } catch (const Exception &){} } break; } default: break; } }