diff --git a/main.qml b/main.qml index 329c4b78..3a5a3d9a 100644 --- a/main.qml +++ b/main.qml @@ -436,7 +436,7 @@ ApplicationWindow { if(localNodeConnected) { leftPanel.progressBar.updateProgress(walletManager.blockchainHeight(),walletManager.blockchainTargetHeight(), 0, qsTr("Remaining blocks (local node):")); leftPanel.progressBar.visible = true - } else if (persistentSettings.startLocalNode && !startLocalNodeCancelled) { + } else if (!persistentSettings.useRemoteNode && !startLocalNodeCancelled) { daemonManagerDialog.open() } @@ -478,7 +478,7 @@ ApplicationWindow { currentWallet.pauseRefresh(); appWindow.showProcessingSplash(qsTr("Waiting for daemon to start...")) - daemonManager.start(flags, persistentSettings.testnet, persistentSettings.blockchainDataDir); + daemonManager.start(flags, persistentSettings.testnet, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress); persistentSettings.daemonFlags = flags } @@ -1004,9 +1004,9 @@ ApplicationWindow { property string daemonPassword: "" property bool transferShowAdvanced: false property string blockchainDataDir: "" - property bool startLocalNode: true property bool useRemoteNode: false property string remoteNodeAddress: "" + property string bootstrapNodeAddress: "" } // Information dialog diff --git a/pages/Settings.qml b/pages/Settings.qml index 8641f4eb..3f933760 100644 --- a/pages/Settings.qml +++ b/pages/Settings.qml @@ -248,7 +248,7 @@ Rectangle { } GridLayout { - visible: !isMobile + visible: !isMobile && !persistentSettings.useRemoteNode id: daemonStatusRow columns: (isMobile) ? 2 : 4 StandardButton { @@ -260,6 +260,9 @@ Rectangle { releasedColor: "#FF6C3C" pressedColor: "#FF4304" onClicked: { + // Update bootstrap daemon address + persistentSettings.bootstrapNodeAddress = bootstrapNodeEdit.daemonAddrText ? bootstrapNodeEdit.getAddress() : ""; + // Set current daemon address to local appWindow.currentDaemonAddress = appWindow.localDaemonAddress appWindow.startDaemon(daemonFlags.text) @@ -296,7 +299,7 @@ Rectangle { ColumnLayout { id: blockchainFolderRow - visible: !isMobile + visible: !isMobile && !persistentSettings.useRemoteNode Label { id: blockchainFolderLabel color: "#4A4949" @@ -325,7 +328,7 @@ Rectangle { RowLayout { - visible: daemonAdvanced.checked && !isMobile + visible: daemonAdvanced.checked && !isMobile && !persistentSettings.useRemoteNode id: daemonFlagsRow Label { id: daemonFlagsLabel @@ -343,7 +346,7 @@ Rectangle { RowLayout { Layout.fillWidth: true - visible: daemonAdvanced.checked || isMobile + visible: (daemonAdvanced.checked || isMobile) && persistentSettings.useRemoteNode Label { id: daemonLoginLabel Layout.fillWidth: true @@ -354,7 +357,7 @@ Rectangle { } ColumnLayout { - visible: daemonAdvanced.checked || isMobile + visible: (daemonAdvanced.checked || isMobile) && persistentSettings.useRemoteNode LineEdit { id: daemonUsername Layout.preferredWidth: 100 * scaleRatio @@ -374,6 +377,26 @@ Rectangle { } } + RowLayout { + visible: persistentSettings.startLocalNode + ColumnLayout { + Label { + color: "#4A4949" + text: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString + } + RemoteNodeEdit { + id: bootstrapNodeEdit + Layout.minimumWidth: 100 * scaleRatio + daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim() + daemonPortText: (persistentSettings.bootstrapNodeAddress.split(":")[1].trim() == "") ? "18081" : persistentSettings.bootstrapNodeAddress.split(":")[1] + onEditingFinished: { + persistentSettings.bootstrapNodeAddress = daemonAddrText ? bootstrapNodeEdit.getAddress() : ""; + console.log("setting bootstrap node to " + persistentSettings.bootstrapNodeAddress) + } + } + } + } + RowLayout { visible: persistentSettings.useRemoteNode ColumnLayout { diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 58002014..93e7a9a8 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -32,7 +32,7 @@ DaemonManager *DaemonManager::instance(const QStringList *args) return m_instance; } -bool DaemonManager::start(const QString &flags, bool testnet, const QString &dataDir) +bool DaemonManager::start(const QString &flags, bool testnet, const QString &dataDir, const QString &bootstrapNodeAddress) { // prepare command line arguments and pass to monerod QStringList arguments; @@ -67,6 +67,11 @@ bool DaemonManager::start(const QString &flags, bool testnet, const QString &dat arguments << dataDir; } + // Bootstrap node address + if(!bootstrapNodeAddress.isEmpty()) { + arguments << "--bootstrap-daemon-address" << bootstrapNodeAddress; + } + arguments << "--check-updates" << "disabled"; diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 2b9c8b84..d081ad7d 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -14,7 +14,7 @@ public: static DaemonManager * instance(const QStringList *args); - Q_INVOKABLE bool start(const QString &flags, bool testnet, const QString &dataDir = ""); + Q_INVOKABLE bool start(const QString &flags, bool testnet, const QString &dataDir = "", const QString &bootstrapNodeAddress = ""); Q_INVOKABLE bool stop(bool testnet); // return true if daemon process is started diff --git a/wizard/WizardDaemonSettings.qml b/wizard/WizardDaemonSettings.qml index f57fb4cb..953bb21d 100644 --- a/wizard/WizardDaemonSettings.qml +++ b/wizard/WizardDaemonSettings.qml @@ -54,8 +54,8 @@ ColumnLayout { function onPageClosed(settingsObject) { appWindow.persistentSettings.useRemoteNode = remoteNode.checked - appWindow.persistentSettings.startLocalNode = localNode.checked appWindow.persistentSettings.remoteNodeAddress = remoteNodeEdit.getAddress(); + appWindow.persistentSettings.bootstrapNodeAddress = bootstrapNodeEdit.daemonAddrText ? bootstrapNodeEdit.getAddress() : ""; return true } @@ -129,8 +129,12 @@ ColumnLayout { fontSize: 16 * scaleRatio checkedIcon: "../images/checkedVioletIcon.png" uncheckedIcon: "../images/uncheckedIcon.png" - checked: appWindow.persistentSettings.startLocalNode && !isAndroid && !isIOS + checked: !appWindow.persistentSettings.useRemoteNode && !isAndroid && !isIOS visible: !isAndroid && !isIOS + onClicked: { + checked = true; + remoteNode.checked = false; + } } } @@ -162,6 +166,19 @@ ColumnLayout { } } + Label { + Layout.fillWidth: true + Layout.topMargin: 20 * scaleRatio + fontSize: 14 * scaleRatio + text: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString + } + RemoteNodeEdit { + Layout.minimumWidth: 300 * scaleRatio + opacity: localNode.checked + id: bootstrapNodeEdit + daemonAddrText: persistentSettings.bootstrapNodeAddress.split(":")[0].trim() + daemonPortText: (persistentSettings.bootstrapNodeAddress.split(":")[1].trim() == "") ? "18081" : persistentSettings.bootstrapNodeAddress.split(":")[1] + } } RowLayout { @@ -176,6 +193,10 @@ ColumnLayout { checkedIcon: "../images/checkedVioletIcon.png" uncheckedIcon: "../images/uncheckedIcon.png" checked: appWindow.persistentSettings.useRemoteNode + onClicked: { + checked = true + localNode.checked = false + } } }