]> Nutra Git (v2) - gamesguru/feather.git/commitdiff
Send: paste Qr code image in pay to field
authortobtoht <thotbot@protonmail.com>
Wed, 7 Jul 2021 22:48:17 +0000 (00:48 +0200)
committertobtoht <thotbot@protonmail.com>
Wed, 7 Jul 2021 22:48:17 +0000 (00:48 +0200)
src/SendWidget.cpp
src/SendWidget.h
src/libwalletqt/Wallet.cpp
src/libwalletqt/Wallet.h
src/libwalletqt/WalletManager.cpp
src/libwalletqt/WalletManager.h
src/widgets/PayToEdit.cpp
src/widgets/PayToEdit.h

index 1d24138b65c624e4a2ea5608fdefd13581ad727a..c7671704df27eb55b23741e126d9d91a83c0274c 100644 (file)
@@ -41,6 +41,7 @@ SendWidget::SendWidget(QSharedPointer<AppContext> ctx, QWidget *parent)
     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();
@@ -274,6 +275,25 @@ void SendWidget::onEndTransaction() {
     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();
 
index 7826318146c4791285f5888c440b6c661ef04176..31c9c0a03f9074e4d82c50fefab461ad673ade8d 100644 (file)
@@ -44,6 +44,9 @@ public slots:
     void onInitiateTransaction();
     void onEndTransaction();
 
+private slots:
+    void onDataPasted(const QString &data);
+
 private:
     void setupComboBox();
     double amountDouble();
index 629d7885a22ca1866ca9cd118529fc035cf18d21..98d0d9da8093065ec4c35e3845b2010a57580a24 100644 (file)
@@ -1102,7 +1102,8 @@ bool Wallet::verifySignedMessage(const QString &message, const QString &address,
     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;
@@ -1120,6 +1121,30 @@ bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id
    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);
index bcdb65c51d565ea5b78078f8b2ae51a440a618c3..49e44eb8a8b05f02ebabd11293a9c3905d44ecc2 100644 (file)
@@ -76,9 +76,9 @@ class Wallet : public QObject, public PassprasePrompter
 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,
@@ -384,7 +384,8 @@ public:
     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);
index fbecd333504d87e051a43bf0f1df3f756cf78419..0c1d655ac8b18831c7e5c65dff74b86587996f68 100644 (file)
@@ -304,38 +304,6 @@ QString WalletManager::resolveOpenAlias(const QString &address) const
     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)
 {
index b43f83dedef825c7c7b40dd528ce833f66a6a450..b9086c5d7722322135b06c4cce3b0b60e9b1c792 100644 (file)
@@ -143,8 +143,6 @@ public:
     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);
index a63f41dc9603a6002bae35ceba61551967fcee2f..1a7fc8135a9820c96182354651e03e63ec30f0bf 100644 (file)
@@ -4,11 +4,15 @@
 
 #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)
 {
@@ -72,6 +76,45 @@ bool PayToEdit::isOpenAlias() {
     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();
index 0b3bfa7064d171c5037ab40637e10f0467b7f7c4..0d698df37ef94c88600a8253653bcda599c599c4 100644 (file)
@@ -48,10 +48,18 @@ public:
     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);