@@ -343,7 +343,6 @@ RPCConsole::RPCConsole(const PlatformStyle *_platformStyle, QWidget *parent) :
343
343
ui(new Ui::RPCConsole),
344
344
clientModel(0 ),
345
345
historyPtr(0 ),
346
- cachedNodeid(-1 ),
347
346
platformStyle(_platformStyle),
348
347
peersTableContextMenu(0 ),
349
348
banTableContextMenu(0 ),
@@ -469,19 +468,19 @@ void RPCConsole::setClientModel(ClientModel *model)
469
468
ui->peerWidget ->verticalHeader ()->hide ();
470
469
ui->peerWidget ->setEditTriggers (QAbstractItemView::NoEditTriggers);
471
470
ui->peerWidget ->setSelectionBehavior (QAbstractItemView::SelectRows);
472
- ui->peerWidget ->setSelectionMode (QAbstractItemView::SingleSelection );
471
+ ui->peerWidget ->setSelectionMode (QAbstractItemView::ExtendedSelection );
473
472
ui->peerWidget ->setContextMenuPolicy (Qt::CustomContextMenu);
474
473
ui->peerWidget ->setColumnWidth (PeerTableModel::Address, ADDRESS_COLUMN_WIDTH);
475
474
ui->peerWidget ->setColumnWidth (PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH);
476
475
ui->peerWidget ->setColumnWidth (PeerTableModel::Ping, PING_COLUMN_WIDTH);
477
476
ui->peerWidget ->horizontalHeader ()->setStretchLastSection (true );
478
477
479
478
// create peer table context menu actions
480
- QAction* disconnectAction = new QAction (tr (" &Disconnect Node " ), this );
481
- QAction* banAction1h = new QAction (tr (" Ban Node for" ) + " " + tr (" 1 &hour" ), this );
482
- QAction* banAction24h = new QAction (tr (" Ban Node for" ) + " " + tr (" 1 &day" ), this );
483
- QAction* banAction7d = new QAction (tr (" Ban Node for" ) + " " + tr (" 1 &week" ), this );
484
- QAction* banAction365d = new QAction (tr (" Ban Node for" ) + " " + tr (" 1 &year" ), this );
479
+ QAction* disconnectAction = new QAction (tr (" &Disconnect" ), this );
480
+ QAction* banAction1h = new QAction (tr (" Ban for" ) + " " + tr (" 1 &hour" ), this );
481
+ QAction* banAction24h = new QAction (tr (" Ban for" ) + " " + tr (" 1 &day" ), this );
482
+ QAction* banAction7d = new QAction (tr (" Ban for" ) + " " + tr (" 1 &week" ), this );
483
+ QAction* banAction365d = new QAction (tr (" Ban for" ) + " " + tr (" 1 &year" ), this );
485
484
486
485
// create peer table context menu
487
486
peersTableContextMenu = new QMenu ();
@@ -514,7 +513,9 @@ void RPCConsole::setClientModel(ClientModel *model)
514
513
this , SLOT (peerSelected (const QItemSelection &, const QItemSelection &)));
515
514
// peer table signal handling - update peer details when new nodes are added to the model
516
515
connect (model->getPeerTableModel (), SIGNAL (layoutChanged ()), this , SLOT (peerLayoutChanged ()));
517
-
516
+ // peer table signal handling - cache selected node ids
517
+ connect (model->getPeerTableModel (), SIGNAL (layoutAboutToChange ()), this , SLOT (peerLayoutAboutToChange ()));
518
+
518
519
// set up ban table
519
520
ui->banlistWidget ->setModel (model->getBanTableModel ());
520
521
ui->banlistWidget ->verticalHeader ()->hide ();
@@ -527,7 +528,7 @@ void RPCConsole::setClientModel(ClientModel *model)
527
528
ui->banlistWidget ->horizontalHeader ()->setStretchLastSection (true );
528
529
529
530
// create ban table context menu action
530
- QAction* unbanAction = new QAction (tr (" &Unban Node " ), this );
531
+ QAction* unbanAction = new QAction (tr (" &Unban" ), this );
531
532
532
533
// create ban table context menu
533
534
banTableContextMenu = new QMenu ();
@@ -825,6 +826,17 @@ void RPCConsole::peerSelected(const QItemSelection &selected, const QItemSelecti
825
826
updateNodeDetail (stats);
826
827
}
827
828
829
+ void RPCConsole::peerLayoutAboutToChange ()
830
+ {
831
+ QModelIndexList selected = ui->peerWidget ->selectionModel ()->selectedIndexes ();
832
+ cachedNodeids.clear ();
833
+ for (int i = 0 ; i < selected.size (); i++)
834
+ {
835
+ const CNodeCombinedStats *stats = clientModel->getPeerTableModel ()->getNodeStats (selected.at (i).row ());
836
+ cachedNodeids.append (stats->nodeStats .nodeid );
837
+ }
838
+ }
839
+
828
840
void RPCConsole::peerLayoutChanged ()
829
841
{
830
842
if (!clientModel || !clientModel->getPeerTableModel ())
@@ -834,7 +846,7 @@ void RPCConsole::peerLayoutChanged()
834
846
bool fUnselect = false ;
835
847
bool fReselect = false ;
836
848
837
- if (cachedNodeid == - 1 ) // no node selected yet
849
+ if (cachedNodeids. empty () ) // no node selected yet
838
850
return ;
839
851
840
852
// find the currently selected row
@@ -846,7 +858,7 @@ void RPCConsole::peerLayoutChanged()
846
858
847
859
// check if our detail node has a row in the table (it may not necessarily
848
860
// be at selectedRow since its position can change after a layout change)
849
- int detailNodeRow = clientModel->getPeerTableModel ()->getRowByNodeId (cachedNodeid );
861
+ int detailNodeRow = clientModel->getPeerTableModel ()->getRowByNodeId (cachedNodeids. first () );
850
862
851
863
if (detailNodeRow < 0 )
852
864
{
@@ -872,7 +884,10 @@ void RPCConsole::peerLayoutChanged()
872
884
873
885
if (fReselect )
874
886
{
875
- ui->peerWidget ->selectRow (detailNodeRow);
887
+ for (int i = 0 ; i < cachedNodeids.size (); i++)
888
+ {
889
+ ui->peerWidget ->selectRow (clientModel->getPeerTableModel ()->getRowByNodeId (cachedNodeids.at (i)));
890
+ }
876
891
}
877
892
878
893
if (stats)
@@ -881,9 +896,6 @@ void RPCConsole::peerLayoutChanged()
881
896
882
897
void RPCConsole::updateNodeDetail (const CNodeCombinedStats *stats)
883
898
{
884
- // Update cached nodeid
885
- cachedNodeid = stats->nodeStats .nodeid ;
886
-
887
899
// update the detail ui with latest node information
888
900
QString peerAddrDetails (QString::fromStdString (stats->nodeStats .addrName ) + " " );
889
901
peerAddrDetails += tr (" (node id: %1)" ).arg (QString::number (stats->nodeStats .nodeid ));
@@ -973,56 +985,72 @@ void RPCConsole::disconnectSelectedNode()
973
985
{
974
986
if (!g_connman)
975
987
return ;
976
- // Get currently selected peer address
977
- NodeId id = GUIUtil::getEntryData (ui->peerWidget , 0 , PeerTableModel::NetNodeId).toInt ();
978
- // Find the node, disconnect it and clear the selected node
979
- if (g_connman->DisconnectNode (id))
980
- clearSelectedNode ();
988
+
989
+ // Get selected peer addresses
990
+ QList<QModelIndex> nodes = GUIUtil::getEntryData (ui->peerWidget , 0 );
991
+ for (int i = 0 ; i < nodes.count (); i++)
992
+ {
993
+ // Get currently selected peer address
994
+ NodeId id = nodes.at (i).data (PeerTableModel::NetNodeId).toInt ();
995
+ // Find the node, disconnect it and clear the selected node
996
+ if (g_connman->DisconnectNode (id))
997
+ clearSelectedNode ();
998
+ }
981
999
}
982
1000
983
1001
void RPCConsole::banSelectedNode (int bantime)
984
1002
{
985
1003
if (!clientModel || !g_connman)
986
1004
return ;
987
-
988
- if (cachedNodeid == -1 )
989
- return ;
990
-
991
- // Get currently selected peer address
992
- int detailNodeRow = clientModel->getPeerTableModel ()->getRowByNodeId (cachedNodeid);
993
- if (detailNodeRow < 0 )
994
- return ;
995
-
996
- // Find possible nodes, ban it and clear the selected node
997
- const CNodeCombinedStats *stats = clientModel->getPeerTableModel ()->getNodeStats (detailNodeRow);
998
- if (stats) {
999
- g_connman->Ban (stats->nodeStats .addr , BanReasonManuallyAdded, bantime);
1000
- clearSelectedNode ();
1001
- clientModel->getBanTableModel ()->refresh ();
1005
+
1006
+ // Get selected peer addresses
1007
+ QList<QModelIndex> nodes = GUIUtil::getEntryData (ui->peerWidget , 0 );
1008
+ for (int i = 0 ; i < nodes.count (); i++)
1009
+ {
1010
+ // Get currently selected peer address
1011
+ NodeId id = nodes.at (i).data (PeerTableModel::NetNodeId).toInt ();
1012
+
1013
+ // Get currently selected peer address
1014
+ int detailNodeRow = clientModel->getPeerTableModel ()->getRowByNodeId (id);
1015
+ if (detailNodeRow < 0 )
1016
+ return ;
1017
+
1018
+ // Find possible nodes, ban it and clear the selected node
1019
+ const CNodeCombinedStats *stats = clientModel->getPeerTableModel ()->getNodeStats (detailNodeRow);
1020
+ if (stats) {
1021
+ g_connman->Ban (stats->nodeStats .addr , BanReasonManuallyAdded, bantime);
1022
+ }
1002
1023
}
1024
+ clearSelectedNode ();
1025
+ clientModel->getBanTableModel ()->refresh ();
1003
1026
}
1004
1027
1005
1028
void RPCConsole::unbanSelectedNode ()
1006
1029
{
1007
1030
if (!clientModel)
1008
1031
return ;
1009
1032
1010
- // Get currently selected ban address
1011
- QString strNode = GUIUtil::getEntryData (ui->banlistWidget , 0 , BanTableModel::Address).toString ();
1012
- CSubNet possibleSubnet;
1013
-
1014
- LookupSubNet (strNode.toStdString ().c_str (), possibleSubnet);
1015
- if (possibleSubnet.IsValid () && g_connman)
1033
+ // Get selected ban addresses
1034
+ QList<QModelIndex> nodes = GUIUtil::getEntryData (ui->banlistWidget , 0 );
1035
+ for (int i = 0 ; i < nodes.count (); i++)
1016
1036
{
1017
- g_connman->Unban (possibleSubnet);
1018
- clientModel->getBanTableModel ()->refresh ();
1037
+ // Get currently selected ban address
1038
+ QString strNode = nodes.at (i).data (BanTableModel::Address).toString ();
1039
+ CSubNet possibleSubnet;
1040
+
1041
+ LookupSubNet (strNode.toStdString ().c_str (), possibleSubnet);
1042
+ if (possibleSubnet.IsValid () && g_connman)
1043
+ {
1044
+ g_connman->Unban (possibleSubnet);
1045
+ clientModel->getBanTableModel ()->refresh ();
1046
+ }
1019
1047
}
1020
1048
}
1021
1049
1022
1050
void RPCConsole::clearSelectedNode ()
1023
1051
{
1024
1052
ui->peerWidget ->selectionModel ()->clearSelection ();
1025
- cachedNodeid = - 1 ;
1053
+ cachedNodeids. clear () ;
1026
1054
ui->detailWidget ->hide ();
1027
1055
ui->peerHeading ->setText (tr (" Select a peer to view detailed information." ));
1028
1056
}
0 commit comments