Compare commits

...

7 Commits

@ -317,7 +317,7 @@ void AppContext::onWalletOpened(Wallet *wallet) {
emit walletOpenedError(errMsg); emit walletOpenedError(errMsg);
} else { } else {
this->walletClose(false); this->walletClose(false);
emit walletOpenPasswordNeeded(this->walletPassword.isEmpty()); emit walletOpenPasswordNeeded(this->walletPassword.isEmpty(), wallet->path());
} }
return; return;
} }

@ -147,7 +147,7 @@ signals:
void walletCreatedError(const QString &msg); void walletCreatedError(const QString &msg);
void walletCreated(Wallet *wallet); void walletCreated(Wallet *wallet);
void walletOpenedError(QString msg); void walletOpenedError(QString msg);
void walletOpenPasswordNeeded(bool invalidPassword); void walletOpenPasswordNeeded(bool invalidPassword, QString path);
void transactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid); void transactionCommitted(bool status, PendingTransaction *tx, const QStringList& txid);
void createTransactionError(QString message); void createTransactionError(QString message);
void createTransactionCancelled(QString address, double amount); void createTransactionCancelled(QString address, double amount);

@ -58,7 +58,7 @@ void CLI::onWalletOpenedError(const QString &err) {
return this->finishedError(err); return this->finishedError(err);
} }
void CLI::onWalletOpenPasswordRequired(bool invalidPassword) { void CLI::onWalletOpenPasswordRequired(bool invalidPassword, const QString &path) {
if(mode == CLIMode::CLIModeExportContacts || if(mode == CLIMode::CLIModeExportContacts ||
mode == CLIMode::CLIModeExportTxHistory) mode == CLIMode::CLIModeExportTxHistory)
return this->finishedError("invalid password"); return this->finishedError("invalid password");

@ -26,7 +26,7 @@ public slots:
//libwalletqt //libwalletqt
void onWalletOpened(); void onWalletOpened();
void onWalletOpenedError(const QString& err); void onWalletOpenedError(const QString& err);
void onWalletOpenPasswordRequired(bool invalidPassword); void onWalletOpenPasswordRequired(bool invalidPassword, const QString &path);
private: private:
AppContext *ctx; AppContext *ctx;

@ -474,6 +474,8 @@ void MainWindow::initMenu() {
Utils::showMessageBox("Address book exported", QString("Address book exported to %1").arg(fn), false); Utils::showMessageBox("Address book exported", QString("Address book exported to %1").arg(fn), false);
}); });
connect(ui->actionImportContactsCSV, &QAction::triggered, this, &MainWindow::importContacts);
// Tools // Tools
connect(ui->actionSignVerify, &QAction::triggered, this, &MainWindow::menuSignVerifyClicked); connect(ui->actionSignVerify, &QAction::triggered, this, &MainWindow::menuSignVerifyClicked);
connect(ui->actionVerifyTxProof, &QAction::triggered, this, &MainWindow::menuVerifyTxProof); connect(ui->actionVerifyTxProof, &QAction::triggered, this, &MainWindow::menuVerifyTxProof);
@ -545,12 +547,13 @@ void MainWindow::onWalletCreatedError(const QString &err) {
this->showWizard(WalletWizard::Page_CreateWallet); this->showWizard(WalletWizard::Page_CreateWallet);
} }
void MainWindow::onWalletOpenPasswordRequired(bool invalidPassword) { void MainWindow::onWalletOpenPasswordRequired(bool invalidPassword, const QString &path) {
QFileInfo fileInfo(path);
QInputDialog passwordDialog(this); QInputDialog passwordDialog(this);
passwordDialog.setInputMode(QInputDialog::TextInput); passwordDialog.setInputMode(QInputDialog::TextInput);
passwordDialog.setTextEchoMode(QLineEdit::Password); passwordDialog.setTextEchoMode(QLineEdit::Password);
passwordDialog.setWindowTitle("Password required"); passwordDialog.setWindowTitle("Password required");
passwordDialog.setLabelText("Please enter wallet password."); passwordDialog.setLabelText(QString("Please enter %1 wallet password.").arg(fileInfo.fileName()));
passwordDialog.resize(300, 100); passwordDialog.resize(300, 100);
if(!(bool)passwordDialog.exec()) if(!(bool)passwordDialog.exec())
return this->showWizard(WalletWizard::Page_OpenWallet); return this->showWizard(WalletWizard::Page_OpenWallet);
@ -1045,6 +1048,29 @@ void MainWindow::onAddContact(const QString &address, const QString &name) {
} }
} }
void MainWindow::importContacts() {
const QString targetFile = QFileDialog::getOpenFileName(this, "Import CSV file", QDir::homePath(), "CSV Files (*.csv)");
if(targetFile.isEmpty()) return;
auto *model = m_ctx->currentWallet->addressBookModel();
QMapIterator<QString, QString> i(model->readCSV(targetFile));
int inserts = 0;
while (i.hasNext()) {
i.next();
bool addressValid = WalletManager::addressValid(i.value(), m_ctx->currentWallet->nettype());
if(addressValid) {
m_ctx->currentWallet->addressBook()->addRow(i.value(), "", i.key());
inserts++;
}
}
if(inserts > 0) {
m_ctx->storeWallet();
}
QMessageBox::information(this, "Contacts imported", QString("Total contacts imported: %1").arg(inserts));
}
MainWindow *MainWindow::getInstance() { MainWindow *MainWindow::getInstance() {
return pMainWindow; return pMainWindow;
} }

