diff --git a/src/ContactsWidget.cpp b/src/ContactsWidget.cpp index a4616e0..c43a4b6 100644 --- a/src/ContactsWidget.cpp +++ b/src/ContactsWidget.cpp @@ -24,8 +24,8 @@ ContactsWidget::ContactsWidget(QSharedPointer ctx, QWidget *parent) ui->contacts->setModel(m_proxyModel); ui->contacts->setSortingEnabled(true); - ui->contacts->header()->setSectionResizeMode(AddressBookModel::Address, QHeaderView::Stretch); - ui->contacts->header()->setSectionResizeMode(AddressBookModel::Description, QHeaderView::ResizeToContents); + ui->contacts->header()->setSectionResizeMode(AddressBookModel::Address, QHeaderView::ResizeToContents); + ui->contacts->header()->setSectionResizeMode(AddressBookModel::Description, QHeaderView::Stretch); ui->contacts->header()->setMinimumSectionSize(200); // header context menu @@ -36,6 +36,12 @@ ContactsWidget::ContactsWidget(QSharedPointer ctx, QWidget *parent) connect(ui->contacts->header(), &QHeaderView::customContextMenuRequested, this, &ContactsWidget::showHeaderMenu); + connect(ui->contacts, &QTreeView::doubleClicked, [this](QModelIndex index){ + if (!(m_model->flags(index) & Qt::ItemIsEditable)) { + this->payTo(); + } + }); + // context menu ui->contacts->setContextMenuPolicy(Qt::CustomContextMenu); m_contextMenu = new QMenu(ui->contacts); @@ -45,8 +51,7 @@ ContactsWidget::ContactsWidget(QSharedPointer ctx, QWidget *parent) // row context menu m_rowMenu = new QMenu(ui->contacts); - m_rowMenu->addAction(icons()->icon("copy.png"), "Copy address", this, &ContactsWidget::copyAddress); - m_rowMenu->addAction(icons()->icon("copy.png"), "Copy name", this, &ContactsWidget::copyName); + m_rowMenu->addAction("Copy address", this, &ContactsWidget::copyAddress); m_rowMenu->addAction("Pay to", this, &ContactsWidget::payTo); m_rowMenu->addAction("Delete", this, &ContactsWidget::deleteContact); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 8e6fd3f..c612164 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -701,6 +701,10 @@ void MainWindow::showSeedDialog() { return; } + if (!this->verifyPassword()) { + return; + } + SeedDialog dialog{m_ctx, this}; dialog.exec(); } @@ -772,6 +776,10 @@ void MainWindow::showRestoreHeightDialog() { } void MainWindow::showKeysDialog() { + if (!this->verifyPassword()) { + return; + } + KeysDialog dialog{m_ctx, this}; dialog.exec(); } @@ -1557,6 +1565,22 @@ void MainWindow::updateRecentlyOpenedMenu() { ui->menuRecently_open->addAction(m_clearRecentlyOpenAction); } +bool MainWindow::verifyPassword() { + bool ok; + while (true) { + QString password = QInputDialog::getText(this, "Enter password", "Please enter your password:", QLineEdit::EchoMode::Password, "", &ok); + if (!ok) { // Dialog cancelled + return false; + } + if (password != m_ctx->wallet->getPassword()) { + QMessageBox::warning(this, "Error", "Incorrect password"); + continue; + } + break; + } + return true; +} + void MainWindow::toggleSearchbar(bool visible) { config()->set(Config::showSearchbar, visible); diff --git a/src/MainWindow.h b/src/MainWindow.h index b83f0a1..6def9dd 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -212,6 +212,7 @@ private: void addToRecentlyOpened(const QString &filename); void updateRecentlyOpenedMenu(); void updateWidgetIcons(); + bool verifyPassword(); QIcon hardwareDevicePairedIcon(); QIcon hardwareDeviceUnpairedIcon(); diff --git a/src/assets/nodes.json b/src/assets/nodes.json index 2ca37fc..181fda8 100644 --- a/src/assets/nodes.json +++ b/src/assets/nodes.json @@ -14,6 +14,7 @@ "node-1.sethsimmons.me:18089", "selsta1.featherwallet.net:18081", "selsta2.featherwallet.net:18081", + "node.monerooutreach.org:18081", "xmr-node-eu.cakewallet.com:18081", "xmr-node-usa-east.cakewallet.com:18081", "canada.node.xmr.pm:18089", diff --git a/src/dialog/TxInfoDialog.cpp b/src/dialog/TxInfoDialog.cpp index d873530..69576e7 100644 --- a/src/dialog/TxInfoDialog.cpp +++ b/src/dialog/TxInfoDialog.cpp @@ -43,21 +43,21 @@ TxInfoDialog::TxInfoDialog(QSharedPointer ctx, TransactionInfo *txIn } else { ui->btn_rebroadcastTx->hide(); } - - if (txInfo->direction() == TransactionInfo::Direction_Out) { - // TODO: this will not properly represent coinjoin-like transactions. - QVector coins = m_ctx->wallet->coins()->coins_from_txid(m_txid); - QTextCursor c_i = ui->inputs->textCursor(); - QString inputs_str; - for (const auto &coin : coins) { - inputs_str += QString("%1 %2\n").arg(coin->pubKey(), coin->displayAmount()); - } - ui->inputs->setText(inputs_str); - ui->label_inputs->setText(QString("Inputs (%1)").arg(QString::number(coins.size()))); - this->adjustHeight(ui->inputs, coins.size()); - } else { - ui->frameInputs->hide(); - } +// +// if (txInfo->direction() == TransactionInfo::Direction_Out) { +// // TODO: this will not properly represent coinjoin-like transactions. +// QVector coins = m_ctx->wallet->coins()->coins_from_txid(m_txid); +// QTextCursor c_i = ui->inputs->textCursor(); +// QString inputs_str; +// for (const auto &coin : coins) { +// inputs_str += QString("%1 %2\n").arg(coin->pubKey(), coin->displayAmount()); +// } +// ui->inputs->setText(inputs_str); +// ui->label_inputs->setText(QString("Inputs (%1)").arg(QString::number(coins.size()))); +// this->adjustHeight(ui->inputs, coins.size()); +// } else { + ui->frameInputs->hide(); +// } QTextCursor cursor = ui->outputs->textCursor(); diff --git a/src/model/AddressBookModel.h b/src/model/AddressBookModel.h index 7157c6d..0257bcb 100644 --- a/src/model/AddressBookModel.h +++ b/src/model/AddressBookModel.h @@ -16,8 +16,8 @@ class AddressBookModel : public QAbstractTableModel public: enum ModelColumn { - Address = 0, - Description, + Description = 0, + Address, COUNT }; diff --git a/src/qrcode_scanner/QrCodeScanDialog.cpp b/src/qrcode_scanner/QrCodeScanDialog.cpp index 2980f5c..1dd78b3 100644 --- a/src/qrcode_scanner/QrCodeScanDialog.cpp +++ b/src/qrcode_scanner/QrCodeScanDialog.cpp @@ -22,10 +22,15 @@ QrCodeScanDialog::QrCodeScanDialog(QWidget *parent) if (m_cameras.count() < 1) { QMessageBox::warning(parent, "QR code scanner", "No available cameras found."); this->close(); + return; } for (const auto &camera : m_cameras) { +#ifdef Q_OS_WIN + ui->combo_camera->addItem(camera.description()); +#else ui->combo_camera->addItem(camera.deviceName()); +#endif } connect(ui->combo_camera, QOverload::of(&QComboBox::currentIndexChanged), this, &QrCodeScanDialog::onCameraSwitched);