]> Nutra Git (v2) - gamesguru/feather.git/commitdiff
Coins: Sweep selected
authortobtoht <thotbot@protonmail.com>
Mon, 28 Jun 2021 16:05:21 +0000 (18:05 +0200)
committertobtoht <thotbot@protonmail.com>
Mon, 28 Jun 2021 16:05:21 +0000 (18:05 +0200)
src/appcontext.cpp
src/appcontext.h
src/coinswidget.cpp
src/coinswidget.h
src/dialog/OutputSweepDialog.cpp
src/dialog/OutputSweepDialog.h
src/libwalletqt/Wallet.cpp
src/libwalletqt/Wallet.h
src/mainwindow.ui

index 96b456357f8db2d9490807336158a47edb32de63..006f8c9f89a2e865d06769f2f91523772e155dc4 100644 (file)
@@ -121,6 +121,17 @@ void AppContext::onSweepOutput(const QString &keyImage, QString address, bool ch
     emit initiateTransaction();
 }
 
+void AppContext::onSweepOutputs(const QVector<QString> &keyImages, QString address, bool churn, int outputs) {
+    if (churn) {
+        address = this->wallet->address(0, 0);
+    }
+
+    qInfo() << "Creating transaction";
+    this->wallet->createTransactionSelectedAsync(keyImages, address, outputs, this->tx_priority);
+
+    emit initiateTransaction();
+}
+
 void AppContext::onCreateTransactionError(const QString &msg) {
     this->tmpTxDescription = "";
     emit endTransaction();
index ebf482b829e622a9cab54dedae67fb2fd812e168..1a7d4dbec29f4baa8c995f07f7af2f466148044b 100644 (file)
@@ -51,6 +51,7 @@ public slots:
     void onCreateTransactionMultiDest(const QVector<QString> &addresses, const QVector<quint64> &amounts, const QString &description);
     void onCancelTransaction(PendingTransaction *tx, const QVector<QString> &address);
     void onSweepOutput(const QString &keyImage, QString address, bool churn, int outputs);
+    void onSweepOutputs(const QVector<QString> &keyImages, QString address, bool churn, int outputs);
     void onCreateTransactionError(const QString &msg);
     void onOpenAliasResolve(const QString &openAlias);
     void onSetRestoreHeight(quint64 height);
index 55c9441537e29550950628e6f7cd62b7def02b5d..c6f0d08cedf6d33e60feab8fcebe7f163c8450f1 100644 (file)
@@ -47,10 +47,12 @@ CoinsWidget::CoinsWidget(QSharedPointer<AppContext> ctx, QWidget *parent)
 
     m_viewOutputAction = new QAction(icons()->icon("info2.svg"), "Details", this);
     m_sweepOutputAction = new QAction("Sweep output", this);
+    m_sweepOutputsAction = new QAction("Sweep selected outputs", this);
     connect(m_freezeOutputAction, &QAction::triggered, this, &CoinsWidget::freezeOutput);
     connect(m_thawOutputAction, &QAction::triggered, this, &CoinsWidget::thawOutput);
     connect(m_viewOutputAction, &QAction::triggered, this, &CoinsWidget::viewOutput);
     connect(m_sweepOutputAction, &QAction::triggered, this, &CoinsWidget::onSweepOutput);
+    connect(m_sweepOutputsAction, &QAction::triggered, this, &CoinsWidget::onSweepMulti);
 
     connect(m_freezeAllSelectedAction, &QAction::triggered, this, &CoinsWidget::freezeAllSelected);
     connect(m_thawAllSelectedAction, &QAction::triggered, this, &CoinsWidget::thawAllSelected);
@@ -88,6 +90,7 @@ void CoinsWidget::showContextMenu(const QPoint &point) {
     if (list.size() > 1) {
         menu->addAction(m_freezeAllSelectedAction);
         menu->addAction(m_thawAllSelectedAction);
+        menu->addAction(m_sweepOutputsAction);
     }
     else {
         CoinsInfo* c = this->currentEntry();
@@ -178,7 +181,7 @@ void CoinsWidget::onSweepOutput() {
         return;
     }
 
-    auto *dialog = new OutputSweepDialog(this, c);
+    auto *dialog = new OutputSweepDialog(this, c->amount());
     int ret = dialog->exec();
     if (!ret) return;
 
@@ -186,6 +189,30 @@ void CoinsWidget::onSweepOutput() {
     dialog->deleteLater();
 }
 
+void CoinsWidget::onSweepMulti() {
+    QVector<CoinsInfo*> selectedCoins = this->currentEntries();
+    QVector<QString> keyImages;
+
+    quint64 totalAmount = 0;
+    for (const auto coin : selectedCoins) {
+        if (!coin) return;
+
+        QString keyImage = coin->keyImage();
+        if (!coin->keyImageKnown()) {
+            QMessageBox::warning(this, "Unable to sweep output", "Unable to sweep output: key image unknown");
+            return;
+        }
+        keyImages.push_back(keyImage);
+        totalAmount += coin->amount();
+    }
+
+    OutputSweepDialog dialog{this, totalAmount};
+    int ret = dialog.exec();
+    if (!ret) return;
+
+    m_ctx->onSweepOutputs(keyImages, dialog.address(), dialog.churn(), dialog.outputs());
+}
+
 void CoinsWidget::copy(copyField field) {
     CoinsInfo* c = this->currentEntry();
     if (!c) return;
@@ -227,6 +254,15 @@ CoinsInfo* CoinsWidget::currentEntry() {
     }
 }
 
+QVector<CoinsInfo*> CoinsWidget::currentEntries() {
+    QModelIndexList list = ui->coins->selectionModel()->selectedRows();
+    QVector<CoinsInfo*> selectedCoins;
+    for (const auto index : list) {
+        selectedCoins.push_back(m_model->entryFromIndex(m_proxyModel->mapToSource(index)));
+    }
+    return selectedCoins;
+}
+
 void CoinsWidget::freezeCoins(const QVector<int>& indexes) {
     for (int i : indexes) {
         m_ctx->wallet->coins()->freeze(i);
index 2be9650ef4b5f523a90bd37cfe2f5f02715026d5..e87f2f159eb7a8367a77e336496d8d792ca542be 100644 (file)
@@ -35,6 +35,7 @@ private slots:
     void thawAllSelected();
     void viewOutput();
     void onSweepOutput();
+    void onSweepMulti();
 
 private:
     void freezeCoins(const QVector<int>& indexes);
@@ -63,6 +64,7 @@ private:
     QAction *m_thawAllSelectedAction;
     QAction *m_viewOutputAction;
     QAction *m_sweepOutputAction;
+    QAction *m_sweepOutputsAction;
     Coins *m_coins;
     CoinsModel * m_model;
     CoinsProxyModel * m_proxyModel;
@@ -70,6 +72,7 @@ private:
     void showContextMenu(const QPoint & point);
     void copy(copyField field);
     CoinsInfo* currentEntry();
+    QVector<CoinsInfo*> currentEntries();
 };
 
 
index 0bb1c585dfc02d9bf5e8d28e2fbdc4b92fdae2fb..7c7d2fbc0067cb623404962bd89a9ec3ed41172f 100644 (file)
@@ -6,14 +6,13 @@
 
 #include "libwalletqt/WalletManager.h"
 
-OutputSweepDialog::OutputSweepDialog(QWidget *parent, CoinsInfo *coin)
+OutputSweepDialog::OutputSweepDialog(QWidget *parent, quint64 amount)
         : QDialog(parent)
         , ui(new Ui::OutputSweepDialog)
+        , m_amount(amount)
 {
     ui->setupUi(this);
 
-    m_amount = coin->amount();
-
     connect(ui->checkBox_churn, &QCheckBox::toggled, [&](bool toggled){
        ui->lineEdit_address->setEnabled(!toggled);
        ui->lineEdit_address->setText(toggled ? "Primary address" : "");
index d5c9101d10409d02c46f36bf76f3d9b667e4595c..4b565fb49eb7194a7dbe457873a0d6d389be201b 100644 (file)
@@ -17,7 +17,7 @@ class OutputSweepDialog : public QDialog
 Q_OBJECT
 
 public:
-    explicit OutputSweepDialog(QWidget *parent, CoinsInfo *coin);
+    explicit OutputSweepDialog(QWidget *parent, quint64 amount);
     ~OutputSweepDialog() override;
 
     QString address();
index 003fd3649b5a13f93e6c08a316164df91af69bed..c4943c182ffab85749135bfe06e67babe5f5966c 100644 (file)
@@ -723,6 +723,29 @@ void Wallet::createTransactionSingleAsync(const QString &key_image, const QStrin
     });
 }
 
+PendingTransaction *Wallet::createTransactionSelected(const QVector<QString> &key_images, const QString &dst_addr,
+                                                      size_t outputs, PendingTransaction::Priority priority)
+{
+    std::vector<std::string> kis;
+    for (const auto &key_image : key_images) {
+        kis.push_back(key_image.toStdString());
+    }
+    Monero::PendingTransaction *ptImpl = m_walletImpl->createTransactionSelected(kis, dst_addr.toStdString(), outputs, static_cast<Monero::PendingTransaction::Priority>(priority));
+    PendingTransaction *result = new PendingTransaction(ptImpl, this);
+
+    return result;
+}
+
+void Wallet::createTransactionSelectedAsync(const QVector<QString> &key_images, const QString &dst_addr,
+                                            size_t outputs, PendingTransaction::Priority priority)
+{
+    m_scheduler.run([this, key_images, dst_addr, outputs, priority] {
+        PendingTransaction *tx = createTransactionSelected(key_images, dst_addr, outputs, priority);
+        QVector<QString> address {dst_addr};
+        emit transactionCreated(tx, address);
+    });
+}
+
 PendingTransaction *Wallet::createSweepUnmixableTransaction()
 {
 //    pauseRefresh();
index 94dcc25a46e67c8e1699c4b890ce0c8d3c61ef5c..5f0a65a8cdc48b87e56e38f4ff33faa585f80d09 100644 (file)
@@ -298,6 +298,14 @@ public:
     void createTransactionSingleAsync(const QString &key_image, const QString &dst_addr,
             size_t outputs, PendingTransaction::Priority priority);
 
+    //! creates transaction with selected inputs
+    PendingTransaction * createTransactionSelected(const QVector<QString> &key_images, const QString &dst_addr,
+                                                   size_t outputs, PendingTransaction::Priority priority);
+
+    //! creates async transaction with selected inputs
+    void createTransactionSelectedAsync(const QVector<QString> &key_images, const QString &dst_addr,
+                                        size_t outputs, PendingTransaction::Priority priority);
+
     //! creates sweep unmixable transaction
     PendingTransaction * createSweepUnmixableTransaction();
 
index fc0c81d6c11a3588e35d397a92abdf2121fb079c..8748ebf5ecd79da3df244f1f9fb16ce804b2e9b2 100644 (file)
   <customwidget>
    <class>CCSWidget</class>
    <extends>QWidget</extends>
-   <header>widgets/ccswidget.h</header>
+   <header>widgets/CCSWidget.h</header>
    <container>1</container>
   </customwidget>
   <customwidget>
    <class>RedditWidget</class>
    <extends>QWidget</extends>
-   <header>widgets/redditwidget.h</header>
+   <header>widgets/RedditWidget.h</header>
    <container>1</container>
   </customwidget>
  </customwidgets>