You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

199 lines
6.0 KiB

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import org.electrum 1.0
import "../controls"
ElDialog {
id: wizard
focus: true
width: parent.width
height: parent.height
padding: 0
title: (pages.currentItem.wizard_title ? pages.currentItem.wizard_title : wizardTitle) +
(pages.currentItem.title ? ' - ' + pages.currentItem.title : '')
iconSource: '../../../icons/electrum.png'
// android back button triggers close() on Popups. Disabling close here,
// we handle that via Keys.onReleased event handler in the root layout.
closePolicy: Popup.NoAutoClose
property string wizardTitle
property var wizard_data
property alias pages: pages
property QtObject wiz
property alias finishButtonText: finishButton.text
function doClose() {
if (pages.currentIndex == 0)
reject()
else
pages.prev()
}
function _setWizardData(wdata) {
wizard_data = {}
Object.assign(wizard_data, wdata) // deep copy
// console.log('wizard data is now :' + JSON.stringify(wizard_data))
}
// helper function to dynamically load wizard page components
// and add them to the SwipeView
// Here we do some manual binding of page.valid -> pages.pagevalid and
// page.last -> pages.lastpage to propagate the state without the binding
// going stale.
function _loadNextComponent(view, wdata={}) {
// remove any existing pages after current page
while (pages.contentChildren[pages.currentIndex+1]) {
pages.takeItem(pages.currentIndex+1).destroy()
}
var url = Qt.resolvedUrl(wiz.viewToComponent(view))
var comp = Qt.createComponent(url)
if (comp.status == Component.Error) {
console.log(comp.errorString())
return null
}
// make a deepcopy of wdata and pass it to the component
var wdata_copy={}
Object.assign(wdata_copy, wdata)
var page = comp.createObject(pages, {wizard_data: wdata_copy})
page.validChanged.connect(function() {
if (page != pages.currentItem)
return
pages.pagevalid = page.valid
})
page.lastChanged.connect(function() {
if (page != pages.currentItem)
return
pages.lastpage = page.last
})
page.next.connect(function() {
var newview = wiz.submit(page.wizard_data)
if (newview.view) {
console.log('next view: ' + newview.view)
var newpage = _loadNextComponent(newview.view, newview.wizard_data)
} else {
console.log('END')
}
})
page.finish.connect(function() {
// run wizard.submit() a final time, so that the navmap[view]['accept'] handler can run (if any)
var newview = wiz.submit(page.wizard_data)
_setWizardData(newview.wizard_data)
console.log('wizard finished')
// finish wizard
wizard.doAccept()
})
page.prev.connect(function() {
var wdata = wiz.prev()
})
pages.pagevalid = page.valid
pages.lastpage = page.last
return page
}
ColumnLayout {
anchors.fill: parent
spacing: 0
// root Item in Wizard, capture back button here and delegate to main
Keys.onReleased: {
if (event.key == Qt.Key_Back) {
console.log("Back button within wizard")
app.close() // this handles unwind of dialogs/stack
}
}
SwipeView {
id: pages
Layout.fillWidth: true
Layout.fillHeight: true
interactive: false
clip:true
function prev() {
currentItem.prev()
currentIndex = currentIndex - 1
_setWizardData(pages.contentChildren[currentIndex].wizard_data)
pages.pagevalid = pages.contentChildren[currentIndex].valid
pages.lastpage = pages.contentChildren[currentIndex].last
}
function next() {
currentItem.accept()
_setWizardData(pages.contentChildren[currentIndex].wizard_data)
currentItem.next()
currentIndex = currentIndex + 1
}
function finish() {
currentItem.accept()
_setWizardData(pages.contentChildren[currentIndex].wizard_data)
currentItem.finish()
}
property bool pagevalid: false
property bool lastpage: false
Component.onCompleted: {
_setWizardData({})
}
Binding {
target: AppController
property: 'secureWindow'
value: pages.contentChildren[pages.currentIndex].securePage
}
}
ButtonContainer {
Layout.fillWidth: true
FlatButton {
Layout.fillWidth: true
Layout.preferredWidth: 1
visible: pages.currentIndex == 0
text: qsTr("Cancel")
onClicked: wizard.doReject()
}
FlatButton {
Layout.fillWidth: true
Layout.preferredWidth: 1
visible: pages.currentIndex > 0
text: qsTr('Back')
onClicked: pages.prev()
}
FlatButton {
Layout.fillWidth: true
Layout.preferredWidth: 1
text: qsTr("Next")
visible: !pages.lastpage
enabled: pages.pagevalid
onClicked: pages.next()
}
FlatButton {
id: finishButton
Layout.fillWidth: true
Layout.preferredWidth: 1
text: qsTr("Finish")
visible: pages.lastpage
enabled: pages.pagevalid
onClicked: pages.finish()
}
}
}
}