Overhaul network activity toggle

- Rename RPC command "togglenetwork" to "setnetworkactive (true|false)"
- Add simple test case
- GUI toggle added to connections icon in statusbar
This commit is contained in:
Jonas Schnelli 2014-11-19 13:33:34 +01:00 committed by Luke Dashjr
parent 32efa79e0e
commit b2b33d9017
9 changed files with 75 additions and 14 deletions

View File

@ -34,6 +34,7 @@ Files: src/qt/res/icons/add.png
src/qt/res/icons/info.png src/qt/res/icons/info.png
src/qt/res/icons/key.png src/qt/res/icons/key.png
src/qt/res/icons/lock_*.png src/qt/res/icons/lock_*.png
src/qt/res/icons/network_disabled.png
src/qt/res/icons/open.png src/qt/res/icons/open.png
src/qt/res/icons/overview.png src/qt/res/icons/overview.png
src/qt/res/icons/quit.png src/qt/res/icons/quit.png

View File

@ -264,6 +264,7 @@ RES_ICONS = \
qt/res/icons/key.png \ qt/res/icons/key.png \
qt/res/icons/lock_closed.png \ qt/res/icons/lock_closed.png \
qt/res/icons/lock_open.png \ qt/res/icons/lock_open.png \
qt/res/icons/network_disabled.png \
qt/res/icons/open.png \ qt/res/icons/open.png \
qt/res/icons/overview.png \ qt/res/icons/overview.png \
qt/res/icons/quit.png \ qt/res/icons/quit.png \

View File

@ -52,6 +52,7 @@
<file alias="transaction_abandoned">res/icons/transaction_abandoned.png</file> <file alias="transaction_abandoned">res/icons/transaction_abandoned.png</file>
<file alias="hd_enabled">res/icons/hd_enabled.png</file> <file alias="hd_enabled">res/icons/hd_enabled.png</file>
<file alias="hd_disabled">res/icons/hd_disabled.png</file> <file alias="hd_disabled">res/icons/hd_disabled.png</file>
<file alias="network_disabled">res/icons/network_disabled.png</file>
</qresource> </qresource>
<qresource prefix="/movies"> <qresource prefix="/movies">
<file alias="spinner-000">res/movies/spinner-000.png</file> <file alias="spinner-000">res/movies/spinner-000.png</file>

View File

@ -83,7 +83,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
unitDisplayControl(0), unitDisplayControl(0),
labelWalletEncryptionIcon(0), labelWalletEncryptionIcon(0),
labelWalletHDStatusIcon(0), labelWalletHDStatusIcon(0),
labelConnectionsIcon(0), connectionsControl(0),
labelBlocksIcon(0), labelBlocksIcon(0),
progressBarLabel(0), progressBarLabel(0),
progressBar(0), progressBar(0),
@ -195,7 +195,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle); unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle);
labelWalletEncryptionIcon = new QLabel(); labelWalletEncryptionIcon = new QLabel();
labelWalletHDStatusIcon = new QLabel(); labelWalletHDStatusIcon = new QLabel();
labelConnectionsIcon = new QLabel(); connectionsControl = new NetworkToggleStatusBarControl();
labelBlocksIcon = new QLabel(); labelBlocksIcon = new QLabel();
if(enableWallet) if(enableWallet)
{ {
@ -206,7 +206,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle *
frameBlocksLayout->addWidget(labelWalletHDStatusIcon); frameBlocksLayout->addWidget(labelWalletHDStatusIcon);
} }
frameBlocksLayout->addStretch(); frameBlocksLayout->addStretch();
frameBlocksLayout->addWidget(labelConnectionsIcon); frameBlocksLayout->addWidget(connectionsControl);
frameBlocksLayout->addStretch(); frameBlocksLayout->addStretch();
frameBlocksLayout->addWidget(labelBlocksIcon); frameBlocksLayout->addWidget(labelBlocksIcon);
frameBlocksLayout->addStretch(); frameBlocksLayout->addStretch();
@ -480,6 +480,7 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel)
} }
#endif // ENABLE_WALLET #endif // ENABLE_WALLET
unitDisplayControl->setOptionsModel(_clientModel->getOptionsModel()); unitDisplayControl->setOptionsModel(_clientModel->getOptionsModel());
connectionsControl->setClientModel(_clientModel);
OptionsModel* optionsModel = _clientModel->getOptionsModel(); OptionsModel* optionsModel = _clientModel->getOptionsModel();
if(optionsModel) if(optionsModel)
@ -699,13 +700,15 @@ void BitcoinGUI::updateNetworkState()
case 7: case 8: case 9: icon = ":/icons/connect_3"; break; case 7: case 8: case 9: icon = ":/icons/connect_3"; break;
default: icon = ":/icons/connect_4"; break; default: icon = ":/icons/connect_4"; break;
} }
labelConnectionsIcon->setPixmap(platformStyle->SingleColorIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
if (clientModel->getNetworkActive()) { if (clientModel->getNetworkActive()) {
labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count)); connectionsControl->setToolTip(tr("%n active connection(s) to Bitcoin network", "", count));
} else { } else {
labelConnectionsIcon->setToolTip(tr("Network activity disabled")); connectionsControl->setToolTip(tr("Network activity disabled"));
icon = ":/icons/network_disabled";
} }
connectionsControl->setPixmap(platformStyle->SingleColorIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE));
} }
void BitcoinGUI::setNumConnections(int count) void BitcoinGUI::setNumConnections(int count)
@ -1220,3 +1223,18 @@ void UnitDisplayStatusBarControl::onMenuSelection(QAction* action)
optionsModel->setDisplayUnit(action->data()); optionsModel->setDisplayUnit(action->data());
} }
} }
void NetworkToggleStatusBarControl::mousePressEvent(QMouseEvent *event)
{
if (clientModel) {
clientModel->setNetworkActive(!clientModel->getNetworkActive());
}
}
/** Lets the control know about the Client Model */
void NetworkToggleStatusBarControl::setClientModel(ClientModel *_clientModel)
{
if (_clientModel) {
this->clientModel = _clientModel;
}
}

