diff options
| author | xiphon <xiphon@protonmail.com> | 2021-04-03 10:45:02 +0000 |
|---|---|---|
| committer | xiphon <xiphon@protonmail.com> | 2021-04-06 11:58:36 +0000 |
| commit | 6bc96270469294d6ddfedf16ff166c49079491be (patch) | |
| tree | 3cf15acb631c4bc940b58f8b612420f78b35c050 /main.qml | |
| parent | 34df4e74d4c75f53d0a05ad9e75cf494e9f7134a (diff) | |
| download | monzero-gui-6bc96270469294d6ddfedf16ff166c49079491be.tar.gz monzero-gui-6bc96270469294d6ddfedf16ff166c49079491be.tar.xz monzero-gui-6bc96270469294d6ddfedf16ff166c49079491be.zip | |
SettingsNode: implement multiple remote nodes support
Diffstat (limited to 'main.qml')
| -rw-r--r-- | main.qml | 134 |
1 files changed, 120 insertions, 14 deletions
@@ -26,6 +26,7 @@ // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import QtQml.Models 2.12 import QtQuick 2.9 import QtQuick.Window 2.0 import QtQuick.Controls 1.1 @@ -374,13 +375,13 @@ ApplicationWindow { console.log("Recovering from seed: ", persistentSettings.is_recovering) console.log("restore Height", persistentSettings.restore_height) - // Use saved daemon rpc login settings - currentWallet.setDaemonLogin(persistentSettings.daemonUsername, persistentSettings.daemonPassword) - - if(persistentSettings.useRemoteNode) - currentDaemonAddress = persistentSettings.remoteNodeAddress - else - currentDaemonAddress = localDaemonAddress + if (persistentSettings.useRemoteNode) { + const remoteNode = remoteNodesModel.currentRemoteNode(); + currentDaemonAddress = remoteNode.address; + currentWallet.setDaemonLogin(remoteNode.username, remoteNode.password); + } else { + currentDaemonAddress = localDaemonAddress; + } console.log("initializing with daemon address: ", currentDaemonAddress) currentWallet.initAsync( @@ -397,7 +398,7 @@ ApplicationWindow { } function isTrustedDaemon() { - return !persistentSettings.useRemoteNode || persistentSettings.is_trusted_daemon; + return !persistentSettings.useRemoteNode || remoteNodesModel.currentRemoteNode().trusted; } function usefulName(path) { @@ -626,7 +627,9 @@ ApplicationWindow { const callback = function() { persistentSettings.useRemoteNode = true; - currentDaemonAddress = persistentSettings.remoteNodeAddress; + const remoteNode = remoteNodesModel.currentRemoteNode(); + currentDaemonAddress = remoteNode.address; + currentWallet.setDaemonLogin(remoteNode.username, remoteNode.password); currentWallet.initAsync( currentDaemonAddress, isTrustedDaemon(), @@ -652,6 +655,7 @@ ApplicationWindow { console.log("disconnecting remote node"); persistentSettings.useRemoteNode = false; currentDaemonAddress = localDaemonAddress + currentWallet.setDaemonLogin("", ""); currentWallet.initAsync( currentDaemonAddress, isTrustedDaemon(), @@ -1360,6 +1364,8 @@ ApplicationWindow { confirmationDialog.open(); } } + + remoteNodesModel.initialize(); } MoneroSettings { @@ -1380,22 +1386,33 @@ ApplicationWindow { property bool miningIgnoreBattery : true property var nettype: NetworkType.MAINNET property int restore_height : 0 - property bool is_trusted_daemon : false + property bool is_trusted_daemon : false // TODO: drop after v0.17.2.0 release property bool is_recovering : false property bool is_recovering_from_device : false property bool customDecorations : true property string daemonFlags property int logLevel: 0 property string logCategories: "" - property string daemonUsername: "" - property string daemonPassword: "" + property string daemonUsername: "" // TODO: drop after v0.17.2.0 release + property string daemonPassword: "" // TODO: drop after v0.17.2.0 release property bool transferShowAdvanced: false property bool receiveShowAdvanced: false property bool historyShowAdvanced: false property bool historyHumanDates: true property string blockchainDataDir: "" property bool useRemoteNode: false - property string remoteNodeAddress: "" + property string remoteNodeAddress: "" // TODO: drop after v0.17.2.0 release + property string remoteNodesSerialized: JSON.stringify({ + selected: 0, + nodes: remoteNodeAddress != "" + ? [{ + address: remoteNodeAddress, + username: daemonUsername, + password: daemonPassword, + trusted: is_trusted_daemon, + }] + : [], + }) property string bootstrapNodeAddress: "" property bool segregatePreForkOutputs: true property bool keyReuseMitigation2: true @@ -1441,6 +1458,88 @@ ApplicationWindow { } } + ListModel { + id: remoteNodesModel + + property int selected: 0 + + signal store() + + function initialize() { + try { + const remoteNodes = JSON.parse(persistentSettings.remoteNodesSerialized); + for (var index = 0; index < remoteNodes.nodes.length; ++index) { + const remoteNode = remoteNodes.nodes[index]; + remoteNodesModel.append(remoteNode); + } + selected = remoteNodes.selected % remoteNodesModel.count || 0; + } catch (e) { + console.error('failed to parse remoteNodesSerialized', e); + } + + store.connect(function() { + var remoteNodes = []; + for (var index = 0; index < remoteNodesModel.count; ++index) { + remoteNodes.push(remoteNodesModel.get(index)); + } + persistentSettings.remoteNodesSerialized = JSON.stringify({ + selected: selected, + nodes: remoteNodes + }); + }); + } + + function appendIfNotExists(newRemoteNode) { + for (var index = 0; index < remoteNodesModel.count; ++index) { + const remoteNode = remoteNodesModel.get(index); + if (remoteNode.address == newRemoteNode.address && + remoteNode.username == newRemoteNode.username && + remoteNode.password == newRemoteNode.password && + remoteNode.trusted == newRemoteNode.trusted) { + return index; + } + } + remoteNodesModel.append(newRemoteNode); + return remoteNodesModel.count - 1; + } + + function applyRemoteNode(index) { + selected = index; + const remoteNode = currentRemoteNode(); + persistentSettings.useRemoteNode = true; + if (currentWallet) { + currentWallet.setDaemonLogin(remoteNode.username, remoteNode.password); + currentWallet.setTrustedDaemon(remoteNode.trusted); + appWindow.connectRemoteNode(); + } + } + + function currentRemoteNode() { + if (selected < remoteNodesModel.count) { + return remoteNodesModel.get(selected); + } + return { + address: "", + username: "", + password: "", + trusted: false, + }; + } + + function removeSelectNextIfNeeded(index) { + remoteNodesModel.remove(index); + if (selected == index) { + applyRemoteNode(selected % remoteNodesModel.count || 0); + } else if (selected > index) { + selected = selected - 1; + } + } + + onCountChanged: store() + onDataChanged: store() + onSelectedChanged: store() + } + // Information dialog StandardDialog { // dynamically change onclose handler @@ -1521,6 +1620,10 @@ ApplicationWindow { y: (parent.height - height) / 2 } + MoneroComponents.RemoteNodeDialog { + id: remoteNodeDialog + } + // Choose blockchain folder FileDialog { id: blockchainFileDialog @@ -1766,7 +1869,9 @@ ApplicationWindow { anchors.fill: blurredArea source: blurredArea radius: 64 - visible: passwordDialog.visible || inputDialog.visible || splash.visible || updateDialog.visible || devicePassphraseDialog.visible || txConfirmationPopup.visible || successfulTxPopup.visible + visible: passwordDialog.visible || inputDialog.visible || splash.visible || updateDialog.visible || + devicePassphraseDialog.visible || txConfirmationPopup.visible || successfulTxPopup.visible || + remoteNodeDialog.visible } @@ -2156,6 +2261,7 @@ ApplicationWindow { passwordDialog.onRejectedCallback = function() { appWindow.showWizard(); } if (inputDialogVisible) inputDialog.close() + remoteNodeDialog.close(); passwordDialog.open(); } |
