diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -31,6 +31,7 @@ #include "rpc/server.h" #include "scheduler.h" #include "ui_interface.h" +#include "uint256.h" #include "util.h" #include "warnings.h" @@ -74,6 +75,7 @@ // Declare meta types used for QMetaObject::invokeMethod Q_DECLARE_METATYPE(bool *) Q_DECLARE_METATYPE(Amount) +Q_DECLARE_METATYPE(uint256) // Config is non-copyable so we can only register pointers to it Q_DECLARE_METATYPE(Config *) diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -60,6 +60,9 @@ const Amount watchUnconfBalance, const Amount watchImmatureBalance); +Q_SIGNALS: + void coinsSent(const uint256 &txid); + private: Ui::SendCoinsDialog *ui; ClientModel *clientModel; diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -411,6 +411,7 @@ accept(); CoinControlDialog::coinControl->UnSelectAll(); coinControlUpdateLabels(); + Q_EMIT coinsSent(currentTransaction.getTransaction()->GetId()); } fNewRecipientAllowed = true; } diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h --- a/src/qt/transactionview.h +++ b/src/qt/transactionview.h @@ -6,6 +6,7 @@ #define BITCOIN_QT_TRANSACTIONVIEW_H #include "guiutil.h" +#include "uint256.h" #include #include @@ -118,6 +119,7 @@ void changedAmount(const QString &amount); void exportClicked(); void focusTransaction(const QModelIndex &); + void focusTransaction(const uint256 &txid); }; #endif // BITCOIN_QT_TRANSACTIONVIEW_H diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -603,6 +603,36 @@ transactionView->setFocus(); } +void TransactionView::focusTransaction(const uint256 &txid) { + if (!transactionProxyModel) { + return; + } + + const QModelIndexList results = + this->model->getTransactionTableModel()->match( + this->model->getTransactionTableModel()->index(0, 0), + TransactionTableModel::TxHashRole, + QString::fromStdString(txid.ToString()), -1); + + transactionView->setFocus(); + transactionView->selectionModel()->clearSelection(); + for (const QModelIndex &index : results) { + const QModelIndex targetIndex = + transactionProxyModel->mapFromSource(index); + transactionView->selectionModel()->select( + targetIndex, + QItemSelectionModel::Rows | QItemSelectionModel::Select); + // Called once per destination to ensure all results are in view, unless + // transactions are not ordered by (ascending or descending) date. + transactionView->scrollTo(targetIndex); + // scrollTo() does not scroll far enough the first time when + // transactions are ordered by ascending date. + if (index == results[0]) { + transactionView->scrollTo(targetIndex); + } + } +} + // We override the virtual resizeEvent of the QWidget to adjust tables column // sizes as the tables width is proportional to the dialogs width. void TransactionView::resizeEvent(QResizeEvent *event) { diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -74,6 +74,10 @@ connect(overviewPage, SIGNAL(outOfSyncWarningClicked()), this, SLOT(requestedSyncWarningInfo())); + // Highlight transaction after send + connect(sendCoinsPage, SIGNAL(coinsSent(uint256)), transactionView, + SLOT(focusTransaction(uint256))); + // Double-clicking on a transaction on the transaction history page shows // details connect(transactionView, SIGNAL(doubleClicked(QModelIndex)), @@ -100,6 +104,10 @@ connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), gui, SLOT(gotoHistoryPage())); + // Navigate to transaction history page after send + connect(sendCoinsPage, SIGNAL(coinsSent(uint256)), gui, + SLOT(gotoHistoryPage())); + // Receive and report messages connect(this, SIGNAL(message(QString, QString, unsigned int)), gui, SLOT(message(QString, QString, unsigned int)));