Add context menu for address book page (implements part 1 of issue #648)

This commit is contained in:
Wladimir J. van der Laan 2011-12-04 18:01:53 +01:00
parent e073457191
commit c4a4a4b886
2 changed files with 70 additions and 11 deletions

View File

@ -4,11 +4,13 @@
#include "addresstablemodel.h" #include "addresstablemodel.h"
#include "editaddressdialog.h" #include "editaddressdialog.h"
#include "csvmodelwriter.h" #include "csvmodelwriter.h"
#include "guiutil.h"
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QClipboard> #include <QClipboard>
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
#include <QMenu>
#ifdef USE_QRCODE #ifdef USE_QRCODE
#include "qrcodedialog.h" #include "qrcodedialog.h"
@ -53,7 +55,28 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
break; break;
} }
ui->tableView->setTabKeyNavigation(false); ui->tableView->setTabKeyNavigation(false);
ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
// Context menu actions
QAction *copyAddressAction = new QAction(tr("Copy address"), this);
QAction *copyLabelAction = new QAction(tr("Copy label"), this);
QAction *editAction = new QAction(tr("Edit"), this);
deleteAction = new QAction(tr("Delete"), this);
contextMenu = new QMenu();
contextMenu->addAction(copyAddressAction);
contextMenu->addAction(copyLabelAction);
contextMenu->addAction(editAction);
contextMenu->addAction(deleteAction);
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(ui->tableView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint)));
// Pass through accept action from button box
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
} }
@ -108,18 +131,29 @@ void AddressBookPage::setModel(AddressTableModel *model)
void AddressBookPage::on_copyToClipboard_clicked() void AddressBookPage::on_copyToClipboard_clicked()
{ {
// Copy currently selected address to clipboard GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Address);
// (or nothing, if nothing selected) }
QTableView *table = ui->tableView; void AddressBookPage::onCopyLabelAction()
if(!table->selectionModel()) {
return; GUIUtil::copyEntryData(ui->tableView, AddressTableModel::Label);
QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address); }
foreach (QModelIndex index, indexes) void AddressBookPage::onEditAction()
{ {
QVariant address = index.data(); if(!ui->tableView->selectionModel())
QApplication::clipboard()->setText(address.toString()); 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_newAddressButton_clicked() void AddressBookPage::on_newAddressButton_clicked()
@ -170,10 +204,14 @@ void AddressBookPage::selectionChanged()
switch(tab) switch(tab)
{ {
case SendingTab: case SendingTab:
// In sending tab, allow deletion of selection
ui->deleteButton->setEnabled(true); ui->deleteButton->setEnabled(true);
deleteAction->setEnabled(true);
break; break;
case ReceivingTab: case ReceivingTab:
// Deleting receiving addresses, however, is not allowed
ui->deleteButton->setEnabled(false); ui->deleteButton->setEnabled(false);
deleteAction->setEnabled(false);
break; break;
} }
ui->copyToClipboard->setEnabled(true); ui->copyToClipboard->setEnabled(true);
@ -207,6 +245,7 @@ void AddressBookPage::done(int retval)
if(returnValue.isEmpty()) if(returnValue.isEmpty())
{ {
// If no address entry selected, return rejected
retval = Rejected; retval = Rejected;
} }
@ -257,3 +296,12 @@ void AddressBookPage::on_showQRCode_clicked()
} }
#endif #endif
} }
void AddressBookPage::contextualMenu(const QPoint &point)
{
QModelIndex index = ui->tableView->indexAt(point);
if(index.isValid())
{
contextMenu->exec(QCursor::pos());
}
}

View File

@ -12,6 +12,7 @@ QT_BEGIN_NAMESPACE
class QTableView; class QTableView;
class QItemSelection; class QItemSelection;
class QSortFilterProxyModel; class QSortFilterProxyModel;
class QMenu;
QT_END_NAMESPACE QT_END_NAMESPACE
/** Widget that shows a list of sending or receiving addresses. /** Widget that shows a list of sending or receiving addresses.
@ -48,13 +49,23 @@ private:
Tabs tab; Tabs tab;
QString returnValue; QString returnValue;
QSortFilterProxyModel *proxyModel; QSortFilterProxyModel *proxyModel;
QMenu *contextMenu;
QAction *deleteAction;
private slots: private slots:
void on_deleteButton_clicked(); void on_deleteButton_clicked();
void on_newAddressButton_clicked(); void on_newAddressButton_clicked();
/** Copy address of currently selected address entry to clipboard */
void on_copyToClipboard_clicked(); void on_copyToClipboard_clicked();
void selectionChanged(); void selectionChanged();
void on_showQRCode_clicked(); void on_showQRCode_clicked();
/** Spawn contextual menu (right mouse menu) for address book entry */
void contextualMenu(const QPoint &point);
/** Copy label of currently selected address entry to clipboard */
void onCopyLabelAction();
/** Edit currently selected address entry */
void onEditAction();
}; };
#endif // ADDRESSBOOKDIALOG_H #endif // ADDRESSBOOKDIALOG_H