aboutsummaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorluigi1111 <luigi1111w@gmail.com>2019-04-08 14:35:29 -0400
committerluigi1111 <luigi1111w@gmail.com>2019-04-08 14:35:29 -0400
commitcd65cc12dabbdf49207c07d3a333b209427e9567 (patch)
tree33e9a8c3b8477c8859e60a2086f1833dbe068bc9 /components
parent2f22503c8b54208afbca9fbac8a51f0bfe397339 (diff)
parent1a2675b24669e51ac79324d2889494b95eddef62 (diff)
downloadmonzero-gui-cd65cc12dabbdf49207c07d3a333b209427e9567.tar.gz
monzero-gui-cd65cc12dabbdf49207c07d3a333b209427e9567.tar.xz
monzero-gui-cd65cc12dabbdf49207c07d3a333b209427e9567.zip
Merge pull request #2037
1a2675b async device open and create from device, passphrase (ph4r05)
Diffstat (limited to 'components')
-rw-r--r--components/PassphraseDialog.qml327
-rw-r--r--components/Style.qml1
2 files changed, 328 insertions, 0 deletions
diff --git a/components/PassphraseDialog.qml b/components/PassphraseDialog.qml
new file mode 100644
index 00000000..c7af29f9
--- /dev/null
+++ b/components/PassphraseDialog.qml
@@ -0,0 +1,327 @@
+// Copyright (c) 2014-2019, 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.7
+import QtQuick.Controls 2.0
+import QtQuick.Dialogs 1.2
+import QtQuick.Layouts 1.1
+import QtQuick.Controls.Styles 1.4
+import QtQuick.Window 2.0
+
+import "../components" as MoneroComponents
+
+Item {
+ id: root
+ visible: false
+ z: parent.z + 2
+
+ property bool isHidden: true
+ property alias passphrase: passphaseInput1.text
+ property string walletName
+ property string errorText
+
+ // same signals as Dialog has
+ signal accepted()
+ signal rejected()
+ signal closeCallback()
+
+ function open(walletName, errorText) {
+ inactiveOverlay.visible = true
+
+ root.walletName = walletName ? walletName : ""
+ root.errorText = errorText ? errorText : "";
+
+ leftPanel.enabled = false
+ middlePanel.enabled = false
+ titleBar.enabled = false
+ show();
+ root.visible = true;
+ passphaseInput1.text = "";
+ passphaseInput2.text = "";
+ passphaseInput1.focus = true
+ }
+
+ function close() {
+ inactiveOverlay.visible = false
+ leftPanel.enabled = true
+ middlePanel.enabled = true
+ titleBar.enabled = true
+ root.visible = false;
+ closeCallback();
+ }
+
+ function toggleIsHidden() {
+ passphaseInput1.echoMode = isHidden ? TextInput.Normal : TextInput.Password;
+ passphaseInput2.echoMode = isHidden ? TextInput.Normal : TextInput.Password;
+ isHidden = !isHidden;
+ }
+
+ function showError(errorText) {
+ open(root.walletName, errorText);
+ }
+
+ // TODO: implement without hardcoding sizes
+ width: 480
+ height: 360
+
+ // Make window draggable
+ MouseArea {
+ anchors.fill: parent
+ property point lastMousePos: Qt.point(0, 0)
+ onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
+ onMouseXChanged: root.x += (mouseX - lastMousePos.x)
+ onMouseYChanged: root.y += (mouseY - lastMousePos.y)
+ }
+
+ ColumnLayout {
+ z: inactiveOverlay.z + 1
+ id: mainLayout
+ spacing: 10
+ anchors { fill: parent; margins: 35 * scaleRatio }
+
+ ColumnLayout {
+ id: column
+
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter
+ Layout.maximumWidth: 400 * scaleRatio
+
+ Label {
+ text: root.walletName.length > 0 ? qsTr("Please enter wallet device passphrase for: ") + root.walletName : qsTr("Please enter wallet device passphrase")
+ Layout.fillWidth: true
+
+ font.pixelSize: 16 * scaleRatio
+ font.family: MoneroComponents.Style.fontLight.name
+
+ color: MoneroComponents.Style.defaultFontColor
+ }
+
+ Label {
+ text: qsTr("Warning: passphrase entry on host is a security risk as it can be captured by malware. It is advised to prefer device-based passphrase entry.");
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
+
+ font.pixelSize: 14 * scaleRatio
+ font.family: MoneroComponents.Style.fontLight.name
+
+ color: MoneroComponents.Style.warningColor
+ }
+
+ Label {
+ text: root.errorText
+ visible: root.errorText
+
+ color: MoneroComponents.Style.errorColor
+ font.pixelSize: 16 * scaleRatio
+ font.family: MoneroComponents.Style.fontLight.name
+ Layout.fillWidth: true
+ wrapMode: Text.Wrap
+ }
+
+ TextField {
+ id : passphaseInput1
+ Layout.topMargin: 6
+ Layout.fillWidth: true
+ horizontalAlignment: TextInput.AlignLeft
+ verticalAlignment: TextInput.AlignVCenter
+ font.family: MoneroComponents.Style.fontLight.name
+ font.pixelSize: 24 * scaleRatio
+ echoMode: TextInput.Password
+ bottomPadding: 10
+ leftPadding: 10
+ topPadding: 10
+ color: MoneroComponents.Style.defaultFontColor
+ selectionColor: MoneroComponents.Style.dimmedFontColor
+ selectedTextColor: MoneroComponents.Style.defaultFontColor
+ KeyNavigation.tab: passphaseInput2
+
+ background: Rectangle {
+ radius: 2
+ border.color: Qt.rgba(255, 255, 255, 0.35)
+ border.width: 1
+ color: "black"
+
+ Image {
+ width: 26 * scaleRatio
+ height: 26 * scaleRatio
+ opacity: 0.7
+ fillMode: Image.PreserveAspectFit
+ source: isHidden ? "../images/eyeShow.png" : "../images/eyeHide.png"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.rightMargin: 20
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onClicked: {
+ toggleIsHidden()
+ }
+ onEntered: {
+ parent.opacity = 0.9
+ parent.width = 28 * scaleRatio
+ parent.height = 28 * scaleRatio
+ }
+ onExited: {
+ parent.opacity = 0.7
+ parent.width = 26 * scaleRatio
+ parent.height = 26 * scaleRatio
+ }
+ }
+ }
+ }
+
+ Keys.onEscapePressed: {
+ root.close()
+ root.rejected()
+ }
+ }
+
+ // padding
+ Rectangle {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter
+ height: 10
+ opacity: 0
+ color: "black"
+ }
+
+ Label {
+ text: qsTr("Please re-enter")
+ Layout.fillWidth: true
+
+ font.pixelSize: 16 * scaleRatio
+ font.family: MoneroComponents.Style.fontLight.name
+
+ color: MoneroComponents.Style.defaultFontColor
+ }
+
+ TextField {
+ id : passphaseInput2
+ Layout.topMargin: 6
+ Layout.fillWidth: true
+ horizontalAlignment: TextInput.AlignLeft
+ verticalAlignment: TextInput.AlignVCenter
+ font.family: MoneroComponents.Style.fontLight.name
+ font.pixelSize: 24 * scaleRatio
+ echoMode: TextInput.Password
+ KeyNavigation.tab: okButton
+ bottomPadding: 10
+ leftPadding: 10
+ topPadding: 10
+ color: MoneroComponents.Style.defaultFontColor
+ selectionColor: MoneroComponents.Style.dimmedFontColor
+ selectedTextColor: MoneroComponents.Style.defaultFontColor
+
+ background: Rectangle {
+ radius: 2
+ border.color: Qt.rgba(255, 255, 255, 0.35)
+ border.width: 1
+ color: "black"
+
+ Image {
+ width: 26 * scaleRatio
+ height: 26 * scaleRatio
+ opacity: 0.7
+ fillMode: Image.PreserveAspectFit
+ source: isHidden ? "../images/eyeShow.png" : "../images/eyeHide.png"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.rightMargin: 20
+ MouseArea {
+ anchors.fill: parent
+ cursorShape: Qt.PointingHandCursor
+ hoverEnabled: true
+ onClicked: {
+ toggleIsHidden()
+ }
+ onEntered: {
+ parent.opacity = 0.9
+ parent.width = 28 * scaleRatio
+ parent.height = 28 * scaleRatio
+ }
+ onExited: {
+ parent.opacity = 0.7
+ parent.width = 26 * scaleRatio
+ parent.height = 26 * scaleRatio
+ }
+ }
+ }
+ }
+
+ Keys.onReturnPressed: {
+ if (passphaseInput1.text === passphaseInput2.text) {
+ root.close()
+ root.accepted()
+ }
+ }
+ Keys.onEscapePressed: {
+ root.close()
+ root.rejected()
+ }
+ }
+
+ // padding
+ Rectangle {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter
+ height: 10
+ opacity: 0
+ color: "black"
+ }
+
+ // Ok/Cancel buttons
+ RowLayout {
+ id: buttons
+ spacing: 16 * scaleRatio
+ Layout.topMargin: 16
+ Layout.alignment: Qt.AlignRight
+
+ MoneroComponents.StandardButton {
+ id: cancelButton
+ text: qsTr("Cancel") + translationManager.emptyString
+ KeyNavigation.tab: passphaseInput1
+ onClicked: {
+ root.close()
+ root.rejected()
+ }
+ }
+ MoneroComponents.StandardButton {
+ id: okButton
+ text: qsTr("Continue")
+ KeyNavigation.tab: cancelButton
+ enabled: passphaseInput1.text === passphaseInput2.text
+ onClicked: {
+ root.close()
+ root.accepted()
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/components/Style.qml b/components/Style.qml
index 52b49287..cc106239 100644
--- a/components/Style.qml
+++ b/components/Style.qml
@@ -17,6 +17,7 @@ QtObject {
property string defaultFontColor: "white"
property string dimmedFontColor: "#BBBBBB"
property string lightGreyFontColor: "#DFDFDF"
+ property string warningColor: "#963E00"
property string errorColor: "#FA6800"
property string inputBoxBackground: "black"
property string inputBoxBackgroundError: "#FFDDDD"