25 #include <QApplication>
27 #include <QDateTimeEdit>
28 #include <QDesktopServices>
29 #include <QDoubleValidator>
30 #include <QHBoxLayout>
31 #include <QHeaderView>
41 #include <QVBoxLayout>
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);
52 if (platformStyle->getUseExtraSpacing()) {
53 hlayout->setSpacing(5);
54 hlayout->addSpacing(26);
56 hlayout->setSpacing(0);
57 hlayout->addSpacing(23);
60 watchOnlyWidget =
new QComboBox(
this);
61 watchOnlyWidget->setFixedWidth(24);
65 hlayout->addWidget(watchOnlyWidget);
67 dateWidget =
new QComboBox(
this);
68 if (platformStyle->getUseExtraSpacing()) {
69 dateWidget->setFixedWidth(121);
71 dateWidget->setFixedWidth(120);
73 dateWidget->addItem(tr(
"All"),
All);
74 dateWidget->addItem(tr(
"Today"), Today);
75 dateWidget->addItem(tr(
"This week"), ThisWeek);
76 dateWidget->addItem(tr(
"This month"), ThisMonth);
77 dateWidget->addItem(tr(
"Last month"), LastMonth);
78 dateWidget->addItem(tr(
"This year"), ThisYear);
79 dateWidget->addItem(tr(
"Range…"), Range);
80 hlayout->addWidget(dateWidget);
82 typeWidget =
new QComboBox(
this);
83 if (platformStyle->getUseExtraSpacing()) {
84 typeWidget->setFixedWidth(121);
86 typeWidget->setFixedWidth(120);
98 hlayout->addWidget(typeWidget);
100 search_widget =
new QLineEdit(
this);
101 search_widget->setPlaceholderText(tr(
"Enter address, transaction id, or label to search"));
102 hlayout->addWidget(search_widget);
104 amountWidget =
new QLineEdit(
this);
105 amountWidget->setPlaceholderText(tr(
"Min amount"));
106 if (platformStyle->getUseExtraSpacing()) {
107 amountWidget->setFixedWidth(97);
109 amountWidget->setFixedWidth(100);
111 QDoubleValidator *amountValidator =
new QDoubleValidator(0, 1e20, 8,
this);
112 QLocale amountLocale(QLocale::C);
113 amountLocale.setNumberOptions(QLocale::RejectGroupSeparator);
114 amountValidator->setLocale(amountLocale);
115 amountWidget->setValidator(amountValidator);
116 hlayout->addWidget(amountWidget);
119 static constexpr
auto input_filter_delay{200ms};
121 QTimer* amount_typing_delay =
new QTimer(
this);
122 amount_typing_delay->setSingleShot(
true);
123 amount_typing_delay->setInterval(input_filter_delay);
125 QTimer* prefix_typing_delay =
new QTimer(
this);
126 prefix_typing_delay->setSingleShot(
true);
127 prefix_typing_delay->setInterval(input_filter_delay);
129 QVBoxLayout *vlayout =
new QVBoxLayout(
this);
130 vlayout->setContentsMargins(0,0,0,0);
131 vlayout->setSpacing(0);
133 transactionView =
new QTableView(
this);
134 transactionView->setObjectName(
"transactionView");
135 vlayout->addLayout(hlayout);
136 vlayout->addWidget(createDateRangeWidget());
137 vlayout->addWidget(transactionView);
138 vlayout->setSpacing(0);
139 int width = transactionView->verticalScrollBar()->sizeHint().width();
141 if (platformStyle->getUseExtraSpacing()) {
142 hlayout->addSpacing(width+2);
144 hlayout->addSpacing(width);
146 transactionView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
147 transactionView->setTabKeyNavigation(
false);
148 transactionView->setContextMenuPolicy(Qt::CustomContextMenu);
149 transactionView->installEventFilter(
this);
150 transactionView->setAlternatingRowColors(
true);
151 transactionView->setSelectionBehavior(QAbstractItemView::SelectRows);
152 transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection);
153 transactionView->setSortingEnabled(
true);
154 transactionView->verticalHeader()->hide();
157 if (!transactionView->horizontalHeader()->restoreState(settings.value(
"TransactionViewHeaderState").toByteArray())) {
163 transactionView->horizontalHeader()->setMinimumSectionSize(MINIMUM_COLUMN_WIDTH);
164 transactionView->horizontalHeader()->setStretchLastSection(
true);
167 contextMenu =
new QMenu(
this);
168 contextMenu->setObjectName(
"contextMenu");
176 contextMenu->addSeparator();
177 bumpFeeAction = contextMenu->addAction(tr(
"Increase transaction &fee"));
179 bumpFeeAction->setObjectName(
"bumpFeeAction");
186 connect(amountWidget, &QLineEdit::textChanged, amount_typing_delay, qOverload<>(&QTimer::start));
188 connect(search_widget, &QLineEdit::textChanged, prefix_typing_delay, qOverload<>(&QTimer::start));
198 focusTransaction(txid);
205 settings.setValue(
"TransactionViewHeaderState",
transactionView->horizontalHeader()->saveState());
210 this->
model = _model;
226 bool actions_created =
false;
227 for (
int i = 0; i < listUrls.size(); ++i)
229 QString
url = listUrls[i].trimmed();
230 QString host = QUrl(
url, QUrl::StrictMode).host();
233 if (!actions_created) {
235 actions_created =
true;
255 if (e->type() == QEvent::PaletteChange) {
264 QWidget::changeEvent(e);
270 QDate current = QDate::currentDate();
286 QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
359 tr(
"Export Transaction History"), QString(),
362 tr(
"Comma separated file") + QLatin1String(
" (*.csv)"),
nullptr);
364 if (filename.isNull())
381 if(!writer.
write()) {
382 Q_EMIT
message(tr(
"Exporting Failed"), tr(
"There was an error trying to save the transaction history to %1.").arg(filename),
386 Q_EMIT
message(tr(
"Exporting Successful"), tr(
"The transaction history was successfully saved to %1.").arg(filename),
394 QModelIndexList selection =
transactionView->selectionModel()->selectedRows(0);
395 if (selection.empty())
406 if (
index.isValid()) {
415 QModelIndexList selection =
transactionView->selectionModel()->selectedRows(0);
420 hash.
SetHex(hashQStr.toStdString());
433 QModelIndexList selection =
transactionView->selectionModel()->selectedRows(0);
438 hash.
SetHex(hashQStr.toStdString());
447 qApp->processEvents();
486 QModelIndexList selection =
transactionView->selectionModel()->selectedRows();
487 if(!selection.isEmpty())
493 if(address.isEmpty())
504 QModelIndex modelIdx = addressBook->
index(idx, 0, QModelIndex());
512 dlg->setModel(addressBook);
521 dlg->setModel(addressBook);
522 dlg->setAddress(address);
532 QModelIndexList selection =
transactionView->selectionModel()->selectedRows();
533 if(!selection.isEmpty())
536 dlg->setAttribute(Qt::WA_DeleteOnClose);
545 QModelIndexList selection =
transactionView->selectionModel()->selectedRows(0);
546 if(!selection.isEmpty())
556 layout->setContentsMargins(0,0,0,0);
557 layout->addSpacing(23);
558 layout->addWidget(
new QLabel(tr(
"Range:")));
561 dateFrom->setDisplayFormat(
"dd/MM/yy");
564 dateFrom->setDate(QDate::currentDate().addDays(-7));
566 layout->addWidget(
new QLabel(tr(
"to")));
568 dateTo =
new QDateTimeEdit(
this);
569 dateTo->setDisplayFormat(
"dd/MM/yy");
570 dateTo->setCalendarPopup(
true);
571 dateTo->setMinimumWidth(100);
572 dateTo->setDate(QDate::currentDate());
573 layout->addWidget(
dateTo);
574 layout->addStretch();
613 QString::fromStdString(txid.
ToString()), -1);
617 for (
const QModelIndex&
index : results) {
621 QItemSelectionModel::Rows | QItemSelectionModel::Select);
634 if (event->type() == QEvent::KeyPress)
636 QKeyEvent *ke =
static_cast<QKeyEvent *
>(event);
637 if (ke->key() == Qt::Key_C && ke->modifiers().testFlag(Qt::ControlModifier))
643 return QWidget::eventFilter(obj, event);