namespacing, user friendly base58 entry, addressbook work

This commit is contained in:
Wladimir J. van der Laan 2011-06-02 15:57:23 +02:00
parent ef1b844e7b
commit e457b02142
12 changed files with 147 additions and 38 deletions

View file

@ -6,26 +6,46 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>458</width>
<height>300</height> <height>113</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Dialog</string> <string>Edit Address</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<spacer name="verticalSpacer"> <layout class="QFormLayout" name="formLayout">
<property name="orientation"> <property name="fieldGrowthPolicy">
<enum>Qt::Vertical</enum> <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <item row="0" column="0">
<size> <widget class="QLabel" name="label">
<width>20</width> <property name="text">
<height>40</height> <string>&amp;Label</string>
</size>
</property> </property>
</spacer> <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>
<item> <item>
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">

View file

@ -9,6 +9,8 @@ class BitcoinAddressValidator : public QRegExpValidator
public: public:
explicit BitcoinAddressValidator(QObject *parent = 0); explicit BitcoinAddressValidator(QObject *parent = 0);
State validate(QString &input, int &pos) const;
static const int MaxAddressLength = 34; static const int MaxAddressLength = 34;
signals: signals:

View file

@ -12,7 +12,14 @@ class EditAddressDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit EditAddressDialog(QWidget *parent = 0); enum Mode {
NewReceivingAddress,
NewSendingAddress,
EditReceivingAddress,
EditSendingAddress
};
explicit EditAddressDialog(Mode mode, QWidget *parent = 0);
~EditAddressDialog(); ~EditAddressDialog();
private: private:

View file

@ -2,10 +2,24 @@
#define GUIUTIL_H #define GUIUTIL_H
#include <QString> #include <QString>
#include <QFont>
QString DateTimeStr(qint64 nTime); 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 */ /* Render bitcoin addresses in monospace font */
QFont bitcoinAddressFont(); static QFont bitcoinAddressFont();
static void setupAddressWidget(QLineEdit *widget, QWidget *parent);
static void setupAmountWidget(QLineEdit *widget, QWidget *parent);
};
#endif // GUIUTIL_H #endif // GUIUTIL_H

View file

@ -87,14 +87,20 @@ void AddressBookDialog::on_copyToClipboard_clicked()
void AddressBookDialog::on_editButton_clicked() void AddressBookDialog::on_editButton_clicked()
{ {
/* Double click triggers edit button */ /* Double click also triggers edit button */
EditAddressDialog dlg; EditAddressDialog dlg(
ui->tabWidget->currentIndex() == SendingTab ?
EditAddressDialog::EditSendingAddress :
EditAddressDialog::EditReceivingAddress);
dlg.exec(); dlg.exec();
} }
void AddressBookDialog::on_newAddressButton_clicked() void AddressBookDialog::on_newAddressButton_clicked()
{ {
EditAddressDialog dlg; EditAddressDialog dlg(
ui->tabWidget->currentIndex() == SendingTab ?
EditAddressDialog::NewSendingAddress :
EditAddressDialog::NewReceivingAddress);
dlg.exec(); dlg.exec();
} }
@ -103,10 +109,10 @@ void AddressBookDialog::on_tabWidget_currentChanged(int index)
switch(index) switch(index)
{ {
case SendingTab: case SendingTab:
ui->deleteButton->show(); ui->deleteButton->setEnabled(true);
break; break;
case ReceivingTab: case ReceivingTab:
ui->deleteButton->hide(); ui->deleteButton->setEnabled(false);
break; break;
} }
} }

View file

