diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index 639d4e21a..d6b81bb50 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -262,44 +262,54 @@ void PeerListWidget::updatePeerCountryResolutionState() void PeerListWidget::showPeerListMenu(const QPoint &) { - BitTorrent::Torrent *const torrent = m_properties->getCurrentTorrent(); + BitTorrent::Torrent *torrent = m_properties->getCurrentTorrent(); if (!torrent) return; - QMenu *menu = new QMenu(this); + auto *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); + menu->setToolTipsVisible(true); - // Add Peer Action - // Do not allow user to add peers in a private torrent - if (!torrent->isQueued() && !torrent->isChecking() && !torrent->isPrivate()) + QAction *addNewPeer = menu->addAction(UIThemeManager::instance()->getIcon("user-group-new"), tr("Add peers...") + , this, [this, torrent]() { - menu->addAction(UIThemeManager::instance()->getIcon("user-group-new"), tr("Add a new peer...") - , this, [this, torrent]() + const QVector peersList = PeersAdditionDialog::askForPeers(this); + const int peerCount = std::count_if(peersList.cbegin(), peersList.cend(), [torrent](const BitTorrent::PeerAddress &peer) { - const QVector peersList = PeersAdditionDialog::askForPeers(this); - const int peerCount = std::count_if(peersList.cbegin(), peersList.cend(), [torrent](const BitTorrent::PeerAddress &peer) - { - return torrent->connectPeer(peer); - }); - if (peerCount < peersList.length()) - QMessageBox::information(this, tr("Adding peers"), tr("Some peers cannot be added. Check the Log for details.")); - else if (peerCount > 0) - QMessageBox::information(this, tr("Adding peers"), tr("Peers are added to this torrent.")); + return torrent->connectPeer(peer); }); - } + if (peerCount < peersList.length()) + QMessageBox::information(this, tr("Adding peers"), tr("Some peers cannot be added. Check the Log for details.")); + else if (peerCount > 0) + QMessageBox::information(this, tr("Adding peers"), tr("Peers are added to this torrent.")); + }); + QAction *copyPeers = menu->addAction(UIThemeManager::instance()->getIcon("edit-copy"), tr("Copy IP:port") + , this, &PeerListWidget::copySelectedPeers); + menu->addSeparator(); + QAction *banPeers = menu->addAction(UIThemeManager::instance()->getIcon("user-group-delete"), tr("Ban peer permanently") + , this, &PeerListWidget::banSelectedPeers); + + // disable actions + const auto disableAction = [](QAction *action, const QString &tooltip) + { + action->setEnabled(false); + action->setToolTip(tooltip); + }; + + if (torrent->isPrivate()) + disableAction(addNewPeer, tr("Cannot add peers to a private torrent")); + else if (torrent->isChecking()) + disableAction(addNewPeer, tr("Cannot add peers when the torrent is checking")); + else if (torrent->isQueued()) + disableAction(addNewPeer, tr("Cannot add peers when the torrent is queued")); - if (!selectionModel()->selectedRows().isEmpty()) + if (selectionModel()->selectedRows().isEmpty()) { - menu->addAction(UIThemeManager::instance()->getIcon("edit-copy"), tr("Copy IP:port") - , this, &PeerListWidget::copySelectedPeers); - menu->addSeparator(); - menu->addAction(UIThemeManager::instance()->getIcon("user-group-delete"), tr("Ban peer permanently") - , this, &PeerListWidget::banSelectedPeers); + const QString tooltip = tr("No peer was selected"); + disableAction(copyPeers, tooltip); + disableAction(banPeers, tooltip); } - if (menu->isEmpty()) - delete menu; - else - menu->popup(QCursor::pos()); + menu->popup(QCursor::pos()); } void PeerListWidget::banSelectedPeers() diff --git a/src/webui/www/private/index.html b/src/webui/www/private/index.html index d465bd71e..0726ce732 100644 --- a/src/webui/www/private/index.html +++ b/src/webui/www/private/index.html @@ -203,7 +203,7 @@
  • QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget] QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]