Browse Source

Refactor Addressbook

import_zecw
Aditya Kulkarni 6 years ago
parent
commit
79520f41c5
  1. 89
      src/addressbook.cpp
  2. 26
      src/addressbook.h
  3. 2
      src/mainwindow.h
  4. 10
      src/sendtab.cpp
  5. 4
      src/settings.cpp
  6. 2
      src/settings.h

89
src/addressbook.cpp

@ -18,22 +18,23 @@ AddressBookModel::~AddressBookModel() {
} }
void AddressBookModel::saveData() { void AddressBookModel::saveData() {
AddressBook::writeToStorage(labels);
// Save column positions // Save column positions
QSettings().setValue("addresstablegeometry", parent->horizontalHeader()->saveState()); QSettings().setValue("addresstablegeometry", parent->horizontalHeader()->saveState());
} }
void AddressBookModel::loadData() { void AddressBookModel::loadData() {
labels = AddressBook::readFromStorage(); labels = AddressBook::getInstance()->getAllAddressLabels();
parent->horizontalHeader()->restoreState(QSettings().value("addresstablegeometry").toByteArray()); parent->horizontalHeader()->restoreState(QSettings().value("addresstablegeometry").toByteArray());
} }
void AddressBookModel::addNewLabel(QString label, QString addr) { void AddressBookModel::addNewLabel(QString label, QString addr) {
labels.push_back(QPair<QString, QString>(label, addr)); //labels.push_back(QPair<QString, QString>(label, addr));
AddressBook::writeToStorage(labels); AddressBook::getInstance()->addAddressLabel(label, addr);
labels.clear();
labels = AddressBook::getInstance()->getAllAddressLabels();
dataChanged(index(0, 0), index(labels.size()-1, columnCount(index(0,0))-1)); dataChanged(index(0, 0), index(labels.size()-1, columnCount(index(0,0))-1));
layoutChanged(); layoutChanged();
@ -43,9 +44,10 @@ void AddressBookModel::removeItemAt(int row) {
if (row >= labels.size()) if (row >= labels.size())
return; return;
labels.removeAt(row); AddressBook::getInstance()->removeAddressLabel(labels[row].first, labels[row].second);
AddressBook::writeToStorage(labels);
labels.clear();
labels = AddressBook::getInstance()->getAllAddressLabels();
dataChanged(index(0, 0), index(labels.size()-1, columnCount(index(0,0))-1)); dataChanged(index(0, 0), index(labels.size()-1, columnCount(index(0,0))-1));
layoutChanged(); layoutChanged();
@ -86,6 +88,10 @@ QVariant AddressBookModel::headerData(int section, Qt::Orientation orientation,
return QVariant(); return QVariant();
} }
//===============
// AddressBook
//===============
void AddressBook::open(MainWindow* parent, QLineEdit* target) { void AddressBook::open(MainWindow* parent, QLineEdit* target) {
QDialog d(parent); QDialog d(parent);
Ui_addressBook ab; Ui_addressBook ab;
@ -180,31 +186,41 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
}; };
} }
QList<QPair<QString, QString>> AddressBook::readFromStorage() { //=============
// AddressBook singleton class
//=============
AddressBook* AddressBook::getInstance() {
if (!instance)
instance = new AddressBook();
return instance;
}
AddressBook::AddressBook() {
readFromStorage();
}
void AddressBook::readFromStorage() {
QFile file(AddressBook::writeableFile()); QFile file(AddressBook::writeableFile());
QList<QPair<QString, QString>> labels;
if (!file.exists()) { if (!file.exists()) {
return labels; return;
} }
allLabels.clear();
file.open(QIODevice::ReadOnly); file.open(QIODevice::ReadOnly);
QDataStream in(&file); // read the data serialized from the file QDataStream in(&file); // read the data serialized from the file
QString version; QString version;
in >> version >> labels; in >> version >> allLabels;
file.close(); file.close();
return labels;
} }
void AddressBook::writeToStorage() {
void AddressBook::writeToStorage(QList<QPair<QString, QString>> labels) {
QFile file(AddressBook::writeableFile()); QFile file(AddressBook::writeableFile());
file.open(QIODevice::ReadWrite | QIODevice::Truncate); file.open(QIODevice::ReadWrite | QIODevice::Truncate);
QDataStream out(&file); // we will serialize the data into the file QDataStream out(&file); // we will serialize the data into the file
out << QString("v1") << labels; out << QString("v1") << allLabels;
file.close(); file.close();
} }
@ -221,3 +237,40 @@ QString AddressBook::writeableFile() {
return dir.filePath(filename); return dir.filePath(filename);
} }
} }
// Add a new address/label to the database
void AddressBook::addAddressLabel(QString label, QString address) {
Q_ASSERT(Settings::isValidAddress(address));
allLabels.push_back(QPair<QString, QString>(label, address));
writeToStorage();
}
// Remove a new address/label from the database
void AddressBook::removeAddressLabel(QString label, QString address) {
// Iterate over the list and remove the label/address
for (int i=0; i < allLabels.size(); i++) {
if (allLabels[i].first == label && allLabels[i].second == address)
allLabels.removeAt(i);
writeToStorage();
return;
}
}
// Read all addresses
const QList<QPair<QString, QString>>& AddressBook::getAllAddressLabels() {
return allLabels;
}
// Get the label for an address
QString AddressBook::getLabelForAddress(QString addr) {
for (auto i : allLabels) {
if (i.second == addr)
return i.first;
}
return "";
}
AddressBook* AddressBook::instance = nullptr;

