LockScreen: converted to Layout
This commit is contained in:
parent
9a14a5cc10
commit
4768485974
2 changed files with 357 additions and 361 deletions
|
|
@ -155,7 +155,7 @@ Loader {
|
||||||
anchors.topMargin: 80 * scaling
|
anchors.topMargin: 80 * scaling
|
||||||
spacing: 40 * scaling
|
spacing: 40 * scaling
|
||||||
|
|
||||||
Column {
|
ColumnLayout {
|
||||||
spacing: Style.marginXS * scaling
|
spacing: Style.marginXS * scaling
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
|
|
@ -168,6 +168,7 @@ Loader {
|
||||||
font.letterSpacing: -2 * scaling
|
font.letterSpacing: -2 * scaling
|
||||||
color: Color.mOnSurface
|
color: Color.mOnSurface
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
SequentialAnimation on scale {
|
SequentialAnimation on scale {
|
||||||
loops: Animation.Infinite
|
loops: Animation.Infinite
|
||||||
|
|
@ -192,22 +193,23 @@ Loader {
|
||||||
font.weight: Font.Light
|
font.weight: Font.Light
|
||||||
color: Color.mOnSurface
|
color: Color.mOnSurface
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
width: timeText.width
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
Layout.preferredWidth: timeText.implicitWidth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column {
|
ColumnLayout {
|
||||||
spacing: Style.marginM * scaling
|
spacing: Style.marginM * scaling
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: 108 * scaling
|
Layout.preferredWidth: 108 * scaling
|
||||||
height: 108 * scaling
|
Layout.preferredHeight: 108 * scaling
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
radius: width * 0.5
|
radius: width * 0.5
|
||||||
color: Color.transparent
|
color: Color.transparent
|
||||||
border.color: Color.mPrimary
|
border.color: Color.mPrimary
|
||||||
border.width: Math.max(1, Style.borderL * scaling)
|
border.width: Math.max(1, Style.borderL * scaling)
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
z: 10
|
z: 10
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
|
|
@ -375,377 +377,371 @@ Loader {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
anchors.verticalCenterOffset: 50 * scaling
|
anchors.verticalCenterOffset: 50 * scaling
|
||||||
|
|
||||||
Item {
|
Rectangle {
|
||||||
width: parent.width
|
id: terminalBackground
|
||||||
height: 280 * scaling
|
anchors.fill: parent
|
||||||
Layout.fillWidth: true
|
radius: Style.radiusM * scaling
|
||||||
|
color: Qt.alpha(Color.mSurface, 0.9)
|
||||||
Rectangle {
|
border.color: Color.mPrimary
|
||||||
id: terminalBackground
|
border.width: Math.max(1, Style.borderM * scaling)
|
||||||
anchors.fill: parent
|
|
||||||
radius: Style.radiusM * scaling
|
|
||||||
color: Qt.alpha(Color.mSurface, 0.9)
|
|
||||||
border.color: Color.mPrimary
|
|
||||||
border.width: Math.max(1, Style.borderM * scaling)
|
|
||||||
|
|
||||||
Repeater {
|
|
||||||
model: 20
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 1
|
|
||||||
color: Qt.alpha(Color.mPrimary, 0.1)
|
|
||||||
y: index * 10 * scaling
|
|
||||||
opacity: Style.opacityMedium
|
|
||||||
SequentialAnimation on opacity {
|
|
||||||
loops: Animation.Infinite
|
|
||||||
NumberAnimation {
|
|
||||||
to: 0.6
|
|
||||||
duration: 2000 + Math.random() * 1000
|
|
||||||
}
|
|
||||||
NumberAnimation {
|
|
||||||
to: 0.1
|
|
||||||
duration: 2000 + Math.random() * 1000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: 20
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: 40 * scaling
|
height: 1
|
||||||
color: Qt.alpha(Color.mPrimary, 0.2)
|
color: Qt.alpha(Color.mPrimary, 0.1)
|
||||||
topLeftRadius: Style.radiusS * scaling
|
y: index * 10 * scaling
|
||||||
topRightRadius: Style.radiusS * scaling
|
opacity: Style.opacityMedium
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: Style.marginM * scaling
|
|
||||||
anchors.bottomMargin: Style.marginM * scaling
|
|
||||||
anchors.leftMargin: Style.marginL * scaling
|
|
||||||
anchors.rightMargin: Style.marginL * scaling
|
|
||||||
spacing: Style.marginM * scaling
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: "SECURE TERMINAL"
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
Layout.fillWidth: true
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: Style.marginS * scaling
|
|
||||||
visible: batteryIndicator.batteryVisible
|
|
||||||
NIcon {
|
|
||||||
text: batteryIndicator.getIcon()
|
|
||||||
font.pointSize: Style.fontSizeM * scaling
|
|
||||||
color: batteryIndicator.charging ? Color.mPrimary : Color.mOnSurface
|
|
||||||
}
|
|
||||||
NText {
|
|
||||||
text: Math.round(batteryIndicator.percent) + "%"
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeM * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: Style.marginS * scaling
|
|
||||||
NText {
|
|
||||||
text: keyboardLayout.currentLayout
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeM * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
}
|
|
||||||
NIcon {
|
|
||||||
text: "keyboard_alt"
|
|
||||||
font.pointSize: Style.fontSizeM * scaling
|
|
||||||
color: Color.mOnSurface
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.margins: Style.marginL * scaling
|
|
||||||
anchors.topMargin: 70 * scaling
|
|
||||||
spacing: Style.marginM * scaling
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
spacing: Style.marginM * scaling
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: Quickshell.env("USER") + "@noctalia:~$"
|
|
||||||
color: Color.mPrimary
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
id: welcomeText
|
|
||||||
text: ""
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
property int currentIndex: 0
|
|
||||||
property string fullText: "Welcome back, " + Quickshell.env("USER") + "!"
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
interval: Style.animationFast
|
|
||||||
running: true
|
|
||||||
repeat: true
|
|
||||||
onTriggered: {
|
|
||||||
if (parent.currentIndex < parent.fullText.length) {
|
|
||||||
parent.text = parent.fullText.substring(0, parent.currentIndex + 1)
|
|
||||||
parent.currentIndex++
|
|
||||||
} else {
|
|
||||||
running = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
spacing: Style.marginM * scaling
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: Quickshell.env("USER") + "@noctalia:~$"
|
|
||||||
color: Color.mPrimary
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: "sudo unlock-session"
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
}
|
|
||||||
|
|
||||||
TextInput {
|
|
||||||
id: passwordInput
|
|
||||||
width: 0
|
|
||||||
height: 0
|
|
||||||
visible: false
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
color: Color.mOnSurface
|
|
||||||
echoMode: TextInput.Password
|
|
||||||
passwordCharacter: "*"
|
|
||||||
passwordMaskDelay: 0
|
|
||||||
|
|
||||||
text: lockContext.currentText
|
|
||||||
onTextChanged: {
|
|
||||||
lockContext.currentText = text
|
|
||||||
}
|
|
||||||
|
|
||||||
Keys.onPressed: function (event) {
|
|
||||||
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
|
||||||
lockContext.tryUnlock()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
forceActiveFocus()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
id: asterisksText
|
|
||||||
text: "*".repeat(passwordInput.text.length)
|
|
||||||
color: Color.mOnSurface
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
visible: passwordInput.activeFocus
|
|
||||||
|
|
||||||
SequentialAnimation {
|
|
||||||
id: typingEffect
|
|
||||||
NumberAnimation {
|
|
||||||
target: passwordInput
|
|
||||||
property: "scale"
|
|
||||||
to: 1.01
|
|
||||||
duration: 50
|
|
||||||
}
|
|
||||||
NumberAnimation {
|
|
||||||
target: passwordInput
|
|
||||||
property: "scale"
|
|
||||||
to: 1.0
|
|
||||||
duration: 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: 8 * scaling
|
|
||||||
height: 20 * scaling
|
|
||||||
color: Color.mPrimary
|
|
||||||
visible: passwordInput.activeFocus
|
|
||||||
Layout.leftMargin: -Style.marginS * scaling
|
|
||||||
Layout.alignment: Qt.AlignVCenter
|
|
||||||
|
|
||||||
SequentialAnimation on opacity {
|
|
||||||
loops: Animation.Infinite
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.0
|
|
||||||
duration: 500
|
|
||||||
}
|
|
||||||
NumberAnimation {
|
|
||||||
to: 0.0
|
|
||||||
duration: 500
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NText {
|
|
||||||
text: {
|
|
||||||
if (lockContext.unlockInProgress)
|
|
||||||
return "Authenticating..."
|
|
||||||
if (lockContext.showFailure && lockContext.errorMessage)
|
|
||||||
return lockContext.errorMessage
|
|
||||||
if (lockContext.showFailure)
|
|
||||||
return "Authentication failed."
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
color: {
|
|
||||||
if (lockContext.unlockInProgress)
|
|
||||||
return Color.mPrimary
|
|
||||||
if (lockContext.showFailure)
|
|
||||||
return Color.mError
|
|
||||||
return Color.transparent
|
|
||||||
}
|
|
||||||
font.family: "DejaVu Sans Mono"
|
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
|
||||||
Layout.fillWidth: true
|
|
||||||
|
|
||||||
SequentialAnimation on opacity {
|
|
||||||
running: lockContext.unlockInProgress
|
|
||||||
loops: Animation.Infinite
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.0
|
|
||||||
duration: 800
|
|
||||||
}
|
|
||||||
NumberAnimation {
|
|
||||||
to: 0.5
|
|
||||||
duration: 800
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
Layout.alignment: Qt.AlignRight
|
|
||||||
Layout.bottomMargin: -10 * scaling
|
|
||||||
Rectangle {
|
|
||||||
width: 120 * scaling
|
|
||||||
height: 40 * scaling
|
|
||||||
radius: Style.radiusS * scaling
|
|
||||||
color: executeButtonArea.containsMouse ? Color.mPrimary : Qt.alpha(Color.mPrimary, 0.2)
|
|
||||||
border.color: Color.mPrimary
|
|
||||||
border.width: Math.max(1, Style.borderS * scaling)
|
|
||||||
enabled: !lockContext.unlockInProgress
|
|
||||||
|
|
||||||
NText {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: lockContext.unlockInProgress ? "EXECUTING" : "EXECUTE"
|
|
||||||
color: executeButtonArea.containsMouse ? Color.mOnPrimary : Color.mPrimary
|
|
||||||
font.family: Settings.data.ui.fontFixed
|
|
||||||
font.pointSize: Style.fontSizeM * scaling
|
|
||||||
font.weight: Style.fontWeightBold
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: executeButtonArea
|
|
||||||
anchors.fill: parent
|
|
||||||
hoverEnabled: true
|
|
||||||
onClicked: {
|
|
||||||
lockContext.tryUnlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
SequentialAnimation on scale {
|
|
||||||
running: executeButtonArea.containsMouse
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.05
|
|
||||||
duration: Style.animationFast
|
|
||||||
easing.type: Easing.OutCubic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SequentialAnimation on scale {
|
|
||||||
running: !executeButtonArea.containsMouse
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.0
|
|
||||||
duration: Style.animationFast
|
|
||||||
easing.type: Easing.OutCubic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SequentialAnimation on scale {
|
|
||||||
loops: Animation.Infinite
|
|
||||||
running: lockContext.unlockInProgress
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.02
|
|
||||||
duration: 600
|
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
}
|
|
||||||
NumberAnimation {
|
|
||||||
to: 1.0
|
|
||||||
duration: 600
|
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors.fill: parent
|
|
||||||
radius: parent.radius
|
|
||||||
color: Color.transparent
|
|
||||||
border.color: Qt.alpha(Color.mPrimary, 0.3)
|
|
||||||
border.width: Math.max(1, Style.borderS * scaling)
|
|
||||||
z: -1
|
|
||||||
|
|
||||||
SequentialAnimation on opacity {
|
SequentialAnimation on opacity {
|
||||||
loops: Animation.Infinite
|
loops: Animation.Infinite
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
to: 0.6
|
to: 0.6
|
||||||
duration: 2000
|
duration: 2000 + Math.random() * 1000
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
}
|
}
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
to: 0.2
|
to: 0.1
|
||||||
duration: 2000
|
duration: 2000 + Math.random() * 1000
|
||||||
easing.type: Easing.InOutQuad
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
height: 40 * scaling
|
||||||
|
color: Qt.alpha(Color.mPrimary, 0.2)
|
||||||
|
topLeftRadius: Style.radiusS * scaling
|
||||||
|
topRightRadius: Style.radiusS * scaling
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: Style.marginM * scaling
|
||||||
|
anchors.bottomMargin: Style.marginM * scaling
|
||||||
|
anchors.leftMargin: Style.marginL * scaling
|
||||||
|
anchors.rightMargin: Style.marginL * scaling
|
||||||
|
spacing: Style.marginM * scaling
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: "SECURE TERMINAL"
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: Style.marginS * scaling
|
||||||
|
visible: batteryIndicator.batteryVisible
|
||||||
|
NIcon {
|
||||||
|
text: batteryIndicator.getIcon()
|
||||||
|
font.pointSize: Style.fontSizeM * scaling
|
||||||
|
color: batteryIndicator.charging ? Color.mPrimary : Color.mOnSurface
|
||||||
|
}
|
||||||
|
NText {
|
||||||
|
text: Math.round(batteryIndicator.percent) + "%"
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeM * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: Style.marginS * scaling
|
||||||
|
NText {
|
||||||
|
text: keyboardLayout.currentLayout
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeM * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
}
|
||||||
|
NIcon {
|
||||||
|
text: "keyboard_alt"
|
||||||
|
font.pointSize: Style.fontSizeM * scaling
|
||||||
|
color: Color.mOnSurface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.margins: Style.marginL * scaling
|
||||||
|
anchors.topMargin: 70 * scaling
|
||||||
|
spacing: Style.marginM * scaling
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: Style.marginM * scaling
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: Quickshell.env("USER") + "@noctalia:~$"
|
||||||
|
color: Color.mPrimary
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
id: welcomeText
|
||||||
|
text: ""
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
property int currentIndex: 0
|
||||||
|
property string fullText: "Welcome back, " + Quickshell.env("USER") + "!"
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
interval: Style.animationFast
|
||||||
|
running: true
|
||||||
|
repeat: true
|
||||||
|
onTriggered: {
|
||||||
|
if (parent.currentIndex < parent.fullText.length) {
|
||||||
|
parent.text = parent.fullText.substring(0, parent.currentIndex + 1)
|
||||||
|
parent.currentIndex++
|
||||||
|
} else {
|
||||||
|
running = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
spacing: Style.marginM * scaling
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: Quickshell.env("USER") + "@noctalia:~$"
|
||||||
|
color: Color.mPrimary
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: "sudo unlock-session"
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
}
|
||||||
|
|
||||||
|
TextInput {
|
||||||
|
id: passwordInput
|
||||||
|
width: 0
|
||||||
|
height: 0
|
||||||
|
visible: false
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
color: Color.mOnSurface
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
passwordCharacter: "*"
|
||||||
|
passwordMaskDelay: 0
|
||||||
|
|
||||||
|
text: lockContext.currentText
|
||||||
|
onTextChanged: {
|
||||||
|
lockContext.currentText = text
|
||||||
|
}
|
||||||
|
|
||||||
|
Keys.onPressed: function (event) {
|
||||||
|
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
||||||
|
lockContext.tryUnlock()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
forceActiveFocus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
id: asterisksText
|
||||||
|
text: "*".repeat(passwordInput.text.length)
|
||||||
|
color: Color.mOnSurface
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
visible: passwordInput.activeFocus
|
||||||
|
|
||||||
|
SequentialAnimation {
|
||||||
|
id: typingEffect
|
||||||
|
NumberAnimation {
|
||||||
|
target: passwordInput
|
||||||
|
property: "scale"
|
||||||
|
to: 1.01
|
||||||
|
duration: 50
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
target: passwordInput
|
||||||
|
property: "scale"
|
||||||
|
to: 1.0
|
||||||
|
duration: 50
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: 8 * scaling
|
||||||
|
height: 20 * scaling
|
||||||
|
color: Color.mPrimary
|
||||||
|
visible: passwordInput.activeFocus
|
||||||
|
Layout.leftMargin: -Style.marginS * scaling
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
|
||||||
|
SequentialAnimation on opacity {
|
||||||
|
loops: Animation.Infinite
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.0
|
||||||
|
duration: 500
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
to: 0.0
|
||||||
|
duration: 500
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: {
|
||||||
|
if (lockContext.unlockInProgress)
|
||||||
|
return "Authenticating..."
|
||||||
|
if (lockContext.showFailure && lockContext.errorMessage)
|
||||||
|
return lockContext.errorMessage
|
||||||
|
if (lockContext.showFailure)
|
||||||
|
return "Authentication failed."
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
color: {
|
||||||
|
if (lockContext.unlockInProgress)
|
||||||
|
return Color.mPrimary
|
||||||
|
if (lockContext.showFailure)
|
||||||
|
return Color.mError
|
||||||
|
return Color.transparent
|
||||||
|
}
|
||||||
|
font.family: "DejaVu Sans Mono"
|
||||||
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
|
Layout.fillWidth: true
|
||||||
|
|
||||||
|
SequentialAnimation on opacity {
|
||||||
|
running: lockContext.unlockInProgress
|
||||||
|
loops: Animation.Infinite
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.0
|
||||||
|
duration: 800
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
to: 0.5
|
||||||
|
duration: 800
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Layout.alignment: Qt.AlignRight
|
||||||
|
Layout.bottomMargin: -10 * scaling
|
||||||
|
Rectangle {
|
||||||
|
Layout.preferredWidth: 120 * scaling
|
||||||
|
Layout.preferredHeight: 40 * scaling
|
||||||
|
radius: Style.radiusS * scaling
|
||||||
|
color: executeButtonArea.containsMouse ? Color.mPrimary : Qt.alpha(Color.mPrimary, 0.2)
|
||||||
|
border.color: Color.mPrimary
|
||||||
|
border.width: Math.max(1, Style.borderS * scaling)
|
||||||
|
enabled: !lockContext.unlockInProgress
|
||||||
|
|
||||||
|
NText {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: lockContext.unlockInProgress ? "EXECUTING" : "EXECUTE"
|
||||||
|
color: executeButtonArea.containsMouse ? Color.mOnPrimary : Color.mPrimary
|
||||||
|
font.family: Settings.data.ui.fontFixed
|
||||||
|
font.pointSize: Style.fontSizeM * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: executeButtonArea
|
||||||
|
anchors.fill: parent
|
||||||
|
hoverEnabled: true
|
||||||
|
onClicked: {
|
||||||
|
lockContext.tryUnlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation on scale {
|
||||||
|
running: executeButtonArea.containsMouse
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.05
|
||||||
|
duration: Style.animationFast
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation on scale {
|
||||||
|
running: !executeButtonArea.containsMouse
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.0
|
||||||
|
duration: Style.animationFast
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SequentialAnimation on scale {
|
||||||
|
loops: Animation.Infinite
|
||||||
|
running: lockContext.unlockInProgress
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.02
|
||||||
|
duration: 600
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
to: 1.0
|
||||||
|
duration: 600
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
radius: parent.radius
|
||||||
|
color: Color.transparent
|
||||||
|
border.color: Qt.alpha(Color.mPrimary, 0.3)
|
||||||
|
border.width: Math.max(1, Style.borderS * scaling)
|
||||||
|
z: -1
|
||||||
|
|
||||||
|
SequentialAnimation on opacity {
|
||||||
|
loops: Animation.Infinite
|
||||||
|
NumberAnimation {
|
||||||
|
to: 0.6
|
||||||
|
duration: 2000
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
NumberAnimation {
|
||||||
|
to: 0.2
|
||||||
|
duration: 2000
|
||||||
|
easing.type: Easing.InOutQuad
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Power buttons at bottom
|
// Power buttons at bottom right
|
||||||
Row {
|
RowLayout {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.margins: 50 * scaling
|
anchors.margins: 50 * scaling
|
||||||
spacing: 20 * scaling
|
spacing: 20 * scaling
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: 60 * scaling
|
Layout.preferredWidth: 60 * scaling
|
||||||
height: 60 * scaling
|
Layout.preferredHeight: 60 * scaling
|
||||||
radius: width * 0.5
|
radius: width * 0.5
|
||||||
color: powerButtonArea.containsMouse ? Color.mError : Qt.alpha(Color.mError, 0.2)
|
color: powerButtonArea.containsMouse ? Color.mError : Qt.alpha(Color.mError, 0.2)
|
||||||
border.color: Color.mError
|
border.color: Color.mError
|
||||||
|
|
@ -769,8 +765,8 @@ Loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: 60 * scaling
|
Layout.preferredWidth: 60 * scaling
|
||||||
height: 60 * scaling
|
Layout.preferredHeight: 60 * scaling
|
||||||
radius: width * 0.5
|
radius: width * 0.5
|
||||||
color: restartButtonArea.containsMouse ? Color.mPrimary : Qt.alpha(Color.mPrimary, Style.opacityLight)
|
color: restartButtonArea.containsMouse ? Color.mPrimary : Qt.alpha(Color.mPrimary, Style.opacityLight)
|
||||||
border.color: Color.mPrimary
|
border.color: Color.mPrimary
|
||||||
|
|
@ -794,8 +790,8 @@ Loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: 60 * scaling
|
Layout.preferredWidth: 60 * scaling
|
||||||
height: 60 * scaling
|
Layout.preferredHeight: 60 * scaling
|
||||||
radius: width * 0.5
|
radius: width * 0.5
|
||||||
color: suspendButtonArea.containsMouse ? Color.mSecondary : Qt.alpha(Color.mSecondary, 0.2)
|
color: suspendButtonArea.containsMouse ? Color.mSecondary : Qt.alpha(Color.mSecondary, 0.2)
|
||||||
border.color: Color.mSecondary
|
border.color: Color.mSecondary
|
||||||
|
|
|
||||||
|
|
@ -407,7 +407,7 @@ NPanel {
|
||||||
color: tabTextColor
|
color: tabTextColor
|
||||||
font.pointSize: Style.fontSizeL * scaling
|
font.pointSize: Style.fontSizeL * scaling
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tab label
|
// Tab label
|
||||||
NText {
|
NText {
|
||||||
text: modelData.label
|
text: modelData.label
|
||||||
|
|
@ -540,4 +540,4 @@ NPanel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue