123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- // ECOin - Copyright (c) - 2014/2024 - GPLv3 - epsylon@riseup.net (https://03c8.net)
- #include "addressbookpage.h"
- #include "ui_addressbookpage.h"
- #include "addresstablemodel.h"
- #include "optionsmodel.h"
- #include "ecoingui.h"
- #include "editaddressdialog.h"
- #include "csvmodelwriter.h"
- #include "guiutil.h"
- #include <QSortFilterProxyModel>
- #include <QClipboard>
- #include <QMessageBox>
- #include <QMenu>
- #include <QString>
- #include <QUrl>
- #ifdef USE_QRCODE
- #include "qrcodedialog.h"
- #endif
- AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
- QDialog(parent),
- ui(new Ui::AddressBookPage),
- model(0),
- optionsModel(0),
- mode(mode),
- tab(tab)
- {
- ui->setupUi(this);
- #ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
- ui->newAddressButton->setIcon(QIcon());
- ui->copyToClipboard->setIcon(QIcon());
- ui->deleteButton->setIcon(QIcon());
- #endif
- #ifndef USE_QRCODE
- ui->showQRCode->setVisible(false);
- #endif
- switch(mode)
- {
- case ForSending:
- connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
- ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
- ui->tableView->setFocus();
- break;
- case ForEditing:
- ui->buttonBox->setVisible(false);
- break;
- }
- switch(tab)
- {
- case SendingTab:
- ui->labelExplanation->setVisible(false);
- ui->deleteButton->setVisible(true);
- ui->signMessage->setVisible(false);
- break;
- case ReceivingTab:
- ui->deleteButton->setVisible(false);
- ui->signMessage->setVisible(true);
- break;
- }
- // Context menu actions
- QAction *copyLabelAction = new QAction(tr("Copy &Label"), this);
- QAction *copyAddressAction = new QAction(ui->copyToClipboard->text(), this);
- QAction *editAction = new QAction(tr("&Edit"), this);
- QAction *showQRCodeAction = new QAction(ui->showQRCode->text(), this);
- QAction *signMessageAction = new QAction(ui->signMessage->text(), this);
- QAction *verifyMessageAction = new QAction(ui->verifyMessage->text(), this);
- deleteAction = new QAction(ui->deleteButton->text(), this);
- // Build context menu
- contextMenu = new QMenu();
- contextMenu->addAction(copyAddressAction);
- contextMenu->addAction(copyLabelAction);
- contextMenu->addAction(editAction);
- if(tab == SendingTab)
- contextMenu->addAction(deleteAction);
- contextMenu->addSeparator();
- contextMenu->addAction(showQRCodeAction);
- if(tab == ReceivingTab)
- contextMenu->addAction(signMessageAction);
- else if(tab == SendingTab)
- contextMenu->addAction(verifyMessageAction);
- // Connect signals for context menu actions
- connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(on_copyToClipboard_clicked()));
- connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(onCopyLabelAction()));
- connect(editAction, SIGNAL(triggered()), this, SLOT(onEditAction()));
- connect(deleteAction, SIGNAL(triggered()), this, SLOT(on_deleteButton_clicked()));
- connect(showQRCodeAction, SIGNAL(triggered()), this, SLOT(on_showQRCode_clicked()));
- connect(signMessageAction, SIGNAL(triggered()), this, SLOT(on_signMessage_clicked()));
- connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(on_verifyMessage_clicked()));
- connect(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));
- // Pass through accept action from button box
- connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
- }
- AddressBookPage::~AddressBookPage()
- {
- delete ui;
- }
- void AddressBookPage::setModel(AddressTableModel *model)
- {
- this->model = model;
- if(!model)
- return;
- proxyModel = new QSortFilterProxyModel(this);
- proxyModel->setSourceModel(model);
- proxyModel->setDynamicSortFilter(true);
- proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
- proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
- switch(tab)
- {
- case ReceivingTab:
- // Receive filter
- proxyModel->setFilterRole(AddressTableModel::TypeRole);
- proxyModel->setFilterFixedString(AddressTableModel::Receive);
- break;
- case SendingTab:
- // Send filter
- proxyModel->setFilterRole(AddressTableModel::TypeRole);
- proxyModel->setFilterFixedString(AddressTableModel::Send);
- break;
- }
- ui->tableView->setModel(proxyModel);
- ui->tableView->sortByColumn(0, Qt::AscendingOrder);
- // Set column widths
- ui->tableView->horizontalHeader()->resizeSection(
- AddressTableModel::Address, 320);
- ui->tableView->horizontalHeader()->setSectionResizeMode(
- AddressTableModel::Label, QHeaderView::Stretch);
- connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
- this, SLOT(selectionChanged()));
- // Select row for newly created address
- connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)),
- this, SLOT(selectNewAddress(QModelIndex,int,int)));
- selectionChanged();
- }
- void AddressBookPage::setOptionsModel(OptionsModel *optionsModel)
- {
- this->optionsModel = optionsModel;
- }
- void AddressBookPage::on_copyToClipboard_clicked()
- {
- GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Address);
- }
- void AddressBookPage::onCopyLabelAction()
- {
- GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Label);
- }
- void AddressBookPage::onEditAction()
- {
- if(!ui->tableView->selectionModel())
- return;
- QModelIndexList indexes = ui->tableView->selectionModel()->selectedRows();
- if(indexes.isEmpty())
- return;
- EditAddressDialog dlg(
- tab == SendingTab ?
- EditAddressDialog::EditSendingAddress :
- EditAddressDialog::EditReceivingAddress);
- dlg.setModel(model);
- QModelIndex origIndex = proxyModel->mapToSource(indexes.at(0));
- dlg.loadRow(origIndex.row());
- dlg.exec();
- }
- void AddressBookPage::on_signMessage_clicked()
- {
- QTableView *table = ui->tableView;
- QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
- QString addr;
- foreach (QModelIndex index, indexes)
- {
- QVariant address = index.data();
- addr = address.toString();
- }
- emit signMessage(addr);
- }
- void AddressBookPage::on_verifyMessage_clicked()
- {
- QTableView *table = ui->tableView;
- QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
- QString addr;
- foreach (QModelIndex index, indexes)
- {
- QVariant address = index.data();
- addr = address.toString();
- }
- emit verifyMessage(addr);
- }
- void AddressBookPage::on_newAddressButton_clicked()
- {
- if(!model)
- return;
- EditAddressDialog dlg(
- tab == SendingTab ?
- EditAddressDialog::NewSendingAddress :
- EditAddressDialog::NewReceivingAddress, this);
- dlg.setModel(model);
- if(dlg.exec())
- {
- newAddressToSelect = dlg.getAddress();
- }
- }
- void AddressBookPage::on_deleteButton_clicked()
- {
- QTableView *table = ui->tableView;
- if(!table->selectionModel())
- return;
- QModelIndexList indexes = table->selectionModel()->selectedRows();
- if(!indexes.isEmpty())
- {
- table->model()->removeRow(indexes.at(0).row());
- }
- }
- void AddressBookPage::selectionChanged()
- {
- // Set button states based on selected tab and selection
- QTableView *table = ui->tableView;
- if(!table->selectionModel())
- return;
- if(table->selectionModel()->hasSelection())
- {
- switch(tab)
- {
- case SendingTab:
- // In sending tab, allow deletion of selection
- ui->deleteButton->setEnabled(true);
- ui->deleteButton->setVisible(true);
- deleteAction->setEnabled(true);
- ui->signMessage->setEnabled(false);
- ui->signMessage->setVisible(false);
- ui->verifyMessage->setEnabled(true);
- ui->verifyMessage->setVisible(true);
- break;
- case ReceivingTab:
- // Deleting receiving addresses, however, is not allowed
- ui->deleteButton->setEnabled(false);
- ui->deleteButton->setVisible(false);
- deleteAction->setEnabled(false);
- ui->signMessage->setEnabled(true);
- ui->signMessage->setVisible(true);
- ui->verifyMessage->setEnabled(false);
- ui->verifyMessage->setVisible(false);
- break;
- }
- ui->copyToClipboard->setEnabled(true);
- ui->showQRCode->setEnabled(true);
- }
- else
- {
- ui->deleteButton->setEnabled(false);
- ui->showQRCode->setEnabled(false);
- ui->copyToClipboard->setEnabled(false);
- ui->signMessage->setEnabled(false);
- ui->verifyMessage->setEnabled(false);
- }
- }
- void AddressBookPage::done(int retval)
- {
- QTableView *table = ui->tableView;
- if(!table->selectionModel() || !table->model())
- return;
- // When this is a tab/widget and not a model dialog, ignore "done"
- if(mode == ForEditing)
- return;
- // Figure out which address was selected, and return it
- QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
- foreach (QModelIndex index, indexes)
- {
- QVariant address = table->model()->data(index);
- returnValue = address.toString();
- }
- if(returnValue.isEmpty())
- {
- // If no address entry selected, return rejected
- retval = Rejected;
- }
- QDialog::done(retval);
- }
- void AddressBookPage::exportClicked()
- {
- // CSV is currently the only supported format
- QString filename = GUIUtil::getSaveFileName(
- this,
- tr("Export Address Book Data"), QString(),
- tr("Comma separated file (*.csv)"));
- if (filename.isNull()) return;
- CSVModelWriter writer(filename);
- // name, column, role
- writer.setModel(proxyModel);
- writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
- writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
- if(!writer.write())
- {
- QMessageBox::critical(this, tr("Error exporting"), tr("Could not write to file %1.").arg(filename),
- QMessageBox::Abort, QMessageBox::Abort);
- }
- }
- void AddressBookPage::on_showQRCode_clicked()
- {
- #ifdef USE_QRCODE
- QTableView *table = ui->tableView;
- QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
- foreach (QModelIndex index, indexes)
- {
- QString address = index.data().toString(), label = index.sibling(index.row(), 0).data(Qt::EditRole).toString();
- QRCodeDialog *dialog = new QRCodeDialog(address, label, tab == ReceivingTab, this);
- if(optionsModel)
- dialog->setModel(optionsModel);
- dialog->setAttribute(Qt::WA_DeleteOnClose);
- dialog->show();
- }
- #endif
- }
- void AddressBookPage::contextualMenu(const QPoint &point)
- {
- QModelIndex index = ui->tableView->indexAt(point);
- if(index.isValid())
- {
- contextMenu->exec(QCursor::pos());
- }
- }
- void AddressBookPage::selectNewAddress(const QModelIndex &parent, int begin, int end)
- {
- QModelIndex idx = proxyModel->mapFromSource(model->index(begin, AddressTableModel::Address, parent));
- if(idx.isValid() && (idx.data(Qt::EditRole).toString() == newAddressToSelect))
- {
- // Select row of newly created address, once
- ui->tableView->setFocus();
- ui->tableView->selectRow(idx.row());
- newAddressToSelect.clear();
- }
- }
|