diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index fde1eee..a779c4a 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -10,12 +10,13 @@ #include #include +#include "constants.h" +#include "networktype.h" #include "utils.h" +#include "utils/ColorScheme.h" #include "utils/config.h" #include "utils/os/tails.h" #include "utils/os/whonix.h" -#include "utils/ColorScheme.h" -#include "constants.h" QByteArray Utils::fileGetContents(const QString &path) { @@ -506,4 +507,16 @@ QString Utils::defaultWalletDir() { #elif defined(Q_OS_WIN) return QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/Monero/wallets"; #endif +} + +quint16 Utils::getDefaultRpcPort(NetworkType::Type type) { + switch (type) { + case NetworkType::Type::MAINNET: + return 18081; + case NetworkType::Type::TESTNET: + return 28081; + case NetworkType::Type::STAGENET: + return 38081; + } + return 18081; } \ No newline at end of file diff --git a/src/utils/utils.h b/src/utils/utils.h index e99f36d..32e5add 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -78,6 +78,7 @@ public: static QTextCharFormat addressTextFormat(const SubaddressIndex &index, quint64 amount); static bool isTorsocks(); static QString defaultWalletDir(); + static quint16 getDefaultRpcPort(NetworkType::Type type); template static QString QtEnumToString (const QEnum value) diff --git a/src/wizard/PageNetwork.cpp b/src/wizard/PageNetwork.cpp index b359c88..586f105 100644 --- a/src/wizard/PageNetwork.cpp +++ b/src/wizard/PageNetwork.cpp @@ -3,27 +3,55 @@ #include "PageNetwork.h" #include "ui_PageNetwork.h" -#include "WalletWizard.h" + +#include + #include "constants.h" +#include "utils.h" +#include "WalletWizard.h" PageNetwork::PageNetwork(QWidget *parent) : QWizardPage(parent) , ui(new Ui::PageNetwork) + , m_portOpenWatcher(new QFutureWatcher>(this)) { ui->setupUi(this); this->setTitle("Welcome to Feather"); + ui->frame_nodeDetected->hide(); ui->frame_customNode->hide(); - ui->btnGroup_network->setId(ui->radio_autoConnect, 0); - ui->btnGroup_network->setId(ui->radio_custom, 1); + ui->btnGroup_network->setId(ui->radio_autoConnect, Button::AUTO); + ui->btnGroup_network->setId(ui->radio_custom, Button::CUSTOM); + + QPixmap infoIcon = QPixmap(":/assets/images/info2.svg"); + ui->infoIcon->setPixmap(infoIcon.scaledToWidth(32, Qt::SmoothTransformation)); connect(ui->btnGroup_network, &QButtonGroup::idClicked, [this](int id) { - ui->frame_customNode->setVisible(id == 1); + ui->frame_customNode->setVisible(id == Button::CUSTOM); }); connect(ui->line_customNode, &QLineEdit::textEdited, [this]{ this->completeChanged(); }); + + connect(m_portOpenWatcher, &QFutureWatcher>::finished, [this](){ + auto res = m_portOpenWatcher->result(); + bool nodeFound = res.first; + if (nodeFound) { + ui->frame_nodeDetected->show(); + ui->label_nodeDetected->setText(QString("Feather detected a local node on %1").arg(res.second)); + + ui->btnGroup_network->button(Button::CUSTOM)->click(); + ui->line_customNode->setText(res.second); + } + }); + + QFuture> portOpen = QtConcurrent::run([]{ + QString localhost = "127.0.0.1"; + quint16 port = Utils::getDefaultRpcPort(constants::networkType); + return QPair{Utils::portOpen(localhost, port), QString("%1:%2").arg(localhost, QString::number(port))}; + }); + m_portOpenWatcher->setFuture(portOpen); } int PageNetwork::nextId() const { @@ -34,7 +62,7 @@ bool PageNetwork::validatePage() { int id = ui->btnGroup_network->checkedId(); config()->set(Config::nodeSource, id); - if (id == 1) { + if (id == Button::CUSTOM) { NodeList nodeList; nodeList.addNode(ui->line_customNode->text(), constants::networkType, NodeList::Type::custom); } @@ -43,7 +71,7 @@ bool PageNetwork::validatePage() { } bool PageNetwork::isComplete() const { - if (ui->btnGroup_network->checkedId() == 0) { + if (ui->btnGroup_network->checkedId() == Button::AUTO) { return true; } diff --git a/src/wizard/PageNetwork.h b/src/wizard/PageNetwork.h index 4e68bb9..8e5999f 100644 --- a/src/wizard/PageNetwork.h +++ b/src/wizard/PageNetwork.h @@ -26,7 +26,13 @@ public: bool isComplete() const override; private: + enum Button { + AUTO=0, + CUSTOM + }; + Ui::PageNetwork *ui; + QFutureWatcher> *m_portOpenWatcher; }; #endif //FEATHER_WIZARDNETWORK_H diff --git a/src/wizard/PageNetwork.ui b/src/wizard/PageNetwork.ui index 6b54e7e..a151c99 100644 --- a/src/wizard/PageNetwork.ui +++ b/src/wizard/PageNetwork.ui @@ -70,6 +70,54 @@ + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 0 + 0 + + + + icon + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 0 + + + + + + + + Feather detected a local node on port 18081. + + + + + +