qml: add signals for QEQRScanner and fallbacks, add QEBytes container type so we can pass along byte arrays between QML and python, port qr scan occurrences to new signals.
214 lines
6.8 KiB
QML
214 lines
6.8 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import QtQuick.Controls
|
|
import QtQuick.Controls.Material
|
|
|
|
import org.electrum 1.0
|
|
|
|
import "../controls"
|
|
|
|
WizardComponent {
|
|
id: root
|
|
securePage: true
|
|
|
|
valid: false
|
|
|
|
property int cosigner: 0
|
|
property int participants: 0
|
|
property string multisigMasterPubkey
|
|
|
|
function apply() {
|
|
applyMasterKey(masterkey_ta.text)
|
|
}
|
|
|
|
function applyMasterKey(key) {
|
|
key = key.trim()
|
|
if (cosigner) {
|
|
wizard_data['multisig_cosigner_data'][cosigner.toString()]['master_key'] = key
|
|
} else {
|
|
wizard_data['master_key'] = key
|
|
}
|
|
}
|
|
|
|
function verifyMasterKey(key) {
|
|
valid = false
|
|
validationtext.text = ''
|
|
key = key.trim()
|
|
|
|
if (!key) {
|
|
validationtext.text = ''
|
|
return false
|
|
}
|
|
|
|
if (!bitcoin.verifyMasterKey(key, wizard_data['wallet_type'])) {
|
|
validationtext.text = qsTr('Error: invalid master key')
|
|
return false
|
|
}
|
|
|
|
if (cosigner) {
|
|
applyMasterKey(key)
|
|
if (wiz.hasDuplicateMasterKeys(wizard_data)) {
|
|
validationtext.text = qsTr('Error: duplicate master public key')
|
|
return false
|
|
}
|
|
if (wiz.hasHeterogeneousMasterKeys(wizard_data)) {
|
|
validationtext.text = qsTr('Error: master public key types do not match')
|
|
return false
|
|
}
|
|
}
|
|
|
|
return valid = true
|
|
}
|
|
|
|
ColumnLayout {
|
|
width: parent.width
|
|
|
|
Label {
|
|
Layout.fillWidth: true
|
|
|
|
visible: cosigner
|
|
text: qsTr('Here is your master public key. Please share it with your cosigners')
|
|
wrapMode: Text.Wrap
|
|
}
|
|
|
|
TextHighlightPane {
|
|
Layout.fillWidth: true
|
|
|
|
visible: cosigner
|
|
|
|
RowLayout {
|
|
width: parent.width
|
|
Label {
|
|
Layout.fillWidth: true
|
|
text: multisigMasterPubkey
|
|
font.pixelSize: constants.fontSizeMedium
|
|
font.family: FixedFont
|
|
wrapMode: Text.Wrap
|
|
}
|
|
ToolButton {
|
|
icon.source: '../../../icons/share.png'
|
|
icon.color: 'transparent'
|
|
onClicked: {
|
|
var dialog = app.genericShareDialog.createObject(app, {
|
|
title: qsTr('Master public key'),
|
|
text: multisigMasterPubkey
|
|
})
|
|
dialog.open()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle {
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: 1
|
|
Layout.topMargin: constants.paddingLarge
|
|
Layout.bottomMargin: constants.paddingLarge
|
|
visible: cosigner
|
|
color: Material.accentColor
|
|
}
|
|
|
|
Label {
|
|
text: qsTr('Cosigner #%1 of %2').arg(cosigner).arg(participants)
|
|
visible: cosigner
|
|
}
|
|
|
|
Label {
|
|
Layout.fillWidth: true
|
|
text: cosigner
|
|
? [qsTr('Please enter the master public key (xpub) of your cosigner.'),
|
|
qsTr('Enter their master private key (xprv) if you want to be able to sign for them.')
|
|
].join('\n')
|
|
: [qsTr('Please enter your master private key (xprv).'),
|
|
qsTr('You can also enter a public key (xpub) here, but be aware you will then create a watch-only wallet if all cosigners are added using public keys')
|
|
].join('\n')
|
|
wrapMode: Text.Wrap
|
|
}
|
|
|
|
RowLayout {
|
|
ElTextArea {
|
|
id: masterkey_ta
|
|
Layout.fillWidth: true
|
|
Layout.minimumHeight: 160
|
|
font.family: FixedFont
|
|
wrapMode: TextEdit.WrapAnywhere
|
|
onTextChanged: {
|
|
if (anyActiveFocus) {
|
|
verifyMasterKey(text)
|
|
}
|
|
}
|
|
inputMethodHints: Qt.ImhSensitiveData | Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase
|
|
background: PaneInsetBackground {
|
|
baseColor: constants.darkerDialogBackground
|
|
}
|
|
}
|
|
ColumnLayout {
|
|
Layout.alignment: Qt.AlignTop
|
|
ToolButton {
|
|
icon.source: '../../../icons/paste.png'
|
|
icon.height: constants.iconSizeMedium
|
|
icon.width: constants.iconSizeMedium
|
|
onClicked: {
|
|
if (verifyMasterKey(AppController.clipboardToText()))
|
|
masterkey_ta.text = AppController.clipboardToText()
|
|
else
|
|
masterkey_ta.text = ''
|
|
}
|
|
}
|
|
ToolButton {
|
|
icon.source: '../../../icons/qrcode.png'
|
|
icon.height: constants.iconSizeMedium
|
|
icon.width: constants.iconSizeMedium
|
|
scale: 1.2
|
|
onClicked: {
|
|
var dialog = app.scanDialog.createObject(app, {
|
|
hint: cosigner
|
|
? qsTr('Scan a cosigner master public key')
|
|
: qsTr('Scan a master key')
|
|
})
|
|
dialog.onFoundText.connect(function(data) {
|
|
if (verifyMasterKey(data))
|
|
masterkey_ta.text = data
|
|
else
|
|
masterkey_ta.text = ''
|
|
dialog.close()
|
|
})
|
|
dialog.open()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
TextArea {
|
|
id: validationtext
|
|
visible: text
|
|
Layout.fillWidth: true
|
|
readOnly: true
|
|
wrapMode: TextInput.WordWrap
|
|
background: Rectangle {
|
|
color: 'transparent'
|
|
}
|
|
}
|
|
}
|
|
|
|
Bitcoin {
|
|
id: bitcoin
|
|
onValidationMessageChanged: {
|
|
validationtext.text = validationMessage
|
|
}
|
|
}
|
|
|
|
Component.onCompleted: {
|
|
if (wizard_data['wallet_type'] == 'multisig') {
|
|
if ('multisig_current_cosigner' in wizard_data)
|
|
cosigner = wizard_data['multisig_current_cosigner']
|
|
participants = wizard_data['multisig_participants']
|
|
|
|
if ('multisig_master_pubkey' in wizard_data) {
|
|
multisigMasterPubkey = wizard_data['multisig_master_pubkey']
|
|
}
|
|
}
|
|
Qt.callLater(masterkey_ta.forceActiveFocus)
|
|
}
|
|
}
|