]> Nutra Git (v1) - gamesguru/feather.git/commitdiff
Wizard: detect local node
authortobtoht <thotbot@protonmail.com>
Sun, 4 Jul 2021 03:40:31 +0000 (05:40 +0200)
committertobtoht <thotbot@protonmail.com>
Sun, 4 Jul 2021 03:40:31 +0000 (05:40 +0200)
src/utils/utils.cpp
src/utils/utils.h
src/wizard/PageNetwork.cpp
src/wizard/PageNetwork.h
src/wizard/PageNetwork.ui

index fde1eee63a45404a4a55fcb80b6577c16fc0df87..a779c4a8079df7bd683630fd280fcf408e88cf1e 100644 (file)
 #include <QtWidgets/QStyle>
 #include <QPushButton>
 
+#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
index e99f36d143910b36e7b4715c6cc3847ff4bfa87b..32e5adde224aa259d84fec15aad1548ea94512ee 100644 (file)
@@ -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<typename QEnum>
     static QString QtEnumToString (const QEnum value)
index b359c887d12aae88bca3cfebf61779521a1999b6..586f1054feedbced1fa391dba97b9ab089ec531a 100644 (file)
@@ -3,27 +3,55 @@
 
 #include "PageNetwork.h"
 #include "ui_PageNetwork.h"
-#include "WalletWizard.h"
+
+#include <QtConcurrent/QtConcurrent>
+
 #include "constants.h"
+#include "utils.h"
+#include "WalletWizard.h"
 
 PageNetwork::PageNetwork(QWidget *parent)
     : QWizardPage(parent)
     , ui(new Ui::PageNetwork)
+    , m_portOpenWatcher(new QFutureWatcher<QPair<bool, QString>>(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<QPair<bool, QString>>::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<QPair<bool, QString>> portOpen = QtConcurrent::run([]{
+        QString localhost = "127.0.0.1";
+        quint16 port = Utils::getDefaultRpcPort(constants::networkType);
+        return QPair<bool, QString>{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;
     }
 
index 4e68bb9a873eb48a3b806e9dc4ed0b6e28c32cf2..8e5999fa389803ec0ec8254516aff3725a2589d7 100644 (file)
@@ -26,7 +26,13 @@ public:
     bool isComplete() const override;
 
 private:
+    enum Button {
+        AUTO=0,
+        CUSTOM
+    };
+
     Ui::PageNetwork *ui;
+    QFutureWatcher<QPair<bool, QString>> *m_portOpenWatcher;
 };
 
 #endif //FEATHER_WIZARDNETWORK_H
index 6b54e7e7dff68aeefcb20695e1ca397f965ab011..a151c99dd59346ce2afd9c2b3edc67b55f0b4f9a 100644 (file)
      </item>
     </layout>
    </item>
+   <item>
+    <widget class="QFrame" name="frame_nodeDetected">
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QLabel" name="infoIcon">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>icon</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Fixed</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>5</width>
+          <height>0</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <widget class="QLabel" name="label_nodeDetected">
+        <property name="text">
+         <string>Feather detected a local node on port 18081.</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
    <item>
     <layout class="QVBoxLayout" name="verticalLayout_2">
      <item>