mirror of https://github.com/lukechilds/komodo.git
Wladimir J. van der Laan
13 years ago
10 changed files with 833 additions and 79 deletions
@ -0,0 +1,323 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>RPCConsole</class> |
|||
<widget class="QDialog" name="RPCConsole"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>706</width> |
|||
<height>382</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Bitcoin debug window</string> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout_2"> |
|||
<item> |
|||
<widget class="QTabWidget" name="tabWidget"> |
|||
<property name="currentIndex"> |
|||
<number>0</number> |
|||
</property> |
|||
<widget class="QWidget" name="tab"> |
|||
<attribute name="title"> |
|||
<string>Information</string> |
|||
</attribute> |
|||
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1"> |
|||
<property name="horizontalSpacing"> |
|||
<number>12</number> |
|||
</property> |
|||
<item row="1" column="0"> |
|||
<widget class="QLabel" name="label_5"> |
|||
<property name="text"> |
|||
<string>Client name</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="1" column="1"> |
|||
<widget class="QLabel" name="clientName"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="0"> |
|||
<widget class="QLabel" name="label_6"> |
|||
<property name="text"> |
|||
<string>Client version</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="2" column="1"> |
|||
<widget class="QLabel" name="clientVersion"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="0"> |
|||
<widget class="QLabel" name="label_9"> |
|||
<property name="font"> |
|||
<font> |
|||
<weight>75</weight> |
|||
<bold>true</bold> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Version</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="4" column="0"> |
|||
<widget class="QLabel" name="label_11"> |
|||
<property name="font"> |
|||
<font> |
|||
<weight>75</weight> |
|||
<bold>true</bold> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Network</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="5" column="0"> |
|||
<widget class="QLabel" name="label_7"> |
|||
<property name="text"> |
|||
<string>Number of connections</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="5" column="1"> |
|||
<widget class="QLabel" name="numberOfConnections"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="6" column="0"> |
|||
<widget class="QLabel" name="label_8"> |
|||
<property name="text"> |
|||
<string>On testnet</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="6" column="1"> |
|||
<widget class="QCheckBox" name="isTestNet"> |
|||
<property name="enabled"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="7" column="0"> |
|||
<widget class="QLabel" name="label_10"> |
|||
<property name="font"> |
|||
<font> |
|||
<weight>75</weight> |
|||
<bold>true</bold> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>Block chain</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="8" column="0"> |
|||
<widget class="QLabel" name="label_3"> |
|||
<property name="text"> |
|||
<string>Current number of blocks</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="8" column="1"> |
|||
<widget class="QLabel" name="numberOfBlocks"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="9" column="0"> |
|||
<widget class="QLabel" name="label_4"> |
|||
<property name="text"> |
|||
<string>Estimated total blocks</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="9" column="1"> |
|||
<widget class="QLabel" name="totalBlocks"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="10" column="0"> |
|||
<widget class="QLabel" name="label_2"> |
|||
<property name="text"> |
|||
<string>Last block time</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="10" column="1"> |
|||
<widget class="QLabel" name="lastBlockTime"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="textInteractionFlags"> |
|||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="11" column="0"> |
|||
<spacer name="verticalSpacer"> |
|||
<property name="orientation"> |
|||
<enum>Qt::Vertical</enum> |
|||
</property> |
|||
<property name="sizeHint" stdset="0"> |
|||
<size> |
|||
<width>20</width> |
|||
<height>40</height> |
|||
</size> |
|||
</property> |
|||
</spacer> |
|||
</item> |
|||
<item row="3" column="0"> |
|||
<widget class="QLabel" name="label_12"> |
|||
<property name="text"> |
|||
<string>Build date</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="3" column="1"> |
|||
<widget class="QLabel" name="buildDate"> |
|||
<property name="text"> |
|||
<string>N/A</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<widget class="QWidget" name="tab_2"> |
|||
<attribute name="title"> |
|||
<string>Console</string> |
|||
</attribute> |
|||
<layout class="QVBoxLayout" name="verticalLayout_3"> |
|||
<property name="spacing"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QTableWidget" name="messagesWidget"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>0</width> |
|||
<height>100</height> |
|||
</size> |
|||
</property> |
|||
<property name="tabKeyNavigation"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="selectionBehavior"> |
|||
<enum>QAbstractItemView::SelectRows</enum> |
|||
</property> |
|||
<property name="columnCount"> |
|||
<number>2</number> |
|||
</property> |
|||
<attribute name="horizontalHeaderVisible"> |
|||
<bool>false</bool> |
|||
</attribute> |
|||
<attribute name="verticalHeaderVisible"> |
|||
<bool>false</bool> |
|||
</attribute> |
|||
<column/> |
|||
<column/> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<layout class="QHBoxLayout" name="horizontalLayout"> |
|||
<property name="spacing"> |
|||
<number>3</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="text"> |
|||
<string>></string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLineEdit" name="lineEdit"/> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="clearButton"> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>24</width> |
|||
<height>24</height> |
|||
</size> |
|||
</property> |
|||
<property name="toolTip"> |
|||
<string>Clear console</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
<property name="icon"> |
|||
<iconset resource="../bitcoin.qrc"> |
|||
<normaloff>:/icons/remove</normaloff>:/icons/remove</iconset> |
|||
</property> |
|||
<property name="shortcut"> |
|||
<string notr="true">Ctrl+L</string> |
|||
</property> |
|||
<property name="autoDefault"> |
|||
<bool>false</bool> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<resources> |
|||
<include location="../bitcoin.qrc"/> |
|||
</resources> |
|||
<connections/> |
|||
</ui> |
@ -0,0 +1,316 @@ |
|||
#include "rpcconsole.h" |
|||
#include "ui_rpcconsole.h" |
|||
|
|||
#include "clientmodel.h" |
|||
#include "bitcoinrpc.h" |
|||
#include "guiutil.h" |
|||
|
|||
#include <QTime> |
|||
#include <QTimer> |
|||
#include <QThread> |
|||
#include <QTextEdit> |
|||
#include <QKeyEvent> |
|||
|
|||
#include <boost/tokenizer.hpp> |
|||
|
|||
// TODO: make it possible to filter out categories (esp debug messages when implemented)
|
|||
// TODO: receive errors and debug messages through ClientModel
|
|||
|
|||
const int CONSOLE_SCROLLBACK = 50; |
|||
const int CONSOLE_HISTORY = 50; |
|||
|
|||
/* Object for executing console RPC commands in a separate thread.
|
|||
*/ |
|||
class RPCExecutor: public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public slots: |
|||
void start(); |
|||
void request(const QString &command); |
|||
signals: |
|||
void reply(int category, const QString &command); |
|||
}; |
|||
|
|||
#include "rpcconsole.moc" |
|||
|
|||
void RPCExecutor::start() |
|||
{ |
|||
// Nothing to do
|
|||
} |
|||
|
|||
void RPCExecutor::request(const QString &command) |
|||
{ |
|||
// Parse shell-like command line into separate arguments
|
|||
boost::escaped_list_separator<char> els('\\',' ','\"'); |
|||
std::string strCommand = command.toStdString(); |
|||
boost::tokenizer<boost::escaped_list_separator<char> > tok(strCommand, els); |
|||
|
|||
std::string strMethod; |
|||
std::vector<std::string> strParams; |
|||
int n = 0; |
|||
for(boost::tokenizer<boost::escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg,++n) |
|||
{ |
|||
if(n == 0) // First parameter is the command
|
|||
strMethod = *beg; |
|||
else |
|||
strParams.push_back(*beg); |
|||
} |
|||
|
|||
try { |
|||
std::string strPrint; |
|||
json_spirit::Value result = tableRPC.execute(strMethod, RPCConvertValues(strMethod, strParams)); |
|||
|
|||
// Format result reply
|
|||
if (result.type() == json_spirit::null_type) |
|||
strPrint = ""; |
|||
else if (result.type() == json_spirit::str_type) |
|||
strPrint = result.get_str(); |
|||
else |
|||
strPrint = write_string(result, true); |
|||
|
|||
emit reply(RPCConsole::CMD_REPLY, QString::fromStdString(strPrint)); |
|||
} |
|||
catch (json_spirit::Object& objError) |
|||
{ |
|||
emit reply(RPCConsole::CMD_ERROR, QString::fromStdString(write_string(json_spirit::Value(objError), false))); |
|||
} |
|||
catch (std::exception& e) |
|||
{ |
|||
emit reply(RPCConsole::CMD_ERROR, QString("Error: ") + QString::fromStdString(e.what())); |
|||
} |
|||
} |
|||
|
|||
RPCConsole::RPCConsole(QWidget *parent) : |
|||
QDialog(parent), |
|||
ui(new Ui::RPCConsole), |
|||
firstLayout(true), |
|||
historyPtr(0) |
|||
{ |
|||
ui->setupUi(this); |
|||
ui->messagesWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch); |
|||
ui->messagesWidget->setContextMenuPolicy(Qt::ActionsContextMenu); |
|||
|
|||
// Install event filter for up and down arrow
|
|||
ui->lineEdit->installEventFilter(this); |
|||
|
|||
// Add "Copy message" to context menu explicitly
|
|||
QAction *copyMessageAction = new QAction(tr("&Copy"), this); |
|||
copyMessageAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_C)); |
|||
copyMessageAction->setShortcutContext(Qt::WidgetShortcut); |
|||
connect(copyMessageAction, SIGNAL(triggered()), this, SLOT(copyMessage())); |
|||
ui->messagesWidget->addAction(copyMessageAction); |
|||
|
|||
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear())); |
|||
|
|||
startExecutor(); |
|||
|
|||
clear(); |
|||
} |
|||
|
|||
RPCConsole::~RPCConsole() |
|||
{ |
|||
emit stopExecutor(); |
|||
delete ui; |
|||
} |
|||
|
|||
bool RPCConsole::event(QEvent *event) |
|||
{ |
|||
int returnValue = QWidget::event(event); |
|||
|
|||
if (event->type() == QEvent::LayoutRequest && firstLayout) |
|||
{ |
|||
// Work around QTableWidget issue:
|
|||
// Call resizeRowsToContents on first Layout request with widget visible,
|
|||
// to make sure multiline messages that were added before the console was shown
|
|||
// have the right height.
|
|||
if(ui->messagesWidget->isVisible()) |
|||
{ |
|||
firstLayout = false; |
|||
ui->messagesWidget->resizeRowsToContents(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
return returnValue; |
|||
} |
|||
|
|||
bool RPCConsole::eventFilter(QObject* obj, QEvent *event) |
|||
{ |
|||
if(obj == ui->lineEdit) |
|||
{ |
|||
if(event->type() == QEvent::KeyPress) |
|||
{ |
|||
QKeyEvent *key = static_cast<QKeyEvent*>(event); |
|||
switch(key->key()) |
|||
{ |
|||
case Qt::Key_Up: browseHistory(-1); return true; |
|||
case Qt::Key_Down: browseHistory(1); return true; |
|||
} |
|||
} |
|||
} |
|||
return QDialog::eventFilter(obj, event); |
|||
} |
|||
|
|||
void RPCConsole::setClientModel(ClientModel *model) |
|||
{ |
|||
this->clientModel = model; |
|||
if(model) |
|||
{ |
|||
// Subscribe to information, replies, messages, errors
|
|||
connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); |
|||
connect(model, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int))); |
|||
|
|||
// Provide initial values
|
|||
ui->clientVersion->setText(model->formatFullVersion()); |
|||
ui->clientName->setText(model->clientName()); |
|||
ui->buildDate->setText(model->formatBuildDate()); |
|||
|
|||
setNumConnections(model->getNumConnections()); |
|||
ui->isTestNet->setChecked(model->isTestNet()); |
|||
|
|||
setNumBlocks(model->getNumBlocks()); |
|||
} |
|||
} |
|||
|
|||
static QColor categoryColor(int category) |
|||
{ |
|||
switch(category) |
|||
{ |
|||
case RPCConsole::MC_ERROR: return QColor(255,0,0); break; |
|||
case RPCConsole::MC_DEBUG: return QColor(192,192,192); break; |
|||
case RPCConsole::CMD_REQUEST: return QColor(128,128,128); break; |
|||
case RPCConsole::CMD_REPLY: return QColor(128,255,128); break; |
|||
case RPCConsole::CMD_ERROR: return QColor(255,128,128); break; |
|||
default: return QColor(0,0,0); |
|||
} |
|||
} |
|||
|
|||
void RPCConsole::clear() |
|||
{ |
|||
ui->messagesWidget->clear(); |
|||
ui->messagesWidget->setRowCount(0); |
|||
ui->lineEdit->clear(); |
|||
ui->lineEdit->setFocus(); |
|||
|
|||
message(CMD_REPLY, tr("Welcome to the bitcoin RPC console.")+"\n"+ |
|||
tr("Use up and down arrows to navigate history, and Ctrl-L to clear screen.")+"\n"+ |
|||
tr("Type \"help\" for an overview of available commands.")); |
|||
} |
|||
|
|||
void RPCConsole::message(int category, const QString &message) |
|||
{ |
|||
// Add row to messages widget
|
|||
int row = ui->messagesWidget->rowCount(); |
|||
ui->messagesWidget->setRowCount(row+1); |
|||
|
|||
QTime time = QTime::currentTime(); |
|||
QTableWidgetItem *newTime = new QTableWidgetItem(time.toString()); |
|||
newTime->setData(Qt::DecorationRole, categoryColor(category)); |
|||
newTime->setForeground(QColor(128,128,128)); |
|||
newTime->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); // make non-editable
|
|||
|
|||
int numLines = message.count("\n") + 1; |
|||
// As Qt doesn't like very tall cells (they break scrolling) keep only short messages in
|
|||
// the cell text, longer messages trigger a display widget with scroll bar
|
|||
if(numLines < 5) |
|||
{ |
|||
QTableWidgetItem *newItem = new QTableWidgetItem(message); |
|||
newItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); // make non-editable
|
|||
if(category == CMD_ERROR) // Coloring error messages in red
|
|||
newItem->setForeground(QColor(255,16,16)); |
|||
ui->messagesWidget->setItem(row, 1, newItem); |
|||
} else { |
|||
QTextEdit *newWidget = new QTextEdit; |
|||
newWidget->setText(message); |
|||
newWidget->setMaximumHeight(100); |
|||
newWidget->setReadOnly(true); |
|||
ui->messagesWidget->setCellWidget(row, 1, newWidget); |
|||
} |
|||
|
|||
ui->messagesWidget->setItem(row, 0, newTime); |
|||
ui->messagesWidget->resizeRowToContents(row); |
|||
// Preserve only limited scrollback buffer
|
|||
while(ui->messagesWidget->rowCount() > CONSOLE_SCROLLBACK) |
|||
ui->messagesWidget->removeRow(0); |
|||
// Scroll to bottom after table is updated
|
|||
QTimer::singleShot(0, ui->messagesWidget, SLOT(scrollToBottom())); |
|||
} |
|||
|
|||
void RPCConsole::setNumConnections(int count) |
|||
{ |
|||
ui->numberOfConnections->setText(QString::number(count)); |
|||
} |
|||
|
|||
void RPCConsole::setNumBlocks(int count) |
|||
{ |
|||
ui->numberOfBlocks->setText(QString::number(count)); |
|||
if(clientModel) |
|||
{ |
|||
ui->totalBlocks->setText(QString::number(clientModel->getNumBlocksOfPeers())); |
|||
ui->lastBlockTime->setText(clientModel->getLastBlockDate().toString()); |
|||
} |
|||
} |
|||
|
|||
void RPCConsole::on_lineEdit_returnPressed() |
|||
{ |
|||
QString cmd = ui->lineEdit->text(); |
|||
ui->lineEdit->clear(); |
|||
|
|||
if(!cmd.isEmpty()) |
|||
{ |
|||
message(CMD_REQUEST, cmd); |
|||
emit cmdRequest(cmd); |
|||
// Truncate history from current position
|
|||
history.erase(history.begin() + historyPtr, history.end()); |
|||
// Append command to history
|
|||
history.append(cmd); |
|||
// Enforce maximum history size
|
|||
while(history.size() > CONSOLE_HISTORY) |
|||
history.removeFirst(); |
|||
// Set pointer to end of history
|
|||
historyPtr = history.size(); |
|||
} |
|||
} |
|||
|
|||
void RPCConsole::browseHistory(int offset) |
|||
{ |
|||
historyPtr += offset; |
|||
if(historyPtr < 0) |
|||
historyPtr = 0; |
|||
if(historyPtr > history.size()) |
|||
historyPtr = history.size(); |
|||
QString cmd; |
|||
if(historyPtr < history.size()) |
|||
cmd = history.at(historyPtr); |
|||
ui->lineEdit->setText(cmd); |
|||
} |
|||
|
|||
void RPCConsole::startExecutor() |
|||
{ |
|||
QThread* thread = new QThread; |
|||
RPCExecutor *executor = new RPCExecutor(); |
|||
executor->moveToThread(thread); |
|||
|
|||
// Notify executor when thread started (in executor thread)
|
|||
connect(thread, SIGNAL(started()), executor, SLOT(start())); |
|||
// Replies from executor object must go to this object
|
|||
connect(executor, SIGNAL(reply(int,QString)), this, SLOT(message(int,QString))); |
|||
// Requests from this object must go to executor
|
|||
connect(this, SIGNAL(cmdRequest(QString)), executor, SLOT(request(QString))); |
|||
// On stopExecutor signal
|
|||
// - queue executor for deletion (in execution thread)
|
|||
// - quit the Qt event loop in the execution thread
|
|||
connect(this, SIGNAL(stopExecutor()), executor, SLOT(deleteLater())); |
|||
connect(this, SIGNAL(stopExecutor()), thread, SLOT(quit())); |
|||
// Queue the thread for deletion (in this thread) when it is finished
|
|||
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); |
|||
|
|||
// Default implementation of QThread::run() simply spins up an event loop in the thread,
|
|||
// which is what we want.
|
|||
thread->start(); |
|||
} |
|||
|
|||
void RPCConsole::copyMessage() |
|||
{ |
|||
GUIUtil::copyEntryData(ui->messagesWidget, 1, Qt::EditRole); |
|||
} |
@ -0,0 +1,64 @@ |
|||
#ifndef RPCCONSOLE_H |
|||
#define RPCCONSOLE_H |
|||
|
|||
#include <QDialog> |
|||
|
|||
namespace Ui { |
|||
class RPCConsole; |
|||
} |
|||
class ClientModel; |
|||
|
|||
/** Local bitcoin RPC console. */ |
|||
class RPCConsole: public QDialog |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
explicit RPCConsole(QWidget *parent = 0); |
|||
~RPCConsole(); |
|||
|
|||
void setClientModel(ClientModel *model); |
|||
|
|||
enum MessageClass { |
|||
MC_ERROR, |
|||
MC_DEBUG, |
|||
CMD_REQUEST, |
|||
CMD_REPLY, |
|||
CMD_ERROR |
|||
}; |
|||
|
|||
protected: |
|||
virtual bool event(QEvent *event); |
|||
virtual bool eventFilter(QObject* obj, QEvent *event); |
|||
|
|||
private slots: |
|||
void on_lineEdit_returnPressed(); |
|||
|
|||
public slots: |
|||
void clear(); |
|||
void message(int category, const QString &message); |
|||
/** Set number of connections shown in the UI */ |
|||
void setNumConnections(int count); |
|||
/** Set number of blocks shown in the UI */ |
|||
void setNumBlocks(int count); |
|||
/** Go forward or back in history */ |
|||
void browseHistory(int offset); |
|||
/** Copy currently selected message to clipboard */ |
|||
void copyMessage(); |
|||
|
|||
signals: |
|||
// For RPC command executor
|
|||
void stopExecutor(); |
|||
void cmdRequest(const QString &command); |
|||
|
|||
private: |
|||
Ui::RPCConsole *ui; |
|||
ClientModel *clientModel; |
|||
bool firstLayout; |
|||
QStringList history; |
|||
int historyPtr; |
|||
|
|||
void startExecutor(); |
|||
}; |
|||
|
|||
#endif // RPCCONSOLE_H
|
Loading…
Reference in new issue