Changeset View
Changeset View
Standalone View
Standalone View
src/qt/walletcontroller.cpp
Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | if (!m_wallets.empty()) { | ||||
return wallet_model; | return wallet_model; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// Instantiate model and register it. | // Instantiate model and register it. | ||||
WalletModel *wallet_model = new WalletModel( | WalletModel *wallet_model = new WalletModel( | ||||
std::move(wallet), m_node, m_platform_style, m_options_model, nullptr); | std::move(wallet), m_node, m_platform_style, m_options_model, nullptr); | ||||
// Handler callback runs in a different thread so fix wallet model thread | |||||
// affinity. | |||||
wallet_model->moveToThread(thread()); | |||||
wallet_model->setParent(this); | |||||
m_wallets.push_back(wallet_model); | m_wallets.push_back(wallet_model); | ||||
connect(wallet_model, &WalletModel::unload, [this, wallet_model] { | connect(wallet_model, &WalletModel::unload, [this, wallet_model] { | ||||
// Defer removeAndDeleteWallet when no modal widget is active. | // Defer removeAndDeleteWallet when no modal widget is active. | ||||
// TODO: remove this workaround by removing usage of QDiallog::exec. | // TODO: remove this workaround by removing usage of QDiallog::exec. | ||||
if (QApplication::activeModalWidget()) { | if (QApplication::activeModalWidget()) { | ||||
connect( | connect( | ||||
qApp, &QApplication::focusWindowChanged, wallet_model, | qApp, &QApplication::focusWindowChanged, wallet_model, | ||||
[this, wallet_model]() { | [this, wallet_model]() { | ||||
if (!QApplication::activeModalWidget()) { | if (!QApplication::activeModalWidget()) { | ||||
removeAndDeleteWallet(wallet_model); | removeAndDeleteWallet(wallet_model); | ||||
} | } | ||||
}, | }, | ||||
Qt::QueuedConnection); | Qt::QueuedConnection); | ||||
} else { | } else { | ||||
removeAndDeleteWallet(wallet_model); | removeAndDeleteWallet(wallet_model); | ||||
} | } | ||||
}); | }); | ||||
// Re-emit coinsSent signal from wallet model. | // Re-emit coinsSent signal from wallet model. | ||||
connect(wallet_model, &WalletModel::coinsSent, this, | connect(wallet_model, &WalletModel::coinsSent, this, | ||||
&WalletController::coinsSent); | &WalletController::coinsSent); | ||||
// Notify walletAdded signal on the GUI thread. | // Notify walletAdded signal on the GUI thread. | ||||
if (QThread::currentThread() == thread()) { | Q_EMIT walletAdded(wallet_model); | ||||
addWallet(wallet_model); | |||||
} else { | |||||
// Handler callback runs in a different thread so fix wallet model | |||||
// thread affinity. | |||||
wallet_model->moveToThread(thread()); | |||||
bool invoked = | |||||
QMetaObject::invokeMethod(this, "addWallet", Qt::QueuedConnection, | |||||
Q_ARG(WalletModel *, wallet_model)); | |||||
assert(invoked); | |||||
} | |||||
return 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) { | void WalletController::removeAndDeleteWallet(WalletModel *wallet_model) { | ||||
// Unregister wallet model. | // Unregister wallet model. | ||||
{ | { | ||||
QMutexLocker locker(&m_mutex); | QMutexLocker locker(&m_mutex); | ||||
m_wallets.erase( | m_wallets.erase( | ||||
std::remove(m_wallets.begin(), m_wallets.end(), wallet_model)); | std::remove(m_wallets.begin(), m_wallets.end(), wallet_model)); | ||||
} | } | ||||
Q_EMIT walletRemoved(wallet_model); | Q_EMIT walletRemoved(wallet_model); | ||||
Show All 27 Lines |