26
src/addressbook.h

@ -31,12 +31,32 @@ private:
class AddressBook { class AddressBook {
public: public:
// Method that opens the AddressBook dialog window.
static void open(MainWindow* parent, QLineEdit* target = nullptr); static void open(MainWindow* parent, QLineEdit* target = nullptr);
static QList<QPair<QString, QString>> readFromStorage(); static AddressBook* getInstance();
static void writeToStorage(QList<QPair<QString, QString>> labels);
static QString writeableFile(); // Add a new address/label to the database
void addAddressLabel(QString label, QString address);
// Remove a new address/label from the database
void removeAddressLabel(QString label, QString address);
// Read all addresses
const QList<QPair<QString, QString>>& getAllAddressLabels();
// Get an address's first label
QString getLabelForAddress(QString address);
private:
AddressBook();
void readFromStorage();
void writeToStorage();
QString writeableFile();
QList<QPair<QString, QString>> allLabels;
static AddressBook* instance;
}; };
#endif // ADDRESSBOOK_H #endif // ADDRESSBOOK_H

2
src/mainwindow.h

@ -97,8 +97,6 @@ private:
void restoreSavedStates(); void restoreSavedStates();
QString addressFromAddressField(const QString& lblAddr) { return lblAddr.trimmed().split("/").last(); }
RPC* rpc = nullptr; RPC* rpc = nullptr;
QCompleter* labelCompleter = nullptr; QCompleter* labelCompleter = nullptr;

10
src/sendtab.cpp

