|
|
@ -10,83 +10,56 @@ AddressBookModel::AddressBookModel(QTableView *parent) |
|
|
|
headers << "Label" << "Address"; |
|
|
|
|
|
|
|
this->parent = parent; |
|
|
|
loadDataFromStorage(); |
|
|
|
loadData(); |
|
|
|
} |
|
|
|
|
|
|
|
AddressBookModel::~AddressBookModel() { |
|
|
|
if (labels != nullptr) |
|
|
|
saveDataToStorage(); |
|
|
|
|
|
|
|
delete labels; |
|
|
|
saveData(); |
|
|
|
} |
|
|
|
|
|
|
|
void AddressBookModel::saveDataToStorage() { |
|
|
|
QFile file(writeableFile()); |
|
|
|
file.open(QIODevice::ReadWrite | QIODevice::Truncate); |
|
|
|
QDataStream out(&file); // we will serialize the data into the file
|
|
|
|
out << QString("v1") << *labels; |
|
|
|
file.close(); |
|
|
|
void AddressBookModel::saveData() { |
|
|
|
AddressBook::writeToStorage(labels); |
|
|
|
|
|
|
|
// Save column positions
|
|
|
|
QSettings().setValue("addresstablegeometry", parent->horizontalHeader()->saveState()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void AddressBookModel::loadDataFromStorage() { |
|
|
|
QFile file(writeableFile()); |
|
|
|
|
|
|
|
delete labels; |
|
|
|
labels = new QList<QPair<QString, QString>>(); |
|
|
|
|
|
|
|
file.open(QIODevice::ReadOnly); |
|
|
|
QDataStream in(&file); // read the data serialized from the file
|
|
|
|
QString version; |
|
|
|
in >> version >> *labels; |
|
|
|
|
|
|
|
file.close(); |
|
|
|
void AddressBookModel::loadData() { |
|
|
|
labels = AddressBook::readFromStorage(); |
|
|
|
|
|
|
|
parent->horizontalHeader()->restoreState(QSettings().value("addresstablegeometry").toByteArray()); |
|
|
|
} |
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
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(); |
|
|
|
} |
|
|
|
|
|
|
|
void AddressBookModel::removeItemAt(int row) { |
|
|
|
if (row >= labels->size()) |
|
|
|
if (row >= labels.size()) |
|
|
|
return; |
|
|
|
labels->removeAt(row); |
|
|
|
|
|
|
|
dataChanged(index(0, 0), index(labels->size()-1, columnCount(index(0,0))-1)); |
|
|
|
labels.removeAt(row); |
|
|
|
AddressBook::writeToStorage(labels); |
|
|
|
|
|
|
|
|
|
|
|
dataChanged(index(0, 0), index(labels.size()-1, columnCount(index(0,0))-1)); |
|
|
|
layoutChanged(); |
|
|
|
} |
|
|
|
|
|
|
|
QPair<QString, QString> AddressBookModel::itemAt(int row) { |
|
|
|
if (row >= labels->size()) return QPair<QString, QString>(); |
|
|
|
if (row >= labels.size()) return QPair<QString, QString>(); |
|
|
|
|
|
|
|
return labels->at(row); |
|
|
|
return labels.at(row); |
|
|
|
} |
|
|
|
|
|
|
|
QString AddressBookModel::writeableFile() { |
|
|
|
auto filename = QStringLiteral("addresslabels.dat"); |
|
|
|
|
|
|
|
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); |
|
|
|
if (!dir.exists()) |
|
|
|
QDir().mkpath(dir.absolutePath()); |
|
|
|
|
|
|
|
if (Settings::getInstance()->isTestnet()) { |
|
|
|
return dir.filePath("testnet-" % filename); |
|
|
|
} else { |
|
|
|
return dir.filePath(filename); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int AddressBookModel::rowCount(const QModelIndex&) const { |
|
|
|
if (labels == nullptr) return 0; |
|
|
|
return labels->size(); |
|
|
|
return labels.size(); |
|
|
|
} |
|
|
|
|
|
|
|
int AddressBookModel::columnCount(const QModelIndex&) const { |
|
|
@ -97,12 +70,12 @@ int AddressBookModel::columnCount(const QModelIndex&) const { |
|
|
|
QVariant AddressBookModel::data(const QModelIndex &index, int role) const { |
|
|
|
if (role == Qt::DisplayRole) { |
|
|
|
switch(index.column()) { |
|
|
|
case 0: return labels->at(index.row()).first; |
|
|
|
case 1: return labels->at(index.row()).second; |
|
|
|
case 0: return labels.at(index.row()).first; |
|
|
|
case 1: return labels.at(index.row()).second; |
|
|
|
} |
|
|
|
} |
|
|
|
return QVariant(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QVariant AddressBookModel::headerData(int section, Qt::Orientation orientation, int role) const { |
|
|
@ -127,6 +100,9 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) { |
|
|
|
ab.buttonBox->button(QDialogButtonBox::Ok)->setText("Pick"); |
|
|
|
} |
|
|
|
|
|
|
|
// Connect the dialog's closing to updating the label address completor
|
|
|
|
QObject::connect(&d, &QDialog::finished, [=] (auto) { parent->updateLabelsAutoComplete(); }); |
|
|
|
|
|
|
|
// If there is a target then make it the addr for the "Add to" button
|
|
|
|
if (target != nullptr && Utils::isValidAddress(target->text())) { |
|
|
|
ab.addr->setText(target->text()); |
|
|
@ -146,13 +122,18 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
auto fnSetTargetLabelAddr = [=] (QLineEdit* target, QString label, QString addr) { |
|
|
|
target->setText(label % "/" % addr); |
|
|
|
}; |
|
|
|
|
|
|
|
// Double-Click picks the item
|
|
|
|
QObject::connect(ab.addresses, &QTableView::doubleClicked, [&] (auto index) { |
|
|
|
if (index.row() < 0) return; |
|
|
|
|
|
|
|
QString lbl = model.itemAt(index.row()).first; |
|
|
|
QString addr = model.itemAt(index.row()).second; |
|
|
|
d.accept(); |
|
|
|
target->setText(addr); |
|
|
|
fnSetTargetLabelAddr(target, lbl, addr); |
|
|
|
}); |
|
|
|
|
|
|
|
// Right-Click
|
|
|
@ -162,13 +143,15 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) { |
|
|
|
|
|
|
|
if (index.row() < 0) return; |
|
|
|
|
|
|
|
QString lbl = model.itemAt(index.row()).first; |
|
|
|
QString addr = model.itemAt(index.row()).second; |
|
|
|
|
|
|
|
QMenu menu(parent); |
|
|
|
|
|
|
|
if (target != nullptr) { |
|
|
|
menu.addAction("Pick", [&] () { |
|
|
|
target->setText(addr); |
|
|
|
d.accept(); |
|
|
|
fnSetTargetLabelAddr(target, lbl, addr); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
@ -187,7 +170,46 @@ void AddressBook::open(MainWindow* parent, QLineEdit* target) { |
|
|
|
if (d.exec() == QDialog::Accepted && target != nullptr) { |
|
|
|
auto selection = ab.addresses->selectionModel(); |
|
|
|
if (selection->hasSelection()) { |
|
|
|
target->setText(model.itemAt(selection->selectedRows().at(0).row()).second); |
|
|
|
auto item = model.itemAt(selection->selectedRows().at(0).row()); |
|
|
|
fnSetTargetLabelAddr(target, item.first, item.second); |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
QList<QPair<QString, QString>> AddressBook::readFromStorage() { |
|
|
|
QFile file(AddressBook::writeableFile()); |
|
|
|
|
|
|
|
QList<QPair<QString, QString>> labels; |
|
|
|
|
|
|
|
file.open(QIODevice::ReadOnly); |
|
|
|
QDataStream in(&file); // read the data serialized from the file
|
|
|
|
QString version; |
|
|
|
in >> version >> labels; |
|
|
|
|
|
|
|
file.close(); |
|
|
|
|
|
|
|
return labels; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void AddressBook::writeToStorage(QList<QPair<QString, QString>> labels) { |
|
|
|
QFile file(AddressBook::writeableFile()); |
|
|
|
file.open(QIODevice::ReadWrite | QIODevice::Truncate); |
|
|
|
QDataStream out(&file); // we will serialize the data into the file
|
|
|
|
out << QString("v1") << labels; |
|
|
|
file.close(); |
|
|
|
} |
|
|
|
|
|
|
|
QString AddressBook::writeableFile() { |
|
|
|
auto filename = QStringLiteral("addresslabels.dat"); |
|
|
|
|
|
|
|
auto dir = QDir(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); |
|
|
|
if (!dir.exists()) |
|
|
|
QDir().mkpath(dir.absolutePath()); |
|
|
|
|
|
|
|
if (Settings::getInstance()->isTestnet()) { |
|
|
|
return dir.filePath("testnet-" % filename); |
|
|
|
} else { |
|
|
|
return dir.filePath(filename); |
|
|
|
} |
|
|
|
} |