View File

@ -26,6 +26,7 @@ class PlatformStyle;
class RPCConsole; class RPCConsole;
class SendCoinsRecipient; class SendCoinsRecipient;
class UnitDisplayStatusBarControl; class UnitDisplayStatusBarControl;
class NetworkToggleStatusBarControl;
class WalletFrame; class WalletFrame;
class WalletModel; class WalletModel;
class HelpMessageDialog; class HelpMessageDialog;
@ -84,7 +85,7 @@ private:
UnitDisplayStatusBarControl *unitDisplayControl; UnitDisplayStatusBarControl *unitDisplayControl;
QLabel *labelWalletEncryptionIcon; QLabel *labelWalletEncryptionIcon;
QLabel *labelWalletHDStatusIcon; QLabel *labelWalletHDStatusIcon;
QLabel *labelConnectionsIcon; NetworkToggleStatusBarControl *connectionsControl;
QLabel *labelBlocksIcon; QLabel *labelBlocksIcon;
QLabel *progressBarLabel; QLabel *progressBarLabel;
QProgressBar *progressBar; QProgressBar *progressBar;
@ -265,4 +266,17 @@ private Q_SLOTS:
void onMenuSelection(QAction* action); void onMenuSelection(QAction* action);
}; };
class NetworkToggleStatusBarControl : public QLabel
{
Q_OBJECT
public:
void setClientModel(ClientModel *clientModel);
protected:
void mousePressEvent(QMouseEvent *event);
private:
ClientModel *clientModel;
};
#endif // BITCOIN_QT_BITCOINGUI_H #endif // BITCOIN_QT_BITCOINGUI_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

View File

@ -107,6 +107,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "prioritisetransaction", 2 }, { "prioritisetransaction", 2 },
{ "setban", 2 }, { "setban", 2 },
{ "setban", 3 }, { "setban", 3 },
{ "setnetworkactive", 0 },
{ "getmempoolancestors", 1 }, { "getmempoolancestors", 1 },
{ "getmempooldescendants", 1 }, { "getmempooldescendants", 1 },
}; };

View File

