diff --git a/main.cpp b/main.cpp index 7b2799d4..43ef8186 100644 --- a/main.cpp +++ b/main.cpp @@ -56,6 +56,7 @@ int main(int argc, char *argv[]) qmlRegisterUncreatableType("Bitmonero.Wallet", 1, 0, "Wallet", "Wallet can't be instantiated directly"); qmlRegisterUncreatableType("Bitmonero.PendingTransaction", 1, 0, "PendingTransaction", "PendingTransaction can't be instantiated directly"); + qRegisterMetaType(); diff --git a/main.qml b/main.qml index e890a75b..b96b5dea 100644 --- a/main.qml +++ b/main.qml @@ -35,6 +35,7 @@ import Qt.labs.settings 1.0 import Bitmonero.Wallet 1.0 import Bitmonero.PendingTransaction 1.0 + import "components" import "wizard" @@ -50,6 +51,7 @@ ApplicationWindow { property var wallet; property var transaction; + function altKeyReleased() { ctrlPressed = false; } function showPageRequest(page) { @@ -122,7 +124,7 @@ ApplicationWindow { function initialize() { - + console.log("initializing..") middlePanel.paymentClicked.connect(handlePayment); if (typeof wizard.settings['wallet'] !== 'undefined') { @@ -143,24 +145,34 @@ ApplicationWindow { } console.log("Wallet opened successfully: ", wallet.errorString); } + // display splash screen... + console.log("initializing with daemon address..") if (!wallet.init(persistentSettings.daemon_address, 0)) { console.log("Error initialize wallet: ", wallet.errorString); return } + console.log("Wallet initialized successfully") + // TODO: update network indicator // subscribing for wallet updates wallet.updated.connect(onWalletUpdate); - + wallet.refreshed.connect(onWalletRefresh); + console.log("refreshing wallet async") // TODO: refresh asynchronously without blocking UI, implement signal(s) - wallet.refresh(); - + wallet.refreshAsync(); console.log("wallet balance: ", wallet.balance) } function onWalletUpdate() { - console.log("wallet updated") + console.log(">>> wallet updated") + leftPanel.unlockedBalanceText = walletManager.displayAmount(wallet.unlockedBalance); + leftPanel.balanceText = walletManager.displayAmount(wallet.balance); + } + + function onWalletRefresh() { + console.log(">>> wallet refreshed") leftPanel.unlockedBalanceText = walletManager.displayAmount(wallet.unlockedBalance); leftPanel.balanceText = walletManager.displayAmount(wallet.balance); } @@ -206,10 +218,10 @@ ApplicationWindow { transactionConfirmationPopup.title = qsTr("Confirmation") transactionConfirmationPopup.text = qsTr("Please confirm transaction:\n\n") - + "\nAddress: " + address - + "\nPayment ID: " + paymentId - + "\nAmount: " + walletManager.displayAmount(transaction.amount) - + "\nFee: " + walletManager.displayAmount(transaction.fee) + + qsTr("\nAddress: ") + address + + qsTr("\nPayment ID: ") + paymentId + + qsTr("\nAmount: ") + walletManager.displayAmount(transaction.amount) + + qsTr("\nFee: ") + walletManager.displayAmount(transaction.fee) transactionConfirmationPopup.icon = StandardIcon.Question transactionConfirmationPopup.open() // committing transaction @@ -288,6 +300,19 @@ ApplicationWindow { } } + Window { + id: walletInitializationSplash + modality: Qt.ApplicationModal + flags: Qt.SplashScreen + height: 100 + width: 250 + Text { + anchors.fill: parent + text: qsTr("Initializing Wallet..."); + } + + } + Item { id: rootItem diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index e6368ad2..3697984e 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -14,6 +14,45 @@ namespace { } +class WalletListenerImpl : public Bitmonero::WalletListener +{ +public: + WalletListenerImpl(Wallet * w) + : m_wallet(w) + { + + } + + virtual void moneySpent(const std::string &txId, uint64_t amount) + { + // TODO + Q_UNUSED(txId) + Q_UNUSED(amount) + } + + virtual void moneyReceived(const std::string &txId, uint64_t amount) + { + // TODO + Q_UNUSED(txId) + Q_UNUSED(amount) + } + + virtual void updated() + { + emit m_wallet->updated(); + } + + // called when wallet refreshed by background thread or explicitly + virtual void refreshed() + { + emit m_wallet->refreshed(); + } + +private: + Wallet * m_wallet; +}; + + QString Wallet::getSeed() const { @@ -88,6 +127,11 @@ bool Wallet::refresh() return result; } +void Wallet::refreshAsync() +{ + m_walletImpl->refreshAsync(); +} + PendingTransaction *Wallet::createTransaction(const QString &dst_addr, const QString &payment_id, quint64 amount, quint32 mixin_count, PendingTransaction::Priority priority) diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 241b89d8..4d6a1ea0 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -77,6 +77,10 @@ public: //! refreshes the wallet Q_INVOKABLE bool refresh(); + + //! refreshes the wallet asynchronously + Q_INVOKABLE void refreshAsync(); + //! creates transaction Q_INVOKABLE PendingTransaction * createTransaction(const QString &dst_addr, const QString &payment_id, quint64 amount, quint32 mixin_count, @@ -103,6 +107,10 @@ public: signals: void updated(); + // emitted when refresh process finished (could take a long time) + // signalling only after we + void refreshed(); + private: Wallet(Bitmonero::Wallet *w, QObject * parent = 0); @@ -110,6 +118,7 @@ private: private: friend class WalletManager; + friend class WalletListenerImpl; //! libwallet's Bitmonero::Wallet * m_walletImpl; // history lifetime managed by wallet;