aboutsummaryrefslogtreecommitdiff
path: root/main.qml
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2021-04-03 10:45:02 +0000
committerxiphon <xiphon@protonmail.com>2021-04-06 11:58:36 +0000
commit6bc96270469294d6ddfedf16ff166c49079491be (patch)
tree3cf15acb631c4bc940b58f8b612420f78b35c050 /main.qml
parent34df4e74d4c75f53d0a05ad9e75cf494e9f7134a (diff)
downloadmonzero-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.qml134
1 files changed, 120 insertions, 14 deletions
diff --git a/main.qml b/main.qml
index 54cdbdab..02bdc259 100644
--- a/main.qml
+++ b/main.qml
@@ -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();
}