Multiple Selection for peer and ban tables
Allows multiple selection and action for the nodes in the peer and ban tables in the Debug Window.
This commit is contained in:
parent
4e5782438c
commit
addfdebe1a
3 changed files with 53 additions and 44 deletions
|
@ -291,17 +291,11 @@ void copyEntryData(QAbstractItemView *view, int column, int role)
|
|||
}
|
||||
}
|
||||
|
||||
QVariant getEntryData(QAbstractItemView *view, int column, int role)
|
||||
QList<QModelIndex> getEntryData(QAbstractItemView *view, int column)
|
||||
{
|
||||
if(!view || !view->selectionModel())
|
||||
return QVariant();
|
||||
QModelIndexList selection = view->selectionModel()->selectedRows(column);
|
||||
|
||||
if(!selection.isEmpty()) {
|
||||
// Return first item
|
||||
return (selection.at(0).data(role));
|
||||
}
|
||||
return QVariant();
|
||||
return QList<QModelIndex>();
|
||||
return view->selectionModel()->selectedRows(column);
|
||||
}
|
||||
|
||||
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,
|
||||
|
|
|
@ -67,10 +67,9 @@ namespace GUIUtil
|
|||
/** Return a field of the currently selected entry as a QString. Does nothing if nothing
|
||||
is selected.
|
||||
@param[in] column Data column to extract from the model
|
||||
@param[in] role Data role to extract from the model
|
||||
@see TransactionView::copyLabel, TransactionView::copyAmount, TransactionView::copyAddress
|
||||
*/
|
||||
QVariant getEntryData(QAbstractItemView *view, int column, int role);
|
||||
QList<QModelIndex> getEntryData(QAbstractItemView *view, int column);
|
||||
|
||||
void setClipboard(const QString& str);
|
||||
|
||||
|
|
|
@ -469,7 +469,7 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|||
ui->peerWidget->verticalHeader()->hide();
|
||||
ui->peerWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
ui->peerWidget->setSelectionMode(QAbstractItemView::SingleSelection);
|
||||
ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH);
|
||||
ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH);
|
||||
|
@ -477,11 +477,11 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|||
ui->peerWidget->horizontalHeader()->setStretchLastSection(true);
|
||||
|
||||
// create peer table context menu actions
|
||||
QAction* disconnectAction = new QAction(tr("&Disconnect Node"), this);
|
||||
QAction* banAction1h = new QAction(tr("Ban Node for") + " " + tr("1 &hour"), this);
|
||||
QAction* banAction24h = new QAction(tr("Ban Node for") + " " + tr("1 &day"), this);
|
||||
QAction* banAction7d = new QAction(tr("Ban Node for") + " " + tr("1 &week"), this);
|
||||
QAction* banAction365d = new QAction(tr("Ban Node for") + " " + tr("1 &year"), this);
|
||||
QAction* disconnectAction = new QAction(tr("&Disconnect"), this);
|
||||
QAction* banAction1h = new QAction(tr("Ban for") + " " + tr("1 &hour"), this);
|
||||
QAction* banAction24h = new QAction(tr("Ban for") + " " + tr("1 &day"), this);
|
||||
QAction* banAction7d = new QAction(tr("Ban for") + " " + tr("1 &week"), this);
|
||||
QAction* banAction365d = new QAction(tr("Ban for") + " " + tr("1 &year"), this);
|
||||
|
||||
// create peer table context menu
|
||||
peersTableContextMenu = new QMenu();
|
||||
|
@ -527,7 +527,7 @@ void RPCConsole::setClientModel(ClientModel *model)
|
|||
ui->banlistWidget->horizontalHeader()->setStretchLastSection(true);
|
||||
|
||||
// create ban table context menu action
|
||||
QAction* unbanAction = new QAction(tr("&Unban Node"), this);
|
||||
QAction* unbanAction = new QAction(tr("&Unban"), this);
|
||||
|
||||
// create ban table context menu
|
||||
banTableContextMenu = new QMenu();
|
||||
|
@ -973,33 +973,44 @@ void RPCConsole::disconnectSelectedNode()
|
|||
{
|
||||
if(!g_connman)
|
||||
return;
|
||||
// Get currently selected peer address
|
||||
NodeId id = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::NetNodeId).toInt();
|
||||
// Find the node, disconnect it and clear the selected node
|
||||
if(g_connman->DisconnectNode(id))
|
||||
clearSelectedNode();
|
||||
|
||||
// Get selected peer addresses
|
||||
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->peerWidget, 0);
|
||||
for(int i = 0; i < nodes.count(); i++)
|
||||
{
|
||||
// Get currently selected peer address
|
||||
NodeId id = nodes.at(i).data(PeerTableModel::NetNodeId).toInt();
|
||||
// Find the node, disconnect it and clear the selected node
|
||||
if(g_connman->DisconnectNode(id))
|
||||
clearSelectedNode();
|
||||
}
|
||||
}
|
||||
|
||||
void RPCConsole::banSelectedNode(int bantime)
|
||||
{
|
||||
if (!clientModel || !g_connman)
|
||||
return;
|
||||
|
||||
// Get selected peer addresses
|
||||
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->peerWidget, 0);
|
||||
for(int i = 0; i < nodes.count(); i++)
|
||||
{
|
||||
// Get currently selected peer address
|
||||
NodeId id = nodes.at(i).data(PeerTableModel::NetNodeId).toInt();
|
||||
|
||||
if(cachedNodeid == -1)
|
||||
return;
|
||||
// Get currently selected peer address
|
||||
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id);
|
||||
if(detailNodeRow < 0)
|
||||
return;
|
||||
|
||||
// Get currently selected peer address
|
||||
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeid);
|
||||
if(detailNodeRow < 0)
|
||||
return;
|
||||
|
||||
// Find possible nodes, ban it and clear the selected node
|
||||
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
|
||||
if(stats) {
|
||||
g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
|
||||
clearSelectedNode();
|
||||
clientModel->getBanTableModel()->refresh();
|
||||
// Find possible nodes, ban it and clear the selected node
|
||||
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
|
||||
if(stats) {
|
||||
g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
|
||||
}
|
||||
}
|
||||
clearSelectedNode();
|
||||
clientModel->getBanTableModel()->refresh();
|
||||
}
|
||||
|
||||
void RPCConsole::unbanSelectedNode()
|
||||
|
@ -1007,15 +1018,20 @@ void RPCConsole::unbanSelectedNode()
|
|||
if (!clientModel)
|
||||
return;
|
||||
|
||||
// Get currently selected ban address
|
||||
QString strNode = GUIUtil::getEntryData(ui->banlistWidget, 0, BanTableModel::Address).toString();
|
||||
CSubNet possibleSubnet;
|
||||
|
||||
LookupSubNet(strNode.toStdString().c_str(), possibleSubnet);
|
||||
if (possibleSubnet.IsValid() && g_connman)
|
||||
// Get selected ban addresses
|
||||
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->banlistWidget, 0);
|
||||
for(int i = 0; i < nodes.count(); i++)
|
||||
{
|
||||
g_connman->Unban(possibleSubnet);
|
||||
clientModel->getBanTableModel()->refresh();
|
||||
// Get currently selected ban address
|
||||
QString strNode = nodes.at(i).data(BanTableModel::Address).toString();
|
||||
CSubNet possibleSubnet;
|
||||
|
||||
LookupSubNet(strNode.toStdString().c_str(), possibleSubnet);
|
||||
if (possibleSubnet.IsValid() && g_connman)
|
||||
{
|
||||
g_connman->Unban(possibleSubnet);
|
||||
clientModel->getBanTableModel()->refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue