add address/label autocomplete
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user