namespacing, user friendly base58 entry, addressbook work
This commit is contained in:
parent
ef1b844e7b
commit
e457b02142
12 changed files with 147 additions and 38 deletions
|
@ -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>&Label</string>
|
||||||
</size>
|
</property>
|
||||||
</property>
|
<property name="buddy">
|
||||||
</spacer>
|
<cstring>labelEdit</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>&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">
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,15 @@ class EditAddressDialog : public QDialog
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit EditAddressDialog(QWidget *parent = 0);
|
enum Mode {
|
||||||
~EditAddressDialog();
|
NewReceivingAddress,
|
||||||
|
NewSendingAddress,
|
||||||
|
EditReceivingAddress,
|
||||||
|
EditSendingAddress
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit EditAddressDialog(Mode mode, QWidget *parent = 0);
|
||||||
|
~EditAddressDialog();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::EditAddressDialog *ui;
|
Ui::EditAddressDialog *ui;
|
||||||
|
|
|
@ -2,10 +2,24 @@
|
||||||
#define GUIUTIL_H
|
#define GUIUTIL_H
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QFont>
|
|
||||||
|
|
||||||
QString DateTimeStr(qint64 nTime);
|
QT_BEGIN_NAMESPACE
|
||||||
/* Render bitcoin addresses in monospace font */
|
class QFont;
|
||||||
QFont bitcoinAddressFont();
|
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
|
#endif // GUIUTIL_H
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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..."));
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue