mirror of
				https://git.wownero.com/wowlet/wowlet.git
				synced 2024-08-15 01:03:14 +00:00 
			
		
		
		
	Merge pull request 'Contacts: disallow duplicates' (#254) from tobtoht/feather:contacts_duplicates into master
Reviewed-on: https://git.wownero.com/feather/feather/pulls/254
This commit is contained in:
		
						commit
						b51e1f3b0c
					
				
					 6 changed files with 55 additions and 32 deletions
				
			
		| 
						 | 
				
			
			@ -5,17 +5,17 @@
 | 
			
		|||
#include "ui_contactswidget.h"
 | 
			
		||||
#include "dialog/contactsdialog.h"
 | 
			
		||||
#include "model/ModelUtils.h"
 | 
			
		||||
#include "utils/utils.h"
 | 
			
		||||
#include "mainwindow.h"
 | 
			
		||||
#include "libwalletqt/AddressBook.h"
 | 
			
		||||
 | 
			
		||||
#include <QClipboard>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QKeyEvent>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
 | 
			
		||||
ContactsWidget::ContactsWidget(QWidget *parent) :
 | 
			
		||||
    QWidget(parent),
 | 
			
		||||
    ui(new Ui::ContactsWidget)
 | 
			
		||||
{
 | 
			
		||||
    ui->setupUi(this);
 | 
			
		||||
    m_ctx = MainWindow::getContext();
 | 
			
		||||
 | 
			
		||||
    // header context menu
 | 
			
		||||
    ui->contacts->header()->setContextMenuPolicy(Qt::CustomContextMenu);
 | 
			
		||||
| 
						 | 
				
			
			@ -28,15 +28,16 @@ ContactsWidget::ContactsWidget(QWidget *parent) :
 | 
			
		|||
    // context menu
 | 
			
		||||
    ui->contacts->setContextMenuPolicy(Qt::CustomContextMenu);
 | 
			
		||||
    m_contextMenu = new QMenu(ui->contacts);
 | 
			
		||||
    m_contextMenu->addAction(QIcon(":/assets/images/person.svg"), "New contact", this, &ContactsWidget::newContact);
 | 
			
		||||
 | 
			
		||||
    m_contextMenu->addAction(QIcon(":/assets/images/person.svg"), "New contact", [this]{
 | 
			
		||||
        this->newContact();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // row context menu
 | 
			
		||||
    m_rowMenu = new QMenu(ui->contacts);
 | 
			
		||||
    m_rowMenu->addAction(QIcon(":/assets/images/copy.png"), "Copy address", this, &ContactsWidget::copyAddress);
 | 
			
		||||
    m_rowMenu->addAction(QIcon(":/assets/images/copy.png"), "Copy name", this, &ContactsWidget::copyName);
 | 
			
		||||
    m_rowMenu->addAction(QIcon(":/assets/images/appicons/128x128.png"), "Pay to", this, &ContactsWidget::payTo);
 | 
			
		||||
    m_deleteEntryAction = m_rowMenu->addAction("Delete", this, &ContactsWidget::deleteContact);
 | 
			
		||||
    m_rowMenu->addAction("Pay to", this, &ContactsWidget::payTo);
 | 
			
		||||
    m_rowMenu->addAction("Delete", this, &ContactsWidget::deleteContact);
 | 
			
		||||
 | 
			
		||||
    connect(ui->contacts, &QTreeView::customContextMenuRequested, [=](const QPoint & point){
 | 
			
		||||
        QModelIndex index = ui->contacts->indexAt(point);
 | 
			
		||||
| 
						 | 
				
			
			@ -95,16 +96,44 @@ void ContactsWidget::showHeaderMenu(const QPoint& position)
 | 
			
		|||
    m_headerMenu->exec(QCursor::pos());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ContactsWidget::newContact()
 | 
			
		||||
void ContactsWidget::newContact(QString address, QString name)
 | 
			
		||||
{
 | 
			
		||||
    auto * dialog = new ContactsDialog(this);
 | 
			
		||||
    auto * dialog = new ContactsDialog(this, address, name);
 | 
			
		||||
    int ret = dialog->exec();
 | 
			
		||||
    if (!ret) return;
 | 
			
		||||
 | 
			
		||||
    QString address = dialog->getAddress();
 | 
			
		||||
    QString name = dialog->getName();
 | 
			
		||||
    address = dialog->getAddress();
 | 
			
		||||
    name = dialog->getName();
 | 
			
		||||
 | 
			
		||||
    emit addContact(address, name);
 | 
			
		||||
    bool addressValid = WalletManager::addressValid(address, m_ctx->currentWallet->nettype());
 | 
			
		||||
    if (!addressValid) {
 | 
			
		||||
        QMessageBox::warning(this, "Invalid address", "Invalid address");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int num_addresses = m_ctx->currentWallet->addressBook()->count();
 | 
			
		||||
    QString address_entry;
 | 
			
		||||
    QString name_entry;
 | 
			
		||||
    for (int i=0; i<num_addresses; i++) {
 | 
			
		||||
        m_ctx->currentWallet->addressBook()->getRow(i, [&address_entry, &name_entry](const AddressBookInfo &entry){
 | 
			
		||||
            address_entry = entry.address();
 | 
			
		||||
            name_entry = entry.description();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (address == address_entry) {
 | 
			
		||||
            QMessageBox::warning(this, "Unable to add contact", "Duplicate address");
 | 
			
		||||
            ui->contacts->setCurrentIndex(m_model->index(i,0)); // Highlight duplicate address
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (name == name_entry) {
 | 
			
		||||
            QMessageBox::warning(this, "Unable to add contact", "Duplicate label");
 | 
			
		||||
            this->newContact(address, name);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    m_ctx->currentWallet->addressBook()->addRow(address, "", name);
 | 
			
		||||
    m_ctx->storeWallet();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ContactsWidget::deleteContact()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@
 | 
			
		|||
 | 
			
		||||
#include "model/AddressBookModel.h"
 | 
			
		||||
#include "model/AddressBookProxyModel.h"
 | 
			
		||||
#include "appcontext.h"
 | 
			
		||||
 | 
			
		||||
#include <QWidget>
 | 
			
		||||
#include <QMenu>
 | 
			
		||||
| 
						 | 
				
			
			@ -21,29 +22,28 @@ class ContactsWidget : public QWidget
 | 
			
		|||
public:
 | 
			
		||||
    explicit ContactsWidget(QWidget *parent = nullptr);
 | 
			
		||||
    void setModel(AddressBookModel * model);
 | 
			
		||||
    ~ContactsWidget();
 | 
			
		||||
    ~ContactsWidget() override;
 | 
			
		||||
 | 
			
		||||
public slots:
 | 
			
		||||
    void copyAddress();
 | 
			
		||||
    void copyName();
 | 
			
		||||
    void payTo();
 | 
			
		||||
    void newContact();
 | 
			
		||||
    void newContact(QString address = "", QString name = "");
 | 
			
		||||
    void deleteContact();
 | 
			
		||||
    void setShowFullAddresses(bool show);
 | 
			
		||||
    void setSearchFilter(const QString &filter);
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
    void addContact(QString &address, QString &name);
 | 
			
		||||
    void fillAddress(QString &address);
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
    void showHeaderMenu(const QPoint& position);
 | 
			
		||||
    void showHeaderMenu(const QPoint &position);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Ui::ContactsWidget *ui;
 | 
			
		||||
    AppContext *m_ctx;
 | 
			
		||||
 | 
			
		||||
    QAction *m_showFullAddressesAction;
 | 
			
		||||
    QAction *m_deleteEntryAction;
 | 
			
		||||
    QMenu *m_rowMenu;
 | 
			
		||||
    QMenu *m_contextMenu;
 | 
			
		||||
    QMenu *m_headerMenu;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,13 +4,19 @@
 | 
			
		|||
#include "ui_contactsdialog.h"
 | 
			
		||||
#include "contactsdialog.h"
 | 
			
		||||
 | 
			
		||||
ContactsDialog::ContactsDialog(QWidget *parent)
 | 
			
		||||
ContactsDialog::ContactsDialog(QWidget *parent, const QString &address, const QString &name)
 | 
			
		||||
    : QDialog(parent)
 | 
			
		||||
    , ui(new Ui::ContactsDialog)
 | 
			
		||||
{
 | 
			
		||||
    ui->setupUi(this);
 | 
			
		||||
    setMinimumWidth(400);
 | 
			
		||||
 | 
			
		||||
    ui->lineEdit_address->setText(address);
 | 
			
		||||
    ui->lineEdit_name->setText(name);
 | 
			
		||||
    if (!name.isEmpty()) {
 | 
			
		||||
        ui->lineEdit_name->setFocus();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    connect(ui->buttonBox, &QDialogButtonBox::accepted, [&](){
 | 
			
		||||
        m_address = ui->lineEdit_address->text();
 | 
			
		||||
        m_name = ui->lineEdit_name->text();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ class ContactsDialog : public QDialog
 | 
			
		|||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit ContactsDialog(QWidget *parent = nullptr);
 | 
			
		||||
    explicit ContactsDialog(QWidget *parent = nullptr, const QString &address = "", const QString &name = "");
 | 
			
		||||
    ~ContactsDialog() override;
 | 
			
		||||
 | 
			
		||||
    QString getAddress();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -289,7 +289,6 @@ MainWindow::MainWindow(AppContext *ctx, QWidget *parent) :
 | 
			
		|||
    connect(ui->historyWidget, &HistoryWidget::resendTransaction, this, &MainWindow::onResendTransaction);
 | 
			
		||||
 | 
			
		||||
    // Contacts
 | 
			
		||||
    connect(ui->contactWidget, &ContactsWidget::addContact, this, &MainWindow::onAddContact);
 | 
			
		||||
    connect(ui->contactWidget, &ContactsWidget::fillAddress, ui->sendWidget, &SendWidget::fillAddress);
 | 
			
		||||
 | 
			
		||||
    // Open alias
 | 
			
		||||
| 
						 | 
				
			
			@ -1055,16 +1054,6 @@ void MainWindow::onResendTransaction(const QString &txid) {
 | 
			
		|||
    dialog->deleteLater();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::onAddContact(const QString &address, const QString &name) {
 | 
			
		||||
    bool addressValid = WalletManager::addressValid(address, m_ctx->currentWallet->nettype());
 | 
			
		||||
    if (!addressValid)
 | 
			
		||||
        QMessageBox::warning(this, "Invalid address", "Invalid address");
 | 
			
		||||
    else {
 | 
			
		||||
        m_ctx->currentWallet->addressBook()->addRow(address, "", name);
 | 
			
		||||
        m_ctx->storeWallet();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::importContacts() {
 | 
			
		||||
    const QString targetFile = QFileDialog::getOpenFileName(this, "Import CSV file", QDir::homePath(), "CSV Files (*.csv)");
 | 
			
		||||
    if(targetFile.isEmpty()) return;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,7 +118,6 @@ public slots:
 | 
			
		|||
    void onWalletOpenPasswordRequired(bool invalidPassword, const QString &path);
 | 
			
		||||
    void onViewOnBlockExplorer(const QString &txid);
 | 
			
		||||
    void onResendTransaction(const QString &txid);
 | 
			
		||||
    void onAddContact(const QString &address, const QString &name);
 | 
			
		||||
    void importContacts();
 | 
			
		||||
    void showRestoreHeightDialog();
 | 
			
		||||
    void importTransaction();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue