New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New wizards + modes #1909
New wizards + modes #1909
Conversation
I’ve noticed so far:
|
Thanks @selsta. I made some changes.
Window size between the wizards and wallet view stays the same now.
Without custom decorations, the language can now be changed by going to
During opening of a wallet, the GUI will now stay in the wizard view.
Possibly related to your local setup, qmake should include these translations (via the In addition, I also rebased to latest master. |
components/LanguageSidebar.qml
Outdated
} | ||
|
||
width: 240 * scaleRatio | ||
height: parent.height - 50 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
height: parent.height - 50 | |
height: parent.height - (persistentSettings.customDecorations ? 50 : 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks
components/LanguageSidebar.qml
Outdated
|
||
onStatusChanged: { | ||
if(status === XmlListModel.Ready){ | ||
console.log("languages availible: ",count); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typo :P
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed :) Was from old code.
wizard/WizardHome.qml
Outdated
text: "Change language" | ||
|
||
onClicked: { | ||
wizardController.wizardState = 'wizardLanguage'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wizardController.wizardState = 'wizardLanguage'; | |
wizardController.wizardState = 'wizardLanguage'; | |
languageSidebar.open(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice one :)
components/LanguageSidebar.qml
Outdated
console.log("languages availible: ",count); | ||
if(count === 1){ | ||
console.log("Skipping language page until more languages are availible") | ||
wizard.switchPage(true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wizard.switchPage(true); | |
if (wizardStateView.state = "wizardLanguage") { | |
wizard.switchPage(true); | |
} |
I think this is more correct.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks.
I tried to debug the issue with languages not showing up without resizing but I’ve had no luck. The only other improvement suggestion I have is some kind of scrollbar or something. Currently, if the window height isn’t high enough, there’s no way to move forward. |
Note to self: integrate #1892 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With these two changes, Ledger Nano S hardware wallet will work again.
wizard/WizardCreateDevice1.qml
Outdated
|
||
var written = wizardController.createWalletFromDevice(); | ||
if(written){ | ||
wizardStateView.state = "wizardHome"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wizardStateView.state = "wizardHome"; | |
wizardStateView.state = "wizardCreateWallet2"; |
Otherwise, wizard will not advance to next page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh nice, you tested Ledger. I have yet to. Ill make these changes for the time being. Thanks.
import "../js/Wizard.js" as Wizard | ||
import "../components" | ||
import "../components" as MoneroComponents | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
import moneroComponents.Wallet 1.0 | |
Fixes
qrc:/wizard/WizardController.qml:342: ReferenceError: Wallet is not defined
Also empty language sidebar for me, even with a clean build. |
Seems like there's a regression with #1878 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think my comment about a scrollbar is still valid, also the language bar still requires changing the window height to show up.
Will review more later.
wizard/WizardAskPassword.qml
Outdated
strength = 100; | ||
|
||
// privacyLevel component uses 1..100 scale | ||
strength = Wizard.mapScope(1, 100, 1, 100, strength); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nop
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This function does nothing if the input and output scale are both 1, 100.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
12:13 dsc_: If the password strength is fine, remove the mapscope function IMO.
wizard/WizardController.qml
Outdated
|
||
delegate: StackViewDelegate { | ||
pushTransition: StackViewTransition { | ||
// PropertyAnimation { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this supposed to stay in?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I don't see why not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is it commented out in the first place?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've removed the comment. On second thought the animations look pretty sweet.
if (success) { | ||
wizardController.m_wallet = wallet; | ||
wizardController.walletOptionsIsRecoveringFromDevice = true; | ||
wizardController.tmpWalletFilename = tmp_wallet_filename; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Like @mmbyday pointed out, this should fix the regression (untested):
wizardController.tmpWalletFilename = tmp_wallet_filename; | |
wizardController.tmpWalletFilename = tmp_wallet_filename; | |
wizardController.walletOptionsRestoreHeight = wizardController.m_wallet.walletCreationHeight; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed
wizard/WizardWalletInput.qml
Outdated
if(walletLocation === "") return false; | ||
|
||
var exists = Wizard.walletPathExists(walletLocation.text, walletName.text, isIOS, walletManager); | ||
if(!exists && walletLocation.error === false) return true; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return !exists && walletLocation.error === false;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please elaborate
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (x) return true;
else return false;
is the same as
return x;
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ping on this? It’s not a bug but it simplifies the code. Writing the return value explicit as you did isn’t usual.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed
anchors.margins: 8 * scaleRatio | ||
anchors.leftMargin: 10 * scaleRatio | ||
font.family: MoneroComponents.Style.fontRegular.name | ||
text: qsTr("Enter your 25 (or 24) word mnemonic seed") + translationManager.emptyString |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why 24? 25 word seed without the checksum?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Currently:
monero-gui/wizard/WizardMemoTextInput.qml
Line 45 in dc7a95c
text: qsTr("Enter your 25 (or 24) word mnemonic seed") + translationManager.emptyString |
Probably checksum.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I think we should remove mentions of 24 word seeds but not in this PR.
wizard/WizardNav.qml
Outdated
// Set `wizardProgress` width based on amount of progress dots | ||
wizardProgress.width = 30 * menuNav.progressSteps; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
newline missing :P
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
:) fixed
This seems broken.
Also, on the final summary page of the wizard, when creating a new wallet from seed restore, the restore height is no longer displayed. The old wizard would show restore height. Working as intended? Or just missing. |
@@ -1891,6 +1954,14 @@ ApplicationWindow { | |||
passwordDialog.open(); | |||
} | |||
|
|||
function changeWalletMode(mode){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion: Perhaps in the Layout/UI settings tab, allow users to change wallet modes. Or is there already a way to change modes in an existing wallet?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nvm. I see the mode selection button on the welcome to monero screen. Nice :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still a good suggestion. I think we can think about this at a later point. Would be nice to be able to more easily switch modes (whilst you have a wallet opened).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree, this should be added later.
Confirmed. While language bar is open but empty, resizing the window will cause the languages to appear. |
Layout.fillWidth: true | ||
|
||
Text { | ||
text: qsTr("This mode is ideal for managing small amounts of money. You have access to basic features for making and managing transactions. It will automatically connect to the Monero network so you can start using Monero immediately.") + translationManager.emptyString |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
text: qsTr("This mode is ideal for managing small amounts of money. You have access to basic features for making and managing transactions. It will automatically connect to the Monero network so you can start using Monero immediately.") + translationManager.emptyString | |
text: qsTr("This mode is ideal for managing small amounts of monero. You have access to basic features for making and managing transactions. It will automatically connect to the Monero network so you can start using Monero immediately.") + translationManager.emptyString |
better IMO :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, good catch.
btnNext.visible: false | ||
progressSteps: 0 | ||
|
||
onPrevClicked: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion: This Mode Selection screen could use a "previous" button, along with the change language button.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Where would previous bring you?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess back to the main menu?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would add some complexity to determine if an user has already chosen a mode, in which case you can show the previous button but not on the first run. I would prefer to leave it like it is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One more vote for a Back to menu button on the Mode selection screen: If you arrive here from the menu it's impossible to back out without making a choice, with the added difficulty that right now this screen does not indicate which mode is the currently active one.
wizard/WizardHome.qml
Outdated
|
||
MoneroComponents.StandardButton { | ||
small: true | ||
text: qsTr("Mode selection") + translationManager.emptyString |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
text: qsTr("Mode selection") + translationManager.emptyString | |
text: qsTr("Change wallet mode") + translationManager.emptyString |
For better button text consistency
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
} | ||
} | ||
|
||
RowLayout { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps these two buttons would look better centered.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't think it will look OK since it is a change from the 'far-left' & 'far-right' button positions we have currently. In addition, there is no guarantee that there are 2 buttons displayed since they depend on custom decorations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Feel free to PR for it after this is merged though if you think it's important.
Layout.minimumWidth: 150 * scaleRatio | ||
text: "Continue" | ||
|
||
onClicked: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this extra click on the continue button required. If I click a language, that should be good to move on.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is pretty confusing in terms of UX. Clicking language in the sidebar should not do anything more than (dynamically) switching the language it is currently displaying.
In addition, I think the complexity of code needed does not justify the goal.
opacity: 0.75 | ||
visible: true | ||
|
||
MouseArea { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A mouseover effect, like that on the accounts page's listview, would be nice.
i.e.
onEntered: {
delegateTable.color = "#26FFFFFF"
}
onExited: {
delegateTable.color = "transparent"
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The background of those items is actually an image asset. However, I was able to simulate a hover effect by playing around with the opacity
. Looks better indeed.
font.pixelSize: 12 * scaleRatio | ||
font.family: MoneroComponents.Style.fontRegular.name | ||
color: MoneroComponents.Style.defaultFontColor | ||
text: Version.GUI_VERSION + " (Qt " + qtRuntimeVersion + ")" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Perhaps some pre-text. Otherwise this text looks odd without context.
text: Version.GUI_VERSION + " (Qt " + qtRuntimeVersion + ")" | |
text: "Wallet version: " + Version.GUI_VERSION + " (Qt " + qtRuntimeVersion + ")" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's not odd. That's just how software usually display their versions in splashes and/or intros.
|
||
wizardStateView.state = "wizardCreateWallet3"; | ||
} | ||
onNextClicked: { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Scenario: restore wallet, open wallet, logout of wallet, restore wallet, then previous mnemonic still visible. Perhaps clear sensitive fields at this point.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
Thanks for review... Some fixes/changes:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ledger related.
|
||
var wallet = walletManager.createWalletFromDevice(tmp_wallet_filename, "", nettype, deviceName, restoreHeight, subaddressLookahead); | ||
|
||
var success = wallet.status === Wallet.Status_Ok; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Requires import moneroComponents.Wallet 1.0
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
wizard/WizardController.qml
Outdated
wizardController.walletOptionsRestoreHeight = wizardController.m_wallet.walletCreationHeight; | ||
} else { | ||
console.log(wallet.errorString) | ||
walletErrorDialog.text = wallet.errorString; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
walletErrorDialog
is undefined as far as I can see.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
Bugs I’ve found:
|
value: walletOptionsName | ||
} | ||
|
||
WizardSummaryItem { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Debug leftover?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Creating a testnet and stagenet wallet doesn’t seem to work currently.
wizard/WizardSummary.qml
Outdated
} | ||
|
||
WizardSummaryItem { | ||
visible: persistentSettings.remoteNodeAddress !== "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
persistentSettings.remoteNodeAddress should get set to ""
if you use a local node.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did visible: persistentSettings.remoteNodeAddress !== "" && appWindow.walletMode == 0
instead and same approach for subsequent bootstrap item.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep, this seems fixed now.
wizard/WizardSummary.qml
Outdated
} | ||
|
||
WizardSummaryItem { | ||
visible: persistentSettings.bootstrapNodeAddress !== "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like a copy paste mistake.
visible: persistentSettings.bootstrapNodeAddress !== "" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Works as intended.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Like I said on IRC, this doesn’t look right. Nettype has nothing to do with bootstrapNodeAddress. I’d say it should be always visible or only visible if the nettype is testnet/stagenet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, you're right. Fixed.
js/Utils.js
Outdated
|
||
function netTypeToString(){ | ||
var nettype = appWindow.persistentSettings.nettype; | ||
return nettype == NetworkType.TESTNET ? qsTr("Testnet") : nettype == NetworkType.STAGENET ? qsTr("Stagenet") : qsTr("Mainnet"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
qrc:/js/Utils.js:94: ReferenceError: NetworkType is not defined
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed
Fixed
Fixed via
Fixed.
Added |
The PR is too big, I can't review it.
|
We are getting close to merging this :) I think this should still get fixed though:
https://user-images.githubusercontent.com/7697454/53013705-b75a1500-3446-11e9-835b-d580665d7543.gif |
Thanks @selsta
@xiphon regarding rotating globe; perhaps talk with kneuffelbund on IRC and see what he thinks. Maybe he can come up with something. Removing it all together is also fine by me but would rather do that in a separate PR where we can discuss the starting screen more in depth - as we are currently limited to make release in time. As for Another fix via @dEBRUYNE-1:
Wallet defaults to Advanced mode when no prior mode configuration is found. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good work @xmrdsc, must have been a lot of work! I’ve approved it but left some small comments.
else{ | ||
return 0; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
newline :)
property alias viewState: rootItem.state | ||
|
||
property string remoteNodeService: { | ||
// support user-defined remote node aggregators |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe add a TODO to finish support for user-defined remote node aggregators. I think there’s currently no way to set one. Or is it intended to be set in code only?
@@ -81,7 +82,21 @@ ApplicationWindow { | |||
readonly property string localDaemonAddress : "localhost:" + getDefaultDaemonRpcPort(persistentSettings.nettype) | |||
property string currentDaemonAddress; | |||
property bool startLocalNodeCancelled: false | |||
property int estimatedBlockchainSize: 50 // GB | |||
property int disconnectedEpoch: 0 | |||
property int estimatedBlockchainSize: 75 // GB |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could add a function that estimates the blockchain size. Just an idea, not for this PR.
appWindow.disconnectedEpoch = 0; | ||
return; | ||
}, function(){ | ||
appWindow.showStatusMessage(qsTr("Failed to fetch remote nodes from third-party server."), simpleModeConnectionTimer.interval / 1000); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens to simple mode users if your server goes down?
@@ -1891,6 +1954,14 @@ ApplicationWindow { | |||
passwordDialog.open(); | |||
} | |||
|
|||
function changeWalletMode(mode){ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree, this should be added later.
<file>images/create-wallet.png</file> | ||
<file>images/remote-node.png</file> | ||
<file>images/local-node.png</file> | ||
<file>images/local-node-full.png</file> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
<file>images/local-node-full@2x.png</file>
<file>images/local-node@2x.png</file>
<file>images/remote-node@2x.png </file>
id: bootstrapNodeEdit | ||
Layout.minimumWidth: 300 * scaleRatio | ||
|
||
//labelText: qsTr("Bootstrap node (leave blank if not wanted)") + translationManager.emptyString |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this isn’t supposed to stay in?
// Copyright (c) 2014-2018, The Monero Project | ||
// | ||
// Copyright (c) 2014-2019, The Monero Project | ||
// |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Stray spaces in the following lines look unintended.
This PR is the result of rewriting and redesigning the wizards. Summary:
Edit:
Technical notes:
wizardController
.wizardController.variablename
instead of merelyvariable
(which is inherited via component hierarchy). This should in theory make the code more verbose and reveal where variables are actually coming from.Layout.
used wherever possible. Still some 'mixing anchors/layouts' warnings though. Could not get rid of them.FolderListModel
, sorted on time modified.Heads-ups for testers:
wizard/
have had their name changed which renders any existing translation mappings broken. I plan to write a Python script to (partially) migrate some translation strings to ease the pain for the translation workgroup.screenshots