-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Qt] add banlist table below peers table
- Loading branch information
1 parent
50f0908
commit ad204df
Showing
7 changed files
with
375 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
// Copyright (c) 2011-2015 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include "bantablemodel.h" | ||
|
||
#include "clientmodel.h" | ||
#include "guiconstants.h" | ||
#include "guiutil.h" | ||
|
||
#include "net.h" | ||
#include "sync.h" | ||
#include "utiltime.h" | ||
|
||
#include <QDebug> | ||
#include <QList> | ||
#include <QTimer> | ||
|
||
#include <boost/date_time/posix_time/posix_time.hpp> | ||
#include <boost/date_time/c_local_time_adjustor.hpp> | ||
|
||
// private implementation | ||
class BanTablePriv | ||
{ | ||
public: | ||
/** Local cache of peer information */ | ||
QList<CCombinedBan> cachedBanlist; | ||
/** Column to sort nodes by */ | ||
int sortColumn; | ||
/** Order (ascending or descending) to sort nodes by */ | ||
Qt::SortOrder sortOrder; | ||
|
||
/** Pull a full list of banned nodes from CNode into our cache */ | ||
void refreshBanlist() | ||
{ | ||
std::map<CSubNet, int64_t> banMap; | ||
CNode::GetBanned(banMap); | ||
|
||
cachedBanlist.clear(); | ||
#if QT_VERSION >= 0x040700 | ||
cachedBanlist.reserve(banMap.size()); | ||
#endif | ||
std::map<CSubNet, int64_t>::iterator iter; | ||
for (iter = banMap.begin(); iter != banMap.end(); ++iter) { | ||
CCombinedBan banEntry; | ||
banEntry.subnet = iter->first; | ||
banEntry.bantil = iter->second; | ||
cachedBanlist.append(banEntry); | ||
} | ||
} | ||
|
||
int size() | ||
{ | ||
return cachedBanlist.size(); | ||
} | ||
|
||
CCombinedBan *index(int idx) | ||
{ | ||
if(idx >= 0 && idx < cachedBanlist.size()) { | ||
return &cachedBanlist[idx]; | ||
} else { | ||
return 0; | ||
} | ||
} | ||
}; | ||
|
||
BanTableModel::BanTableModel(ClientModel *parent) : | ||
QAbstractTableModel(parent), | ||
clientModel(parent), | ||
timer(0) | ||
{ | ||
columns << tr("IP/Netmask") << tr("Banned Until"); | ||
priv = new BanTablePriv(); | ||
// default to unsorted | ||
priv->sortColumn = -1; | ||
|
||
// set up timer for auto refresh | ||
timer = new QTimer(); | ||
connect(timer, SIGNAL(timeout()), SLOT(refresh())); | ||
timer->setInterval(MODEL_UPDATE_DELAY); | ||
|
||
// load initial data | ||
refresh(); | ||
} | ||
|
||
void BanTableModel::startAutoRefresh() | ||
{ | ||
timer->start(); | ||
} | ||
|
||
void BanTableModel::stopAutoRefresh() | ||
{ | ||
timer->stop(); | ||
} | ||
|
||
int BanTableModel::rowCount(const QModelIndex &parent) const | ||
{ | ||
Q_UNUSED(parent); | ||
return priv->size(); | ||
} | ||
|
||
int BanTableModel::columnCount(const QModelIndex &parent) const | ||
{ | ||
Q_UNUSED(parent); | ||
return columns.length();; | ||
} | ||
|
||
QVariant BanTableModel::data(const QModelIndex &index, int role) const | ||
{ | ||
if(!index.isValid()) | ||
return QVariant(); | ||
|
||
CCombinedBan *rec = static_cast<CCombinedBan*>(index.internalPointer()); | ||
|
||
if (role == Qt::DisplayRole) { | ||
switch(index.column()) | ||
{ | ||
case Address: | ||
return QString::fromStdString(rec->subnet.ToString()); | ||
case Bantime: | ||
//show time in users local timezone, not 64bit compatible! | ||
//TODO find a way to support 64bit timestamps | ||
boost::posix_time::ptime pt1 = boost::posix_time::from_time_t(rec->bantil); | ||
boost::posix_time::ptime pt2 = boost::date_time::c_local_adjustor<boost::posix_time::ptime>::utc_to_local(pt1); | ||
std::stringstream ss; | ||
ss << pt2; | ||
return QString::fromStdString(ss.str()); | ||
} | ||
} else if (role == Qt::TextAlignmentRole) { | ||
if (index.column() == Bantime) | ||
return (int)(Qt::AlignRight | Qt::AlignVCenter); | ||
} | ||
|
||
return QVariant(); | ||
} | ||
|
||
QVariant BanTableModel::headerData(int section, Qt::Orientation orientation, int role) const | ||
{ | ||
if(orientation == Qt::Horizontal) | ||
{ | ||
if(role == Qt::DisplayRole && section < columns.size()) | ||
{ | ||
return columns[section]; | ||
} | ||
} | ||
return QVariant(); | ||
} | ||
|
||
Qt::ItemFlags BanTableModel::flags(const QModelIndex &index) const | ||
{ | ||
if(!index.isValid()) | ||
return 0; | ||
|
||
Qt::ItemFlags retval = Qt::ItemIsSelectable | Qt::ItemIsEnabled; | ||
return retval; | ||
} | ||
|
||
QModelIndex BanTableModel::index(int row, int column, const QModelIndex &parent) const | ||
{ | ||
Q_UNUSED(parent); | ||
CCombinedBan *data = priv->index(row); | ||
|
||
if (data) | ||
{ | ||
return createIndex(row, column, data); | ||
} | ||
else | ||
{ | ||
return QModelIndex(); | ||
} | ||
} | ||
|
||
void BanTableModel::refresh() | ||
{ | ||
emit layoutAboutToBeChanged(); | ||
priv->refreshBanlist(); | ||
emit layoutChanged(); | ||
} | ||
|
||
void BanTableModel::sort(int column, Qt::SortOrder order) | ||
{ | ||
priv->sortColumn = column; | ||
priv->sortOrder = order; | ||
refresh(); | ||
} | ||
|
||
bool BanTableModel::shouldShow() | ||
{ | ||
if (priv->size() > 0) | ||
return true; | ||
return false; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
// Copyright (c) 2011-2013 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_QT_BANTABLEMODEL_H | ||
#define BITCOIN_QT_BANTABLEMODEL_H | ||
|
||
#include "main.h" | ||
#include "net.h" | ||
|
||
#include <QAbstractTableModel> | ||
#include <QStringList> | ||
|
||
class ClientModel; | ||
class BanTablePriv; | ||
|
||
QT_BEGIN_NAMESPACE | ||
class QTimer; | ||
QT_END_NAMESPACE | ||
|
||
struct CCombinedBan { | ||
CSubNet subnet; | ||
int64_t bantil; | ||
}; | ||
|
||
/** | ||
Qt model providing information about connected peers, similar to the | ||
"getpeerinfo" RPC call. Used by the rpc console UI. | ||
*/ | ||
class BanTableModel : public QAbstractTableModel | ||
{ | ||
Q_OBJECT | ||
|
||
public: | ||
explicit BanTableModel(ClientModel *parent = 0); | ||
void startAutoRefresh(); | ||
void stopAutoRefresh(); | ||
|
||
enum ColumnIndex { | ||
Address = 0, | ||
Bantime = 1, | ||
}; | ||
|
||
/** @name Methods overridden from QAbstractTableModel | ||
@{*/ | ||
int rowCount(const QModelIndex &parent) const; | ||
int columnCount(const QModelIndex &parent) const; | ||
QVariant data(const QModelIndex &index, int role) const; | ||
QVariant headerData(int section, Qt::Orientation orientation, int role) const; | ||
QModelIndex index(int row, int column, const QModelIndex &parent) const; | ||
Qt::ItemFlags flags(const QModelIndex &index) const; | ||
void sort(int column, Qt::SortOrder order); | ||
bool shouldShow(); | ||
/*@}*/ | ||
|
||
public slots: | ||
void refresh(); | ||
|
||
private: | ||
ClientModel *clientModel; | ||
QStringList columns; | ||
BanTablePriv *priv; | ||
QTimer *timer; | ||
}; | ||
|
||
#endif // BITCOIN_QT_BANTABLEMODEL_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.