@ -401,6 +401,7 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
" \"localrelay\": true|false, (bool) true if transaction relay is requested from peers\n" " \"localrelay\": true|false, (bool) true if transaction relay is requested from peers\n"
" \"timeoffset\": xxxxx, (numeric) the time offset\n" " \"timeoffset\": xxxxx, (numeric) the time offset\n"
" \"connections\": xxxxx, (numeric) the number of connections\n" " \"connections\": xxxxx, (numeric) the number of connections\n"
" \"networkactive\": x, (numeric) the number of connections\n"
" \"networks\": [ (array) information per network\n" " \"networks\": [ (array) information per network\n"
" {\n" " {\n"
" \"name\": \"xxx\", (string) network (ipv4, ipv6 or onion)\n" " \"name\": \"xxx\", (string) network (ipv4, ipv6 or onion)\n"
@ -435,8 +436,10 @@ UniValue getnetworkinfo(const UniValue& params, bool fHelp)
obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices()))); obj.push_back(Pair("localservices", strprintf("%016x", g_connman->GetLocalServices())));
obj.push_back(Pair("localrelay", fRelayTxes)); obj.push_back(Pair("localrelay", fRelayTxes));
obj.push_back(Pair("timeoffset", GetTimeOffset())); obj.push_back(Pair("timeoffset", GetTimeOffset()));
if(g_connman) if (g_connman) {
obj.push_back(Pair("networkactive", (int)g_connman->GetNetworkActive()));
obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL))); obj.push_back(Pair("connections", (int)g_connman->GetNodeCount(CConnman::CONNECTIONS_ALL)));
}
obj.push_back(Pair("networks", GetNetworksInfo())); obj.push_back(Pair("networks", GetNetworksInfo()));
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK()))); obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
UniValue localAddresses(UniValue::VARR); UniValue localAddresses(UniValue::VARR);
@ -571,12 +574,12 @@ UniValue clearbanned(const UniValue& params, bool fHelp)
return NullUniValue; return NullUniValue;
} }
UniValue togglenetwork(const JSONRPCRequest& request) UniValue setnetworkactive(const JSONRPCRequest& request)
{ {
if (request.fHelp || request.params.size() != 0) { if (request.fHelp || request.params.size() != 1) {
throw runtime_error( throw runtime_error(
"togglenetwork\n" "setnetworkactive \"true|false\"\n"
"Toggle all network activity temporarily." "Disable/Re-Enable all network activity temporarily."
); );
} }
@ -584,7 +587,7 @@ UniValue togglenetwork(const JSONRPCRequest& request)
throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled"); throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
} }
g_connman->SetNetworkActive(!g_connman->GetNetworkActive()); g_connman->SetNetworkActive(request.params[0].get_bool());
return g_connman->GetNetworkActive(); return g_connman->GetNetworkActive();
} }
@ -603,7 +606,7 @@ static const CRPCCommand commands[] =
{ "network", "setban", &setban, true }, { "network", "setban", &setban, true },
{ "network", "listbanned", &listbanned, true }, { "network", "listbanned", &listbanned, true },
{ "network", "clearbanned", &clearbanned, true }, { "network", "clearbanned", &clearbanned, true },
{ "network", "togglenetwork", &togglenetwork, true, }, { "network", "setnetworkactive", &setnetworkactive, true, },
}; };
void RegisterNetRPCCommands(CRPCTable &t) void RegisterNetRPCCommands(CRPCTable &t)

View File

@ -81,6 +81,28 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams)
BOOST_CHECK_THROW(CallRPC(string("sendrawtransaction ")+rawtx+" extra"), runtime_error); BOOST_CHECK_THROW(CallRPC(string("sendrawtransaction ")+rawtx+" extra"), runtime_error);
} }
BOOST_AUTO_TEST_CASE(rpc_togglenetwork)
{
UniValue r;
r = CallRPC("getnetworkinfo");
int netState = find_value(r.get_obj(), "networkactive").get_int();
BOOST_CHECK_EQUAL(netState, 1);
BOOST_CHECK_NO_THROW(CallRPC("setnetworkactive false"));
r = CallRPC("getnetworkinfo");
int numConnection = find_value(r.get_obj(), "connections").get_int();
BOOST_CHECK_EQUAL(numConnection, 0);
netState = find_value(r.get_obj(), "networkactive").get_int();
BOOST_CHECK_EQUAL(netState, 0);
BOOST_CHECK_NO_THROW(CallRPC("setnetworkactive true"));
r = CallRPC("getnetworkinfo");
netState = find_value(r.get_obj(), "networkactive").get_int();
BOOST_CHECK_EQUAL(netState, 1);
}
BOOST_AUTO_TEST_CASE(rpc_rawsign) BOOST_AUTO_TEST_CASE(rpc_rawsign)
{ {
UniValue r; UniValue r;