25#include <QApplication> 
   27#include <QDateTimeEdit> 
   28#include <QDesktopServices> 
   29#include <QDoubleValidator> 
   44    : QWidget(parent), m_platform_style{platformStyle}
 
   47    setContentsMargins(0,0,0,0);
 
   49    QHBoxLayout *hlayout = 
new QHBoxLayout();
 
   50    hlayout->setContentsMargins(0,0,0,0);
 
   53        hlayout->setSpacing(5);
 
   54        hlayout->addSpacing(26);
 
   56        hlayout->setSpacing(0);
 
   57        hlayout->addSpacing(23);
 
   93    search_widget->setPlaceholderText(tr(
"Enter address, transaction id, or label to search"));
 
  103    QDoubleValidator *amountValidator = 
new QDoubleValidator(0, 1e20, 8, 
this);
 
  104    QLocale amountLocale(QLocale::C);
 
  105    amountLocale.setNumberOptions(QLocale::RejectGroupSeparator);
 
  106    amountValidator->setLocale(amountLocale);
 
  111    static constexpr auto input_filter_delay{200ms};
 
  113    QTimer* amount_typing_delay = 
new QTimer(
this);
 
  114    amount_typing_delay->setSingleShot(
true);
 
  115    amount_typing_delay->setInterval(input_filter_delay);
 
  117    QTimer* prefix_typing_delay = 
new QTimer(
this);
 
  118    prefix_typing_delay->setSingleShot(
true);
 
  119    prefix_typing_delay->setInterval(input_filter_delay);
 
  121    QVBoxLayout *vlayout = 
