Browse Source

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.
0.14
Andrew Chow 8 years ago
parent
commit
addfdebe1a
  1. 12
      src/qt/guiutil.cpp
  2. 3
      src/qt/guiutil.h
  3. 42
      src/qt/rpcconsole.cpp

12
src/qt/guiutil.cpp

@ -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()) if(!view || !view->selectionModel())
return QVariant(); return QList<QModelIndex>();
QModelIndexList selection = view->selectionModel()->selectedRows(column); return view->selectionModel()->selectedRows(column);
if(!selection.isEmpty()) {
// Return first item
return (selection.at(0).data(role));
}
return QVariant();
} }
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,

3
src/qt/guiutil.h

@ -67,10 +67,9 @@ namespace GUIUtil
/** Return a field of the currently selected entry as a QString. Does nothing if nothing /** Return a field of the currently selected entry as a QString. Does nothing if nothing
is selected. is selected.
@param[in] column Data column to extract from the model @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 @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); void setClipboard(const QString& str);

42
src/qt/rpcconsole.cpp

@ -469,7 +469,7 @@ void RPCConsole::setClientModel(ClientModel *model)
ui->peerWidget->verticalHeader()->hide(); ui->peerWidget->verticalHeader()->hide();
ui->peerWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->peerWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->peerWidget->setSelectionMode(QAbstractItemView::SingleSelection); ui->peerWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu); ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);
ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH); ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH);
ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH); ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH);
@ -477,11 +477,11 @@ void RPCConsole::setClientModel(ClientModel *model)
ui->peerWidget->horizontalHeader()->setStretchLastSection(true); ui->peerWidget->horizontalHeader()->setStretchLastSection(true);
// create peer table context menu actions // create peer table context menu actions
QAction* disconnectAction = new QAction(tr("&Disconnect Node"), this); QAction* disconnectAction = new QAction(tr("&Disconnect"), this);
QAction* banAction1h = new QAction(tr("Ban Node for") + " " + tr("1 &hour"), this); QAction* banAction1h = new QAction(tr("Ban for") + " " + tr("1 &hour"), this);
QAction* banAction24h = new QAction(tr("Ban Node for") + " " + tr("1 &day"), this); QAction* banAction24h = new QAction(tr("Ban for") + " " + tr("1 &day"), this);
QAction* banAction7d = new QAction(tr("Ban Node for") + " " + tr("1 &week"), this); QAction* banAction7d = new QAction(tr("Ban for") + " " + tr("1 &week"), this);
QAction* banAction365d = new QAction(tr("Ban Node for") + " " + tr("1 &year"), this); QAction* banAction365d = new QAction(tr("Ban for") + " " + tr("1 &year"), this);
// create peer table context menu // create peer table context menu
peersTableContextMenu = new QMenu(); peersTableContextMenu = new QMenu();
@ -527,7 +527,7 @@ void RPCConsole::setClientModel(ClientModel *model)
ui->banlistWidget->horizontalHeader()->setStretchLastSection(true); ui->banlistWidget->horizontalHeader()->setStretchLastSection(true);
// create ban table context menu action // 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 // create ban table context menu
banTableContextMenu = new QMenu(); banTableContextMenu = new QMenu();
@ -973,11 +973,17 @@ void RPCConsole::disconnectSelectedNode()
{ {
if(!g_connman) if(!g_connman)
return; 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 // Get currently selected peer address
NodeId id = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::NetNodeId).toInt(); NodeId id = nodes.at(i).data(PeerTableModel::NetNodeId).toInt();
// Find the node, disconnect it and clear the selected node // Find the node, disconnect it and clear the selected node
if(g_connman->DisconnectNode(id)) if(g_connman->DisconnectNode(id))
clearSelectedNode(); clearSelectedNode();
}
} }
void RPCConsole::banSelectedNode(int bantime) void RPCConsole::banSelectedNode(int bantime)
@ -985,11 +991,15 @@ void RPCConsole::banSelectedNode(int bantime)
if (!clientModel || !g_connman) if (!clientModel || !g_connman)
return; return;
if(cachedNodeid == -1) // Get selected peer addresses
return; 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();
// Get currently selected peer address // Get currently selected peer address
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(cachedNodeid); int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id);
if(detailNodeRow < 0) if(detailNodeRow < 0)
return; return;
@ -997,9 +1007,10 @@ void RPCConsole::banSelectedNode(int bantime)
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
if(stats) { if(stats) {
g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); g_connman->Ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime);
}
}
clearSelectedNode(); clearSelectedNode();
clientModel->getBanTableModel()->refresh(); clientModel->getBanTableModel()->refresh();
}
} }
void RPCConsole::unbanSelectedNode() void RPCConsole::unbanSelectedNode()
@ -1007,8 +1018,12 @@ void RPCConsole::unbanSelectedNode()
if (!clientModel) if (!clientModel)
return; return;
// Get selected ban addresses
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->banlistWidget, 0);
for(int i = 0; i < nodes.count(); i++)
{
// Get currently selected ban address // Get currently selected ban address
QString strNode = GUIUtil::getEntryData(ui->banlistWidget, 0, BanTableModel::Address).toString(); QString strNode = nodes.at(i).data(BanTableModel::Address).toString();
CSubNet possibleSubnet; CSubNet possibleSubnet;
LookupSubNet(strNode.toStdString().c_str(), possibleSubnet); LookupSubNet(strNode.toStdString().c_str(), possibleSubnet);
@ -1017,6 +1032,7 @@ void RPCConsole::unbanSelectedNode()
g_connman->Unban(possibleSubnet); g_connman->Unban(possibleSubnet);
clientModel->getBanTableModel()->refresh(); clientModel->getBanTableModel()->refresh();
} }
}
} }
void RPCConsole::clearSelectedNode() void RPCConsole::clearSelectedNode()

Loading…
Cancel
Save