#include "ui_addressbookpage.h"
#include "addresstablemodel.h"
+#include "optionsmodel.h"
+#include "bitcoingui.h"
#include "editaddressdialog.h"
#include "csvmodelwriter.h"
+#include "guiutil.h"
+#include "qrcodedialog.h"
#include <QSortFilterProxyModel>
#include <QClipboard>
-#include <QFileDialog>
#include <QMessageBox>
+#include <QMenu>
+
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_WS_MAC // Icons on push buttons are very uncommon on Mac
+#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
+ ui->showQRCode->setVisible(false);
+
switch(mode)
{
case ForSending:
ui->tableView->setFocus();
break;
case ForEditing:
- ui->buttonBox->hide();
+ ui->buttonBox->setVisible(false);
break;
}
switch(tab)
{
case SendingTab:
- ui->labelExplanation->hide();
+ ui->labelExplanation->setVisible(false);
+ ui->deleteButton->setVisible(true);
+ ui->signMessage->setVisible(false);
break;
case ReceivingTab:
+ ui->deleteButton->setVisible(false);
+ ui->signMessage->setVisible(true);
break;
}
- ui->tableView->setTabKeyNavigation(false);
+ // 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()));
}
this->model = model;
if(!model)
return;
- // Refresh list from core
- model->updateList();
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);
proxyModel->setDynamicSortFilter(true);
+ proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
+ proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
switch(tab)
{
case ReceivingTab:
// Set column widths
ui->tableView->horizontalHeader()->resizeSection(
AddressTableModel::Address, 320);
+#if QT_VERSION < 0x050000
ui->tableView->horizontalHeader()->setResizeMode(
AddressTableModel::Label, QHeaderView::Stretch);
-
+#else
+ ui->tableView->horizontalHeader()->setSectionResizeMode(
+ AddressTableModel::Label, QHeaderView::Stretch);
+#endif
connect(ui->tableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(selectionChanged()));
- if(mode == ForSending)
- {
- // Auto-select first row when in sending mode
- ui->tableView->selectRow(0);
- }
+ // 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()
{
- // Copy currently selected address to clipboard
- // (or nothing, if nothing selected)
- QTableView *table = ui->tableView;
- if(!table->selectionModel())
+ 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();
- QApplication::clipboard()->setText(address.toString());
+ addr = address.toString();
}
+
+ emit verifyMessage(addr);
}
void AddressBookPage::on_newAddressButton_clicked()
EditAddressDialog dlg(
tab == SendingTab ?
EditAddressDialog::NewSendingAddress :
- EditAddressDialog::NewReceivingAddress);
+ EditAddressDialog::NewReceivingAddress, this);
dlg.setModel(model);
if(dlg.exec())
{
- // Select row for newly created address
- QString address = dlg.getAddress();
- QModelIndexList lst = proxyModel->match(proxyModel->index(0,
- AddressTableModel::Address, QModelIndex()),
- Qt::EditRole, address, 1, Qt::MatchExactly);
- if(!lst.isEmpty())
- {
- ui->tableView->setFocus();
- ui->tableView->selectRow(lst.at(0).row());
- }
+ newAddressToSelect = dlg.getAddress();
}
}
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);
}
}
if(returnValue.isEmpty())
{
+ // If no address entry selected, return rejected
retval = Rejected;
}
void AddressBookPage::exportClicked()
{
// CSV is currently the only supported format
- QString filename = QFileDialog::getSaveFileName(
+ QString filename = GUIUtil::getSaveFileName(
this,
- tr("Export Address Book Data"),
- QDir::currentPath(),
+ tr("Export Address Book Data"), QString(),
tr("Comma separated file (*.csv)"));
if (filename.isNull()) return;
QMessageBox::Abort, QMessageBox::Abort);
}
}
+
+void AddressBookPage::on_showQRCode_clicked()
+{
+ 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();
+ }
+}
+
+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();
+ }
+}