namespacing, user friendly base58 entry, addressbook work
authorWladimir J. van der Laan <laanwj@gmail.com>
Thu, 2 Jun 2011 13:57:23 +0000 (15:57 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Thu, 2 Jun 2011 13:57:23 +0000 (15:57 +0200)
12 files changed:
gui/forms/editaddressdialog.ui
gui/include/bitcoinaddressvalidator.h
gui/include/editaddressdialog.h
gui/include/guiutil.h
gui/src/addressbookdialog.cpp
gui/src/addresstablemodel.cpp
gui/src/bitcoinaddressvalidator.cpp
gui/src/bitcoingui.cpp
gui/src/editaddressdialog.cpp
gui/src/guiutil.cpp
gui/src/sendcoinsdialog.cpp
gui/src/transactiontablemodel.cpp

index 2d8aa88..763a0bb 100644 (file)
@@ -6,26 +6,46 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>300</height>
+    <width>458</width>
+    <height>113</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Dialog</string>
+   <string>Edit Address</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>20</width>
-       <height>40</height>
-      </size>
+    <layout class="QFormLayout" name="formLayout">
+     <property name="fieldGrowthPolicy">
+      <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
      </property>
-    </spacer>
+     <item row="0" column="0">
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>&amp;Label</string>
+       </property>
+       <property name="buddy">
+        <cstring>labelEdit</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>&amp;Address</string>
+       </property>
+       <property name="buddy">
+        <cstring>addressEdit</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QLineEdit" name="labelEdit"/>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="addressEdit"/>
+     </item>
+    </layout>
    </item>
    <item>
     <widget class="QDialogButtonBox" name="buttonBox">
index 8322eef..c7b2eef 100644 (file)
@@ -9,6 +9,8 @@ class BitcoinAddressValidator : public QRegExpValidator
 public:
     explicit BitcoinAddressValidator(QObject *parent = 0);
 
+    State validate(QString &input, int &pos) const;
+
     static const int MaxAddressLength = 34;
 signals:
 
index 650ed53..8e4a038 100644 (file)
@@ -12,8 +12,15 @@ class EditAddressDialog : public QDialog
     Q_OBJECT
 
 public:
-    explicit EditAddressDialog(QWidget *parent = 0);
-    ~EditAddressDialog();
+    enum Mode {
+        NewReceivingAddress,
+        NewSendingAddress,
+        EditReceivingAddress,
+        EditSendingAddress
+    };
+
+    explicit EditAddressDialog(Mode mode, QWidget *parent = 0);
+    ~EditAddressDialog();    
 
 private:
     Ui::EditAddressDialog *ui;
index eaa8199..748e29b 100644 (file)
@@ -2,10 +2,24 @@
 #define GUIUTIL_H
 
 #include <QString>
-#include <QFont>
 
-QString DateTimeStr(qint64 nTime);
-/* Render bitcoin addresses in monospace font */
-QFont bitcoinAddressFont();
+QT_BEGIN_NAMESPACE
+class QFont;
+class QLineEdit;
+class QWidget;
+QT_END_NAMESPACE
+
+class GUIUtil
+{
+public:
+    static QString DateTimeStr(qint64 nTime);
+
+    /* Render bitcoin addresses in monospace font */
+    static QFont bitcoinAddressFont();
+
+    static void setupAddressWidget(QLineEdit *widget, QWidget *parent);
+
+    static void setupAmountWidget(QLineEdit *widget, QWidget *parent);
+};
 
 #endif // GUIUTIL_H
index ba6fdb5..853da58 100644 (file)
@@ -87,14 +87,20 @@ void AddressBookDialog::on_copyToClipboard_clicked()
 
 void AddressBookDialog::on_editButton_clicked()
 {
-    /* Double click triggers edit button */
-    EditAddressDialog dlg;
+    /* Double click also triggers edit button */
+    EditAddressDialog dlg(
+            ui->tabWidget->currentIndex() == SendingTab ?
+            EditAddressDialog::EditSendingAddress :
+            EditAddressDialog::EditReceivingAddress);
     dlg.exec();
 }
 
 void AddressBookDialog::on_newAddressButton_clicked()
 {
-    EditAddressDialog dlg;
+    EditAddressDialog dlg(
+            ui->tabWidget->currentIndex() == SendingTab ?
+            EditAddressDialog::NewSendingAddress :
+            EditAddressDialog::NewReceivingAddress);
     dlg.exec();
 }
 
@@ -103,10 +109,10 @@ void AddressBookDialog::on_tabWidget_currentChanged(int index)
     switch(index)
     {
     case SendingTab:
-        ui->deleteButton->show();
+        ui->deleteButton->setEnabled(true);
         break;
     case ReceivingTab:
-        ui->deleteButton->hide();
+        ui->deleteButton->setEnabled(false);
         break;
     }
 }
index 21a9044..c375ca7 100644 (file)
@@ -2,6 +2,8 @@
 #include "guiutil.h"
 #include "main.h"
 
+#include <QFont>
+
 const QString AddressTableModel::Send = "S";
 const QString AddressTableModel::Receive = "R";
 
@@ -108,7 +110,7 @@ QVariant AddressTableModel::data(const QModelIndex &index, int role) const
     {
         if(index.column() == Address)
         {
-            return bitcoinAddressFont();
+            return GUIUtil::bitcoinAddressFont();
         }
     } else if (role == TypeRole)
     {
index 8e71916..bccf445 100644 (file)
@@ -2,7 +2,44 @@
 
 #include "base58.h"
 
+#include <QDebug>
+
+/* Base58 characters are:
+     "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
+
+  This is:
+  - All numbers except for '0'
+  - All uppercase letters except for 'I' and 'O'
+  - All lowercase letters except for 'l'
+
+  User friendly Base58 input can map
+  - 'l' and 'I' to '1'
+  - '0' and 'O' to 'o'
+*/
+
 BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) :
     QRegExpValidator(QRegExp(QString("^[")+QString(pszBase58)+QString("]+")), parent)
 {
 }
