From 69a6c6b821f475a7d8639d859fb195a103b51aad Mon Sep 17 00:00:00 2001 From: xiphon Date: Tue, 20 Apr 2021 22:11:36 +0000 Subject: [PATCH] WizardDaemonSettings: implement full remote node configuration support --- components/RemoteNodeList.qml | 131 ++++++++++++++++++++++++++++++++ pages/settings/SettingsNode.qml | 110 ++------------------------- qml.qrc | 1 + wizard/WizardDaemonSettings.qml | 24 +----- 4 files changed, 144 insertions(+), 122 deletions(-) create mode 100644 components/RemoteNodeList.qml diff --git a/components/RemoteNodeList.qml b/components/RemoteNodeList.qml new file mode 100644 index 00000000..f8500d45 --- /dev/null +++ b/components/RemoteNodeList.qml @@ -0,0 +1,131 @@ +// Copyright (c) 2021, The Monero Project +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are +// permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list +// of conditions and the following disclaimer in the documentation and/or other +// materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific +// prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// 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 QtQuick 2.9 +import QtQuick.Layouts 1.1 + +import FontAwesome 1.0 + +import "." as MoneroComponents +import "effects/" as MoneroEffects + +ColumnLayout { + id: remoteNodeList + spacing: 20 + + MoneroComponents.CheckBox { + border: false + checkedIcon: FontAwesome.minusCircle + uncheckedIcon: FontAwesome.plusCircle + fontAwesomeIcons: true + fontSize: 16 + iconOnTheLeft: true + text: qsTr("Add remote node") + translationManager.emptyString + toggleOnClick: false + onClicked: remoteNodeDialog.add(remoteNodesModel.append) + } + + ColumnLayout { + spacing: 0 + + Repeater { + model: remoteNodesModel + + Rectangle { + height: 30 + Layout.fillWidth: true + color: itemMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent" + + Rectangle { + color: MoneroComponents.Style.appWindowBorderColor + anchors.right: parent.right + anchors.left: parent.left + anchors.top: parent.top + height: 1 + visible: index > 0 + + MoneroEffects.ColorTransition { + targetObj: parent + blackColor: MoneroComponents.Style._b_appWindowBorderColor + whiteColor: MoneroComponents.Style._w_appWindowBorderColor + } + } + + Rectangle { + anchors.fill: parent + anchors.rightMargin: 80 + color: "transparent" + + MoneroComponents.TextPlain { + color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: 6 + font.pixelSize: 16 + text: address + themeTransition: false + } + + MouseArea { + id: itemMouseArea + cursorShape: Qt.PointingHandCursor + anchors.fill: parent + hoverEnabled: true + onClicked: remoteNodesModel.applyRemoteNode(index) + } + } + + RowLayout { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 6 + height: 30 + spacing: 10 + + MoneroComponents.InlineButton { + buttonColor: "transparent" + fontFamily: FontAwesome.fontFamily + fontPixelSize: 18 + text: FontAwesome.edit + onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) { + remoteNodesModel.set(index, remoteNode) + }) + } + + MoneroComponents.InlineButton { + buttonColor: "transparent" + fontFamily: FontAwesome.fontFamily + text: FontAwesome.times + visible: remoteNodesModel.count > 1 + onClicked: remoteNodesModel.removeSelectNextIfNeeded(index) + } + } + } + } + } +} diff --git a/pages/settings/SettingsNode.qml b/pages/settings/SettingsNode.qml index 6d2574c5..32ce336d 100644 --- a/pages/settings/SettingsNode.qml +++ b/pages/settings/SettingsNode.qml @@ -248,110 +248,16 @@ Rectangle{ } } - ColumnLayout { - id: remoteNodeLayout - anchors.margins: 0 - spacing: 20 - Layout.fillWidth: true - Layout.topMargin: 20 + MoneroComponents.WarningBox { + Layout.topMargin: 46 + text: qsTr("To find a remote node, type 'Monero remote node' into your favorite search engine. Please ensure the node is run by a trusted third-party.") + translationManager.emptyString visible: persistentSettings.useRemoteNode + } - MoneroComponents.WarningBox { - Layout.topMargin: 26 - Layout.bottomMargin: 6 - text: qsTr("To find a remote node, type 'Monero remote node' into your favorite search engine. Please ensure the node is run by a trusted third-party.") + translationManager.emptyString - } - - MoneroComponents.CheckBox { - border: false - checkedIcon: FontAwesome.minusCircle - uncheckedIcon: FontAwesome.plusCircle - fontAwesomeIcons: true - fontSize: 16 - iconOnTheLeft: true - text: qsTr("Add remote node") + translationManager.emptyString - toggleOnClick: false - onClicked: remoteNodeDialog.add(remoteNodesModel.append) - } - - ColumnLayout { - spacing: 0 - - Repeater { - model: remoteNodesModel - - Rectangle { - height: 30 - Layout.fillWidth: true - color: itemMouseArea.containsMouse || index === remoteNodesModel.selected ? MoneroComponents.Style.titleBarButtonHoverColor : "transparent" - - Rectangle { - color: MoneroComponents.Style.appWindowBorderColor - anchors.right: parent.right - anchors.left: parent.left - anchors.top: parent.top - height: 1 - visible: index > 0 - - MoneroEffects.ColorTransition { - targetObj: parent - blackColor: MoneroComponents.Style._b_appWindowBorderColor - whiteColor: MoneroComponents.Style._w_appWindowBorderColor - } - } - - Rectangle { - anchors.fill: parent - anchors.rightMargin: 80 - color: "transparent" - - MoneroComponents.TextPlain { - color: index === remoteNodesModel.selected ? MoneroComponents.Style.defaultFontColor : MoneroComponents.Style.dimmedFontColor - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: 6 - font.pixelSize: 16 - text: address - themeTransition: false - } - - MouseArea { - id: itemMouseArea - cursorShape: Qt.PointingHandCursor - anchors.fill: parent - hoverEnabled: true - onClicked: remoteNodesModel.applyRemoteNode(index) - } - } - - RowLayout { - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 6 - height: 30 - spacing: 10 - - MoneroComponents.InlineButton { - buttonColor: "transparent" - fontFamily: FontAwesome.fontFamily - fontPixelSize: 18 - text: FontAwesome.edit - onClicked: remoteNodeDialog.edit(remoteNodesModel.get(index), function (remoteNode) { - remoteNodesModel.set(index, remoteNode) - }) - } - - MoneroComponents.InlineButton { - buttonColor: "transparent" - fontFamily: FontAwesome.fontFamily - text: FontAwesome.times - visible: remoteNodesModel.count > 1 - onClicked: remoteNodesModel.removeSelectNextIfNeeded(index) - } - } - } - } - } + MoneroComponents.RemoteNodeList { + Layout.fillWidth: true + Layout.topMargin: 26 + visible: persistentSettings.useRemoteNode } ColumnLayout { diff --git a/qml.qrc b/qml.qrc index 4cc451cd..7dafe82f 100644 --- a/qml.qrc +++ b/qml.qrc @@ -9,6 +9,7 @@ components/Navbar.qml components/NavbarItem.qml components/RemoteNodeDialog.qml + components/RemoteNodeList.qml components/SettingsListItem.qml components/Slider.qml components/Tooltip.qml diff --git a/wizard/WizardDaemonSettings.qml b/wizard/WizardDaemonSettings.qml index 98f46709..e4b37d9c 100644 --- a/wizard/WizardDaemonSettings.qml +++ b/wizard/WizardDaemonSettings.qml @@ -41,14 +41,7 @@ ColumnLayout { spacing: 10 function save(){ - persistentSettings.useRemoteNode = remoteNode.checked - const index = remoteNodesModel.appendIfNotExists({ - address: remoteNodeEdit.getAddress(), - username: "", - password: "", - trusted: false, - }); - remoteNodesModel.applyRemoteNode(index); + persistentSettings.useRemoteNode = remoteNode.checked; if (bootstrapNodeEdit.daemonAddrText == "auto") { persistentSettings.bootstrapNodeAddress = "auto"; } else { @@ -196,18 +189,9 @@ ColumnLayout { } } - ColumnLayout { - visible: remoteNode.checked - spacing: 0 - - Layout.topMargin: 8 + MoneroComponents.RemoteNodeList { Layout.fillWidth: true - - MoneroComponents.RemoteNodeEdit { - id: remoteNodeEdit - Layout.fillWidth: true - - initialAddress: remoteNodesModel.currentRemoteNode().address - } + Layout.topMargin: 8 + visible: remoteNode.checked } }