forked from dashpay/dash
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge bitcoin#15101: gui: Add WalletController
0dd9bde gui: Refactor to use WalletController (João Barbosa) 8fa271f gui: Add WalletController (João Barbosa) cefb399 gui: Use AutoConnection for WalletModel::unload signal (João Barbosa) Pull request description: This PR is a subset of the work done in the context of bitcoin#13100. This change consists in extracting from the application class the code that manages the wallet models. The role of the `WalletController` instance is to coordinate wallet operations and the window. Tree-SHA512: 6a824054376730eb7d16c643dd2003f5f60778e8ad3af707b82bc12c48438db179ca4446316b28fb17b206f4b9aba8998419aab8c5dd1f7c32467015732b5094
- Loading branch information
1 parent
14c0d1e
commit 68ad472
Showing
8 changed files
with
200 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
// Copyright (c) 2019 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include <qt/walletcontroller.h> | ||
|
||
#include <interfaces/handler.h> | ||
#include <interfaces/node.h> | ||
|
||
#include <algorithm> | ||
|
||
#include <QMutexLocker> | ||
#include <QThread> | ||
|
||
WalletController::WalletController(interfaces::Node& node, OptionsModel* options_model, QObject* parent) | ||
: QObject(parent) | ||
, m_node(node) | ||
, m_options_model(options_model) | ||
{ | ||
m_handler_load_wallet = m_node.handleLoadWallet([this](std::unique_ptr<interfaces::Wallet> wallet) { | ||
getOrCreateWallet(std::move(wallet)); | ||
}); | ||
|
||
for (std::unique_ptr<interfaces::Wallet>& wallet : m_node.getWallets()) { | ||
getOrCreateWallet(std::move(wallet)); | ||
} | ||
} | ||
|
||
// Not using the default destructor because not all member types definitions are | ||
// available in the header, just forward declared. | ||
WalletController::~WalletController() {} | ||
|
||
std::vector<WalletModel*> WalletController::getWallets() const | ||
{ | ||
QMutexLocker locker(&m_mutex); | ||
return m_wallets; | ||
} | ||
|
||
WalletModel* WalletController::getOrCreateWallet(std::unique_ptr<interfaces::Wallet> wallet) | ||
{ | ||
QMutexLocker locker(&m_mutex); | ||
|
||
// Return model instance if exists. | ||
if (!m_wallets.empty()) { | ||
std::string name = wallet->getWalletName(); | ||
for (WalletModel* wallet_model : m_wallets) { | ||
if (wallet_model->wallet().getWalletName() == name) { | ||
return wallet_model; | ||
} | ||
} | ||
} | ||
|
||
// Instantiate model and register it. | ||
WalletModel* wallet_model = new WalletModel(std::move(wallet), m_node, m_options_model, nullptr); | ||
m_wallets.push_back(wallet_model); | ||
|
||
connect(wallet_model, &WalletModel::unload, [this, wallet_model] { | ||
removeAndDeleteWallet(wallet_model); | ||
}); | ||
|
||
// Re-emit coinsSent signal from wallet model. | ||
connect(wallet_model, &WalletModel::coinsSent, this, &WalletController::coinsSent); | ||
|
||
// Notify walletAdded signal on the GUI thread. | ||
if (QThread::currentThread() == thread()) { | ||
addWallet(wallet_model); | ||
} else { | ||
// Handler callback runs in a different thread so fix wallet model thread affinity. | ||
wallet_model->moveToThread(thread()); | ||
QMetaObject::invokeMethod(this, "addWallet", Qt::QueuedConnection, Q_ARG(WalletModel*, wallet_model)); | ||
} | ||
|
||
return wallet_model; | ||
} | ||
|
||
void WalletController::addWallet(WalletModel* wallet_model) | ||
{ | ||
// Take ownership of the wallet model and register it. | ||
wallet_model->setParent(this); | ||
Q_EMIT walletAdded(wallet_model); | ||
} | ||
|
||
void WalletController::removeAndDeleteWallet(WalletModel* wallet_model) | ||
{ | ||
// Unregister wallet model. | ||
{ | ||
QMutexLocker locker(&m_mutex); | ||
m_wallets.erase(std::remove(m_wallets.begin(), m_wallets.end(), wallet_model)); | ||
} | ||
Q_EMIT walletRemoved(wallet_model); | ||
// Currently this can trigger the unload since the model can hold the last | ||
// CWallet shared pointer. | ||
delete wallet_model; | ||
} |
Oops, something went wrong.