Transfer - mobile redesign

This commit is contained in:
Jaquee
2017-08-08 11:10:44 +02:00
parent aded122465
commit 58030c67c8

View File

@@ -71,10 +71,10 @@ Rectangle {
} }
function updateMixin() { function updateMixin() {
var fillLevel = privacyLevelItem.fillLevel var fillLevel = (isMobile) ? privacyLevelItemSmall.fillLevel : privacyLevelItem.fillLevel
var mixin = scaleValueToMixinCount(fillLevel) var mixin = scaleValueToMixinCount(fillLevel)
print ("PrivacyLevel changed:" + fillLevel) console.log("PrivacyLevel changed:" + fillLevel)
print ("mixin count: " + mixin) console.log("mixin count: " + mixin)
privacyLabel.text = qsTr("Privacy level (ringsize %1)").arg(mixin+1) + translationManager.emptyString privacyLabel.text = qsTr("Privacy level (ringsize %1)").arg(mixin+1) + translationManager.emptyString
} }
@@ -107,297 +107,226 @@ Rectangle {
} }
} }
Item { ColumnLayout {
id: pageRoot id: pageRoot
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.topMargin: 20 anchors.margins: 17 * scaleRatio
height: 400 spacing: 0
Label { GridLayout {
id: amountLabel columns: (isMobile)? 1 : 2
anchors.left: parent.left Layout.fillWidth: true
anchors.top: parent.top
anchors.leftMargin: 17
anchors.rightMargin: 17
anchors.topMargin: 17
text: qsTr("Amount") + translationManager.emptyString
fontSize: 14
}
Label { ColumnLayout {
id: transactionPriority Layout.fillWidth: true
anchors.top: parent.top Label {
anchors.topMargin: 17 id: amountLabel
fontSize: 14 text: qsTr("Amount") + translationManager.emptyString
x: (parent.width - 17) / 2 + 17 }
text: qsTr("Transaction priority") + 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 { ColumnLayout {
anchors.centerIn: parent Layout.fillWidth: true
source: "../images/moneroIcon.png" 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 // Make sure dropdown is on top
LineEdit { z: parent.z + 1
id: amountLine }
placeholderText: qsTr("") + translationManager.emptyString
width: parent.width - 37 - 17 - 60 ColumnLayout {
validator: DoubleValidator { Layout.fillWidth: true
bottom: 0.0 Label {
top: 18446744.073709551615 id: addressLabel
decimals: 12 textFormat: Text.RichText
notation: DoubleValidator.StandardNotation text: qsTr("<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>\
locale: "C" Address <font size='2'> ( Paste in or select from </font> <a href='#'>Address book</a><font size='2'> )</font>")
+ 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)
}
} }
} LineEdit {
id: addressLine
StandardButton { Layout.fillWidth: true
id: amountAllButton anchors.topMargin: 5 * scaleRatio
//anchors.left: amountLine.right placeholderText: "4..."
//anchors.top: amountLine.top // validator: RegExpValidator { regExp: /[0-9A-Fa-f]{95}/g }
//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("<style type='text/css'>a {text-decoration: none; color: #FF6C3C; font-size: 14px;}</style>\
Address <font size='2'> ( Paste in or select from </font> <a href='#'>Address book</a><font size='2'> )</font>")
+ 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
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 { StandardButton {
id: resolveButton id: resolveButton
anchors.right: parent.right width: 60 * scaleRatio
anchors.leftMargin: 17 text: qsTr("Resolve") + translationManager.emptyString
anchors.topMargin: 17 shadowReleasedColor: "#FF4304"
anchors.rightMargin: 17 shadowPressedColor: "#B32D00"
width: 60 releasedColor: "#FF6C3C"
text: qsTr("Resolve") + translationManager.emptyString pressedColor: "#FF4304"
shadowReleasedColor: "#FF4304" enabled : isValidOpenAliasAddress(addressLine.text)
shadowPressedColor: "#B32D00" onClicked: {
releasedColor: "#FF6C3C" var result = walletManager.resolveOpenAlias(addressLine.text)
pressedColor: "#FF4304" if (result) {
enabled : isValidOpenAliasAddress(addressLine.text) var parts = result.split("|")
onClicked: { if (parts.length == 2) {
var result = walletManager.resolveOpenAlias(addressLine.text) var address_ok = walletManager.addressValid(parts[1], appWindow.persistentSettings.testnet)
if (result) { if (parts[0] === "true") {
var parts = result.split("|") if (address_ok) {
if (parts.length == 2) { addressLine.text = parts[1]
var address_ok = walletManager.addressValid(parts[1], appWindow.persistentSettings.testnet) addressLine.cursorPosition = 0
if (parts[0] === "true") { }
if (address_ok) { else
addressLine.text = parts[1] oa_message(qsTr("No valid address found at this OpenAlias address"))
addressLine.cursorPosition = 0 } else if (parts[0] === "false") {
} if (address_ok) {
else addressLine.text = parts[1]
oa_message(qsTr("No valid address found at this OpenAlias address")) addressLine.cursorPosition = 0
} else if (parts[0] === "false") { oa_message(qsTr("Address found, but the DNSSEC signatures could not be verified, so this address may be spoofed"))
if (address_ok) { } else {
addressLine.text = parts[1] oa_message(qsTr("No valid address found at this OpenAlias address, but the DNSSEC signatures could not be verified, so this may be spoofed"))
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("Internal error"))
}
} else { } 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 { } 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 { Label {
id: paymentIdLabel id: paymentIdLabel
anchors.left: parent.left text: qsTr("Payment ID <font size='2'>( Optional )</font>") + translationManager.emptyString
anchors.right: parent.right }
anchors.top: addressLineRow.bottom
anchors.leftMargin: 17
anchors.rightMargin: 17
anchors.topMargin: 17
fontSize: 14
text: qsTr("Payment ID <font size='2'>( Optional )</font>") + translationManager.emptyString
}
// payment id input // payment id input
LineEdit { LineEdit {
id: paymentIdLine id: paymentIdLine
anchors.left: parent.left placeholderText: qsTr("16 or 64 hexadecimal characters") + translationManager.emptyString
anchors.right: parent.right Layout.fillWidth: true
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 }
}
Label { Label {
id: descriptionLabel text: qsTr("Description <font size='2'>( Optional )</font>")
anchors.left: parent.left + translationManager.emptyString
anchors.right: parent.right }
anchors.top: paymentIdLine.bottom
anchors.leftMargin: 17
anchors.rightMargin: 17
anchors.topMargin: 17
fontSize: 14
text: qsTr("Description <font size='2'>( Optional )</font>")
+ translationManager.emptyString
}
LineEdit { LineEdit {
id: descriptionLine id: descriptionLine
anchors.left: parent.left placeholderText: qsTr("Saved to local wallet history") + translationManager.emptyString
anchors.right: parent.right Layout.fillWidth: true
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
StandardButton { StandardButton {
id: sendButton id: sendButton
Layout.bottomMargin: 17 * scaleRatio
Layout.topMargin: 17 * scaleRatio
text: qsTr("Send") + translationManager.emptyString text: qsTr("Send") + translationManager.emptyString
shadowReleasedColor: "#FF4304" shadowReleasedColor: "#FF4304"
shadowPressedColor: "#B32D00" 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 } // pageRoot
@@ -482,10 +428,20 @@ Rectangle {
PrivacyLevel { PrivacyLevel {
visible: persistentSettings.transferShowAdvanced visible: persistentSettings.transferShowAdvanced && !isMobile
id: privacyLevelItem id: privacyLevelItem
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right 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() onFillLevelChanged: updateMixin()
} }
@@ -722,6 +678,7 @@ Rectangle {
statusText.text = qsTr("Waiting on daemon synchronization to finish") statusText.text = qsTr("Waiting on daemon synchronization to finish")
} else { } else {
// everything OK, enable transfer page // everything OK, enable transfer page
// Light wallet is always ready
pageRoot.enabled = true; pageRoot.enabled = true;
statusText.text = ""; statusText.text = "";
} }