From 625041df1823f2ce98b53fa054bab47876717c15 Mon Sep 17 00:00:00 2001 From: Ilya Kitaev Date: Wed, 24 Feb 2016 13:25:20 +0300 Subject: [PATCH] integrating cpp wallet mockups with QML --- Wallet.cpp | 27 +++++++++- Wallet.h | 18 +++++-- Wallet2Service.cpp | 6 --- Wallet2Service.h | 17 ------- WalletManager.cpp | 87 +++++++++++++++++++++++++++++++++ WalletManager.h | 15 +++++- main.cpp | 7 ++- monero-core.pro | 1 - wizard/WizardCreateWallet.qml | 23 +++++++-- wizard/WizardMain.qml | 2 + wizard/WizardManageWalletUI.qml | 5 +- 11 files changed, 172 insertions(+), 36 deletions(-) delete mode 100644 Wallet2Service.cpp delete mode 100644 Wallet2Service.h diff --git a/Wallet.cpp b/Wallet.cpp index 89e448fd..5507f531 100644 --- a/Wallet.cpp +++ b/Wallet.cpp @@ -1,6 +1,31 @@ #include "Wallet.h" -Wallet::Wallet(QObject *parent) : QObject(parent) +struct WalletImpl { + // TODO +}; + + +Wallet::Wallet(QObject *parent) + : QObject(parent) +{ + +} + + +QString Wallet::getSeed() const +{ + return "bound class paint gasp task soul forgot past pleasure physical circle " + " appear shore bathroom glove women crap busy beauty bliss idea give needle burden"; +} + +QString Wallet::getSeedLanguage() const +{ + return "English"; +} + +void Wallet::setSeedLaguage(const QString &lang) +{ + // TODO; } diff --git a/Wallet.h b/Wallet.h index 130712e6..14018a66 100644 --- a/Wallet.h +++ b/Wallet.h @@ -3,15 +3,27 @@ #include +struct WalletImpl; + class Wallet : public QObject { Q_OBJECT + Q_PROPERTY(QString seed READ getSeed) public: explicit Wallet(QObject *parent = 0); - + QString getSeed() const; + QString getSeedLanguage() const; + void setSeedLaguage(const QString &lang); signals: - public slots: + +private: + + + friend class WalletManager; + WalletImpl * m_pimpl; + + }; -#endif // WALLET_H \ No newline at end of file +#endif // WALLET_H diff --git a/Wallet2Service.cpp b/Wallet2Service.cpp deleted file mode 100644 index 9637d31a..00000000 --- a/Wallet2Service.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "Wallet2Service.h" - -Wallet2Service::Wallet2Service(QObject *parent) : QObject(parent) -{ - -} diff --git a/Wallet2Service.h b/Wallet2Service.h deleted file mode 100644 index 9ed5ad9b..00000000 --- a/Wallet2Service.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef WALLET2SERVICE_H -#define WALLET2SERVICE_H - -#include - -class Wallet2Service : public QObject -{ - Q_OBJECT -public: - explicit Wallet2Service(QObject *parent = 0); - -signals: - -public slots: -}; - -#endif // WALLET2SERVICE_H \ No newline at end of file diff --git a/WalletManager.cpp b/WalletManager.cpp index 7812ed34..992dfa4d 100644 --- a/WalletManager.cpp +++ b/WalletManager.cpp @@ -1,6 +1,93 @@ #include "WalletManager.h" +#include "Wallet.h" +#include +#include +#include +#include +#include + +WalletManager * WalletManager::m_instance = nullptr; + + +namespace { + bool createFileWrapper(const QString &filename) + { + QFile file(filename); + // qDebug("%s: about to create file: %s", __FUNCTION__, qPrintable(filename)); + bool result = file.open(QIODevice::WriteOnly); + if (!result ){ + qWarning("%s: error creating file '%s' : '%s'", + __FUNCTION__, + qPrintable(filename), + qPrintable(file.errorString())); + } + return result; + } +} + + +WalletManager *WalletManager::instance() +{ + if (!m_instance) { + m_instance = new WalletManager; + } + + return m_instance; +} + +Wallet *WalletManager::createWallet(const QString &path, const QString &password, + const QString &language) +{ + Wallet * wallet = new Wallet(this); + // Create dummy files for testing + QFileInfo fi(path); + QDir tempDir; + tempDir.mkpath(fi.absolutePath()); + createFileWrapper(path); + createFileWrapper(path + ".keys"); + createFileWrapper(path + ".address.txt"); + return wallet; +} + +Wallet *WalletManager::openWallet(const QString &path, const QString &language) +{ + return nullptr; +} + +bool WalletManager::moveWallet(const QString &src, const QString &dst_) +{ + QFile walletFile(src); + if (!walletFile.exists()) { + qWarning("%s: source file [%s] doesn't exits", __FUNCTION__, + qPrintable(src)); + return false; + } + QString dst = QUrl(dst_).toLocalFile(); + QString walletKeysFile = src + ".keys"; + QString walletAddressFile = src + ".address.txt"; + + QString dstWalletKeysFile = dst + ".keys"; + QString dstWalletAddressFile = dst + ".address.txt"; + + if (!walletFile.rename(dst)) { + qWarning("Error renaming file: '%s' to '%s' : (%s)", + qPrintable(src), + qPrintable(dst), + qPrintable(walletFile.errorString())); + return false; + } + QFile::rename(walletKeysFile, dstWalletKeysFile); + QFile::rename(walletAddressFile, dstWalletAddressFile); + + return QFile::exists(dst) && QFile::exists(dstWalletKeysFile) + && QFile::exists(dstWalletAddressFile); + + +} WalletManager::WalletManager(QObject *parent) : QObject(parent) { } + + diff --git a/WalletManager.h b/WalletManager.h index b6153385..ffb498d7 100644 --- a/WalletManager.h +++ b/WalletManager.h @@ -3,15 +3,26 @@ #include +class Wallet; + class WalletManager : public QObject { Q_OBJECT public: - explicit WalletManager(QObject *parent = 0); + static WalletManager * instance(); + Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password, + const QString &language); + Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &language); + Q_INVOKABLE bool moveWallet(const QString &src, const QString &dst); signals: public slots: + +private: + explicit WalletManager(QObject *parent = 0); + static WalletManager * m_instance; + }; -#endif // WALLETMANAGER_H \ No newline at end of file +#endif // WALLETMANAGER_H diff --git a/main.cpp b/main.cpp index e3917f80..0e996b84 100644 --- a/main.cpp +++ b/main.cpp @@ -57,13 +57,18 @@ int main(int argc, char *argv[]) // to save the wallet file (.keys, .bin), they have to be user-accessible for // backups - I reckon we save that in My Documents\Monero Accounts\ on // Windows, ~/Monero Accounts/ on nix / osx + #ifdef Q_OS_WIN QStringList moneroAccountsRootDir = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); #elif defined(Q_OS_UNIX) QStringList moneroAccountsRootDir = QStandardPaths::standardLocations(QStandardPaths::HomeLocation); #endif + if (!moneroAccountsRootDir.empty()) { - engine.rootContext()->setContextProperty("moneroAccountsDir", moneroAccountsRootDir.at(0) + "/Monero Accounts"); + QString moneroAccountsDir = moneroAccountsRootDir.at(0) + "/Monero Accounts"; + QDir tempDir; + tempDir.mkpath(moneroAccountsDir); + engine.rootContext()->setContextProperty("moneroAccountsDir", moneroAccountsDir); } engine.rootContext()->setContextProperty("applicationDirectory", QApplication::applicationDirPath()); diff --git a/monero-core.pro b/monero-core.pro index f021449c..bee7eb17 100644 --- a/monero-core.pro +++ b/monero-core.pro @@ -7,7 +7,6 @@ HEADERS += \ filter.h \ clipboardAdapter.h \ oscursor.h \ - Wallet2Adaptor.h \ WalletManager.h \ Wallet.h diff --git a/wizard/WizardCreateWallet.qml b/wizard/WizardCreateWallet.qml index 8ce4e760..91b7447e 100644 --- a/wizard/WizardCreateWallet.qml +++ b/wizard/WizardCreateWallet.qml @@ -44,12 +44,29 @@ Item { settingsObject['account_name'] = uiItem.accountNameText settingsObject['words'] = uiItem.wordsTexttext settingsObject['wallet_path'] = uiItem.walletPath + + + var new_wallet_filename = settingsObject.wallet_path + "/" + + settingsObject.account_name; + + // moving wallet files to the new destination, if user changed it + if (new_wallet_filename !== settingsObject.wallet_filename) { + walletManager.moveWallet(settingsObject.wallet_filename, new_wallet_filename); + } } function createWallet(settingsObject) { - // print ("Language: " + settingsObject.language); - var wallet = walletManager.createWallet(uiItem.accountNameText, "", settingsObject.language); - uiItem.wordsTextItem.memoText = wallet.seed + var wallet_filename = uiItem.walletPath + "/" + uiItem.accountNameText + if (typeof settingsObject.wallet === 'undefined') { + var wallet = walletManager.createWallet(wallet_filename, "", settingsObject.language) + uiItem.wordsTextItem.memoText = wallet.seed + // saving wallet in "global" settings object + // TODO: wallet should have a property pointing to the file where it stored or loaded from + settingsObject.wallet = wallet + } else { + print("wallet already created. we just stepping back"); + } + settingsObject.wallet_filename = wallet_filename } WizardManageWalletUI { diff --git a/wizard/WizardMain.qml b/wizard/WizardMain.qml index 5f51cec8..51e0baf3 100644 --- a/wizard/WizardMain.qml +++ b/wizard/WizardMain.qml @@ -67,6 +67,7 @@ Rectangle { function handlePageChanged() { var nextButtonVisible = pages[currentPage] !== optionsPage; nextButton.visible = nextButtonVisible; + print ("next button visible: " + nextButtonVisible); switch (pages[currentPage]) { case passwordPage: // disable "next" button until passwords match @@ -87,6 +88,7 @@ Rectangle { // nextButton.enabled = false; break default: + nextButton.enabled = true } diff --git a/wizard/WizardManageWalletUI.qml b/wizard/WizardManageWalletUI.qml index 6ea9ea44..ce035f0a 100644 --- a/wizard/WizardManageWalletUI.qml +++ b/wizard/WizardManageWalletUI.qml @@ -183,9 +183,10 @@ Item { FileDialog { id: fileDialog selectMultiple: false - title: "Please choose a file" + selectFolder: true + title: "Please choose a directory" onAccepted: { - fileUrlInput.text = fileDialog.fileUrl + fileUrlInput.text = fileDialog.folder fileDialog.visible = false } onRejected: {