Browse Source

Disable "add peers" menu items instead of hiding it

Menu item in disabled state can show tool tip to help user understand
why it is unavailable.
Related issue: #15785.
PR #15787.
adaptive-webui-19844
Chocobo1 3 years ago committed by GitHub
parent
commit
6ccc92020c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 64
      src/gui/properties/peerlistwidget.cpp
  2. 2
      src/webui/www/private/index.html

64
src/gui/properties/peerlistwidget.cpp

@ -262,44 +262,54 @@ void PeerListWidget::updatePeerCountryResolutionState()
void PeerListWidget::showPeerListMenu(const QPoint &) void PeerListWidget::showPeerListMenu(const QPoint &)
{ {
BitTorrent::Torrent *const torrent = m_properties->getCurrentTorrent(); BitTorrent::Torrent *torrent = m_properties->getCurrentTorrent();
if (!torrent) return; if (!torrent) return;
QMenu *menu = new QMenu(this); auto *menu = new QMenu(this);
menu->setAttribute(Qt::WA_DeleteOnClose); menu->setAttribute(Qt::WA_DeleteOnClose);
menu->setToolTipsVisible(true);
// Add Peer Action QAction *addNewPeer = menu->addAction(UIThemeManager::instance()->getIcon("user-group-new"), tr("Add peers...")
// Do not allow user to add peers in a private torrent , this, [this, torrent]()
if (!torrent->isQueued() && !torrent->isChecking() && !torrent->isPrivate())
{ {
menu->addAction(UIThemeManager::instance()->getIcon("user-group-new"), tr("Add a new peer...") const QVector<BitTorrent::PeerAddress> peersList = PeersAdditionDialog::askForPeers(this);
, this, [this, torrent]() const int peerCount = std::count_if(peersList.cbegin(), peersList.cend(), [torrent](const BitTorrent::PeerAddress &peer)
{ {
const QVector<BitTorrent::PeerAddress> peersList = PeersAdditionDialog::askForPeers(this); return torrent->connectPeer(peer);
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."));
}); });
} 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") const QString tooltip = tr("No peer was selected");
, this, &PeerListWidget::copySelectedPeers); disableAction(copyPeers, tooltip);
menu->addSeparator(); disableAction(banPeers, tooltip);
menu->addAction(UIThemeManager::instance()->getIcon("user-group-delete"), tr("Ban peer permanently")
, this, &PeerListWidget::banSelectedPeers);
} }
if (menu->isEmpty()) menu->popup(QCursor::pos());
delete menu;
else
menu->popup(QCursor::pos());
} }
void PeerListWidget::banSelectedPeers() void PeerListWidget::banSelectedPeers()

2
src/webui/www/private/index.html

@ -203,7 +203,7 @@
<li><a href="#CopyTrackerUrl" id="CopyTrackerUrl"><img src="icons/edit-copy.svg" alt="QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]" /> QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]</a></li> <li><a href="#CopyTrackerUrl" id="CopyTrackerUrl"><img src="icons/edit-copy.svg" alt="QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]" /> QBT_TR(Copy tracker URL)QBT_TR[CONTEXT=TrackerListWidget]</a></li>
</ul> </ul>
<ul id="torrentPeersMenu" class="contextMenu"> <ul id="torrentPeersMenu" class="contextMenu">
<li><a href="#addPeer"><img src="icons/list-add.svg" alt="QBT_TR(Add a new peer...)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Add a new peer...)QBT_TR[CONTEXT=PeerListWidget]</a></li> <li><a href="#addPeer"><img src="icons/list-add.svg" alt="QBT_TR(Add peers...)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Add peers...)QBT_TR[CONTEXT=PeerListWidget]</a></li>
<li><a href="#copyPeer" id="CopyPeerInfo"><img src="icons/edit-copy.svg" alt="QBT_TR(Copy IP:port)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Copy IP:port)QBT_TR[CONTEXT=PeerListWidget]</a></li> <li><a href="#copyPeer" id="CopyPeerInfo"><img src="icons/edit-copy.svg" alt="QBT_TR(Copy IP:port)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Copy IP:port)QBT_TR[CONTEXT=PeerListWidget]</a></li>
<li class="separator"><a href="#banPeer"><img src="icons/user-group-delete.svg" alt="QBT_TR(Ban peer permanently)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Ban peer permanently)QBT_TR[CONTEXT=PeerListWidget]</a></li> <li class="separator"><a href="#banPeer"><img src="icons/user-group-delete.svg" alt="QBT_TR(Ban peer permanently)QBT_TR[CONTEXT=PeerListWidget]" /> QBT_TR(Ban peer permanently)QBT_TR[CONTEXT=PeerListWidget]</a></li>
</ul> </ul>

Loading…
Cancel
Save