Skip to content

Commit 616eace

Browse files
committed
Merge #161: Add PeerTableModel::StatsRole to prevent data layer violation
b3e9bca qt, refactor: Drop no longer used PeerTableModel::getNodeStats function (Hennadii Stepanov) 49c6040 qt: Use PeerTableModel::StatsRole (Hennadii Stepanov) 35007ed qt: Add PeerTableModel::StatsRole (Hennadii Stepanov) Pull request description: This PR allows to access to the `CNodeCombinedStats` instance directly from any view object. The `PeerTableModel::getNodeStats` member function removed as a kind of layer violation. No behavior changes. Also other pulls (bugfixes) are based on this one: #18 and #164. ACKs for top commit: jonatack: Tested re-ACK b3e9bca per `git range-diff ae8f797 4c05fe0 b3e9bca` promag: Code review ACK b3e9bca. jonasschnelli: utACK b3e9bca Tree-SHA512: 6ba50d5dd2c0373655d491ce8b130c47d598da2db5ff4b00633f447404c7e70f8562ead53ddf166e851384d9632ff9146a770c99845c2cdd3ff7250677e4c130
2 parents 9c0b76c + b3e9bca commit 616eace

File tree

3 files changed

+17
-27
lines changed

3 files changed

+17
-27
lines changed

src/qt/peertablemodel.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ QVariant PeerTableModel::data(const QModelIndex &index, int role) const
185185
default:
186186
return QVariant();
187187
}
188+
} else if (role == StatsRole) {
189+
switch (index.column()) {
190+
case NetNodeId: return QVariant::fromValue(rec);
191+
default: return QVariant();
192+
}
188193
}
189194

190195
return QVariant();
@@ -220,11 +225,6 @@ QModelIndex PeerTableModel::index(int row, int column, const QModelIndex &parent
220225
return QModelIndex();
221226
}
222227

223-
const CNodeCombinedStats *PeerTableModel::getNodeStats(int idx)
224-
{
225-
return priv->index(idx);
226-
}
227-
228228
void PeerTableModel::refresh()
229229
{
230230
Q_EMIT layoutAboutToBeChanged();

src/qt/peertablemodel.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct CNodeCombinedStats {
2828
CNodeStateStats nodeStateStats;
2929
bool fNodeStateStatsAvailable;
3030
};
31+
Q_DECLARE_METATYPE(CNodeCombinedStats*)
3132

3233
class NodeLessThan
3334
{
@@ -52,7 +53,6 @@ class PeerTableModel : public QAbstractTableModel
5253
public:
5354
explicit PeerTableModel(interfaces::Node& node, QObject* parent);
5455
~PeerTableModel();
55-
const CNodeCombinedStats *getNodeStats(int idx);
5656
int getRowByNodeId(NodeId nodeid);
5757
void startAutoRefresh();
5858
void stopAutoRefresh();
@@ -67,6 +67,10 @@ class PeerTableModel : public QAbstractTableModel
6767
Subversion = 6
6868
};
6969

70+
enum {
71+
StatsRole = Qt::UserRole,
72+
};
73+
7074
/** @name Methods overridden from QAbstractTableModel
7175
@{*/
7276
int rowCount(const QModelIndex &parent) const override;

src/qt/rpcconsole.cpp

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,11 +1022,9 @@ void RPCConsole::updateTrafficStats(quint64 totalBytesIn, quint64 totalBytesOut)
10221022

10231023
void RPCConsole::peerLayoutAboutToChange()
10241024
{
1025-
QModelIndexList selected = ui->peerWidget->selectionModel()->selectedIndexes();
10261025
cachedNodeids.clear();
1027-
for(int i = 0; i < selected.size(); i++)
1028-
{
1029-
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(selected.at(i).row());
1026+
for (const QModelIndex& peer : GUIUtil::getEntryData(ui->peerWidget, PeerTableModel::NetNodeId)) {
1027+
const auto stats = peer.data(PeerTableModel::StatsRole).value<CNodeCombinedStats*>();
10301028
cachedNodeids.append(stats->nodeStats.nodeid);
10311029
}
10321030
}
@@ -1085,15 +1083,13 @@ void RPCConsole::peerLayoutChanged()
10851083

10861084
void RPCConsole::updateDetailWidget()
10871085
{
1088-
QModelIndexList selected_rows;
1089-
auto selection_model = ui->peerWidget->selectionModel();
1090-
if (selection_model) selected_rows = selection_model->selectedRows();
1091-
if (!clientModel || !clientModel->getPeerTableModel() || selected_rows.size() != 1) {
1086+
const QList<QModelIndex> selected_peers = GUIUtil::getEntryData(ui->peerWidget, PeerTableModel::NetNodeId);
1087+
if (!clientModel || !clientModel->getPeerTableModel() || selected_peers.size() != 1) {
10921088
ui->detailWidget->hide();
10931089
ui->peerHeading->setText(tr("Select a peer to view detailed information."));
10941090
return;
10951091
}
1096-
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(selected_rows.first().row());
1092+
const auto stats = selected_peers.first().data(PeerTableModel::StatsRole).value<CNodeCombinedStats*>();
10971093
// update the detail ui with latest node information
10981094
QString peerAddrDetails(QString::fromStdString(stats->nodeStats.addrName) + " ");
10991095
peerAddrDetails += tr("(peer id: %1)").arg(QString::number(stats->nodeStats.nodeid));
@@ -1206,19 +1202,9 @@ void RPCConsole::banSelectedNode(int bantime)
12061202
if (!clientModel)
12071203
return;
12081204

1209-
// Get selected peer addresses
1210-
QList<QModelIndex> nodes = GUIUtil::getEntryData(ui->peerWidget, PeerTableModel::NetNodeId);
1211-
for(int i = 0; i < nodes.count(); i++)
1212-
{
1213-
// Get currently selected peer address
1214-
NodeId id = nodes.at(i).data().toLongLong();
1215-
1216-
// Get currently selected peer address
1217-
int detailNodeRow = clientModel->getPeerTableModel()->getRowByNodeId(id);
1218-
if (detailNodeRow < 0) return;
1219-
1205+
for (const QModelIndex& peer : GUIUtil::getEntryData(ui->peerWidget, PeerTableModel::NetNodeId)) {
12201206
// Find possible nodes, ban it and clear the selected node
1221-
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
1207+
const auto stats = peer.data(PeerTableModel::StatsRole).value<CNodeCombinedStats*>();
12221208
if (stats) {
12231209
m_node.ban(stats->nodeStats.addr, bantime);
12241210
m_node.disconnectByAddress(stats->nodeStats.addr);

0 commit comments

Comments
 (0)