From 18cab09a959bc3f62e5112be5cb5ad61f871d963 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Sun, 22 May 2011 17:19:43 +0200 Subject: [PATCH] core initialisation, client model binding --- bitcoin.pro | 8 ++++-- core/src/init.cpp | 2 ++ gui/include/bitcoingui.h | 3 ++ gui/include/clientmodel.h | 31 +++++++++++++++++++++ gui/src/bitcoin.cpp | 34 +++++++++++++++-------- gui/src/bitcoingui.cpp | 21 ++++++++++++++ gui/src/clientmodel.cpp | 58 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 144 insertions(+), 13 deletions(-) create mode 100644 gui/include/clientmodel.h create mode 100644 gui/src/clientmodel.cpp diff --git a/bitcoin.pro b/bitcoin.pro index e87169e89..f32318230 100644 --- a/bitcoin.pro +++ b/bitcoin.pro @@ -4,6 +4,7 @@ DEPENDPATH += . INCLUDEPATH += gui/include core/include cryptopp/include json/include unix:LIBS += -lssl -lboost_system -lboost_filesystem -lboost_program_options -lboost_thread -ldb_cxx macx:DEFINES += __WXMAC_OSX__ MSG_NOSIGNAL=0 +# WINDOWS defines, -DSSL, look at build system # Input HEADERS += gui/include/bitcoingui.h \ @@ -51,7 +52,9 @@ HEADERS += gui/include/bitcoingui.h \ json/include/json/json_spirit_reader.h \ json/include/json/json_spirit_error_position.h \ json/include/json/json_spirit.h \ - core/include/rpc.h + core/include/rpc.h \ + gui/src/clientmodel.h \ + gui/include/clientmodel.h SOURCES += gui/src/bitcoin.cpp gui/src/bitcoingui.cpp \ gui/src/transactiontablemodel.cpp \ gui/src/addresstablemodel.cpp \ @@ -74,7 +77,8 @@ SOURCES += gui/src/bitcoin.cpp gui/src/bitcoingui.cpp \ core/src/db.cpp \ json/src/json_spirit_writer.cpp \ json/src/json_spirit_value.cpp \ - json/src/json_spirit_reader.cpp + json/src/json_spirit_reader.cpp \ + gui/src/clientmodel.cpp RESOURCES += \ gui/bitcoin.qrc diff --git a/core/src/init.cpp b/core/src/init.cpp index 3126d3489..5528c430f 100644 --- a/core/src/init.cpp +++ b/core/src/init.cpp @@ -513,9 +513,11 @@ bool AppInit2(int argc, char* argv[]) SetStartOnSystemStartup(true); #endif +#if 0 #ifndef GUI while (1) Sleep(5000); +#endif #endif return true; diff --git a/gui/include/bitcoingui.h b/gui/include/bitcoingui.h index 9142b6b84..3b722fcca 100644 --- a/gui/include/bitcoingui.h +++ b/gui/include/bitcoingui.h @@ -6,6 +6,7 @@ /* Forward declarations */ class TransactionTableModel; +class ClientModel; QT_BEGIN_NAMESPACE class QLabel; @@ -17,6 +18,7 @@ class BitcoinGUI : public QMainWindow Q_OBJECT public: explicit BitcoinGUI(QWidget *parent = 0); + void setModel(ClientModel *model); /* Transaction table tab indices */ enum { @@ -27,6 +29,7 @@ public: } TabIndex; private: TransactionTableModel *transaction_model; + ClientModel *model; QLineEdit *address; QLabel *labelBalance; diff --git a/gui/include/clientmodel.h b/gui/include/clientmodel.h new file mode 100644 index 000000000..fb1a5edeb --- /dev/null +++ b/gui/include/clientmodel.h @@ -0,0 +1,31 @@ +#ifndef CLIENTMODEL_H +#define CLIENTMODEL_H + +#include + +class ClientModel : public QObject +{ + Q_OBJECT +public: + explicit ClientModel(QObject *parent = 0); + + double getBalance(); + QString getAddress(); + int getNumConnections(); + int getNumBlocks(); + int getNumTransactions(); + +signals: + void balanceChanged(double balance); + void addressChanged(const QString &address); + void numConnectionsChanged(int count); + void numBlocksChanged(int count); + void numTransactionsChanged(int count); + +public slots: + +private slots: + void update(); +}; + +#endif // CLIENTMODEL_H diff --git a/gui/src/bitcoin.cpp b/gui/src/bitcoin.cpp index a5f4a05a0..c843cc406 100644 --- a/gui/src/bitcoin.cpp +++ b/gui/src/bitcoin.cpp @@ -2,7 +2,9 @@ * W.J. van der Laan 2011 */ #include "bitcoingui.h" +#include "clientmodel.h" #include "util.h" +#include "init.h" #include @@ -10,19 +12,29 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - /* Testing on testnet */ - fTestNet = true; + try { + if(AppInit2(argc, argv)) + { + ClientModel model; + BitcoinGUI window; + window.setModel(&model); - BitcoinGUI window; - window.setBalance(1234.567890); - window.setNumConnections(4); - window.setNumTransactions(4); - window.setNumBlocks(33); - window.setAddress("123456789"); + window.show(); - window.show(); + /* Depending on settings: QApplication::setQuitOnLastWindowClosed(false); */ + int retval = app.exec(); - /* Depending on settings: QApplication::setQuitOnLastWindowClosed(false); */ + Shutdown(NULL); - return app.exec(); + return retval; + } + else + { + return 1; + } + } catch (std::exception& e) { + PrintException(&e, "Runaway exception"); + } catch (...) { + PrintException(NULL, "Runaway exception"); + } } diff --git a/gui/src/bitcoingui.cpp b/gui/src/bitcoingui.cpp index e7cd34aaa..5546a0ecf 100644 --- a/gui/src/bitcoingui.cpp +++ b/gui/src/bitcoingui.cpp @@ -9,6 +9,7 @@ #include "sendcoinsdialog.h" #include "optionsdialog.h" #include "aboutdialog.h" +#include "clientmodel.h" #include #include @@ -139,6 +140,26 @@ void BitcoinGUI::createActions() connect(about, SIGNAL(triggered()), this, SLOT(aboutClicked())); } +void BitcoinGUI::setModel(ClientModel *model) +{ + this->model = model; + + setBalance(model->getBalance()); + connect(model, SIGNAL(balanceChanged(double)), this, SLOT(setBalance(double))); + + setNumConnections(model->getNumConnections()); + connect(model, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); + + setNumTransactions(model->getNumTransactions()); + connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int))); + + setNumBlocks(model->getNumBlocks()); + connect(model, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int))); + + setAddress(model->getAddress()); + connect(model, SIGNAL(addressChanged(QString)), this, SLOT(setAddress(QString))); +} + void BitcoinGUI::createTrayIcon() { QMenu *trayIconMenu = new QMenu(this); diff --git a/gui/src/clientmodel.cpp b/gui/src/clientmodel.cpp new file mode 100644 index 000000000..0f191023b --- /dev/null +++ b/gui/src/clientmodel.cpp @@ -0,0 +1,58 @@ +#include "clientmodel.h" +#include "main.h" + +#include + +/* milliseconds between model updates */ +const int MODEL_UPDATE_DELAY = 250; + +ClientModel::ClientModel(QObject *parent) : + QObject(parent) +{ + /* Until we build signal notifications into the bitcoin core, + simply update everything using a timer. + */ + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(update())); + timer->start(MODEL_UPDATE_DELAY); +} + +double ClientModel::getBalance() +{ + return GetBalance(); +} + +QString ClientModel::getAddress() +{ + std::vector vchPubKey; + if (CWalletDB("r").ReadDefaultKey(vchPubKey)) + { + return QString::fromStdString(PubKeyToAddress(vchPubKey)); + } else { + return QString(); + } +} + +int ClientModel::getNumConnections() +{ + return vNodes.size(); +} + +int ClientModel::getNumBlocks() +{ + return nBestHeight; +} + +int ClientModel::getNumTransactions() +{ + return 0; +} + +void ClientModel::update() +{ + emit balanceChanged(getBalance()); + emit addressChanged(getAddress()); + emit numConnectionsChanged(getNumConnections()); + emit numBlocksChanged(getNumBlocks()); + emit numTransactionsChanged(getNumTransactions()); +}