@ -96,9 +96,10 @@ public slots:
void onWalletCreated(Wallet *wallet); void onWalletCreated(Wallet *wallet);
void menuWalletCloseClicked(); void menuWalletCloseClicked();
void menuWalletOpenClicked(); void menuWalletOpenClicked();
void onWalletOpenPasswordRequired(bool invalidPassword); void onWalletOpenPasswordRequired(bool invalidPassword, const QString &path);
void onViewOnBlockExplorer(const QString &txid); void onViewOnBlockExplorer(const QString &txid);
void onAddContact(const QString &address, const QString &name); void onAddContact(const QString &address, const QString &name);
void importContacts();
void showRestoreHeightDialog(); void showRestoreHeightDialog();
// offline tx signing // offline tx signing

@ -333,6 +333,7 @@
<string>Contacts</string> <string>Contacts</string>
</property> </property>
<addaction name="actionExportContactsCSV"/> <addaction name="actionExportContactsCSV"/>
<addaction name="actionImportContactsCSV"/>
</widget> </widget>
<widget class="QMenu" name="menuAdvanced"> <widget class="QMenu" name="menuAdvanced">
<property name="title"> <property name="title">
@ -538,6 +539,11 @@
<string>Refresh models</string> <string>Refresh models</string>
</property> </property>
</action> </action>
<action name="actionImportContactsCSV">
<property name="text">
<string>Import CSV</string>
</property>
</action>
<action name="actionExportContactsCSV"> <action name="actionExportContactsCSV">
<property name="text"> <property name="text">
<string>Export CSV</string> <string>Export CSV</string>

@ -174,3 +174,26 @@ bool AddressBookModel::writeCSV(const QString &path) {
csv = QString("address,description\n%1").arg(csv); csv = QString("address,description\n%1").arg(csv);
return Utils::fileWrite(path, csv); return Utils::fileWrite(path, csv);
} }
QMap<QString, QString> AddressBookModel::readCSV(const QString &path) {
if(!Utils::fileExists(path)) {
return QMap<QString, QString>();
}
QString csv = Utils::barrayToString(Utils::fileOpen(path));
QTextStream stream(&csv);
QMap<QString, QString> map;
while(!stream.atEnd()) {
QStringList line = stream.readLine().split(",");
if(line.length() != 2) {
continue;
}
QString address = line.at(0);
QString description = line.at(1);
description = description.replace("\"", "");
if(!description.isEmpty() && !address.isEmpty()) {
map[description] = address;
}
}
return map;
}

@ -36,6 +36,7 @@ public:
bool isShowFullAddresses() const; bool isShowFullAddresses() const;
void setShowFullAddresses(bool show); void setShowFullAddresses(bool show);
bool writeCSV(const QString &path); bool writeCSV(const QString &path);
QMap<QString, QString> readCSV(const QString &path);
public slots: public slots:
void startReset(); void startReset();

Loading…
Cancel
Save