Split HPasswordPopup into HPopup, HOkCancelPopup
This commit is contained in:
parent
aefb314999
commit
aae26672de
29
src/qml/Base/HOkCancelPopup.qml
Normal file
29
src/qml/Base/HOkCancelPopup.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
31
src/qml/Base/HPopup.qml
Normal 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
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user