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
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() |
|
} |
|
} |
|
} |
|
|
|
}
|
|
|