new QVBoxLayout(
this);
 
  122    vlayout->setContentsMargins(0,0,0,0);
 
  123    vlayout->setSpacing(0);
 
  127    vlayout->addLayout(hlayout);
 
  130    vlayout->setSpacing(0);
 
  134        hlayout->addSpacing(width+2);
 
  136        hlayout->addSpacing(width);
 
  144    transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
  149    if (!
transactionView->horizontalHeader()->restoreState(settings.value(
"TransactionViewHeaderState-2025").toByteArray())) {
 
  176    connect(
amountWidget, &QLineEdit::textChanged, amount_typing_delay, qOverload<>(&QTimer::start));
 
  178    connect(
search_widget, &QLineEdit::textChanged, prefix_typing_delay, qOverload<>(&QTimer::start));
 
  196    settings.setValue(
"TransactionViewHeaderState-2025", 
transactionView->horizontalHeader()->saveState());
 
  201    this->
model = _model;
 
  217            bool actions_created = 
false;
 
  218            for (
int i = 0; i < listUrls.size(); ++i)
 
  220                QString 
url = listUrls[i].trimmed();
 
  221                QString host = QUrl(
url, QUrl::StrictMode).host();
 
  224                    if (!actions_created) {
 
  226                        actions_created = 
true;
 
  240    QWidget::changeEvent(e);
 
  246    QDate current = QDate::currentDate();
 
  262        QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
 
  327        tr(
"Export Transaction History"), QString(),
 
  330        tr(
"Comma separated file") + QLatin1String(
" (*.csv)"), 
nullptr);
 
  332    if (filename.isNull())
 
  347    if(!writer.
write()) {
 
  348        Q_EMIT 
message(tr(
"Exporting Failed"), tr(
"There was an error trying to save the transaction history to %1.").arg(filename),
 
  352        Q_EMIT 
message(tr(
"Exporting Successful"), tr(
"The transaction history was successfully saved to %1.").arg(filename),
 
  360    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows(0);
 
  361    if (selection.empty())
 
  366    std::optional<Txid> maybeHash = 
Txid::FromHex(hashQStr.toStdString());
 
  370    Txid hash = *maybeHash;
 
  376    if (index.isValid()) {
 
  385    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows(0);
 
  399    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows(0);
 
  412        qApp->processEvents();
 
  451    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows();
 
  452    if(!selection.isEmpty())
 
  458        if(address.isEmpty())
 
  469            QModelIndex modelIdx = addressBook->
index(idx, 0, QModelIndex());
 
  477            dlg->setModel(addressBook);
 
  486            dlg->setModel(addressBook);
 
  487            dlg->setAddress(address);
 
  497    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows();
 
  498    if(!selection.isEmpty())
 
  501        dlg->setAttribute(Qt::WA_DeleteOnClose);
 
  503        connect(dlg, &QObject::destroyed, [
this, dlg] {
 
  514    QModelIndexList selection = 
transactionView->selectionModel()->selectedRows(0);
 
  515    if(!selection.isEmpty())
 
  522    dateRangeWidget->setFrameStyle(
static_cast<int>(QFrame::Panel) | 
static_cast<int>(QFrame::Raised));
 
  525    layout->setContentsMargins(0,0,0,0);
 
  526    layout->addSpacing(23);
 
  527    layout->addWidget(
new QLabel(tr(
"Range:")));
 
  530    dateFrom->setDisplayFormat(
"dd/MM/yy");
 
  533    dateFrom->setDate(QDate::currentDate().addDays(-7));
 
  535    layout->addWidget(
new QLabel(tr(
"to")));
 
  537    dateTo = 
new QDateTimeEdit(
this);
 
  538    dateTo->setDisplayFormat(
"dd/MM/yy");
 
  539    dateTo->setCalendarPopup(
true);
 
  540    dateTo->setMinimumWidth(100);
 
  541    dateTo->setDate(QDate::currentDate());
 
  542    layout->addWidget(
dateTo);
 
  543    layout->addStretch();
 
  582        QString::fromStdString(txid.
ToString()), -1);
 
  586    for (
const QModelIndex& index : results) {
 
  590            QItemSelectionModel::Rows | QItemSelectionModel::Select);
 
  603    if (event->type() == QEvent::KeyPress)
 
  605        QKeyEvent *ke = 
static_cast<QKeyEvent *
>(event);
 
  606        if (ke->key() == Qt::Key_C && ke->modifiers().testFlag(Qt::ControlModifier))
 
  612    if (event->type() == QEvent::EnabledChange) {
 
  617    return QWidget::eventFilter(obj, event);
 
int64_t CAmount
Amount in satoshis (Can be negative)
Qt model of the address book in the core.
@ TypeRole
Type of address (Send or Receive)
int lookupAddress(const QString &address) const
QVariant data(const QModelIndex &index, int role) const override
QModelIndex index(int row, int column, const QModelIndex &parent) const override
static const QString Receive
Specifies receive address.
static QString getAmountColumnTitle(Unit unit)
Gets title for amount column including current display unit if optionsModel reference available */.
static bool parse(Unit unit, const QString &value, CAmount *val_out)
Parse string to coin amount.
@ MSG_INFORMATION
Predefined combinations for certain default usage cases.
Export a Qt table model to a CSV file.
bool write()
Perform export of the model to CSV.
void setModel(const QAbstractItemModel *model)
void addColumn(const QString &title, int column, int role=Qt::EditRole)
Dialog for editing an address and associated information.
BitcoinUnit getDisplayUnit() const
QString getThirdPartyTxUrls() const
Dialog showing transaction details.
Filter the transaction list according to pre-specified rules.
void setMinAmount(const CAmount &minimum)
void setDateRange(const std::optional< QDateTime > &from, const std::optional< QDateTime > &to)
Filter transactions between date range.
static const quint32 ALL_TYPES
Type filter bit field (all types)
static quint32 TYPE(int type)
void setSearchString(const QString &)
void setTypeFilter(quint32 modes)
@ TxPlainTextRole
Whole transaction as plain text.
@ LabelRole
Label of address related to transaction.
@ DateRole
Date and time this transaction was created.
@ TxHashRole
Transaction hash.
@ TxHexRole
Transaction data, hex-encoded.
@ AddressRole
Address of transaction.
@ ConfirmedRole
Is transaction confirmed?
@ FormattedAmountRole
Formatted amount, without brackets when unconfirmed.
void updateTransaction(const QString &hash, int status, bool showTransaction)
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void closeOpenedDialogs()
void bumpedFee(const Txid &txid)
void bumpFee(bool checked)
TransactionView(const PlatformStyle *platformStyle, QWidget *parent=nullptr)
QLineEdit * search_widget
bool eventFilter(QObject *obj, QEvent *event) override
QList< TransactionDescDialog * > m_opened_dialogs
@ AMOUNT_MINIMUM_COLUMN_WIDTH
QWidget * createDateRangeWidget()
void setModel(WalletModel *model)
void message(const QString &title, const QString &message, unsigned int style)
Fired when a message should be reported to the user.
void changeEvent(QEvent *e) override
TransactionFilterProxy * transactionProxyModel
QTableView * transactionView
void focusTransaction(const QModelIndex &)
void contextualMenu(const QPoint &)
QAction * copyAddressAction
void openThirdPartyTxUrl(QString url)
QAction * copyLabelAction
void doubleClicked(const QModelIndex &)
Interface to Bitcoin wallet from Qt view code.
bool bumpFee(Txid hash, Txid &new_hash)
AddressTableModel * getAddressTableModel() const
TransactionTableModel * getTransactionTableModel() const
interfaces::Wallet & wallet() const
OptionsModel * getOptionsModel() const
virtual bool abandonTransaction(const Txid &txid)=0
Abandon transaction.
virtual bool transactionCanBeAbandoned(const Txid &txid)=0
Return whether transaction can be abandoned.
virtual bool transactionCanBeBumped(const Txid &txid)=0
Return whether transaction can be bumped.
std::string ToString() const
static std::optional< transaction_identifier > FromHex(std::string_view hex)
void PopupMenu(QMenu *menu, const QPoint &point, QAction *at_action)
Call QMenu::popup() only on supported QT_QPA_PLATFORM.
void ShowModalDialogAsynchronously(QDialog *dialog)
Shows a QDialog instance asynchronously, and deletes it on close.
void copyEntryData(const QAbstractItemView *view, int column, int role)
Copy a field of the currently selected entry of a view to the clipboard.
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
QDateTime StartOfDay(const QDate &date)
Returns the start-moment of the day in local time.
auto ExceptionSafeConnect(Sender sender, Signal signal, Receiver receiver, Slot method, Qt::ConnectionType type=Qt::AutoConnection)
A drop-in replacement of QObject::connect function (see: https://doc.qt.io/qt-5/qobject....
bool hasEntryData(const QAbstractItemView *view, int column, int role)
Returns true if the specified field of the currently selected view entry is not empty.