6 #include "ui_masternodeswidget.h"
20 #define DECORATION_SIZE 65
22 #define REQUEST_START_ALL 1
23 #define REQUEST_START_MISSING 2
36 void init(QWidget* holder,
const QModelIndex &index,
bool isHovered,
bool isSelected)
const override
39 QString label = index.data(Qt::DisplayRole).toString();
40 QString address = index.sibling(index.row(),
MNModel::ADDRESS).data(Qt::DisplayRole).toString();
41 QString status = index.sibling(index.row(),
MNModel::STATUS).data(Qt::DisplayRole).toString();
43 row->
updateView(
"Address: " + address, label, status, wasCollateralAccepted);
46 QColor
rectColor(
bool isHovered,
bool isSelected)
override
70 this->setStyleSheet(parent->styleSheet());
74 ui->left->setContentsMargins(0,20,0,20);
76 ui->right->setContentsMargins(20,20,20,20);
80 fontLight.setWeight(QFont::Light);
84 ui->labelTitle->setFont(fontLight);
96 ui->btnAbout->setTitleClassAndText(
"btn-title-grey", tr(
"What is a Masternode?"));
97 ui->btnAbout->setSubTitleClassAndText(
"text-subtitle", tr(
"FAQ explaining what Masternodes are"));
98 ui->btnAboutController->setTitleClassAndText(
"btn-title-grey", tr(
"What is a Controller?"));
99 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");
107 ui->listMn->setAttribute(Qt::WA_MacShowFocusRect,
false);
108 ui->listMn->setSelectionBehavior(QAbstractItemView::SelectRows);
110 ui->emptyContainer->setVisible(
false);
115 connect(
ui->pushButtonStartAll, &QPushButton::clicked, [
this]() {
116 onStartAllClicked(REQUEST_START_ALL);
118 connect(
ui->pushButtonStartMissing, &QPushButton::clicked, [
this]() {
119 onStartAllClicked(REQUEST_START_MISSING);
122 connect(
ui->btnAbout, &
OptionButton::clicked, [
this](){window->openFAQ(SettingsFaqWidget::Section::MASTERNODE);});
123 connect(
ui->btnAboutController, &
OptionButton::clicked, [
this](){window->openFAQ(SettingsFaqWidget::Section::MNCONTROLLER);});
131 timer =
new QTimer(
this);
153 ui->listMn->setVisible(show);
154 ui->emptyContainer->setVisible(!show);
155 ui->pushButtonStartAll->setVisible(show);
160 ui->listMn->setCurrentIndex(_index);
161 QRect rect =
ui->listMn->visualRect(_index);
162 QPoint pos = rect.topRight();
174 this->
menu->adjustSize();
178 this->
index = _index;
184 ui->listMn->clearSelection();
185 ui->listMn->setFocus();
191 if (!isTierTwoSync)
inform(tr(
"Please wait until the node is fully synced"));
192 return isTierTwoSync;
201 QString strAlias = this->
index.data(Qt::DisplayRole).toString();
202 if (
ask(tr(
"Start Masternode"), tr(
"Are you sure you want to start masternode %1?\n").arg(strAlias))) {
206 inform(tr(
"Cannot edit masternode, wallet locked"));
212 inform(tr(
"Cannot start masternode, the collateral transaction has not been confirmed by the network yet.\n"
220 QString strStatusHtml;
221 strStatusHtml +=
"Alias: " + strAlias +
" ";
223 int failed_amount = 0;
224 int success_amount = 0;
225 std::string alias = strAlias.toStdString();
226 std::string strError;
228 if (failed_amount > 0) {
229 strStatusHtml = tr(
"failed to start.\nError: %1").arg(QString::fromStdString(strError));
230 }
else if (success_amount > 0) {
231 strStatusHtml = tr(
"successfully started");
248 inform(tr(
"Background task is being executed, please wait"));
250 std::unique_ptr<WalletModel::UnlockContext> pctx = std::make_unique<WalletModel::UnlockContext>(
walletModel->
requestUnlock());
251 if (!pctx->isValid()) {
252 warn(tr(
"Start ALL masternodes failed"), tr(
"Wallet unlock cancelled"));
256 if (!
execute(type, std::move(pctx))) {
258 inform(tr(
"Cannot perform Masternodes start"));
265 int amountOfMnFailed = 0;
266 int amountOfMnStarted = 0;
268 if (amountOfMnFailed > 0) {
269 failText = tr(
"%1 Masternodes failed to start, %2 started").arg(amountOfMnFailed).arg(amountOfMnStarted);
280 QString
inform =
startAll(failText, isStartMissing) ? tr(
"All Masternodes started!") : failText;
281 QMetaObject::invokeMethod(
this,
"updateModelAndInform", Qt::QueuedConnection,
291 QMetaObject::invokeMethod(
this,
"inform", Qt::QueuedConnection,
292 Q_ARG(QString,
"Error starting all Masternodes"));
301 inform(tr(
"Cannot show Masternode information, wallet locked"));
306 QString label =
index.data(Qt::DisplayRole).toString();
312 dialog->
setData(pubKey, label, address, txId, outIndex, status);
313 dialog->adjustSize();
316 if (
ask(tr(
"Remote Masternode Data"),
317 tr(
"You are just about to export the required data to run a Masternode\non a remote server to your clipboard.\n\n\n"
318 "You will only have to paste the data in the pivx.conf file\nof your remote server and start it, "
319 "then start the Masternode using\nthis controller wallet (select the Masternode in the list and press \"start\").\n"
322 QString exportedMN =
"masternode=1\n"
323 "externalip=" + address.left(address.lastIndexOf(
":")) +
"\n" +
324 "masternodeaddr=" + address + +
"\n" +
327 inform(tr(
"Masternode data copied to the clipboard."));
331 dialog->deleteLater();
338 QString qAliasString =
index.data(Qt::DisplayRole).toString();
340 bool convertOK =
false;
341 unsigned int indexOut = outIndex.toUInt(&convertOK);
343 inform(tr(
"Invalid collateral output index"));
347 if (!
ask(tr(
"Delete Masternode"), tr(
"You are just about to delete Masternode:\n%1\n\nAre you sure?").arg(qAliasString))) {
366 inform(tr(
"Cannot create Masternode controller, wallet locked"));
372 inform(tr(
"Not enough balance to create a masternode, %1 required.")
378 std::vector<OutPointWrapper> coins;
381 for (
const auto& coin : coins) {
382 selectedBalance += coin.value;
384 if (selectedBalance <= mnCollateralAmount) {
385 inform(tr(
"Not enough coins selected to create a masternode, %1 required.")
405 dialog->deleteLater();
427 ui->btnCoinControl->setActive(
false);
int64_t CAmount
Amount in PIV (Can be negative)
const CChainParams & Params()
Return the currently selected parameters.
@ Label
User specified label.
void ListSelected(std::vector< OutPointWrapper > &vOutpoints) const
void setSelectionType(bool isTransparent)
void setModel(WalletModel *model)
CCoinControl * coinControl
FurListRow * getRowFactory()
QColor rectColor(bool isHovered, bool isSelected) override
MNRow * createHolder(int pos) override
void init(QWidget *holder, const QModelIndex &index, bool isHovered, bool isSelected) const override
MNHolder(bool _isLightTheme)
bool removeMn(const QModelIndex &index)
CAmount getMNCollateralRequiredAmount()
void startAllLegacyMNs(bool onlyMissing, int &amountOfMnFailed, int &amountOfMnStarted, std::string *aliasFilter=nullptr, std::string *error_ret=nullptr)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
bool addMn(CMasternodeConfig::CMasternodeEntry *entry)
bool isMNsNetworkSynced()
int getMasternodeCollateralMinConf()
bool removeLegacyMN(const std::string &alias_to_remove, const std::string &tx_id, unsigned int out_index, QString &ret_error)
@ WAS_COLLATERAL_ACCEPTED
void setCoinControl(CCoinControl *coinControl)
void updateView(QString address, const QString &label, QString status, bool wasCollateralAccepted)
CMasternodeConfig::CMasternodeEntry * mnEntry
void setData(const QString &_pubKey, const QString &name, const QString &address, const QString &_txId, const QString &outputIndex, const QString &status)
CAmount getBalance(const CCoinControl *coinControl=nullptr, bool fIncludeDelegated=true, bool fUnlockedOnly=false, bool fIncludeShielded=true) const
UnlockContext requestUnlock()
bool isRegTestNetwork() const
QString formatBalance(CAmount amount, int nDisplayUnit, bool isZpiv)
void setClipboard(const QString &str)
bool openDialogWithOpaqueBackgroundY(QDialog *widget, PIVXGUI *gui, double posX, int posY, bool hideOpaqueBackground)
void setCssTitleScreen(QLabel *label)
void setCssProperty(std::initializer_list< QWidget * > args, const QString &value)
QColor getRowColor(bool isLightTheme, bool isHovered, bool isSelected)
void setCssSubtitleScreen(QWidget *wid)
void setCssBtnPrimary(QPushButton *btn, bool forceUpdate)
bool error(const char *fmt, const Args &... args)