Skip to content

Commit 1431835

Browse files
committed
CoinControl for masternodes
1 parent aca81a1 commit 1431835

File tree

6 files changed

+75
-7
lines changed

6 files changed

+75
-7
lines changed

src/qt/pivx/forms/masternodeswidget.ui

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,16 @@ and vote on the treasury system receiving a periodic reward.</string>
336336
<property name="spacing">
337337
<number>6</number>
338338
</property>
339+
<item>
340+
<widget class="OptionButton" name="btnCoinControl" native="true">
341+
<property name="minimumSize">
342+
<size>
343+
<width>0</width>
344+
<height>50</height>
345+
</size>
346+
</property>
347+
</widget>
348+
</item>
339349
<item>
340350
<widget class="OptionButton" name="btnAbout" native="true">
341351
<property name="minimumSize">

src/qt/pivx/masternodeswidget.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include "qt/pivx/masternodeswidget.h"
6+
#include "coincontrol.h"
67
#include "qt/pivx/forms/ui_masternodeswidget.h"
78

89
#include "qt/pivx/qtutils.h"
@@ -88,11 +89,16 @@ MasterNodesWidget::MasterNodesWidget(PIVXGUI *parent) :
8889
setCssBtnPrimary(ui->pushButtonStartAll);
8990
setCssBtnPrimary(ui->pushButtonStartMissing);
9091

92+
/* Coin control */
93+
this->coinControlDialog = new CoinControlDialog();
94+
9195
/* Options */
9296
ui->btnAbout->setTitleClassAndText("btn-title-grey", tr("What is a Masternode?"));
9397
ui->btnAbout->setSubTitleClassAndText("text-subtitle", tr("FAQ explaining what Masternodes are"));
9498
ui->btnAboutController->setTitleClassAndText("btn-title-grey", tr("What is a Controller?"));
9599
ui->btnAboutController->setSubTitleClassAndText("text-subtitle", tr("FAQ explaining what is a Masternode Controller"));
100+
ui->btnCoinControl->setTitleClassAndText("btn-title-grey", "Coin Control");
101+
ui->btnCoinControl->setSubTitleClassAndText("text-subtitle", "Select the source of coins to create a Masternode");
96102

97103
setCssProperty(ui->listMn, "container");
98104
ui->listMn->setItemDelegate(delegate);
@@ -115,6 +121,7 @@ MasterNodesWidget::MasterNodesWidget(PIVXGUI *parent) :
115121
connect(ui->listMn, &QListView::clicked, this, &MasterNodesWidget::onMNClicked);
116122
connect(ui->btnAbout, &OptionButton::clicked, [this](){window->openFAQ(SettingsFaqWidget::Section::MASTERNODE);});
117123
connect(ui->btnAboutController, &OptionButton::clicked, [this](){window->openFAQ(SettingsFaqWidget::Section::MNCONTROLLER);});
124+
connect(ui->btnCoinControl, &OptionButton::clicked, this, &MasterNodesWidget::onCoinControlClicked);
118125
}
119126

120127
void MasterNodesWidget::showEvent(QShowEvent *event)
@@ -366,6 +373,22 @@ void MasterNodesWidget::onCreateMNClicked()
366373
.arg(GUIUtil::formatBalance(mnCollateralAmount, BitcoinUnits::PIV)));
367374
return;
368375
}
376+
377+
if (coinControlDialog->coinControl && coinControlDialog->coinControl->HasSelected()) {
378+
std::vector<OutPointWrapper> coins;
379+
coinControlDialog->coinControl->ListSelected(coins);
380+
CAmount selectedBalance = 0;
381+
for (const auto& coin : coins) {
382+
selectedBalance += coin.value;
383+
}
384+
if (selectedBalance <= mnCollateralAmount) {
385+
inform(tr("Not enough coins selected to create a masternode, %1 required.")
386+
.arg(GUIUtil::formatBalance(mnCollateralAmount, BitcoinUnits::PIV)));
387+
return;
388+
}
389+
mnModel->setCoinControl(coinControlDialog->coinControl);
390+
}
391+
369392
showHideOp(true);
370393
MasterNodeWizardDialog *dialog = new MasterNodeWizardDialog(walletModel, mnModel, window);
371394
if (openDialogWithOpaqueBackgroundY(dialog, window, 5, 7)) {
@@ -380,13 +403,30 @@ void MasterNodesWidget::onCreateMNClicked()
380403
}
381404
}
382405
dialog->deleteLater();
406+
resetCoinControl();
383407
}
384408

385409
void MasterNodesWidget::changeTheme(bool isLightTheme, QString& theme)
386410
{
387411
static_cast<MNHolder*>(this->delegate->getRowFactory())->isLightTheme = isLightTheme;
388412
}
389413

