diff --git a/contrib/bitcoin-qt.pro b/contrib/bitcoin-qt.pro
index b8133bf78..2e13d7013 100644
--- a/contrib/bitcoin-qt.pro
+++ b/contrib/bitcoin-qt.pro
@@ -11,8 +11,9 @@ FORMS += \
../src/qt/forms/overviewpage.ui \
../src/qt/forms/receivecoinsdialog.ui \
../src/qt/forms/receiverequestdialog.ui \
- ../src/qt/forms/debugwindow.ui \
../src/qt/forms/sendcoinsdialog.ui \
+ ../src/qt/forms/debugwindow.ui \
+ ../src/qt/forms/kevadialog.ui \
../src/qt/forms/sendcoinsentry.ui \
../src/qt/forms/signverifymessagedialog.ui \
../src/qt/forms/transactiondescdialog.ui \
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
index 1a473ac4b..efc149b0b 100644
--- a/src/Makefile.qt.include
+++ b/src/Makefile.qt.include
@@ -135,6 +135,7 @@ QT_FORMS_UI = \
qt/forms/overviewpage.ui \
qt/forms/receivecoinsdialog.ui \
qt/forms/receiverequestdialog.ui \
+ qt/forms/kevadialog.ui \
qt/forms/debugwindow.ui \
qt/forms/sendcoinsdialog.ui \
qt/forms/sendcoinsentry.ui \
@@ -184,7 +185,7 @@ QT_MOC_CPP = \
qt/moc_transactionfilterproxy.cpp \
qt/moc_transactiontablemodel.cpp \
qt/moc_transactionview.cpp \
- qt/moc_kevaview.cpp \
+ qt/moc_kevadialog.cpp \
qt/moc_utilitydialog.cpp \
qt/moc_walletframe.cpp \
qt/moc_walletmodel.cpp \
@@ -259,7 +260,7 @@ BITCOIN_QT_H = \
qt/transactionrecord.h \
qt/transactiontablemodel.h \
qt/transactionview.h \
- qt/kevaview.h \
+ qt/kevadialog.h \
qt/utilitydialog.h \
qt/walletframe.h \
qt/walletmodel.h \
@@ -374,7 +375,7 @@ BITCOIN_QT_WALLET_CPP = \
qt/transactionrecord.cpp \
qt/transactiontablemodel.cpp \
qt/transactionview.cpp \
- qt/kevaview.cpp \
+ qt/kevadialog.cpp \
qt/walletframe.cpp \
qt/walletmodel.cpp \
qt/walletmodeltransaction.cpp \
diff --git a/src/qt/forms/kevadialog.ui b/src/qt/forms/kevadialog.ui
new file mode 100644
index 000000000..8a986bc19
--- /dev/null
+++ b/src/qt/forms/kevadialog.ui
@@ -0,0 +1,375 @@
+
+
+ KevaDialog
+
+
+
+ 0
+ 0
+ 776
+ 396
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Sunken
+
+
+
-
+
+
-
+
+
+ An optional amount to request. Leave this empty or zero to not request a specific amount.
+
+
+ &Amount:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ reqAmount
+
+
+
+ -
+
+
+ An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Kevacoin network.
+
+
+ &Message:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ reqMessage
+
+
+
+ -
+
+
+ An optional label to associate with the new receiving address.
+
+
+
+ -
+
+
+ Use this form to request payments. All fields are <b>optional</b>.
+
+
+
+ -
+
+
+ An optional label to associate with the new receiving address.
+
+
+ &Label:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ reqLabel
+
+
+
+ -
+
+
+ An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Kevacoin network.
+
+
+
+ -
+
+
-
+
+
+
+ 150
+ 0
+
+
+
+ &Request payment
+
+
+
+ :/icons/receiving_addresses:/icons/receiving_addresses
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Clear all fields of the form.
+
+
+ Clear
+
+
+
+ :/icons/remove:/icons/remove
+
+
+ false
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 80
+ 0
+
+
+
+
+ 1000
+ 100
+
+
+
+ An optional amount to request. Leave this empty or zero to not request a specific amount.
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 1000
+ 16777215
+
+
+
+ Qt::StrongFocus
+
+
+ Native segwit addresses (aka Bech32 or BIP-173) reduce your transaction fees later on and offer better protection against typos, but old wallets don't support them. When unchecked, an address compatible with older wallets will be created instead.
+
+
+ Generate native segwit (Bech32) address
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 10
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
-
+
+
+
+ 75
+ true
+
+
+
+ Requested payments history
+
+
+
+ -
+
+
+ Qt::CustomContextMenu
+
+
+ false
+
+
+ true
+
+
+
+ -
+
+
-
+
+
+ false
+
+
+ Show the selected request (does the same as double clicking an entry)
+
+
+ Show
+
+
+
+ :/icons/edit:/icons/edit
+
+
+ false
+
+
+
+ -
+
+
+ false
+
+
+ Remove the selected entries from the list
+
+
+ Remove
+
+
+
+ :/icons/remove:/icons/remove
+
+
+ false
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BitcoinAmountField
+ QLineEdit
+
+ 1
+
+
+
+ reqLabel
+ reqAmount
+ useBech32
+ reqMessage
+ receiveButton
+ clearButton
+ recentRequestsView
+ showRequestButton
+ removeRequestButton
+
+
+
+
+
+
diff --git a/src/qt/kevadialog.cpp b/src/qt/kevadialog.cpp
new file mode 100644
index 000000000..c9ecaf0aa
--- /dev/null
+++ b/src/qt/kevadialog.cpp
@@ -0,0 +1,292 @@
+// Copyright (c) 2011-2017 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
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+KevaDialog::KevaDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::KevaDialog),
+ columnResizingFixer(0),
+ model(0),
+ platformStyle(_platformStyle)
+{
+ ui->setupUi(this);
+
+ if (!_platformStyle->getImagesOnButtons()) {
+ ui->clearButton->setIcon(QIcon());
+ ui->receiveButton->setIcon(QIcon());
+ ui->showRequestButton->setIcon(QIcon());
+ ui->removeRequestButton->setIcon(QIcon());
+ } else {
+ ui->clearButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
+ ui->receiveButton->setIcon(_platformStyle->SingleColorIcon(":/icons/receiving_addresses"));
+ ui->showRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/edit"));
+ ui->removeRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
+ }
+
+ // context menu actions
+ QAction *copyURIAction = new QAction(tr("Copy URI"), this);
+ QAction *copyLabelAction = new QAction(tr("Copy label"), this);
+ QAction *copyMessageAction = new QAction(tr("Copy message"), this);
+ QAction *copyAmountAction = new QAction(tr("Copy amount"), this);
+
+ // context menu
+ contextMenu = new QMenu(this);
+ contextMenu->addAction(copyURIAction);
+ contextMenu->addAction(copyLabelAction);
+ contextMenu->addAction(copyMessageAction);
+ contextMenu->addAction(copyAmountAction);
+
+ // context menu signals
+ connect(ui->recentRequestsView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint)));
+ connect(copyURIAction, SIGNAL(triggered()), this, SLOT(copyURI()));
+ connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel()));
+ connect(copyMessageAction, SIGNAL(triggered()), this, SLOT(copyMessage()));
+ connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount()));
+
+ connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
+}
+
+void KevaDialog::setModel(WalletModel *_model)
+{
+ this->model = _model;
+
+ if(_model && _model->getOptionsModel())
+ {
+ _model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder);
+ connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
+ updateDisplayUnit();
+
+ QTableView* tableView = ui->recentRequestsView;
+
+ tableView->verticalHeader()->hide();
+ tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ tableView->setModel(_model->getRecentRequestsTableModel());
+ tableView->setAlternatingRowColors(true);
+ tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
+ tableView->setSelectionMode(QAbstractItemView::ContiguousSelection);
+ tableView->setColumnWidth(RecentRequestsTableModel::Date, DATE_COLUMN_WIDTH);
+ tableView->setColumnWidth(RecentRequestsTableModel::Label, LABEL_COLUMN_WIDTH);
+ tableView->setColumnWidth(RecentRequestsTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
+
+ connect(tableView->selectionModel(),
+ SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this,
+ SLOT(recentRequestsView_selectionChanged(QItemSelection, QItemSelection)));
+ // Last 2 columns are set by the columnResizingFixer, when the table geometry is ready.
+ columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(tableView, AMOUNT_MINIMUM_COLUMN_WIDTH, DATE_COLUMN_WIDTH, this);
+
+ if (model->getDefaultAddressType() == OUTPUT_TYPE_BECH32) {
+ ui->useBech32->setCheckState(Qt::Checked);
+ } else {
+ ui->useBech32->setCheckState(Qt::Unchecked);
+ }
+ }
+}
+
+KevaDialog::~KevaDialog()
+{
+ delete ui;
+}
+
+void KevaDialog::clear()
+{
+ ui->reqAmount->clear();
+ ui->reqLabel->setText("");
+ ui->reqMessage->setText("");
+ updateDisplayUnit();
+}
+
+void KevaDialog::reject()
+{
+ clear();
+}
+
+void KevaDialog::accept()
+{
+ clear();
+}
+
+void KevaDialog::updateDisplayUnit()
+{
+ if(model && model->getOptionsModel())
+ {
+ ui->reqAmount->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
+ }
+}
+
+void KevaDialog::on_receiveButton_clicked()
+{
+ if(!model || !model->getOptionsModel() || !model->getAddressTableModel() || !model->getRecentRequestsTableModel())
+ return;
+
+ QString address;
+ QString label = ui->reqLabel->text();
+ /* Generate new receiving address */
+ OutputType address_type;
+ if (ui->useBech32->isChecked()) {
+ address_type = OUTPUT_TYPE_BECH32;
+ } else {
+ address_type = model->getDefaultAddressType();
+ if (address_type == OUTPUT_TYPE_BECH32) {
+ address_type = OUTPUT_TYPE_P2SH_SEGWIT;
+ }
+ }
+ address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, "", address_type);
+ SendCoinsRecipient info(address, label,
+ ui->reqAmount->value(), ui->reqMessage->text());
+ ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->setModel(model->getOptionsModel());
+ dialog->setInfo(info);
+ dialog->show();
+ clear();
+
+ /* Store request for later reference */
+ model->getRecentRequestsTableModel()->addNewRequest(info);
+}
+
+void KevaDialog::on_recentRequestsView_doubleClicked(const QModelIndex &index)
+{
+ const RecentRequestsTableModel *submodel = model->getRecentRequestsTableModel();
+ ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this);
+ dialog->setModel(model->getOptionsModel());
+ dialog->setInfo(submodel->entry(index.row()).recipient);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->show();
+}
+
+void KevaDialog::recentRequestsView_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
+{
+ // Enable Show/Remove buttons only if anything is selected.
+ bool enable = !ui->recentRequestsView->selectionModel()->selectedRows().isEmpty();
+ ui->showRequestButton->setEnabled(enable);
+ ui->removeRequestButton->setEnabled(enable);
+}
+
+void KevaDialog::on_showRequestButton_clicked()
+{
+ if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
+ return;
+ QModelIndexList selection = ui->recentRequestsView->selectionModel()->selectedRows();
+
+ for (const QModelIndex& index : selection) {
+ on_recentRequestsView_doubleClicked(index);
+ }
+}
+
+void KevaDialog::on_removeRequestButton_clicked()
+{
+ if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
+ return;
+ QModelIndexList selection = ui->recentRequestsView->selectionModel()->selectedRows();
+ if(selection.empty())
+ return;
+ // correct for selection mode ContiguousSelection
+ QModelIndex firstIndex = selection.at(0);
+ model->getRecentRequestsTableModel()->removeRows(firstIndex.row(), selection.length(), firstIndex.parent());
+}
+
+// We override the virtual resizeEvent of the QWidget to adjust tables column
+// sizes as the tables width is proportional to the dialogs width.
+void KevaDialog::resizeEvent(QResizeEvent *event)
+{
+ QWidget::resizeEvent(event);
+ columnResizingFixer->stretchColumnWidth(RecentRequestsTableModel::Message);
+}
+
+void KevaDialog::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_Return)
+ {
+ // press return -> submit form
+ if (ui->reqLabel->hasFocus() || ui->reqAmount->hasFocus() || ui->reqMessage->hasFocus())
+ {
+ event->ignore();
+ on_receiveButton_clicked();
+ return;
+ }
+ }
+
+ this->QDialog::keyPressEvent(event);
+}
+
+QModelIndex KevaDialog::selectedRow()
+{
+ if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
+ return QModelIndex();
+ QModelIndexList selection = ui->recentRequestsView->selectionModel()->selectedRows();
+ if(selection.empty())
+ return QModelIndex();
+ // correct for selection mode ContiguousSelection
+ QModelIndex firstIndex = selection.at(0);
+ return firstIndex;
+}
+
+// copy column of selected row to clipboard
+void KevaDialog::copyColumnToClipboard(int column)
+{
+ QModelIndex firstIndex = selectedRow();
+ if (!firstIndex.isValid()) {
+ return;
+ }
+ GUIUtil::setClipboard(model->getRecentRequestsTableModel()->data(firstIndex.child(firstIndex.row(), column), Qt::EditRole).toString());
+}
+
+// context menu
+void KevaDialog::showMenu(const QPoint &point)
+{
+ if (!selectedRow().isValid()) {
+ return;
+ }
+ contextMenu->exec(QCursor::pos());
+}
+
+// context menu action: copy URI
+void KevaDialog::copyURI()
+{
+ QModelIndex sel = selectedRow();
+ if (!sel.isValid()) {
+ return;
+ }
+
+ const RecentRequestsTableModel * const submodel = model->getRecentRequestsTableModel();
+ const QString uri = GUIUtil::formatBitcoinURI(submodel->entry(sel.row()).recipient);
+ GUIUtil::setClipboard(uri);
+}
+
+// context menu action: copy label
+void KevaDialog::copyLabel()
+{
+ copyColumnToClipboard(RecentRequestsTableModel::Label);
+}
+
+// context menu action: copy message
+void KevaDialog::copyMessage()
+{
+ copyColumnToClipboard(RecentRequestsTableModel::Message);
+}
+
+// context menu action: copy amount
+void KevaDialog::copyAmount()
+{
+ copyColumnToClipboard(RecentRequestsTableModel::Amount);
+}
diff --git a/src/qt/kevadialog.h b/src/qt/kevadialog.h
new file mode 100644
index 000000000..c0e571a7e
--- /dev/null
+++ b/src/qt/kevadialog.h
@@ -0,0 +1,80 @@
+// Copyright (c) 2011-2017 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_QT_KEVADIALOG_H
+#define BITCOIN_QT_KEVADIALOG_H
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+class PlatformStyle;
+class WalletModel;
+
+namespace Ui {
+ class KevaDialog;
+}
+
+QT_BEGIN_NAMESPACE
+class QModelIndex;
+QT_END_NAMESPACE
+
+/** Dialog for requesting payment of bitcoins */
+class KevaDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ enum ColumnWidths {
+ DATE_COLUMN_WIDTH = 130,
+ LABEL_COLUMN_WIDTH = 120,
+ AMOUNT_MINIMUM_COLUMN_WIDTH = 180,
+ MINIMUM_COLUMN_WIDTH = 130
+ };
+
+ explicit KevaDialog(const PlatformStyle *platformStyle, QWidget *parent = 0);
+ ~KevaDialog();
+
+ void setModel(WalletModel *model);
+
+public Q_SLOTS:
+ void clear();
+ void reject();
+ void accept();
+
+protected:
+ virtual void keyPressEvent(QKeyEvent *event);
+
+private:
+ Ui::KevaDialog *ui;
+ GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer;
+ WalletModel *model;
+ QMenu *contextMenu;
+ const PlatformStyle *platformStyle;
+
+ QModelIndex selectedRow();
+ void copyColumnToClipboard(int column);
+ virtual void resizeEvent(QResizeEvent *event);
+
+private Q_SLOTS:
+ void on_receiveButton_clicked();
+ void on_showRequestButton_clicked();
+ void on_removeRequestButton_clicked();
+ void on_recentRequestsView_doubleClicked(const QModelIndex &index);
+ void recentRequestsView_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+ void updateDisplayUnit();
+ void showMenu(const QPoint &point);
+ void copyURI();
+ void copyLabel();
+ void copyMessage();
+ void copyAmount();
+};
+
+#endif // BITCOIN_QT_KEVADIALOG_H
diff --git a/src/qt/kevaview.cpp b/src/qt/kevaview.cpp
deleted file mode 100644
index d01eeed49..000000000
--- a/src/qt/kevaview.cpp
+++ /dev/null
@@ -1,623 +0,0 @@
-// Copyright (c) 2011-2017 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
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-KevaView::KevaView(const PlatformStyle *platformStyle, QWidget *parent) :
- QWidget(parent), model(0), transactionProxyModel(0),
- kevaView(0), abandonAction(0), bumpFeeAction(0), columnResizingFixer(0)
-{
- // Build filter row
- setContentsMargins(0,0,0,0);
-
- QHBoxLayout *hlayout = new QHBoxLayout();
- hlayout->setContentsMargins(0,0,0,0);
-
- if (platformStyle->getUseExtraSpacing()) {
- hlayout->setSpacing(5);
- hlayout->addSpacing(26);
- } else {
- hlayout->setSpacing(0);
- hlayout->addSpacing(23);
- }
-
- watchOnlyWidget = new QComboBox(this);
- watchOnlyWidget->setFixedWidth(24);
- watchOnlyWidget->addItem("", TransactionFilterProxy::WatchOnlyFilter_All);
- watchOnlyWidget->addItem(platformStyle->SingleColorIcon(":/icons/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes);
- watchOnlyWidget->addItem(platformStyle->SingleColorIcon(":/icons/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No);
- hlayout->addWidget(watchOnlyWidget);
-
- dateWidget = new QComboBox(this);
- if (platformStyle->getUseExtraSpacing()) {
- dateWidget->setFixedWidth(121);
- } else {
- dateWidget->setFixedWidth(120);
- }
- dateWidget->addItem(tr("All"), All);
- dateWidget->addItem(tr("Today"), Today);
- dateWidget->addItem(tr("This week"), ThisWeek);
- dateWidget->addItem(tr("This month"), ThisMonth);
- dateWidget->addItem(tr("Last month"), LastMonth);
- dateWidget->addItem(tr("This year"), ThisYear);
- dateWidget->addItem(tr("Range..."), Range);
- hlayout->addWidget(dateWidget);
-
- typeWidget = new QComboBox(this);
- if (platformStyle->getUseExtraSpacing()) {
- typeWidget->setFixedWidth(121);
- } else {
- typeWidget->setFixedWidth(120);
- }
-
- typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES);
- typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) |
- TransactionFilterProxy::TYPE(TransactionRecord::RecvFromOther));
- typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) |
- TransactionFilterProxy::TYPE(TransactionRecord::SendToOther));
- typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf));
- typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated));
- typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other));
-
- hlayout->addWidget(typeWidget);
-
- search_widget = new QLineEdit(this);
-#if QT_VERSION >= 0x040700
- search_widget->setPlaceholderText(tr("Enter address, transaction id, or label to search"));
-#endif
- hlayout->addWidget(search_widget);
-
- amountWidget = new QLineEdit(this);
-#if QT_VERSION >= 0x040700
- amountWidget->setPlaceholderText(tr("Min amount"));
-#endif
- if (platformStyle->getUseExtraSpacing()) {
- amountWidget->setFixedWidth(97);
- } else {
- amountWidget->setFixedWidth(100);
- }
- amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this));
- hlayout->addWidget(amountWidget);
-
- // Delay before filtering transactions in ms
- static const int input_filter_delay = 200;
-
- QTimer* amount_typing_delay = new QTimer(this);
- amount_typing_delay->setSingleShot(true);
- amount_typing_delay->setInterval(input_filter_delay);
-
- QTimer* prefix_typing_delay = new QTimer(this);
- prefix_typing_delay->setSingleShot(true);
- prefix_typing_delay->setInterval(input_filter_delay);
-
- QVBoxLayout *vlayout = new QVBoxLayout(this);
- vlayout->setContentsMargins(0,0,0,0);
- vlayout->setSpacing(0);
-
- QTableView *view = new QTableView(this);
- vlayout->addLayout(hlayout);
- vlayout->addWidget(createDateRangeWidget());
- vlayout->addWidget(view);
- vlayout->setSpacing(0);
- int width = view->verticalScrollBar()->sizeHint().width();
- // Cover scroll bar width with spacing
- if (platformStyle->getUseExtraSpacing()) {
- hlayout->addSpacing(width+2);
- } else {
- hlayout->addSpacing(width);
- }
- // Always show scroll bar
- view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
- view->setTabKeyNavigation(false);
- view->setContextMenuPolicy(Qt::CustomContextMenu);
-
- view->installEventFilter(this);
-
- kevaView = view;
- kevaView->setObjectName("KevaView");
-
- // Actions
- abandonAction = new QAction(tr("Abandon transaction"), this);
- bumpFeeAction = new QAction(tr("Increase transaction fee"), this);
- bumpFeeAction->setObjectName("bumpFeeAction");
- QAction *copyAddressAction = new QAction(tr("Copy address"), this);
- QAction *copyLabelAction = new QAction(tr("Copy label"), this);
- QAction *copyAmountAction = new QAction(tr("Copy amount"), this);
- QAction *copyTxIDAction = new QAction(tr("Copy transaction ID"), this);
- QAction *copyTxHexAction = new QAction(tr("Copy raw transaction"), this);
- QAction *copyTxPlainText = new QAction(tr("Copy full transaction details"), this);
- QAction *editLabelAction = new QAction(tr("Edit label"), this);
- QAction *showDetailsAction = new QAction(tr("Show transaction details"), this);
-
- contextMenu = new QMenu(this);
- contextMenu->setObjectName("contextMenu");
- contextMenu->addAction(copyAddressAction);
- contextMenu->addAction(copyLabelAction);
- contextMenu->addAction(copyAmountAction);
- contextMenu->addAction(copyTxIDAction);
- contextMenu->addAction(copyTxHexAction);
- contextMenu->addAction(copyTxPlainText);
- contextMenu->addAction(showDetailsAction);
- contextMenu->addSeparator();
- contextMenu->addAction(bumpFeeAction);
- contextMenu->addAction(abandonAction);
- contextMenu->addAction(editLabelAction);
-
- mapperThirdPartyTxUrls = new QSignalMapper(this);
-
- // Connect actions
- connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString)));
-
- connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int)));
- connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int)));
- connect(watchOnlyWidget, SIGNAL(activated(int)), this, SLOT(chooseWatchonly(int)));
- connect(amountWidget, SIGNAL(textChanged(QString)), amount_typing_delay, SLOT(start()));
- connect(amount_typing_delay, SIGNAL(timeout()), this, SLOT(changedAmount()));
- connect(search_widget, SIGNAL(textChanged(QString)), prefix_typing_delay, SLOT(start()));
- connect(prefix_typing_delay, SIGNAL(timeout()), this, SLOT(changedSearch()));
-
- connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex)));
- connect(view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));
-
- connect(bumpFeeAction, SIGNAL(triggered()), this, SLOT(bumpFee()));
- connect(abandonAction, SIGNAL(triggered()), this, SLOT(abandonTx()));
- connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress()));
- connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel()));
- connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount()));
- connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID()));
- connect(copyTxHexAction, SIGNAL(triggered()), this, SLOT(copyTxHex()));
- connect(copyTxPlainText, SIGNAL(triggered()), this, SLOT(copyTxPlainText()));
- connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel()));
- connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails()));
-}
-
-void KevaView::setModel(WalletModel *_model)
-{
- this->model = _model;
- if(_model)
- {
- transactionProxyModel = new TransactionFilterProxy(this);
- transactionProxyModel->setSourceModel(_model->getTransactionTableModel());
- transactionProxyModel->setDynamicSortFilter(true);
- transactionProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
- transactionProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
-
- transactionProxyModel->setSortRole(Qt::EditRole);
-
- kevaView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- kevaView->setModel(transactionProxyModel);
- kevaView->setAlternatingRowColors(true);
- kevaView->setSelectionBehavior(QAbstractItemView::SelectRows);
- kevaView->setSelectionMode(QAbstractItemView::ExtendedSelection);
- kevaView->setSortingEnabled(true);
- kevaView->sortByColumn(TransactionTableModel::Date, Qt::DescendingOrder);
- kevaView->verticalHeader()->hide();
-
- kevaView->setColumnWidth(TransactionTableModel::Status, STATUS_COLUMN_WIDTH);
- kevaView->setColumnWidth(TransactionTableModel::Watchonly, WATCHONLY_COLUMN_WIDTH);
- kevaView->setColumnWidth(TransactionTableModel::Date, DATE_COLUMN_WIDTH);
- kevaView->setColumnWidth(TransactionTableModel::Type, TYPE_COLUMN_WIDTH);
- kevaView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH);
-
- columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(kevaView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH, this);
-
- if (_model->getOptionsModel())
- {
- // Add third party transaction URLs to context menu
- QStringList listUrls = _model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts);
- for (int i = 0; i < listUrls.size(); ++i)
- {
- QString host = QUrl(listUrls[i].trimmed(), QUrl::StrictMode).host();
- if (!host.isEmpty())
- {
- QAction *thirdPartyTxUrlAction = new QAction(host, this); // use host as menu item label
- if (i == 0)
- contextMenu->addSeparator();
- contextMenu->addAction(thirdPartyTxUrlAction);
- connect(thirdPartyTxUrlAction, SIGNAL(triggered()), mapperThirdPartyTxUrls, SLOT(map()));
- mapperThirdPartyTxUrls->setMapping(thirdPartyTxUrlAction, listUrls[i].trimmed());
- }
- }
- }
-
- // show/hide column Watch-only
- updateWatchOnlyColumn(_model->haveWatchOnly());
-
- // Watch-only signal
- connect(_model, SIGNAL(notifyWatchonlyChanged(bool)), this, SLOT(updateWatchOnlyColumn(bool)));
- }
-}
-
-void KevaView::chooseDate(int idx)
-{
- if(!transactionProxyModel)
- return;
- QDate current = QDate::currentDate();
- dateRangeWidget->setVisible(false);
- switch(dateWidget->itemData(idx).toInt())
- {
- case All:
- transactionProxyModel->setDateRange(
- TransactionFilterProxy::MIN_DATE,
- TransactionFilterProxy::MAX_DATE);
- break;
- case Today:
- transactionProxyModel->setDateRange(
- QDateTime(current),
- TransactionFilterProxy::MAX_DATE);
- break;
- case ThisWeek: {
- // Find last Monday
- QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1));
- transactionProxyModel->setDateRange(
- QDateTime(startOfWeek),
- TransactionFilterProxy::MAX_DATE);
-
- } break;
- case ThisMonth:
- transactionProxyModel->setDateRange(
- QDateTime(QDate(current.year(), current.month(), 1)),
- TransactionFilterProxy::MAX_DATE);
- break;
- case LastMonth:
- transactionProxyModel->setDateRange(
- QDateTime(QDate(current.year(), current.month(), 1).addMonths(-1)),
- QDateTime(QDate(current.year(), current.month(), 1)));
- break;
- case ThisYear:
- transactionProxyModel->setDateRange(
- QDateTime(QDate(current.year(), 1, 1)),
- TransactionFilterProxy::MAX_DATE);
- break;
- case Range:
- dateRangeWidget->setVisible(true);
- dateRangeChanged();
- break;
- }
-}
-
-void KevaView::chooseType(int idx)
-{
- if(!transactionProxyModel)
- return;
- transactionProxyModel->setTypeFilter(
- typeWidget->itemData(idx).toInt());
-}
-
-void KevaView::chooseWatchonly(int idx)
-{
- if(!transactionProxyModel)
- return;
- transactionProxyModel->setWatchOnlyFilter(
- (TransactionFilterProxy::WatchOnlyFilter)watchOnlyWidget->itemData(idx).toInt());
-}
-
-void KevaView::changedSearch()
-{
- if(!transactionProxyModel)
- return;
- transactionProxyModel->setSearchString(search_widget->text());
-}
-
-void KevaView::changedAmount()
-{
- if(!transactionProxyModel)
- return;
- CAmount amount_parsed = 0;
- if (BitcoinUnits::parse(model->getOptionsModel()->getDisplayUnit(), amountWidget->text(), &amount_parsed)) {
- transactionProxyModel->setMinAmount(amount_parsed);
- }
- else
- {
- transactionProxyModel->setMinAmount(0);
- }
-}
-
-void KevaView::exportClicked()
-{
- if (!model || !model->getOptionsModel()) {
- return;
- }
-
- // CSV is currently the only supported format
- QString filename = GUIUtil::getSaveFileName(this,
- tr("Export Transaction History"), QString(),
- tr("Comma separated file (*.csv)"), nullptr);
-
- if (filename.isNull())
- return;
-
- CSVModelWriter writer(filename);
-
- // name, column, role
- writer.setModel(transactionProxyModel);
- writer.addColumn(tr("Confirmed"), 0, TransactionTableModel::ConfirmedRole);
- if (model->haveWatchOnly())
- writer.addColumn(tr("Watch-only"), TransactionTableModel::Watchonly);
- writer.addColumn(tr("Date"), 0, TransactionTableModel::DateRole);
- writer.addColumn(tr("Type"), TransactionTableModel::Type, Qt::EditRole);
- writer.addColumn(tr("Label"), 0, TransactionTableModel::LabelRole);
- writer.addColumn(tr("Address"), 0, TransactionTableModel::AddressRole);
- writer.addColumn(BitcoinUnits::getAmountColumnTitle(model->getOptionsModel()->getDisplayUnit()), 0, TransactionTableModel::FormattedAmountRole);
- writer.addColumn(tr("ID"), 0, TransactionTableModel::TxIDRole);
-
- if(!writer.write()) {
- Q_EMIT message(tr("Exporting Failed"), tr("There was an error trying to save the transaction history to %1.").arg(filename),
- CClientUIInterface::MSG_ERROR);
- }
- else {
- Q_EMIT message(tr("Exporting Successful"), tr("The transaction history was successfully saved to %1.").arg(filename),
- CClientUIInterface::MSG_INFORMATION);
- }
-}
-
-void KevaView::contextualMenu(const QPoint &point)
-{
- QModelIndex index = kevaView->indexAt(point);
- QModelIndexList selection = kevaView->selectionModel()->selectedRows(0);
- if (selection.empty())
- return;
-
- // check if transaction can be abandoned, disable context menu action in case it doesn't
- uint256 hash;
- hash.SetHex(selection.at(0).data(TransactionTableModel::TxHashRole).toString().toStdString());
- abandonAction->setEnabled(model->transactionCanBeAbandoned(hash));
- bumpFeeAction->setEnabled(model->transactionCanBeBumped(hash));
-
- if(index.isValid())
- {
- contextMenu->popup(kevaView->viewport()->mapToGlobal(point));
- }
-}
-
-void KevaView::abandonTx()
-{
- if(!kevaView || !kevaView->selectionModel())
- return;
- QModelIndexList selection = kevaView->selectionModel()->selectedRows(0);
-
- // get the hash from the TxHashRole (QVariant / QString)
- uint256 hash;
- QString hashQStr = selection.at(0).data(TransactionTableModel::TxHashRole).toString();
- hash.SetHex(hashQStr.toStdString());
-
- // Abandon the wallet transaction over the walletModel
- model->abandonTransaction(hash);
-
- // Update the table
- model->getTransactionTableModel()->updateTransaction(hashQStr, CT_UPDATED, false);
-}
-
-void KevaView::bumpFee()
-{
- if(!kevaView || !kevaView->selectionModel())
- return;
- QModelIndexList selection = kevaView->selectionModel()->selectedRows(0);
-
- // get the hash from the TxHashRole (QVariant / QString)
- uint256 hash;
- QString hashQStr = selection.at(0).data(TransactionTableModel::TxHashRole).toString();
- hash.SetHex(hashQStr.toStdString());
-
- // Bump tx fee over the walletModel
- if (model->bumpFee(hash)) {
- // Update the table
- model->getTransactionTableModel()->updateTransaction(hashQStr, CT_UPDATED, true);
- }
-}
-
-void KevaView::copyAddress()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::AddressRole);
-}
-
-void KevaView::copyLabel()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::LabelRole);
-}
-
-void KevaView::copyAmount()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::FormattedAmountRole);
-}
-
-void KevaView::copyTxID()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::TxIDRole);
-}
-
-void KevaView::copyTxHex()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::TxHexRole);
-}
-
-void KevaView::copyTxPlainText()
-{
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::TxPlainTextRole);
-}
-
-void KevaView::editLabel()
-{
- if(!kevaView->selectionModel() ||!model)
- return;
- QModelIndexList selection = kevaView->selectionModel()->selectedRows();
- if(!selection.isEmpty())
- {
- AddressTableModel *addressBook = model->getAddressTableModel();
- if(!addressBook)
- return;
- QString address = selection.at(0).data(TransactionTableModel::AddressRole).toString();
- if(address.isEmpty())
- {
- // If this transaction has no associated address, exit
- return;
- }
- // Is address in address book? Address book can miss address when a transaction is
- // sent from outside the UI.
- int idx = addressBook->lookupAddress(address);
- if(idx != -1)
- {
- // Edit sending / receiving address
- QModelIndex modelIdx = addressBook->index(idx, 0, QModelIndex());
- // Determine type of address, launch appropriate editor dialog type
- QString type = modelIdx.data(AddressTableModel::TypeRole).toString();
-
- EditAddressDialog dlg(
- type == AddressTableModel::Receive
- ? EditAddressDialog::EditReceivingAddress
- : EditAddressDialog::EditSendingAddress, this);
- dlg.setModel(addressBook);
- dlg.loadRow(idx);
- dlg.exec();
- }
- else
- {
- // Add sending address
- EditAddressDialog dlg(EditAddressDialog::NewSendingAddress,
- this);
- dlg.setModel(addressBook);
- dlg.setAddress(address);
- dlg.exec();
- }
- }
-}
-
-void KevaView::showDetails()
-{
- if(!kevaView->selectionModel())
- return;
- QModelIndexList selection = kevaView->selectionModel()->selectedRows();
- if(!selection.isEmpty())
- {
- TransactionDescDialog *dlg = new TransactionDescDialog(selection.at(0));
- dlg->setAttribute(Qt::WA_DeleteOnClose);
- dlg->show();
- }
-}
-
-void KevaView::openThirdPartyTxUrl(QString url)
-{
- if(!kevaView || !kevaView->selectionModel())
- return;
- QModelIndexList selection = kevaView->selectionModel()->selectedRows(0);
- if(!selection.isEmpty())
- QDesktopServices::openUrl(QUrl::fromUserInput(url.replace("%s", selection.at(0).data(TransactionTableModel::TxHashRole).toString())));
-}
-
-QWidget *KevaView::createDateRangeWidget()
-{
- dateRangeWidget = new QFrame();
- dateRangeWidget->setFrameStyle(QFrame::Panel | QFrame::Raised);
- dateRangeWidget->setContentsMargins(1,1,1,1);
- QHBoxLayout *layout = new QHBoxLayout(dateRangeWidget);
- layout->setContentsMargins(0,0,0,0);
- layout->addSpacing(23);
- layout->addWidget(new QLabel(tr("Range:")));
-
- dateFrom = new QDateTimeEdit(this);
- dateFrom->setDisplayFormat("dd/MM/yy");
- dateFrom->setCalendarPopup(true);
- dateFrom->setMinimumWidth(100);
- dateFrom->setDate(QDate::currentDate().addDays(-7));
- layout->addWidget(dateFrom);
- layout->addWidget(new QLabel(tr("to")));
-
- dateTo = new QDateTimeEdit(this);
- dateTo->setDisplayFormat("dd/MM/yy");
- dateTo->setCalendarPopup(true);
- dateTo->setMinimumWidth(100);
- dateTo->setDate(QDate::currentDate());
- layout->addWidget(dateTo);
- layout->addStretch();
-
- // Hide by default
- dateRangeWidget->setVisible(false);
-
- // Notify on change
- connect(dateFrom, SIGNAL(dateChanged(QDate)), this, SLOT(dateRangeChanged()));
- connect(dateTo, SIGNAL(dateChanged(QDate)), this, SLOT(dateRangeChanged()));
-
- return dateRangeWidget;
-}
-
-void KevaView::dateRangeChanged()
-{
- if(!transactionProxyModel)
- return;
- transactionProxyModel->setDateRange(
- QDateTime(dateFrom->date()),
- QDateTime(dateTo->date()).addDays(1));
-}
-
-void KevaView::focusTransaction(const QModelIndex &idx)
-{
- if(!transactionProxyModel)
- return;
- QModelIndex targetIdx = transactionProxyModel->mapFromSource(idx);
- kevaView->scrollTo(targetIdx);
- kevaView->setCurrentIndex(targetIdx);
- kevaView->setFocus();
-}
-
-// We override the virtual resizeEvent of the QWidget to adjust tables column
-// sizes as the tables width is proportional to the dialogs width.
-void KevaView::resizeEvent(QResizeEvent* event)
-{
- QWidget::resizeEvent(event);
- columnResizingFixer->stretchColumnWidth(TransactionTableModel::ToAddress);
-}
-
-// Need to override default Ctrl+C action for amount as default behaviour is just to copy DisplayRole text
-bool KevaView::eventFilter(QObject *obj, QEvent *event)
-{
- if (event->type() == QEvent::KeyPress)
- {
- QKeyEvent *ke = static_cast(event);
- if (ke->key() == Qt::Key_C && ke->modifiers().testFlag(Qt::ControlModifier))
- {
- GUIUtil::copyEntryData(kevaView, 0, TransactionTableModel::TxPlainTextRole);
- return true;
- }
- }
- return QWidget::eventFilter(obj, event);
-}
-
-// show/hide column Watch-only
-void KevaView::updateWatchOnlyColumn(bool fHaveWatchOnly)
-{
- watchOnlyWidget->setVisible(fHaveWatchOnly);
- kevaView->setColumnHidden(TransactionTableModel::Watchonly, !fHaveWatchOnly);
-}
diff --git a/src/qt/kevaview.h b/src/qt/kevaview.h
deleted file mode 100644
index dfffeec2a..000000000
--- a/src/qt/kevaview.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2011-2017 The Bitcoin Core developers
-// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#ifndef BITCOIN_QT_KevaView_H
-#define BITCOIN_QT_KevaView_H
-
-#include
-
-#include
-#include
-
-class PlatformStyle;
-class TransactionFilterProxy;
-class WalletModel;
-
-QT_BEGIN_NAMESPACE
-class QComboBox;
-class QDateTimeEdit;
-class QFrame;
-class QLineEdit;
-class QMenu;
-class QModelIndex;
-class QSignalMapper;
-class QTableView;
-QT_END_NAMESPACE
-
-/** Widget showing the transaction list for a wallet, including a filter row.
- Using the filter row, the user can view or export a subset of the transactions.
- */
-class KevaView : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit KevaView(const PlatformStyle *platformStyle, QWidget *parent = 0);
-
- void setModel(WalletModel *model);
-
- // Date ranges for filter
- enum DateEnum
- {
- All,
- Today,
- ThisWeek,
- ThisMonth,
- LastMonth,
- ThisYear,
- Range
- };
-
- enum ColumnWidths {
- STATUS_COLUMN_WIDTH = 30,
- WATCHONLY_COLUMN_WIDTH = 23,
- DATE_COLUMN_WIDTH = 120,
- TYPE_COLUMN_WIDTH = 113,
- AMOUNT_MINIMUM_COLUMN_WIDTH = 120,
- MINIMUM_COLUMN_WIDTH = 23
- };
-
-private:
- WalletModel *model;
- TransactionFilterProxy *transactionProxyModel;
- QTableView *kevaView;
-
- QComboBox *dateWidget;
- QComboBox *typeWidget;
- QComboBox *watchOnlyWidget;
- QLineEdit *search_widget;
- QLineEdit *amountWidget;
-
- QMenu *contextMenu;
- QSignalMapper *mapperThirdPartyTxUrls;
-
- QFrame *dateRangeWidget;
- QDateTimeEdit *dateFrom;
- QDateTimeEdit *dateTo;
- QAction *abandonAction;
- QAction *bumpFeeAction;
-
- QWidget *createDateRangeWidget();
-
- GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer;
-
- virtual void resizeEvent(QResizeEvent* event);
-
- bool eventFilter(QObject *obj, QEvent *event);
-
-private Q_SLOTS:
- void contextualMenu(const QPoint &);
- void dateRangeChanged();
- void showDetails();
- void copyAddress();
- void editLabel();
- void copyLabel();
- void copyAmount();
- void copyTxID();
- void copyTxHex();
- void copyTxPlainText();
- void openThirdPartyTxUrl(QString url);
- void updateWatchOnlyColumn(bool fHaveWatchOnly);
- void abandonTx();
- void bumpFee();
-
-Q_SIGNALS:
- void doubleClicked(const QModelIndex&);
-
- /** Fired when a message should be reported to the user */
- void message(const QString &title, const QString &message, unsigned int style);
-
-public Q_SLOTS:
- void chooseDate(int idx);
- void chooseType(int idx);
- void chooseWatchonly(int idx);
- void changedAmount();
- void changedSearch();
- void exportClicked();
- void focusTransaction(const QModelIndex&);
-
-};
-
-#endif // BITCOIN_QT_KevaView_H
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index 86ae7aa2c..4e6d17222 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -304,17 +304,17 @@
BitcoinGUI
-
+
Sign &message...
Sign &message...
-
+
Synchronizing with network...
Synchronizing with network...
-
+
&Overview
&Overview
@@ -349,7 +349,7 @@
-
+
E&xit
E&xit
@@ -419,7 +419,7 @@
-
+
Click to disable network activity.
@@ -444,12 +444,12 @@
Reindexing blocks on disk...
-
+
Send coins to a Kevacoin address
Send coins to a Kevacoin address
-
+
Backup wallet to another location
Backup wallet to another location
@@ -474,12 +474,12 @@
&Verify message...
-
+
Kevacoin
Kevacoin
-
+
Wallet
Wallet
@@ -494,7 +494,7 @@
&Receive
-
+
&Show / Hide
&Show / Hide
@@ -539,12 +539,12 @@
Tabs toolbar
-
+
Request payments (generates QR codes and kevacoin: URIs)
-
+
Show the list of used sending addresses and labels
@@ -564,7 +564,7 @@
-
+
%n active connection(s) to Kevacoin network
%n active connection to Kevacoin network
@@ -625,7 +625,7 @@
Up to date
-
+
Show the %1 help message to get a list with possible Kevacoin command-line options
@@ -635,7 +635,7 @@
-
+
Connecting to peers...
@@ -1159,6 +1159,316 @@
+
+ KevaDialog
+
+
+
+ An optional amount to request. Leave this empty or zero to not request a specific amount.
+
+
+
+
+ &Amount:
+
+
+
+
+
+ An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Kevacoin network.
+
+
+
+
+ &Message:
+
+
+
+
+
+ An optional label to associate with the new receiving address.
+
+
+
+
+ Use this form to request payments. All fields are <b>optional</b>.
+
+
+
+
+ &Label:
+ &Label:
+
+
+
+ &Request payment
+
+
+
+
+ Clear all fields of the form.
+
+
+
+
+ Clear
+
+
+
+
+ Native segwit addresses (aka Bech32 or BIP-173) reduce your transaction fees later on and offer better protection against typos, but old wallets don't support them. When unchecked, an address compatible with older wallets will be created instead.
+
+
+
+
+ Generate native segwit (Bech32) address
+
+
+
+
+ Requested payments history
+
+
+
+
+ Show the selected request (does the same as double clicking an entry)
+
+
+
+
+ Show
+
+
+
+
+ Remove the selected entries from the list
+
+
+
+
+ Remove
+
+
+
+
+ Copy URI
+
+
+
+
+ Copy label
+
+
+
+
+ Copy message
+
+
+
+
+ Copy amount
+
+
+
+
+ KevaView
+
+
+
+ All
+
+
+
+
+ Today
+
+
+
+
+ This week
+
+
+
+
+ This month
+
+
+
+
+ Last month
+
+
+
+
+ This year
+
+
+
+
+ Range...
+
+
+
+
+ Received with
+
+
+
+
+ Sent to
+
+
+
+
+ To yourself
+
+
+
+
+ Mined
+
+
+
+
+ Other
+
+
+
+
+ Enter address, transaction id, or label to search
+
+
+
+
+ Min amount
+
+
+
+
+ Abandon transaction
+
+
+
+
+ Increase transaction fee
+
+
+
+
+ Copy address
+
+
+
+
+ Copy label
+
+
+
+
+ Copy amount
+
+
+
+
+ Copy transaction ID
+
+
+
+
+ Copy raw transaction
+
+
+
+
+ Copy full transaction details
+
+
+
+
+ Edit label
+
+
+
+
+ Show transaction details
+
+
+
+
+ Export Transaction History
+
+
+
+
+ Comma separated file (*.csv)
+
+
+
+
+ Confirmed
+ Confirmed
+
+
+
+ Watch-only
+
+
+
+
+ Date
+ Date
+
+
+
+ Type
+
+
+
+
+ Label
+
+
+
+
+ Address
+
+
+
+
+ ID
+
+
+
+
+ Exporting Failed
+
+
+
+
+ There was an error trying to save the transaction history to %1.
+
+
+
+
+ Exporting Successful
+
+
+
+
+ The transaction history was successfully saved to %1.
+
+
+
+
+ Range:
+
+
+
+
+ to
+
+
+
ModalOverlay
@@ -3944,7 +4254,7 @@
WalletView
-
+
&Export
&Export
@@ -3954,7 +4264,7 @@
Export the data in the current tab to a file
-
+
Backup Wallet
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index ae3ac8f71..5d2abe771 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -9,7 +9,7 @@
#include
#include
#include
-#include
+#include
#include
#include
#include
diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp
index cc30ba29d..b0bb15935 100644
--- a/src/qt/walletview.cpp
+++ b/src/qt/walletview.cpp
@@ -14,10 +14,10 @@
#include
#include
#include
+#include
#include
#include
#include
-#include
#include
#include
@@ -54,25 +54,7 @@ WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent):
vbox->addLayout(hbox_buttons);
transactionsPage->setLayout(vbox);
-#if 1
-{
- kevaPage = new QWidget(this);
- QVBoxLayout *vbox = new QVBoxLayout();
- QHBoxLayout *hbox_buttons = new QHBoxLayout();
- kevaView = new KevaView(platformStyle, this);
- vbox->addWidget(kevaView);
- QPushButton *exportButton = new QPushButton(tr("&Export"), this);
- exportButton->setToolTip(tr("Export the data in the current tab to a file"));
- if (platformStyle->getImagesOnButtons()) {
- exportButton->setIcon(platformStyle->SingleColorIcon(":/icons/export"));
- }
- hbox_buttons->addStretch();
- hbox_buttons->addWidget(exportButton);
- vbox->addLayout(hbox_buttons);
- kevaPage->setLayout(vbox);
-}
-#endif
-
+ kevaPage = new KevaDialog(platformStyle);
receiveCoinsPage = new ReceiveCoinsDialog(platformStyle);
sendCoinsPage = new SendCoinsDialog(platformStyle);
@@ -140,7 +122,7 @@ void WalletView::setWalletModel(WalletModel *_walletModel)
// Put transaction list in tabs
transactionView->setModel(_walletModel);
- kevaView->setModel(_walletModel);
+ kevaPage->setModel(_walletModel);
overviewPage->setWalletModel(_walletModel);
receiveCoinsPage->setModel(_walletModel);
sendCoinsPage->setModel(_walletModel);
diff --git a/src/qt/walletview.h b/src/qt/walletview.h
index 784dbefd6..d810a110a 100644
--- a/src/qt/walletview.h
+++ b/src/qt/walletview.h
@@ -15,9 +15,9 @@ class OverviewPage;
class PlatformStyle;
class ReceiveCoinsDialog;
class SendCoinsDialog;
+class KevaDialog;
class SendCoinsRecipient;
class TransactionView;
-class KevaView;
class WalletModel;
class AddressBookPage;
@@ -61,16 +61,14 @@ private:
OverviewPage *overviewPage;
QWidget *transactionsPage;
- QWidget *kevaPage;
ReceiveCoinsDialog *receiveCoinsPage;
SendCoinsDialog *sendCoinsPage;
+ KevaDialog *kevaPage;
AddressBookPage *usedSendingAddressesPage;
AddressBookPage *usedReceivingAddressesPage;
TransactionView *transactionView;
- KevaView *kevaView;
-
QProgressDialog *progressDialog;
const PlatformStyle *platformStyle;