connect(ui->lineAmount, &QLineEdit::textChanged, this, &SendWidget::amountEdited);
connect(ui->lineAddress, &QPlainTextEdit::textChanged, this, &SendWidget::addressEdited);
connect(ui->btn_openAlias, &QPushButton::clicked, this, &SendWidget::aliasClicked);
+ connect(ui->lineAddress, &PayToEdit::dataPasted, this, &SendWidget::onDataPasted);
ui->label_conversionAmount->setText("");
ui->label_conversionAmount->hide();
ui->btn_openAlias->hide();
ui->btnSend->setEnabled(true);
}
+void SendWidget::onDataPasted(const QString &data) {
+ if (!data.isEmpty()) {
+ QVariantMap uriData = m_ctx->wallet->parse_uri_to_object(data);
+ if (!uriData.contains("error")) {
+ if (uriData.contains("address"))
+ ui->lineAddress->setText(uriData.value("address").toString());
+ if (uriData.contains("amount"))
+ ui->lineAmount->setText(uriData.value("amount").toString());
+ if (uriData.contains("tx_description"))
+ ui->lineDescription->setText(uriData.value("tx_description").toString());
+ } else {
+ ui->lineAddress->setText(data);
+ }
+ }
+ else {
+ QMessageBox::warning(this, "Error", "No Qr Code found.");
+ }
+}
+
void SendWidget::setupComboBox() {
ui->comboCurrencySelection->clear();
void onInitiateTransaction();
void onEndTransaction();
+private slots:
+ void onDataPasted(const QString &data);
+
private:
void setupComboBox();
double amountDouble();
return m_walletImpl->verifySignedMessage(message.toStdString(), address.toStdString(), signature.toStdString());
}
}
-bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error)
+
+bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const
{
std::string s_address, s_payment_id, s_tx_description, s_recipient_name, s_error;
std::vector<std::string> s_unknown_parameters;
return res;
}
+QVariantMap Wallet::parse_uri_to_object(const QString &uri) const
+{
+ QString address;
+ QString payment_id;
+ uint64_t amount = 0;
+ QString tx_description;
+ QString recipient_name;
+ QVector<QString> unknown_parameters;
+ QString error;
+
+ QVariantMap result;
+ if (this->parse_uri(uri, address, payment_id, amount, tx_description, recipient_name, unknown_parameters, error)) {
+ result.insert("address", address);
+ result.insert("payment_id", payment_id);
+ result.insert("amount", amount > 0 ? QString::fromStdString(Monero::Wallet::displayAmount(amount)) : "");
+ result.insert("tx_description", tx_description);
+ result.insert("recipient_name", recipient_name);
+ } else {
+ result.insert("error", error);
+ }
+
+ return result;
+}
+
bool Wallet::rescanSpent()
{
QMutexLocker locker(&m_asyncMutex);
Q_OBJECT
public:
- Wallet(QObject * parent = nullptr);
- Wallet(Monero::Wallet *w, QObject * parent = nullptr);
- ~Wallet();
+ explicit Wallet(QObject *parent = nullptr);
+ explicit Wallet(Monero::Wallet *w, QObject * parent = nullptr);
+ ~Wallet() override;
enum Status {
Status_Ok = Monero::Wallet::Status_Ok,
bool verifySignedMessage(const QString &message, const QString &address, const QString &signature, bool filename = false) const;
//! Parse URI
- bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error);
+ bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const;
+ QVariantMap parse_uri_to_object(const QString &uri) const;
//! Namespace your cacheAttribute keys to avoid collisions
bool setCacheAttribute(const QString &key, const QString &val);
res = std::string(dnssec_valid ? "true" : "false") + "|" + res;
return QString::fromStdString(res);
}
-bool WalletManager::parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const
-{
- QMutexLocker locker(&m_mutex);
- // TODO: FIXME
-// if (m_currentWallet)
-// return m_currentWallet->parse_uri(uri, address, payment_id, amount, tx_description, recipient_name, unknown_parameters, error);
- return false;
-}
-
-QVariantMap WalletManager::parse_uri_to_object(const QString &uri) const
-{
- QString address;
- QString payment_id;
- uint64_t amount = 0;
- QString tx_description;
- QString recipient_name;
- QVector<QString> unknown_parameters;
- QString error;
-
- QVariantMap result;
- if (this->parse_uri(uri, address, payment_id, amount, tx_description, recipient_name, unknown_parameters, error)) {
- result.insert("address", address);
- result.insert("payment_id", payment_id);
- result.insert("amount", amount > 0 ? displayAmount(amount) : "");
- result.insert("tx_description", tx_description);
- result.insert("recipient_name", recipient_name);
- } else {
- result.insert("error", error);
- }
-
- return result;
-}
void WalletManager::setLogLevel(int logLevel)
{
Q_INVOKABLE qint64 subi(qint64 x, qint64 y) const { return x - y; }
Q_INVOKABLE QString resolveOpenAlias(const QString &address) const;
- Q_INVOKABLE bool parse_uri(const QString &uri, QString &address, QString &payment_id, uint64_t &amount, QString &tx_description, QString &recipient_name, QVector<QString> &unknown_parameters, QString &error) const;
- Q_INVOKABLE QVariantMap parse_uri_to_object(const QString &uri) const;
// clear/rename wallet cache
Q_INVOKABLE static bool clearWalletCache(const QString &fileName);
#include "PayToEdit.h"
-#include <QtGlobal>
+#include <QApplication>
+#include <QClipboard>
+#include <QMimeData>
#include <QScrollBar>
+#include <QtGlobal>
#include "libwalletqt/WalletManager.h"
#include "model/ModelUtils.h"
+#include "qrcode_scanner/QrCodeUtils.h"
PayToEdit::PayToEdit(QWidget *parent) : QPlainTextEdit(parent)
{
return true;
}
+void PayToEdit::keyPressEvent(QKeyEvent *event) {
+ if (event->matches(QKeySequence::Paste)) {
+ this->pasteEvent(QApplication::clipboard()->mimeData());
+ event->accept();
+ }
+
+ QPlainTextEdit::keyPressEvent(event);
+}
+
+void PayToEdit::pasteEvent(const QMimeData *mimeData) {
+ QImage image;
+ if (mimeData->hasImage()) {
+ image = qvariant_cast<QImage>(mimeData->imageData());
+ }
+ else if (mimeData->hasUrls()) {
+ QList<QUrl> urlList = mimeData->urls();
+ if (urlList.count() > 1) {
+ return;
+ }
+ QFileInfo file(urlList.at(0).toLocalFile());
+ if (file.exists()) {
+ image = QImage{file.absoluteFilePath()};
+ }
+ }
+ else {
+ return;
+ }
+
+ if (image.isNull()) {
+ qDebug() << "Invalid image";
+ return;
+ }
+
+ image.convertTo(QImage::Format_RGB32);
+ QString result = QrCodeUtils::scanImage(image);
+
+ dataPasted(result);
+}
+
void PayToEdit::checkText() {
m_errors.clear();
m_outputs.clear();
void payToMany();
bool isOpenAlias();
+signals:
+ void dataPasted(const QString &data);
+
+protected:
+ void keyPressEvent(QKeyEvent *event) override;
+
private:
void checkText();
void updateSize();
+ void pasteEvent(const QMimeData *mimeData);
+
PartialTxOutput parseAddressAndAmount(const QString &line);
quint64 parseAmount(QString amount);
QString parseAddress(QString address);