414+
void MasterNodesWidget::onCoinControlClicked()
415+
{
416+
if (!coinControlDialog->hasModel()) coinControlDialog->setModel(walletModel);
417+
coinControlDialog->setSelectionType(true);
418+
coinControlDialog->refreshDialog();
419+
coinControlDialog->exec();
420+
ui->btnCoinControl->setActive(coinControlDialog->coinControl->HasSelected());
421+
}
422+
423+
void MasterNodesWidget::resetCoinControl()
424+
{
425+
if (coinControlDialog) coinControlDialog->coinControl->SetNull();
426+
mnModel->resetCoinControl();
427+
ui->btnCoinControl->setActive(false);
428+
}
429+
390430
MasterNodesWidget::~MasterNodesWidget()
391431
{
392432
delete ui;

src/qt/pivx/masternodeswidget.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
#ifndef MASTERNODESWIDGET_H
66
#define MASTERNODESWIDGET_H
77

8-
#include "qt/pivx/pwidget.h"
8+
#include "coincontroldialog.h"
99
#include "qt/pivx/furabstractlistitemdelegate.h"
10+
#include "qt/pivx/pwidget.h"
1011
#include "qt/pivx/tooltipmenu.h"
1112

1213
#include <atomic>
@@ -33,6 +34,7 @@ class MasterNodesWidget : public PWidget
3334

3435
explicit MasterNodesWidget(PIVXGUI *parent = nullptr);
3536
~MasterNodesWidget();
37+
void resetCoinControl();
3638
void setMNModel(MNModel* _mnModel);
3739

3840
void run(int type) override;
@@ -42,6 +44,7 @@ class MasterNodesWidget : public PWidget
4244
void hideEvent(QHideEvent *event) override;
4345

4446
private Q_SLOTS:
47+
void onCoinControlClicked();
4548
void onCreateMNClicked();
4649
void onStartAllClicked(int type);
4750
void changeTheme(bool isLightTheme, QString &theme) override;
@@ -59,6 +62,7 @@ private Q_SLOTS:
5962
TooltipMenu* menu = nullptr;
6063
QModelIndex index;
6164
QTimer *timer = nullptr;
65+
CoinControlDialog* coinControlDialog = nullptr;
6266

6367
std::atomic<bool> isLoading;
6468

src/qt/pivx/mnmodel.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44

55
#include "qt/pivx/mnmodel.h"
66

7+
#include "coincontrol.h"
78
#include "masternode.h"
89
#include "masternodeman.h"
9-
#include "net.h" // for validateMasternodeIP
10-
#include "tiertwo/tiertwo_sync_state.h"
11-
#include "uint256.h"
10+
#include "net.h" // for validateMasternodeIP
1211
#include "qt/bitcoinunits.h"
1312
#include "qt/optionsmodel.h"
1413
#include "qt/pivx/guitransactionsutils.h"
1514
#include "qt/walletmodel.h"
1615
#include "qt/walletmodeltransaction.h"
16+
#include "tiertwo/tiertwo_sync_state.h"
17+
#include "uint256.h"
1718

1819
#include <QFile>
1920
#include <QHostAddress>
@@ -219,9 +220,8 @@ bool MNModel::createMNCollateral(
219220
WalletModelTransaction currentTransaction(recipients);
220221
WalletModel::SendCoinsReturn prepareStatus;
221222

222-
// no coincontrol, no P2CS delegations
223-
prepareStatus = walletModel->prepareTransaction(&currentTransaction, nullptr, false);
224-
223+
// no P2CS delegations
224+
prepareStatus = walletModel->prepareTransaction(&currentTransaction, coinControl, false);
225225
QString returnMsg = tr("Unknown error");
226226
// process prepareStatus and on error generate message shown to user
227227
CClientUIInterface::MessageBoxFlags informType;
@@ -504,3 +504,13 @@ bool MNModel::removeLegacyMN(const std::string& alias_to_remove, const std::stri
504504
masternodeConfig.remove(alias_to_remove);
505505
return true;
506506
}
507+
508+
void MNModel::setCoinControl(CCoinControl* coinControl)
509+
{
510+
this->coinControl = coinControl;
511+
}
512+
513+
void MNModel::resetCoinControl()
514+
{
515+
coinControl = nullptr;
516+
}

src/qt/pivx/mnmodel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,12 @@ class MNModel : public QAbstractTableModel
7777
QString& ret_error);
7878

7979
bool removeLegacyMN(const std::string& alias_to_remove, const std::string& tx_id, unsigned int out_index, QString& ret_error);
80+
void setCoinControl(CCoinControl* coinControl);
81+
void resetCoinControl();
8082

8183
private:
8284
WalletModel* walletModel;
85+
CCoinControl* coinControl;
8386
// alias mn node ---> pair <ip, master node>
8487
QMap<QString, std::pair<QString, CMasternode*>> nodes;
8588
QMap<std::string, bool> collateralTxAccepted;

src/qt/pivx/pivxgui.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ void PIVXGUI::goToAddresses()
505505

506506
void PIVXGUI::goToMasterNodes()
507507
{
508+
masterNodesWidget->resetCoinControl();
508509
showTop(masterNodesWidget);
509510
}
510511

0 commit comments

Comments
 (0)