@ -92,7 +92,7 @@ void MainWindow::setupSendTab() {
void MainWindow::updateLabelsAutoComplete() { void MainWindow::updateLabelsAutoComplete() {
QList<QString> list; QList<QString> list;
auto labels = AddressBook::readFromStorage(); auto labels = AddressBook::getInstance()->getAllAddressLabels();
std::transform(labels.begin(), labels.end(), std::back_inserter(list), [=] (auto la) -> QString { std::transform(labels.begin(), labels.end(), std::back_inserter(list), [=] (auto la) -> QString {
return la.first % "/" % la.second; return la.first % "/" % la.second;
@ -244,7 +244,7 @@ void MainWindow::addAddressSection() {
} }
void MainWindow::addressChanged(int itemNumber, const QString& text) { void MainWindow::addressChanged(int itemNumber, const QString& text) {
auto addr = addressFromAddressField(text); auto addr = Settings::addressFromAddressLabel(text);
setMemoEnabled(itemNumber, addr.startsWith("z")); setMemoEnabled(itemNumber, addr.startsWith("z"));
} }
@ -267,7 +267,7 @@ void MainWindow::setMemoEnabled(int number, bool enabled) {
void MainWindow::memoButtonClicked(int number) { void MainWindow::memoButtonClicked(int number) {
// Memos can only be used with zAddrs. So check that first // Memos can only be used with zAddrs. So check that first
auto addr = ui->sendToWidgets->findChild<QLineEdit*>(QString("Address") + QString::number(number)); auto addr = ui->sendToWidgets->findChild<QLineEdit*>(QString("Address") + QString::number(number));
if (!addressFromAddressField(addr->text()).startsWith("z")) { if (!Settings::addressFromAddressLabel(addr->text()).startsWith("z")) {
QMessageBox msg(QMessageBox::Critical, "Memos can only be used with z-addresses", QMessageBox msg(QMessageBox::Critical, "Memos can only be used with z-addresses",
"The memo field can only be used with a z-address.\n" + addr->text() + "\ndoesn't look like a z-address", "The memo field can only be used with a z-address.\n" + addr->text() + "\ndoesn't look like a z-address",
QMessageBox::Ok, this); QMessageBox::Ok, this);
@ -357,7 +357,7 @@ void MainWindow::maxAmountChecked(int checked) {
} }
sumAllAmounts += Settings::getTotalFee(); sumAllAmounts += Settings::getTotalFee();
auto addr = ui->inputsCombo->currentText().split("(")[0]; auto addr = Settings::addressFromAddressLabel(ui->inputsCombo->currentText().split("(")[0]);
auto maxamount = rpc->getAllBalances()->value(addr) - sumAllAmounts; auto maxamount = rpc->getAllBalances()->value(addr) - sumAllAmounts;
maxamount = (maxamount < 0) ? 0 : maxamount; maxamount = (maxamount < 0) ? 0 : maxamount;
@ -380,7 +380,7 @@ Tx MainWindow::createTxFromSendPage() {
for (int i=0; i < totalItems; i++) { for (int i=0; i < totalItems; i++) {
QString addr = ui->sendToWidgets->findChild<QLineEdit*>(QString("Address") % QString::number(i+1))->text().trimmed(); QString addr = ui->sendToWidgets->findChild<QLineEdit*>(QString("Address") % QString::number(i+1))->text().trimmed();
// Remove label if it exists // Remove label if it exists
addr = addressFromAddressField(addr); addr = Settings::addressFromAddressLabel(addr);
double amt = ui->sendToWidgets->findChild<QLineEdit*>(QString("Amount") % QString::number(i+1))->text().trimmed().toDouble(); double amt = ui->sendToWidgets->findChild<QLineEdit*>(QString("Amount") % QString::number(i+1))->text().trimmed().toDouble();
QString memo = ui->sendToWidgets->findChild<QLabel*>(QString("MemoTxt") % QString::number(i+1))->text().trimmed(); QString memo = ui->sendToWidgets->findChild<QLabel*>(QString("MemoTxt") % QString::number(i+1))->text().trimmed();

4
src/settings.cpp

@ -205,3 +205,7 @@ bool Settings::isValidAddress(QString addr) {
return zcexp.exactMatch(addr) || texp.exactMatch(addr) || return zcexp.exactMatch(addr) || texp.exactMatch(addr) ||
ztsexp.exactMatch(addr) || zsexp.exactMatch(addr); ztsexp.exactMatch(addr) || zsexp.exactMatch(addr);
} }
QString Settings::addressFromAddressLabel(const QString& lblAddr) {
return lblAddr.trimmed().split("/").last();
}

2
src/settings.h

@ -72,6 +72,8 @@ public:
static double getTotalFee(); static double getTotalFee();
static bool isValidAddress(QString addr); static bool isValidAddress(QString addr);
static QString addressFromAddressLabel(const QString& lblAddr);
static QString addressLabelFromAddress(const QString& addr);
static const int updateSpeed = 20 * 1000; // 20 sec static const int updateSpeed = 20 * 1000; // 20 sec
static const int quickUpdateSpeed = 5 * 1000; // 5 sec static const int quickUpdateSpeed = 5 * 1000; // 5 sec

Loading…
Cancel
Save