Split HPasswordPopup into HPopup, HOkCancelPopup

This commit is contained in:
miruka 2019-09-08 12:17:42 -04:00
parent aefb314999
commit aae26672de
3 changed files with 113 additions and 87 deletions

View File

@ -0,0 +1,29 @@
import QtQuick 2.12
import QtQuick.Layouts 1.12
HPopup {
onAboutToShow: okClicked = false
property alias label: label
property bool okClicked: false
box.enterButtonTarget: "ok"
box.buttonModel: [
{ name: "ok", text: qsTr("OK"), iconName: "ok" },
{ name: "cancel", text: qsTr("Cancel"), iconName: "cancel" },
]
box.buttonCallbacks: ({
ok: button => { okClicked = true; popup.close() },
cancel: button => { okClicked = false; popup.close() },
})
HLabel {
id: label
wrapMode: Text.Wrap
Layout.fillWidth: true
}
}

View File

@ -3,27 +3,23 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12 import QtQuick.Layouts 1.12
import "../SidePane" import "../SidePane"
Popup { HOkCancelPopup {
id: popup id: popup
anchors.centerIn: Overlay.overlay
modal: true
padding: 0
onAboutToShow: { onAboutToShow: {
okClicked = false
acceptedPassword = "" acceptedPassword = ""
passwordValid = null passwordValid = null
okClicked = false
errorMessage.text = "" errorMessage.text = ""
} }
onOpened: passwordField.forceActiveFocus() onOpened: passwordField.forceActiveFocus()
property bool validateWhileTyping: false property bool validateWhileTyping: false
property string acceptedPassword: "" property string acceptedPassword: ""
property var passwordValid: null property var passwordValid: null
property bool okClicked: false
property alias label: popupLabel
property alias field: passwordField property alias field: passwordField
@ -35,99 +31,69 @@ Popup {
} }
enter: Transition { box.buttonCallbacks: ({
HNumberAnimation { property: "scale"; from: 0; to: 1; overshoot: 4 } ok: button => {
} let password = passwordField.text
okClicked = true
button.loading = true
exit: Transition { verifyPassword(password, result => {
HNumberAnimation { property: "scale"; to: 0 } if (result === true) {
} passwordValid = true
popup.acceptedPassword = password
popup.close()
} else if (result === false) {
passwordValid = false
} else {
let [msg, translated] = result
errorMessage.text = translated ? msg : qsTr(msg)
}
background: Rectangle { button.loading = false
color: theme.controls.popup.background })
} },
cancel: button => { popup.close() },
contentItem: HBox { })
id: box
implicitWidth: theme.minimumSupportedWidthPlusSpacing
enterButtonTarget: "ok"
buttonModel: [
{ name: "ok", text: qsTr("OK"), iconName: "ok",
enabled: passwordField.text &&
(validateWhileTyping ? passwordValid : true) },
{ name: "cancel", text: qsTr("Cancel"), iconName: "cancel" },
]
buttonCallbacks: ({
ok: button => {
let password = passwordField.text
okClicked = true
button.loading = true
verifyPassword(password, result => {
if (result === true) {
passwordValid = true
popup.acceptedPassword = password
popup.close()
} else if (result === false) {
passwordValid = false
} else {
let [msg, translated] = result
errorMessage.text = translated ? msg : qsTr(msg)
}
button.loading = false
})
},
cancel: button => { popup.close() },
})
HLabel { HRowLayout {
id: popupLabel spacing: box.horizontalSpacing
wrapMode: Text.Wrap
HTextField {
id: passwordField
placeholderText: qsTr("Passphrase")
echoMode: TextInput.Password
focus: true
error: passwordValid === false
onTextChanged: passwordValid =
validateWhileTyping ? verifyPassword(text) : null
Layout.fillWidth: true Layout.fillWidth: true
} }
HRowLayout { HIcon {
spacing: box.horizontalSpacing svgName: passwordValid ? "ok" : "cancel"
visible: Layout.preferredWidth > 0
HTextField { Layout.preferredWidth:
id: passwordField passwordValid == null ||
placeholderText: qsTr("Passphrase") (validateWhileTyping && ! okClicked && ! passwordValid) ?
echoMode: TextInput.Password 0 :implicitWidth
focus: true
error: passwordValid === false
onTextChanged: passwordValid = Behavior on Layout.preferredWidth { HNumberAnimation {} }
validateWhileTyping ? verifyPassword(text) : null
Layout.fillWidth: true
}
HIcon {
svgName: passwordValid ? "ok" : "cancel"
visible: Layout.preferredWidth > 0
Layout.preferredWidth:
passwordValid == null ||
(validateWhileTyping && ! okClicked && ! passwordValid) ?
0 :implicitWidth
Behavior on Layout.preferredWidth { HNumberAnimation {} }
}
} }
}
HLabel { HLabel {
id: errorMessage id: errorMessage
wrapMode: Text.Wrap wrapMode: Text.Wrap
color: theme.colors.errorText color: theme.colors.errorText
visible: Layout.maximumHeight > 0 visible: Layout.maximumHeight > 0
Layout.maximumHeight: text ? implicitHeight : 0 Layout.maximumHeight: text ? implicitHeight : 0
Behavior on Layout.maximumHeight { HNumberAnimation {} } Behavior on Layout.maximumHeight { HNumberAnimation {} }
Layout.fillWidth: true Layout.fillWidth: true
}
} }
} }

31
src/qml/Base/HPopup.qml Normal file
View File

@ -0,0 +1,31 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
Popup {
id: popup
anchors.centerIn: Overlay.overlay
modal: true
padding: 0
default property alias boxData: box.body
property alias box: box
enter: Transition {
HNumberAnimation { property: "scale"; from: 0; to: 1; overshoot: 4 }
}
exit: Transition {
HNumberAnimation { property: "scale"; to: 0 }
}
background: Rectangle {
color: theme.controls.popup.background
}
contentItem: HBox {
id: box
implicitWidth: theme.minimumSupportedWidthPlusSpacing
}
}