@ -2,6 +2,8 @@
#include "guiutil.h" #include "guiutil.h"
#include "main.h" #include "main.h"
#include <QFont>
const QString AddressTableModel::Send = "S"; const QString AddressTableModel::Send = "S";
const QString AddressTableModel::Receive = "R"; const QString AddressTableModel::Receive = "R";
@ -108,7 +110,7 @@ QVariant AddressTableModel::data(const QModelIndex &index, int role) const
{ {
if(index.column() == Address) if(index.column() == Address)
{ {
return bitcoinAddressFont(); return GUIUtil::bitcoinAddressFont();
} }
} else if (role == TypeRole) } else if (role == TypeRole)
{ {

View file

@ -2,7 +2,44 @@
#include "base58.h" #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) : BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) :
QRegExpValidator(QRegExp(QString("^[")+QString(pszBase58)+QString("]+")), 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);
}

View file

@ -10,6 +10,7 @@
#include "optionsdialog.h" #include "optionsdialog.h"
#include "aboutdialog.h" #include "aboutdialog.h"
#include "clientmodel.h" #include "clientmodel.h"
#include "guiutil.h"
#include "main.h" #include "main.h"
@ -70,6 +71,7 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
hbox_address->addWidget(new QLabel(tr("Your Bitcoin Address:"))); hbox_address->addWidget(new QLabel(tr("Your Bitcoin Address:")));
address = new QLineEdit(); address = new QLineEdit();
address->setReadOnly(true); address->setReadOnly(true);
address->setFont(GUIUtil::bitcoinAddressFont());
hbox_address->addWidget(address); hbox_address->addWidget(address);
QPushButton *button_new = new QPushButton(tr("&New...")); QPushButton *button_new = new QPushButton(tr("&New..."));

View file

@ -1,11 +1,14 @@
#include "editaddressdialog.h" #include "editaddressdialog.h"
#include "ui_editaddressdialog.h" #include "ui_editaddressdialog.h"
#include "guiutil.h"
EditAddressDialog::EditAddressDialog(QWidget *parent) : EditAddressDialog::EditAddressDialog(Mode mode, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::EditAddressDialog) ui(new Ui::EditAddressDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
GUIUtil::setupAddressWidget(ui->addressEdit, this);
} }
EditAddressDialog::~EditAddressDialog() EditAddressDialog::~EditAddressDialog()

View file

@ -1,16 +1,37 @@
#include "guiutil.h" #include "guiutil.h"
#include "bitcoinaddressvalidator.h"
#include <QString>
#include <QDateTime> #include <QDateTime>
#include <QDoubleValidator>
#include <QFont>
#include <QLineEdit>
QString DateTimeStr(qint64 nTime) QString GUIUtil::DateTimeStr(qint64 nTime)
{ {
QDateTime date = QDateTime::fromMSecsSinceEpoch(nTime*1000); QDateTime date = QDateTime::fromMSecsSinceEpoch(nTime*1000);
return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm"); return date.date().toString(Qt::SystemLocaleShortDate) + QString(" ") + date.toString("hh:mm");
} }
QFont bitcoinAddressFont() QFont GUIUtil::bitcoinAddressFont()
{ {
QFont font("Monospace"); QFont font("Monospace");
font.setStyleHint(QFont::TypeWriter); font.setStyleHint(QFont::TypeWriter);
return font; 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);
}

View file

@ -1,9 +1,9 @@
#include "sendcoinsdialog.h" #include "sendcoinsdialog.h"
#include "ui_sendcoinsdialog.h" #include "ui_sendcoinsdialog.h"
#include "clientmodel.h" #include "clientmodel.h"
#include "guiutil.h"
#include "addressbookdialog.h" #include "addressbookdialog.h"
#include "bitcoinaddressvalidator.h"
#include "optionsmodel.h" #include "optionsmodel.h"
#include <QApplication> #include <QApplication>
@ -22,13 +22,8 @@ SendCoinsDialog::SendCoinsDialog(QWidget *parent, const QString &address) :
{ {
ui->setupUi(this); ui->setupUi(this);
/* Set up validators */ GUIUtil::setupAddressWidget(ui->payTo, this);
ui->payTo->setMaxLength(BitcoinAddressValidator::MaxAddressLength); GUIUtil::setupAmountWidget(ui->payAmount, this);
ui->payTo->setValidator(new BitcoinAddressValidator(this));
QDoubleValidator *amountValidator = new QDoubleValidator(this);
amountValidator->setDecimals(8);
amountValidator->setBottom(0.0);
ui->payAmount->setValidator(amountValidator);
/* Set initial address if provided */ /* Set initial address if provided */
if(!address.isEmpty()) if(!address.isEmpty())

View file

@ -159,7 +159,7 @@ QVariant TransactionTableModel::formatTxStatus(const TransactionRecord *wtx) con
status = tr("Open for %n block(s)","",wtx->status.open_for); status = tr("Open for %n block(s)","",wtx->status.open_for);
break; break;
case TransactionStatus::OpenUntilDate: case TransactionStatus::OpenUntilDate:
status = tr("Open until ") + DateTimeStr(wtx->status.open_for); status = tr("Open until ") + GUIUtil::DateTimeStr(wtx->status.open_for);
break; break;
case TransactionStatus::Offline: case TransactionStatus::Offline:
status = tr("%1/offline").arg(wtx->status.depth); status = tr("%1/offline").arg(wtx->status.depth);
@ -179,7 +179,7 @@ QVariant TransactionTableModel::formatTxDate(const TransactionRecord *wtx) const
{ {
if(wtx->time) if(wtx->time)
{ {
return QVariant(DateTimeStr(wtx->time)); return QVariant(GUIUtil::DateTimeStr(wtx->time));
} else { } else {
return QVariant(); return QVariant();
} }