From 58030c67c8fdf7b8c954d8e6d13c5ded7ff9a91b Mon Sep 17 00:00:00 2001 From: Jaquee Date: Tue, 8 Aug 2017 11:10:44 +0200 Subject: [PATCH] Transfer - mobile redesign --- pages/Transfer.qml | 491 +++++++++++++++++++++------------------------ 1 file changed, 224 insertions(+), 267 deletions(-) diff --git a/pages/Transfer.qml b/pages/Transfer.qml index 6526f9b9..29ca46ed 100644 --- a/pages/Transfer.qml +++ b/pages/Transfer.qml @@ -71,10 +71,10 @@ Rectangle { } function updateMixin() { - var fillLevel = privacyLevelItem.fillLevel + var fillLevel = (isMobile) ? privacyLevelItemSmall.fillLevel : privacyLevelItem.fillLevel var mixin = scaleValueToMixinCount(fillLevel) - print ("PrivacyLevel changed:" + fillLevel) - print ("mixin count: " + mixin) + console.log("PrivacyLevel changed:" + fillLevel) + console.log("mixin count: " + mixin) privacyLabel.text = qsTr("Privacy level (ringsize %1)").arg(mixin+1) + translationManager.emptyString } @@ -107,297 +107,226 @@ Rectangle { } } - Item { + ColumnLayout { id: pageRoot anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.topMargin: 20 - height: 400 + anchors.margins: 17 * scaleRatio + spacing: 0 - Label { - id: amountLabel - anchors.left: parent.left - anchors.top: parent.top - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 17 - text: qsTr("Amount") + translationManager.emptyString - fontSize: 14 - } + GridLayout { + columns: (isMobile)? 1 : 2 + Layout.fillWidth: true - Label { - id: transactionPriority - anchors.top: parent.top - anchors.topMargin: 17 - fontSize: 14 - x: (parent.width - 17) / 2 + 17 - text: qsTr("Transaction priority") + translationManager.emptyString - } + ColumnLayout { + Layout.fillWidth: true + Label { + id: amountLabel + text: qsTr("Amount") + translationManager.emptyString + } + + RowLayout { + Layout.fillWidth: true + id: amountRow + Layout.minimumWidth: 200 + Item { + visible: !isMobile + width: 37 * scaleRatio + height: 37 * scaleRatio + + Image { + anchors.centerIn: parent + source: "../images/moneroIcon.png" + } + } + // Amount input + LineEdit { + Layout.fillWidth: true + id: amountLine + placeholderText: qsTr("") + translationManager.emptyString + width:100 + validator: DoubleValidator { + bottom: 0.0 + top: 18446744.073709551615 + decimals: 12 + notation: DoubleValidator.StandardNotation + locale: "C" + } + } + + StandardButton { + id: amountAllButton + width: 60 * scaleRatio + text: qsTr("All") + translationManager.emptyString + shadowReleasedColor: "#FF4304" + shadowPressedColor: "#B32D00" + releasedColor: "#FF6C3C" + pressedColor: "#FF4304" + enabled : true + onClicked: amountLine.text = "(all)" + } + } - Row { - id: amountRow - anchors.top: amountLabel.bottom - anchors.topMargin: 5 - anchors.left: parent.left - anchors.leftMargin: 7 - width: (parent.width - 17) / 2 + 10 - Item { - width: 37 - height: 37 + } - Image { - anchors.centerIn: parent - source: "../images/moneroIcon.png" + ColumnLayout { + Layout.fillWidth: true + Label { + id: transactionPriority + text: qsTr("Transaction priority") + translationManager.emptyString + } + // Note: workaround for translations in listElements + // ListElement: cannot use script for property value, so + // code like this wont work: + // ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low } + // For translations to work, the strings need to be listed in + // the file components/StandardDropdown.qml too. + + // Priorities before v5 + ListModel { + id: priorityModel + + ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: PendingTransaction.Priority_Low } + ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: PendingTransaction.Priority_Medium } + ListElement { column1: qsTr("High (x166 fee)") ; column2: ""; priority: PendingTransaction.Priority_High } + } + + // Priorites after v5 + ListModel { + id: priorityModelV5 + + ListElement { column1: qsTr("Slow (x0.25 fee)") ; column2: ""; priority: 1} + ListElement { column1: qsTr("Default (x1 fee)") ; column2: ""; priority: 2 } + ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 } + ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 } + + } + + StandardDropdown { + Layout.fillWidth: true + id: priorityDropdown + shadowReleasedColor: "#FF4304" + shadowPressedColor: "#B32D00" + releasedColor: "#FF6C3C" + pressedColor: "#FF4304" } } - // Amount input - LineEdit { - id: amountLine - placeholderText: qsTr("") + translationManager.emptyString - width: parent.width - 37 - 17 - 60 - validator: DoubleValidator { - bottom: 0.0 - top: 18446744.073709551615 - decimals: 12 - notation: DoubleValidator.StandardNotation - locale: "C" + // Make sure dropdown is on top + z: parent.z + 1 + } + + ColumnLayout { + Layout.fillWidth: true + Label { + id: addressLabel + textFormat: Text.RichText + text: qsTr("\ + Address ( Paste in or select from Address book )") + + translationManager.emptyString + + onLinkActivated: appWindow.showPageRequest("AddressBook") + Layout.fillWidth: true + } + // recipient address input + RowLayout { + id: addressLineRow + Layout.fillWidth: true + + StandardButton { + id: qrfinderButton + text: qsTr("QR Code") + translationManager.emptyString + shadowReleasedColor: "#FF4304" + shadowPressedColor: "#B32D00" + releasedColor: "#FF6C3C" + pressedColor: "#FF4304" + visible : appWindow.qrScannerEnabled + enabled : visible + width: visible ? 60 * scaleRatio : 0 + onClicked: { + cameraUi.state = "Capture" + cameraUi.qrcode_decoded.connect(updateFromQrCode) + } } - } - - StandardButton { - id: amountAllButton - //anchors.left: amountLine.right - //anchors.top: amountLine.top - //anchors.bottom: amountLine.bottom - width: 60 - text: qsTr("All") + translationManager.emptyString - shadowReleasedColor: "#FF4304" - shadowPressedColor: "#B32D00" - releasedColor: "#FF6C3C" - pressedColor: "#FF4304" - enabled : true - onClicked: amountLine.text = "(all)" - } - } - - - // Note: workaround for translations in listElements - // ListElement: cannot use script for property value, so - // code like this wont work: - // ListElement { column1: qsTr("LOW") + translationManager.emptyString ; column2: ""; priority: PendingTransaction.Priority_Low } - // For translations to work, the strings need to be listed in - // the file components/StandardDropdown.qml too. - - // Priorities before v5 - ListModel { - id: priorityModel - - ListElement { column1: qsTr("Low (x1 fee)") ; column2: ""; priority: PendingTransaction.Priority_Low } - ListElement { column1: qsTr("Medium (x20 fee)") ; column2: ""; priority: PendingTransaction.Priority_Medium } - ListElement { column1: qsTr("High (x166 fee)") ; column2: ""; priority: PendingTransaction.Priority_High } - } - - // Priorites after v5 - ListModel { - id: priorityModelV5 - - ListElement { column1: qsTr("Slow (x0.25 fee)") ; column2: ""; priority: 1} - ListElement { column1: qsTr("Default (x1 fee)") ; column2: ""; priority: 2 } - ListElement { column1: qsTr("Fast (x5 fee)") ; column2: ""; priority: 3 } - ListElement { column1: qsTr("Fastest (x41.5 fee)") ; column2: ""; priority: 4 } - - } - - StandardDropdown { - id: priorityDropdown - anchors.top: transactionPriority.bottom - anchors.right: parent.right - anchors.rightMargin: 17 - anchors.topMargin: 5 - anchors.left: transactionPriority.left - shadowReleasedColor: "#FF4304" - shadowPressedColor: "#B32D00" - releasedColor: "#FF6C3C" - pressedColor: "#FF4304" - z: 1 - } - - Label { - id: addressLabel - anchors.left: parent.left - anchors.right: parent.right - anchors.top: amountRow.bottom - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 30 - fontSize: 14 - textFormat: Text.RichText - text: qsTr("\ - Address ( Paste in or select from Address book )") - + translationManager.emptyString - - onLinkActivated: appWindow.showPageRequest("AddressBook") - } - // recipient address input - RowLayout { - id: addressLineRow - anchors.left: parent.left - anchors.right: parent.right - anchors.top: addressLabel.bottom - - StandardButton { - id: qrfinderButton - anchors.left: parent.left - anchors.leftMargin: 17 - anchors.topMargin: 5 - text: qsTr("QR Code") + translationManager.emptyString - shadowReleasedColor: "#FF4304" - shadowPressedColor: "#B32D00" - releasedColor: "#FF6C3C" - pressedColor: "#FF4304" - visible : appWindow.qrScannerEnabled - enabled : visible - width: visible ? 60 : 0 - onClicked: { - cameraUi.state = "Capture" - cameraUi.qrcode_decoded.connect(updateFromQrCode) + LineEdit { + id: addressLine + Layout.fillWidth: true + anchors.topMargin: 5 * scaleRatio + placeholderText: "4..." + // validator: RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g } } - } - LineEdit { - id: addressLine - anchors.left: qrfinderButton.right - anchors.right: resolveButton.left - //anchors.leftMargin: 17 - anchors.topMargin: 5 - placeholderText: "4..." - // validator: RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g } - } - StandardButton { - id: resolveButton - anchors.right: parent.right - anchors.leftMargin: 17 - anchors.topMargin: 17 - anchors.rightMargin: 17 - width: 60 - text: qsTr("Resolve") + translationManager.emptyString - shadowReleasedColor: "#FF4304" - shadowPressedColor: "#B32D00" - releasedColor: "#FF6C3C" - pressedColor: "#FF4304" - enabled : isValidOpenAliasAddress(addressLine.text) - onClicked: { - var result = walletManager.resolveOpenAlias(addressLine.text) - if (result) { - var parts = result.split("|") - if (parts.length == 2) { - var address_ok = walletManager.addressValid(parts[1], appWindow.persistentSettings.testnet) - if (parts[0] === "true") { - if (address_ok) { - addressLine.text = parts[1] - addressLine.cursorPosition = 0 - } - else - oa_message(qsTr("No valid address found at this OpenAlias address")) - } else if (parts[0] === "false") { - if (address_ok) { - addressLine.text = parts[1] - addressLine.cursorPosition = 0 - oa_message(qsTr("Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed")) + StandardButton { + id: resolveButton + width: 60 * scaleRatio + text: qsTr("Resolve") + translationManager.emptyString + shadowReleasedColor: "#FF4304" + shadowPressedColor: "#B32D00" + releasedColor: "#FF6C3C" + pressedColor: "#FF4304" + enabled : isValidOpenAliasAddress(addressLine.text) + onClicked: { + var result = walletManager.resolveOpenAlias(addressLine.text) + if (result) { + var parts = result.split("|") + if (parts.length == 2) { + var address_ok = walletManager.addressValid(parts[1], appWindow.persistentSettings.testnet) + if (parts[0] === "true") { + if (address_ok) { + addressLine.text = parts[1] + addressLine.cursorPosition = 0 + } + else + oa_message(qsTr("No valid address found at this OpenAlias address")) + } else if (parts[0] === "false") { + if (address_ok) { + addressLine.text = parts[1] + addressLine.cursorPosition = 0 + oa_message(qsTr("Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed")) + } else { + oa_message(qsTr("No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed")) + } + } else { + oa_message(qsTr("Internal error")) + } } else { - oa_message(qsTr("No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed")) + oa_message(qsTr("Internal error")) } } else { - oa_message(qsTr("Internal error")) + oa_message(qsTr("No address found")) } - } else { - oa_message(qsTr("Internal error")) - } - } else { - oa_message(qsTr("No address found")) } } } - } - Label { - id: paymentIdLabel - anchors.left: parent.left - anchors.right: parent.right - anchors.top: addressLineRow.bottom - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 17 - fontSize: 14 - text: qsTr("Payment ID ( Optional )") + translationManager.emptyString - } + Label { + id: paymentIdLabel + text: qsTr("Payment ID ( Optional )") + translationManager.emptyString + } - // payment id input - LineEdit { - id: paymentIdLine - anchors.left: parent.left - anchors.right: parent.right - anchors.top: paymentIdLabel.bottom - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 5 - placeholderText: qsTr("16 or 64 hexadecimal characters") + translationManager.emptyString - // validator: DoubleValidator { top: 0.0 } - } + // payment id input + LineEdit { + id: paymentIdLine + placeholderText: qsTr("16 or 64 hexadecimal characters") + translationManager.emptyString + Layout.fillWidth: true + } - Label { - id: descriptionLabel - anchors.left: parent.left - anchors.right: parent.right - anchors.top: paymentIdLine.bottom - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 17 - fontSize: 14 - text: qsTr("Description ( Optional )") - + translationManager.emptyString - } + Label { + text: qsTr("Description ( Optional )") + + translationManager.emptyString + } - LineEdit { - id: descriptionLine - anchors.left: parent.left - anchors.right: parent.right - anchors.top: descriptionLabel.bottom - anchors.leftMargin: 17 - anchors.rightMargin: 17 - anchors.topMargin: 5 - placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString - } - - function checkInformation(amount, address, payment_id, testnet) { - address = address.trim() - payment_id = payment_id.trim() - - var amount_ok = amount.length > 0 - var address_ok = walletManager.addressValid(address, testnet) - var payment_id_ok = payment_id.length == 0 || walletManager.paymentIdValid(payment_id) - var ipid = walletManager.paymentIdFromAddress(address, testnet) - if (ipid.length > 0 && payment_id.length > 0) - payment_id_ok = false - - addressLine.error = !address_ok - amountLine.error = !amount_ok - paymentIdLine.error = !payment_id_ok - - return amount_ok && address_ok && payment_id_ok - } - - - RowLayout { - anchors.left: parent.left - anchors.top: descriptionLine.bottom - anchors.leftMargin: 17 - anchors.topMargin: 17 + LineEdit { + id: descriptionLine + placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString + Layout.fillWidth: true + } StandardButton { id: sendButton + Layout.bottomMargin: 17 * scaleRatio + Layout.topMargin: 17 * scaleRatio text: qsTr("Send") + translationManager.emptyString shadowReleasedColor: "#FF4304" shadowPressedColor: "#B32D00" @@ -418,6 +347,23 @@ Rectangle { } } + function checkInformation(amount, address, payment_id, testnet) { + address = address.trim() + payment_id = payment_id.trim() + + var amount_ok = amount.length > 0 + var address_ok = walletManager.addressValid(address, testnet) + var payment_id_ok = payment_id.length == 0 || walletManager.paymentIdValid(payment_id) + var ipid = walletManager.paymentIdFromAddress(address, testnet) + if (ipid.length > 0 && payment_id.length > 0) + payment_id_ok = false + + addressLine.error = !address_ok + amountLine.error = !amount_ok + paymentIdLine.error = !payment_id_ok + + return amount_ok && address_ok && payment_id_ok + } } // pageRoot @@ -482,10 +428,20 @@ Rectangle { PrivacyLevel { - visible: persistentSettings.transferShowAdvanced + visible: persistentSettings.transferShowAdvanced && !isMobile id: privacyLevelItem anchors.left: parent.left anchors.right: parent.right + anchors.rightMargin: 17 * scaleRatio + onFillLevelChanged: updateMixin() + } + + PrivacyLevelSmall { + visible: persistentSettings.transferShowAdvanced && isMobile + id: privacyLevelItemSmall + anchors.left: parent.left + anchors.right: parent.right + anchors.rightMargin: 17 * scaleRatio onFillLevelChanged: updateMixin() } @@ -722,6 +678,7 @@ Rectangle { statusText.text = qsTr("Waiting on daemon synchronization to finish") } else { // everything OK, enable transfer page + // Light wallet is always ready pageRoot.enabled = true; statusText.text = ""; }