+
+QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const
+{
+    for(int idx=0; idx<input.size(); ++idx)
+    {
+        switch(input.at(idx).unicode())
+        {
+        case 'l':
+        case 'I':
+            input[idx] = QChar('1');
+            break;
+        case '0':
+        case 'O':
+            input[idx] = QChar('o');
+            break;
+        default:
+            break;
+        }
+
+    }
+    return QRegExpValidator::validate(input, pos);
+}
index 0dc895d..a7f2368 100644 (file)
@@ -10,6 +10,7 @@
 #include "optionsdialog.h"
 #include "aboutdialog.h"
 #include "clientmodel.h"
+#include "guiutil.h"
 
 #include "main.h"
 
@@ -70,6 +71,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
     hbox_address->addWidget(new QLabel(tr("Your Bitcoin Address:")));
     address = new QLineEdit();
     address->setReadOnly(true);
+    address->setFont(GUIUtil::bitcoinAddressFont());
     hbox_address->addWidget(address);
     
     QPushButton *button_new = new QPushButton(tr("&New..."));
index bd55597..0699b56 100644 (file)
@@ -1,11 +1,14 @@
 #include "editaddressdialog.h"
 #include "ui_editaddressdialog.h"
+#include "guiutil.h"
 
-EditAddressDialog::EditAddressDialog(QWidget *parent) :
+EditAddressDialog::EditAddressDialog(Mode mode, QWidget *parent) :
     QDialog(parent),
     ui(new Ui::EditAddressDialog)
 {
     ui->setupUi(this);
+
+    GUIUtil::setupAddressWidget(ui->addressEdit, this);
 }
 
 EditAddressDialog::~EditAddressDialog()
index 59b4de3..d01f23d 100644 (file)
@@ -1,16 +1,37 @@
 #include "guiutil.h"
+#include "bitcoinaddressvalidator.h"
 
+#include <QString>
 #include <QDateTime>
+#include <QDoubleValidator>
+#include <QFont>
+#include <QLineEdit>
 
-QString DateTimeStr(qint64 nTime)
+QString GUIUtil::DateTimeStr(qint64 nTime)
 {
     QDateTime date = QDateTime::fromMSecsSinceEpoch(nTime*1000);
     return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm");
 }
 
-QFont bitcoinAddressFont()
+QFont GUIUtil::bitcoinAddressFont()
 {
     QFont font("Monospace");
     font.setStyleHint(QFont::TypeWriter);
     return font;
 }
+
+void GUIUtil::setupAddressWidget(QLineEdit *widget, QWidget *parent)
+{
+    widget->setMaxLength(BitcoinAddressValidator::MaxAddressLength);
+    widget->setValidator(new BitcoinAddressValidator(parent));
+    widget->setFont(bitcoinAddressFont());
+}
+
+void GUIUtil::setupAmountWidget(QLineEdit *widget, QWidget *parent)
+{
+    QDoubleValidator *amountValidator = new QDoubleValidator(parent);
+    amountValidator->setDecimals(8);
+    amountValidator->setBottom(0.0);
+    widget->setValidator(amountValidator);
+}
+
index a6ab601..b50ed99 100644 (file)
@@ -1,9 +1,9 @@
 #include "sendcoinsdialog.h"
 #include "ui_sendcoinsdialog.h"
 #include "clientmodel.h"
+#include "guiutil.h"
 
 #include "addressbookdialog.h"
-#include "bitcoinaddressvalidator.h"
 #include "optionsmodel.h"
 
 #include <QApplication>
@@ -22,13 +22,8 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent, const QString &address) :
 {
     ui->setupUi(this);
 
-    /* Set up validators */
-    ui->payTo->setMaxLength(BitcoinAddressValidator::MaxAddressLength);
-    ui->payTo->setValidator(new BitcoinAddressValidator(this));
-    QDoubleValidator *amountValidator = new QDoubleValidator(this);
-    amountValidator->setDecimals(8);
-    amountValidator->setBottom(0.0);
-    ui->payAmount->setValidator(amountValidator);
+    GUIUtil::setupAddressWidget(ui->payTo, this);
+    GUIUtil::setupAmountWidget(ui->payAmount, this);
 
     /* Set initial address if provided */
     if(!address.isEmpty())
index c7fb43e..e23f45d 100644 (file)
@@ -159,7 +159,7 @@ QVariant TransactionTableModel::formatTxStatus(const TransactionRecord *wtx) con
         status = tr("Open for %n block(s)","",wtx->status.open_for);
         break;
     case TransactionStatus::OpenUntilDate:
-        status = tr("Open until ") + DateTimeStr(wtx->status.open_for);
+        status = tr("Open until ") + GUIUtil::DateTimeStr(wtx->status.open_for);
         break;
     case TransactionStatus::Offline:
         status = tr("%1/offline").arg(wtx->status.depth);
@@ -179,7 +179,7 @@ QVariant TransactionTableModel::formatTxDate(const TransactionRecord *wtx) const
 {
     if(wtx->time)
     {
-        return QVariant(DateTimeStr(wtx->time));
+        return QVariant(GUIUtil::DateTimeStr(wtx->time));
     } else {
         return QVariant();
     }