Improved Mac experience; QDoubleSpinBox for BitcoinAmountField
[novacoin.git] / src / qt / addressbookpage.cpp
index 67ed0fe..6be59a0 100644 (file)
@@ -3,10 +3,12 @@
 
 #include "addresstablemodel.h"
 #include "editaddressdialog.h"
+#include "csvmodelwriter.h"
 
 #include <QSortFilterProxyModel>
 #include <QClipboard>
-#include <QDebug>
+#include <QFileDialog>
+#include <QMessageBox>
 
 AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
     QDialog(parent),
@@ -16,10 +18,18 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
     tab(tab)
 {
     ui->setupUi(this);
+
+#ifdef Q_WS_MAC // Icons on push buttons are very uncommon on Mac
+    ui->newAddressButton->setIcon(QIcon());
+    ui->copyToClipboard->setIcon(QIcon());
+    ui->deleteButton->setIcon(QIcon());
+#endif
+
     switch(mode)
     {
     case ForSending:
-        connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(on_buttonBox_accepted()));
+        connect(ui->tableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(accept()));
+        ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
         ui->tableView->setFocus();
         break;
     case ForEditing:
@@ -34,6 +44,9 @@ AddressBookPage::AddressBookPage(Mode mode, Tabs tab, QWidget *parent) :
     case ReceivingTab:
         break;
     }
+    ui->tableView->setTabKeyNavigation(false);
+
+    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
 }
 
 AddressBookPage::~AddressBookPage()
@@ -47,29 +60,24 @@ void AddressBookPage::setModel(AddressTableModel *model)
     // Refresh list from core
     model->updateList();
 
+    proxyModel = new QSortFilterProxyModel(this);
+    proxyModel->setSourceModel(model);
+    proxyModel->setDynamicSortFilter(true);
     switch(tab)
     {
-    case ReceivingTab: {
+    case ReceivingTab:
         // Receive filter
-        QSortFilterProxyModel *receive_model = new QSortFilterProxyModel(this);
-        receive_model->setSourceModel(model);
-        receive_model->setDynamicSortFilter(true);
-        receive_model->setFilterRole(AddressTableModel::TypeRole);
-        receive_model->setFilterFixedString(AddressTableModel::Receive);
-        ui->tableView->setModel(receive_model);
-        ui->tableView->sortByColumn(0, Qt::AscendingOrder);
-        } break;
-    case SendingTab: {
+        proxyModel->setFilterRole(AddressTableModel::TypeRole);
+        proxyModel->setFilterFixedString(AddressTableModel::Receive);
+        break;
+    case SendingTab:
         // Send filter
-        QSortFilterProxyModel *send_model = new QSortFilterProxyModel(this);
-        send_model->setSourceModel(model);
-        send_model->setDynamicSortFilter(true);
-        send_model->setFilterRole(AddressTableModel::TypeRole);
-        send_model->setFilterFixedString(AddressTableModel::Send);
-        ui->tableView->setModel(send_model);
-        ui->tableView->sortByColumn(0, Qt::AscendingOrder);
-        } break;
+        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(
@@ -114,7 +122,19 @@ void AddressBookPage::on_newAddressButton_clicked()
             EditAddressDialog::NewSendingAddress :
             EditAddressDialog::NewReceivingAddress);
     dlg.setModel(model);
-    dlg.exec();
+    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());
+        }
+    }
 }
 
 void AddressBookPage::on_deleteButton_clicked()
@@ -127,26 +147,6 @@ void AddressBookPage::on_deleteButton_clicked()
     }
 }
 
-void AddressBookPage::on_buttonBox_accepted()
-{
-    QTableView *table = getCurrentTable();
-    QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
-
-    foreach (QModelIndex index, indexes)
-    {
-        QVariant address = table->model()->data(index);
-        returnValue = address.toString();
-    }
-    if(!returnValue.isEmpty())
-    {
-        accept();
-    }
-    else
-    {
-        reject();
-    }
-}
-
 void AddressBookPage::selectionChanged()
 {
     // Set button states based on selected tab and selection
@@ -177,5 +177,46 @@ void AddressBookPage::done(int retval)
     // 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
+    QTableView *table = getCurrentTable();
+    QModelIndexList indexes = table->selectionModel()->selectedRows(AddressTableModel::Address);
+
+    foreach (QModelIndex index, indexes)
+    {
+        QVariant address = table->model()->data(index);
+        returnValue = address.toString();
+    }
+
+    if(returnValue.isEmpty())
+    {
+        retval = Rejected;
+    }
+
     QDialog::done(retval);
 }
+
+void AddressBookPage::exportClicked()
+{
+    // CSV is currently the only supported format
+    QString filename = QFileDialog::getSaveFileName(
+            this,
+            tr("Export Address Book Data"),
+            QDir::currentPath(),
+            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);
+    }
+}