Browse Source

Large addressbook refactor to use QList, to support contacts having more than 2 data fields

We still need deal with converting v1 addressbooks to v2
chat
Duke Leto 4 years ago
parent
commit
8636754703
  1. 62
      src/addressbook.cpp
  2. 17
      src/addressbook.h
  3. 26
      src/mainwindow.cpp
  4. 4
      src/mainwindow.h
  5. 3
      src/sendtab.cpp

62
src/addressbook.cpp

@ -32,9 +32,9 @@ void AddressBookModel::loadData() {
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, QString myZaddr) {
//labels.push_back(QPair<QString, QString>(label, addr)); //labels.push_back(QPair<QString, QString>(label, addr));
AddressBook::getInstance()->addAddressLabel(label, addr); AddressBook::getInstance()->addAddressLabel(label, addr, myZaddr);
labels.clear(); labels.clear();
labels = AddressBook::getInstance()->getAllAddressLabels(); labels = AddressBook::getInstance()->getAllAddressLabels();
@ -47,7 +47,7 @@ void AddressBookModel::removeItemAt(int row) {
if (row >= labels.size()) if (row >= labels.size())
return; return;
AddressBook::getInstance()->removeAddressLabel(labels[row].first, labels[row].second); AddressBook::getInstance()->removeAddressLabel(labels[row][0], labels[row][1]);
labels.clear(); labels.clear();
labels = AddressBook::getInstance()->getAllAddressLabels(); labels = AddressBook::getInstance()->getAllAddressLabels();
@ -56,8 +56,8 @@ void AddressBookModel::removeItemAt(int row) {
layoutChanged(); layoutChanged();
} }
QPair<QString, QString> AddressBookModel::itemAt(int row) { QList<QString> AddressBookModel::itemAt(int row) {
if (row >= labels.size()) return QPair<QString, QString>(); if (row >= labels.size()) return QList<QString>();
return labels.at(row); return labels.at(row);
} }
@ -75,8 +75,8 @@ int AddressBookModel::columnCount(const QModelIndex&) const {
QVariant AddressBookModel::data(const QModelIndex &index, int role) const { QVariant AddressBookModel::data(const QModelIndex &index, int role) const {
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
switch(index.column()) { switch(index.column()) {
case 0: return labels.at(index.row()).first; case 0: return labels.at(index.row())[0];
case 1: return labels.at(index.row()).second; case 1: return labels.at(index.row())[1];
} }
} }
return QVariant(); return QVariant();
@ -149,7 +149,7 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
return; return;
} }
model.addNewLabel(newLabel, ab.addr->text()); model.addNewLabel(newLabel, ab.addr->text(),"");
}); });
// Import Button // Import Button
@ -178,7 +178,8 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
continue; continue;
// Add label, address. // Add label, address.
model.addNewLabel(items.at(1), items.at(0)); //TODO: myzaddr
model.addNewLabel(items.at(1), items.at(0), "");
numImported++; numImported++;
} }
@ -198,8 +199,8 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
if (index.row() < 0) return; if (index.row() < 0) return;
QString lbl = model.itemAt(index.row()).first; QString lbl = model.itemAt(index.row())[0];
QString addr = model.itemAt(index.row()).second; QString addr = model.itemAt(index.row())[1];
d.accept(); d.accept();
fnSetTargetLabelAddr(target, lbl, addr); fnSetTargetLabelAddr(target, lbl, addr);
}); });
@ -211,8 +212,8 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
if (index.row() < 0) return; if (index.row() < 0) return;
QString lbl = model.itemAt(index.row()).first; QString lbl = model.itemAt(index.row())[0];
QString addr = model.itemAt(index.row()).second; QString addr = model.itemAt(index.row())[1];
QMenu menu(parent); QMenu menu(parent);
@ -239,7 +240,7 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) {
auto selection = ab.addresses->selectionModel(); auto selection = ab.addresses->selectionModel();
if (selection && selection->hasSelection() && selection->selectedRows().size() > 0) { if (selection && selection->hasSelection() && selection->selectedRows().size() > 0) {
auto item = model.itemAt(selection->selectedRows().at(0).row()); auto item = model.itemAt(selection->selectedRows().at(0).row());
fnSetTargetLabelAddr(target, item.first, item.second); fnSetTargetLabelAddr(target, item[0], item[1]);
} }
}; };
@ -269,16 +270,20 @@ void AddressBook::readFromStorage() {
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;
//TODO: Do we need to convert v1 address file to v2, or is QT smart enough?
in >> version >> allLabels; in >> version >> allLabels;
qDebug() << "Read " << version << " Hush contacts from disk...";
file.close(); file.close();
} else {
qDebug() << "No Hush contacts found on disk!";
} }
// Special. // Special.
// Add the default ZecWallet donation address if it isn't already present // Add the default ZecWallet donation address if it isn't already present
// QList<QString> allAddresses; // QList<QString> allAddresses;
// std::transform(allLabels.begin(), allLabels.end(), // std::transform(allLabels.begin(), allLabels.end(),
// std::back_inserter(allAddresses), [=] (auto i) { return i.second; }); // std::back_inserter(allAddresses), [=] (auto i) { return i[1]; });
// if (!allAddresses.contains(Settings::getDonationAddr())) { // if (!allAddresses.contains(Settings::getDonationAddr())) {
// allLabels.append(QPair<QString, QString>("ZecWallet donation", Settings::getDonationAddr())); // allLabels.append(QPair<QString, QString>("ZecWallet donation", Settings::getDonationAddr()));
// } // }
@ -288,7 +293,7 @@ void AddressBook::writeToStorage() {
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") << allLabels; out << QString("v2") << allLabels;
file.close(); file.close();
} }
@ -308,18 +313,19 @@ QString AddressBook::writeableFile() {
// Add a new address/label to the database // Add a new address/label to the database
void AddressBook::addAddressLabel(QString label, QString address) { void AddressBook::addAddressLabel(QString label, QString address, QString myzaddr) {
Q_ASSERT(Settings::isValidAddress(address)); Q_ASSERT(Settings::isValidAddress(address));
// First, remove any existing label // First, remove any existing label
// Iterate over the list and remove the label/address // Iterate over the list and remove the label/address
for (int i=0; i < allLabels.size(); i++) { for (int i=0; i < allLabels.size(); i++) {
if (allLabels[i].first == label) { if (allLabels[i][0] == label) {
removeAddressLabel(allLabels[i].first, allLabels[i].second); removeAddressLabel(allLabels[i][0], allLabels[i][1]);
} }
} }
allLabels.push_back(QPair<QString, QString>(label, address)); QList<QString> contact = { label, address, myzaddr };
allLabels.push_back(contact);
writeToStorage(); writeToStorage();
} }
@ -327,7 +333,7 @@ void AddressBook::addAddressLabel(QString label, QString address) {
void AddressBook::removeAddressLabel(QString label, QString address) { void AddressBook::removeAddressLabel(QString label, QString address) {
// Iterate over the list and remove the label/address // Iterate over the list and remove the label/address
for (int i=0; i < allLabels.size(); i++) { for (int i=0; i < allLabels.size(); i++) {
if (allLabels[i].first == label && allLabels[i].second == address) { if (allLabels[i][0] == label && allLabels[i][1] == address) {
allLabels.removeAt(i); allLabels.removeAt(i);
writeToStorage(); writeToStorage();
return; return;
@ -338,8 +344,8 @@ void AddressBook::removeAddressLabel(QString label, QString address) {
void AddressBook::updateLabel(QString oldlabel, QString address, QString newlabel) { void AddressBook::updateLabel(QString oldlabel, QString address, QString newlabel) {
// Iterate over the list and update the label/address // Iterate over the list and update the label/address
for (int i = 0; i < allLabels.size(); i++) { for (int i = 0; i < allLabels.size(); i++) {
if (allLabels[i].first == oldlabel && allLabels[i].second == address) { if (allLabels[i][0] == oldlabel && allLabels[i][1] == address) {
allLabels[i].first = newlabel; allLabels[i][0] = newlabel;
writeToStorage(); writeToStorage();
return; return;
} }
@ -347,7 +353,7 @@ void AddressBook::updateLabel(QString oldlabel, QString address, QString newlabe
} }
// Read all addresses // Read all addresses
const QList<QPair<QString, QString>>& AddressBook::getAllAddressLabels() { const QList<QList<QString>>& AddressBook::getAllAddressLabels() {
if (allLabels.isEmpty()) { if (allLabels.isEmpty()) {
readFromStorage(); readFromStorage();
} }
@ -357,8 +363,8 @@ const QList<QPair<QString, QString>>& AddressBook::getAllAddressLabels() {
// Get the label for an address // Get the label for an address
QString AddressBook::getLabelForAddress(QString addr) { QString AddressBook::getLabelForAddress(QString addr) {
for (auto i : allLabels) { for (auto i : allLabels) {
if (i.second == addr) if (i[1] == addr)
return i.first; return i[0];
} }
return ""; return "";
@ -367,8 +373,8 @@ QString AddressBook::getLabelForAddress(QString addr) {
// Get the address for a label // Get the address for a label
QString AddressBook::getAddressForLabel(QString label) { QString AddressBook::getAddressForLabel(QString label) {
for (auto i: allLabels) { for (auto i: allLabels) {
if (i.first == label) if (i[0] == label)
return i.second; return i[1];
} }
return ""; return "";

17
src/addressbook.h

@ -1,3 +1,5 @@
// Copyright 2019-2020 The Hush Developers
// Released under the GPLv3
#ifndef ADDRESSBOOK_H #ifndef ADDRESSBOOK_H
#define ADDRESSBOOK_H #define ADDRESSBOOK_H
@ -11,9 +13,9 @@ public:
AddressBookModel(QTableView* parent); AddressBookModel(QTableView* parent);
~AddressBookModel(); ~AddressBookModel();
void addNewLabel(QString label, QString addr); void addNewLabel(QString label, QString addr, QString myzaddr);
void removeItemAt(int row); void removeItemAt(int row);
QPair<QString, QString> itemAt(int row); QList<QString> itemAt(int row);
int rowCount(const QModelIndex &parent) const; int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const;
@ -25,7 +27,7 @@ private:
void saveData(); void saveData();
QTableView* parent; QTableView* parent;
QList<QPair<QString, QString>> labels; QList<QList<QString>> labels;
QStringList headers; QStringList headers;
}; };
@ -39,7 +41,7 @@ public:
static QString addressFromAddressLabel(const QString& lblAddr); static QString addressFromAddressLabel(const QString& lblAddr);
// Add a new address/label to the database // Add a new address/label to the database
void addAddressLabel(QString label, QString address); void addAddressLabel(QString label, QString address, QString myZaddr);
// Remove a new address/label from the database // Remove a new address/label from the database
void removeAddressLabel(QString label, QString address); void removeAddressLabel(QString label, QString address);
@ -48,7 +50,7 @@ public:
void updateLabel(QString oldlabel, QString address, QString newlabel); void updateLabel(QString oldlabel, QString address, QString newlabel);
// Read all addresses // Read all addresses
const QList<QPair<QString, QString>>& getAllAddressLabels(); const QList<QList<QString>>& getAllAddressLabels();
// Get an address's first label // Get an address's first label
QString getLabelForAddress(QString address); QString getLabelForAddress(QString address);
@ -61,9 +63,10 @@ private:
void writeToStorage(); void writeToStorage();
QString writeableFile(); QString writeableFile();
QList<QPair<QString, QString>> allLabels; // contact name, contact address, myzaddr (the zaddr we use to receive from this contact)
QList<QList<QString>> allLabels;
static AddressBook* instance; static AddressBook* instance;
}; };
#endif // ADDRESSBOOK_H #endif // ADDRESSBOOK_H

26
src/mainwindow.cpp

@ -30,12 +30,12 @@ void QListView::selectionChanged(const QItemSelection& selected, const QItemSele
} }
QString MainWindow::getZaddrForContact(QString contact) { QString MainWindow::getZaddrForContact(QString contact) {
QList<QPair<QString,QString>> addressLabels = AddressBook::getInstance()->getAllAddressLabels(); QList<QList<QString>> addressLabels = AddressBook::getInstance()->getAllAddressLabels();
for (int i = 0; i < addressLabels.size(); ++i) { for (int i = 0; i < addressLabels.size(); ++i) {
QPair<QString,QString> pair = addressLabels.at(i); QList<QString> thisContact = addressLabels.at(i);
if (pair.first == contact) { if (thisContact[0] == contact) {
qDebug() << "Found contact " << pair.first << " " << pair.second; qDebug() << "Found contact " << thisContact[0] << " " << thisContact[1];
return pair.second; return thisContact[1];
} }
} }
return ""; return "";
@ -1181,14 +1181,14 @@ void MainWindow::setupHushTab() {
void MainWindow::setupChatTab() { void MainWindow::setupChatTab() {
qDebug() << __FUNCTION__; qDebug() << __FUNCTION__;
QList<QPair<QString,QString>> addressLabels = AddressBook::getInstance()->getAllAddressLabels(); QList<QList<QString>> addressLabels = AddressBook::getInstance()->getAllAddressLabels();
QStringListModel *chatModel = new QStringListModel(); QStringListModel *chatModel = new QStringListModel();
QStringList contacts; QStringList contacts;
//contacts << "Alice" << "Bob" << "Charlie" << "Eve"; //contacts << "Alice" << "Bob" << "Charlie" << "Eve";
for (int i = 0; i < addressLabels.size(); ++i) { for (int i = 0; i < addressLabels.size(); ++i) {
QPair<QString,QString> pair = addressLabels.at(i); QList<QString> thisContact = addressLabels.at(i);
qDebug() << "Found contact " << pair.first << " " << pair.second; qDebug() << "Found contact " << thisContact[0] << " " << thisContact[1];
contacts << pair.first; contacts << thisContact[0];
} }
chatModel->setStringList(contacts); chatModel->setStringList(contacts);
@ -1534,14 +1534,12 @@ void MainWindow::setupReceiveTab() {
if (!curLabel.isEmpty() && label.isEmpty()) { if (!curLabel.isEmpty() && label.isEmpty()) {
info = "Removed Label '" % curLabel % "'"; info = "Removed Label '" % curLabel % "'";
AddressBook::getInstance()->removeAddressLabel(curLabel, addr); AddressBook::getInstance()->removeAddressLabel(curLabel, addr);
} } else if (!curLabel.isEmpty() && !label.isEmpty()) {
else if (!curLabel.isEmpty() && !label.isEmpty()) {
info = "Updated Label '" % curLabel % "' to '" % label % "'"; info = "Updated Label '" % curLabel % "' to '" % label % "'";
AddressBook::getInstance()->updateLabel(curLabel, addr, label); AddressBook::getInstance()->updateLabel(curLabel, addr, label);
} } else if (curLabel.isEmpty() && !label.isEmpty()) {
else if (curLabel.isEmpty() && !label.isEmpty()) {
info = "Added Label '" % label % "'"; info = "Added Label '" % label % "'";
AddressBook::getInstance()->addAddressLabel(label, addr); AddressBook::getInstance()->addAddressLabel(label, addr,"");
} }
// Update labels everywhere on the UI // Update labels everywhere on the UI

4
src/mainwindow.h

@ -46,8 +46,8 @@ private:
QString nickname; QString nickname;
QString zaddr; QString zaddr;
QString myZaddr; QString myZaddr;
int64_t lastSentTime; //int64_t lastSentTime;
int64_t lastReceivedTime; //int64_t lastReceivedTime;
}; };

3
src/sendtab.cpp

@ -1,4 +1,5 @@
// Copyright 2019-2020 Hush developers // Copyright 2019-2020 Hush developers
// Released under the GPLv3
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "addressbook.h" #include "addressbook.h"
@ -124,7 +125,7 @@ void MainWindow::updateLabelsAutoComplete() {
auto labels = AddressBook::getInstance()->getAllAddressLabels(); 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[0] % "/" % la[1];
}); });
delete labelCompleter; delete labelCompleter;

Loading…
Cancel
Save