199 lines
7.4 KiB
QML
199 lines
7.4 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Controls 2.13
|
|
import QtQuick.Layouts 1.13
|
|
import QtGraphicalEffects 1.13
|
|
import "../imports"
|
|
|
|
Item {
|
|
id: root
|
|
property var accounts
|
|
property var contacts
|
|
property int inputWidth: 272
|
|
property int sourceSelectWidth: 136
|
|
property alias label: txtLabel.text
|
|
// If supplied, additional info will be displayed top-right in danger colour (red)
|
|
property alias additionalInfo: txtAddlInfo.text
|
|
property var selectedRecipient: { }
|
|
property bool readOnly: false
|
|
height: (readOnly ? inpReadOnly.height : inpAddress.height) + txtLabel.height
|
|
readonly property string addressValidationError: qsTr("Invalid ethereum address")
|
|
|
|
enum Type {
|
|
Address,
|
|
Contact,
|
|
Account
|
|
}
|
|
|
|
function validate() {
|
|
let isValid = true
|
|
if (readOnly) {
|
|
isValid = Utils.isValidAddress(selectedRecipient.address)
|
|
if (!isValid) {
|
|
inpReadOnly.validationError = addressValidationError
|
|
}
|
|
} else if (selAddressSource.selectedSource === "Address") {
|
|
isValid = inpAddress.validate()
|
|
} else if (selAddressSource.selectedSource === "Contact") {
|
|
isValid = selContact.validate()
|
|
}
|
|
return isValid
|
|
}
|
|
|
|
Text {
|
|
id: txtLabel
|
|
visible: label !== ""
|
|
text: qsTr("Recipient")
|
|
font.pixelSize: 13
|
|
font.family: Style.current.fontRegular.name
|
|
font.weight: Font.Medium
|
|
color: Style.current.textColor
|
|
height: 18
|
|
}
|
|
|
|
Text {
|
|
id: txtAddlInfo
|
|
visible: text !== ""
|
|
text: ""
|
|
font.pixelSize: 13
|
|
font.family: Style.current.fontRegular.name
|
|
font.weight: Font.Medium
|
|
color: Style.current.danger
|
|
height: 18
|
|
anchors.right: parent.right
|
|
}
|
|
|
|
RowLayout {
|
|
anchors.top: txtLabel.bottom
|
|
anchors.topMargin: 7
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
spacing: 8
|
|
|
|
Input {
|
|
id: inpReadOnly
|
|
visible: root.readOnly
|
|
Layout.preferredWidth: selAddressSource.visible ? root.inputWidth : parent.width
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.fillWidth: true
|
|
anchors.left: undefined
|
|
anchors.right: undefined
|
|
text: (root.selectedRecipient && root.selectedRecipient.name) ? root.selectedRecipient.name : qsTr("No recipient selected")
|
|
textField.leftPadding: 14
|
|
textField.topPadding: 18
|
|
textField.bottomPadding: 18
|
|
textField.verticalAlignment: TextField.AlignVCenter
|
|
textField.font.pixelSize: 15
|
|
textField.color: Style.current.secondaryText
|
|
textField.readOnly: true
|
|
validationErrorAlignment: TextEdit.AlignRight
|
|
validationErrorTopMargin: 8
|
|
customHeight: 56
|
|
}
|
|
|
|
AddressInput {
|
|
id: inpAddress
|
|
width: root.inputWidth
|
|
label: ""
|
|
visible: !root.readOnly
|
|
Layout.preferredWidth: selAddressSource.visible ? root.inputWidth : parent.width
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.fillWidth: true
|
|
validationError: root.addressValidationError
|
|
onSelectedAddressChanged: {
|
|
if (root.readOnly) {
|
|
return
|
|
}
|
|
root.selectedRecipient = { address: selectedAddress, type: RecipientSelector.Type.Address }
|
|
}
|
|
}
|
|
|
|
ContactSelector {
|
|
id: selContact
|
|
contacts: root.contacts
|
|
visible: false
|
|
width: root.inputWidth
|
|
dropdownWidth: parent.width
|
|
Layout.preferredWidth: selAddressSource.visible ? root.inputWidth : parent.width
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.fillWidth: true
|
|
onSelectedContactChanged: {
|
|
if (root.readOnly) {
|
|
return
|
|
}
|
|
if(selectedContact && selectedContact.address) {
|
|
const { address, name, alias, isContact, identicon, ensVerified } = selectedContact
|
|
root.selectedRecipient = { address, name, alias, isContact, identicon, ensVerified, type: RecipientSelector.Type.Contact }
|
|
}
|
|
}
|
|
}
|
|
|
|
AccountSelector {
|
|
id: selAccount
|
|
accounts: root.accounts
|
|
visible: false
|
|
width: root.inputWidth
|
|
dropdownWidth: parent.width
|
|
label: ""
|
|
Layout.preferredWidth: selAddressSource.visible ? root.inputWidth : parent.width
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.fillWidth: true
|
|
onSelectedAccountChanged: {
|
|
if (root.readOnly) {
|
|
return
|
|
}
|
|
const { address, name, iconColor, assets, fiatBalance } = selectedAccount
|
|
root.selectedRecipient = { address, name, iconColor, assets, fiatBalance, type: RecipientSelector.Type.Account }
|
|
}
|
|
}
|
|
AddressSourceSelector {
|
|
id: selAddressSource
|
|
visible: !root.readOnly
|
|
sources: ["Address", "Contact", "My account"]
|
|
width: sourceSelectWidth
|
|
Layout.preferredWidth: root.sourceSelectWidth
|
|
Layout.alignment: Qt.AlignTop
|
|
|
|
onSelectedSourceChanged: {
|
|
if (root.readOnly) {
|
|
return
|
|
}
|
|
let address, name
|
|
switch (selectedSource) {
|
|
case "Address":
|
|
inpAddress.visible = true
|
|
selContact.visible = selAccount.visible = false
|
|
root.height = Qt.binding(function() { return inpAddress.height + txtLabel.height })
|
|
root.selectedRecipient = { address: inpAddress.selectedAddress, type: RecipientSelector.Type.Address }
|
|
break;
|
|
case "Contact":
|
|
selContact.visible = true
|
|
inpAddress.visible = selAccount.visible = false
|
|
root.height = Qt.binding(function() { return selContact.height + txtLabel.height })
|
|
let { alias, isContact, identicon, ensVerified } = selContact.selectedContact
|
|
address = selContact.selectedContact.address
|
|
name = selContact.selectedContact.name
|
|
root.selectedRecipient = { address, name, alias, isContact, identicon, ensVerified, type: RecipientSelector.Type.Contact }
|
|
break;
|
|
case "My account":
|
|
selAccount.visible = true
|
|
inpAddress.visible = selContact.visible = false
|
|
root.height = Qt.binding(function() { return selAccount.height + txtLabel.height })
|
|
const { iconColor, assets, fiatBalance } = selAccount.selectedAccount
|
|
address = selAccount.selectedAccount.address
|
|
name = selAccount.selectedAccount.name
|
|
root.selectedRecipient = { address, name, iconColor, assets, fiatBalance, type: RecipientSelector.Type.Account }
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*##^##
|
|
Designer {
|
|
D{i:0;autoSize:true;height:480;width:640}
|
|
}
|
|
##^##*/
|