562 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			QML
		
	
	
	
			
		
		
	
	
			562 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			QML
		
	
	
	
| // Copyright 2023 zayronxio <zayronxio@gmail.com>
 | |
| // Used sources & ideas:
 | |
| // - SDDM Team https://github.com/sddm/sddm
 | |
| import QtQuick
 | |
| import SddmComponents
 | |
| import QtQuick.Controls
 | |
| import Qt5Compat.GraphicalEffects
 | |
| import QtQuick.Layouts
 | |
| import org.kde.plasma.components as PlasmaComponents
 | |
| import org.kde.plasma.core as PlasmaCore
 | |
| import "components"
 | |
| 
 | |
| Rectangle {
 | |
|     width: 640
 | |
|     height: 480
 | |
|     LayoutMirroring.enabled: Qt.locale().textDirection === Qt.RightToLeft
 | |
|     LayoutMirroring.childrenInherit: true
 | |
| 
 | |
|     TextConstants {
 | |
|         id: textConstants
 | |
|     }
 | |
| 
 | |
|     // hack for disable autostart QtQuick.VirtualKeyboard
 | |
|     Loader {
 | |
|         id: inputPanel
 | |
|         property bool keyboardActive: false
 | |
|         source: "components/VirtualKeyboard.qml"
 | |
|     }
 | |
| 
 | |
|     Connections {
 | |
|         target: sddm
 | |
|         onLoginSucceeded: {
 | |
| 
 | |
|         }
 | |
|         onLoginFailed: {
 | |
|             password.placeholderText = textConstants.loginFailed
 | |
|             password.placeholderTextColor = "white"
 | |
|             password.text = ""
 | |
|             password.focus = true
 | |
|             errorMsgContainer.visible = true
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     Image {
 | |
|         id: wallpaper
 | |
|         anchors.fill: parent
 | |
|         fillMode: Image.PreserveAspectCrop
 | |
| 
 | |
|         Binding on source {
 | |
|             when: config.background !== undefined
 | |
|             value: config.background
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     DropShadow {
 | |
|         anchors.fill: panel
 | |
|         horizontalOffset: 0
 | |
|         verticalOffset: 0
 | |
|         radius: 0
 | |
|         samples: 17
 | |
|         color: "#70000000"
 | |
|         source: panel
 | |
|         }
 | |
| 
 | |
|     Row {
 | |
|         anchors.bottom: parent.bottom
 | |
|         anchors.right: parent.right
 | |
|         anchors.rightMargin: 40
 | |
|         anchors.bottomMargin: 35
 | |
| 
 | |
|         Item {
 | |
| 
 | |
|             Image {
 | |
|                 id: shutdown
 | |
|                 height: 22
 | |
|                 width: 22
 | |
|                 source: "images/system-shutdown.svg"
 | |
|                 fillMode: Image.PreserveAspectFit
 | |
| 
 | |
|                 MouseArea {
 | |
|                     anchors.fill: parent
 | |
|                     hoverEnabled: true
 | |
|                     onEntered: {
 | |
|                         shutdown.source = "images/system-shutdown-hover.svg"
 | |
|                         var component = Qt.createComponent(
 | |
|                                     "components/ShutdownToolTip.qml")
 | |
|                         if (component.status === Component.Ready) {
 | |
|                             var tooltip = component.createObject(shutdown)
 | |
|                             tooltip.x = -100
 | |
|                             tooltip.y = 40
 | |
|                             tooltip.destroy(600)
 | |
|                         }
 | |
|                     }
 | |
|                     onExited: {
 | |
|                         shutdown.source = "images/system-shutdown.svg"
 | |
|                     }
 | |
|                     onClicked: {
 | |
|                         shutdown.source = "images/system-shutdown-pressed.svg"
 | |
|                         sddm.powerOff()
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|         Row {
 | |
|         anchors.bottom: parent.bottom
 | |
|         anchors.right: parent.right
 | |
|         anchors.rightMargin: 70
 | |
|         anchors.bottomMargin: 35
 | |
| 
 | |
|         Item {
 | |
| 
 | |
|             Image {
 | |
|                 id: reboot
 | |
|                 height: 22
 | |
|                 width: 22
 | |
|                 source: "images/system-reboot.svg"
 | |
|                 fillMode: Image.PreserveAspectFit
 | |
| 
 | |
|                 MouseArea {
 | |
|                     anchors.fill: parent
 | |
|                     hoverEnabled: true
 | |
|                     onEntered: {
 | |
|                         reboot.source = "images/system-reboot-hover.svg"
 | |
|                         var component = Qt.createComponent(
 | |
|                                     "components/RebootToolTip.qml")
 | |
|                         if (component.status === Component.Ready) {
 | |
|                             var tooltip = component.createObject(reboot)
 | |
|                             tooltip.x = -100
 | |
|                             tooltip.y = 40
 | |
|                             tooltip.destroy(600)
 | |
|                         }
 | |
|                     }
 | |
|                     onExited: {
 | |
|                         reboot.source = "images/system-reboot.svg"
 | |
|                     }
 | |
|                     onClicked: {
 | |
|                         reboot.source = "images/system-reboot-pressed.svg"
 | |
|                         sddm.reboot()
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|         Row {
 | |
|         anchors.bottom: parent.bottom
 | |
|         anchors.right: parent.right
 | |
|         anchors.rightMargin: 84
 | |
|         anchors.bottomMargin: 15
 | |
|         Text {
 | |
|             id: kb
 | |
|             color: "#eff0f1"
 | |
|             text: keyboard.layouts[keyboard.currentLayout].shortName
 | |
|             font.pointSize: 9
 | |
|             font.weight: Font.DemiBold
 | |
|         }
 | |
|         Text {
 | |
|             id: espacio
 | |
|              text: "  "
 | |
| 
 | |
|         }
 | |
| 
 | |
|             Image {
 | |
|                 id: sff
 | |
|                 height: 16
 | |
|                 width: 16
 | |
|                 source: "images/keyboard.svg"
 | |
|                 fillMode: Image.PreserveAspectFit
 | |
|             }
 | |
|     }
 | |
|         Row {
 | |
|         anchors.bottom: parent.bottom
 | |
|         anchors.right: parent.right
 | |
|         anchors.rightMargin: 123
 | |
|         anchors.bottomMargin: 15
 | |
| 
 | |
|          ComboBox {
 | |
|                     id: session
 | |
|                     height: 20
 | |
|                     width: 150
 | |
|                     model: sessionModel
 | |
|                     textRole: "name"
 | |
|                     displayText: ""
 | |
|                     currentIndex: sessionModel.lastIndex
 | |
|                     background: Rectangle {
 | |
|                     implicitWidth: parent.width
 | |
|                     implicitHeight: parent.height
 | |
|                     color: "transparent"
 | |
|                 }
 | |
| 
 | |
|                     delegate: MenuItem {
 | |
|                         id: menuitems
 | |
|                         width: slistview.width * 4
 | |
|                         text: session.textRole ? (Array.isArray(session.model) ? modelData[session.textRole] : model[session.textRole]) : modelData
 | |
|                         highlighted: session.highlightedIndex === index
 | |
|                         hoverEnabled: session.hoverEnabled
 | |
|                         onClicked: {
 | |
|                             session.currentIndex = index
 | |
|                             slistview.currentIndex = index
 | |
|                             session.popup.close()
 | |
|                         }
 | |
|                     }
 | |
|                     indicator: Rectangle{
 | |
|                         anchors.right: parent.right
 | |
|                         anchors.rightMargin: 9
 | |
|                         height: parent.height
 | |
|                         width: 18
 | |
|                         color: "transparent"
 | |
|                         Image{
 | |
|                             anchors.verticalCenter: parent.verticalCenter
 | |
|                             width: parent.width
 | |
|                             height: width
 | |
|                             fillMode: Image.PreserveAspectFit
 | |
|                             source: "images/conf.svg"
 | |
|                         }
 | |
|                     }
 | |
|                     popup: Popup {
 | |
|                         width: parent.width
 | |
|                         height: parent.height * menuitems.count
 | |
|                         implicitHeight: slistview.contentHeight
 | |
|                         margins: 0
 | |
|                         contentItem: ListView {
 | |
|                             id: slistview
 | |
|                             clip: true
 | |
|                             anchors.fill: parent
 | |
|                             model: session.model
 | |
|                             spacing: 0
 | |
|                             highlightFollowsCurrentItem: true
 | |
|                             currentIndex: session.highlightedIndex
 | |
|                             delegate: session.delegate
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|     }
 | |
|      Rectangle {
 | |
|                             id: maskleft
 | |
|                             color: "red"
 | |
|                             width: 45
 | |
|                             height: 45
 | |
|                             radius: 100
 | |
|                             visible: false
 | |
|                             }
 | |
| 
 | |
| // user list added for windows theme//
 | |
|     Component {
 | |
|             id: userDelegate
 | |
| 
 | |
|              Row {
 | |
|                  spacing: 10
 | |
|               Image {
 | |
|                 width: 45
 | |
|                 height: 45
 | |
|                 source: model.icon
 | |
|                 layer.enabled: true
 | |
|                 layer.effect: OpacityMask {
 | |
|                 maskSource: maskleft
 | |
|                         }
 | |
|                 MouseArea {
 | |
|                     anchors.fill: parent
 | |
|                     onClicked: {
 | |
|                         ava.source = ""
 | |
|                         ava.source = "/home/" + user.currentText + "/.face.icon"
 | |
|                         user.currentIndex = index;
 | |
|                         userfocus = true;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|                     Text {
 | |
|                     anchors.verticalCenter: parent.verticalCenter
 | |
|                     text: (model.realName === "") ? model.name : model.realName
 | |
|                     color: "white"
 | |
|                     font.pointSize: 9
 | |
|                     font.bold: true
 | |
|                     MouseArea {
 | |
|                     anchors.fill: parent
 | |
|                     onClicked: {
 | |
|                         ava.source = ""
 | |
|                         ava.source = "/home/" + user.currentText + "/.face.icon"
 | |
|                         user.currentIndex = index;
 | |
|                         user.focus = true;
 | |
|                     }
 | |
|                 }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|          }
 | |
|                                          ComboBox {
 | |
|                     id: user
 | |
|                     height: 40
 | |
|                     width: 226
 | |
|                     textRole: "name"
 | |
|                     currentIndex: userModel.lastIndex
 | |
|                     model: userModel
 | |
| 
 | |
|                      background: Rectangle {
 | |
|                     implicitWidth: parent.width
 | |
|                     implicitHeight: parent.height
 | |
|                     Layout.alignment: Qt.AlignHCenter
 | |
|                     color: "transparent"
 | |
|                                    }
 | |
|                       contentItem: Text {
 | |
|                        font.pointSize: 15
 | |
|                        text: user.currentText
 | |
|                        color: "transparent"
 | |
|                        font.bold: true
 | |
|                        anchors.horizontalCenter: parent.horizontalCenter
 | |
|                        verticalAlignment: Text.AlignVCenter
 | |
|                        horizontalAlignment: Text.AlignHCenter
 | |
|                                               }
 | |
|                     delegate: MenuItem {
 | |
|                         font.bold: true
 | |
|                         width: parent.width - 24
 | |
|                         text: user.textRole ? (Array.isArray(
 | |
|                                                    user.model) ? modelData[user.textRole] : model[user.textRole]) : modelData
 | |
|                         highlighted: user.highlightedIndex === index
 | |
|                         hoverEnabled: user.hoverEnabled
 | |
|                         onClicked: {
 | |
|                             user.currentIndex = index
 | |
|                             ulistview.currentIndex = index
 | |
|                             user.popup.close()
 | |
|                             ava.source = ""
 | |
|                             ava.source = "/home/" + user.currentText + "/.face.icon"
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                       indicator: Rectangle{
 | |
|                         anchors.right: parent.right
 | |
|                         anchors.rightMargin: 9
 | |
|                         height: parent.height
 | |
|                         width: 24
 | |
|                         color: "transparent"
 | |
|                         Image{
 | |
|                             anchors.verticalCenter: parent.verticalCenter
 | |
|                             width: parent.width
 | |
|                             height: width
 | |
|                             fillMode: Image.PreserveAspectFit
 | |
|                             source: ""
 | |
|                         }
 | |
|                     }
 | |
| 
 | |
|                     popup: Popup {
 | |
|                         width: parent.width
 | |
|                         height: parent.height * parent.count
 | |
|                         implicitHeight: ulistview.contentHeight
 | |
|                         margins: 0
 | |
|                         contentItem: ListView {
 | |
|                             id: ulistview
 | |
|                             clip: true
 | |
|                             anchors.fill: parent
 | |
|                             model: user.model
 | |
|                             spacing: 0
 | |
|                             highlightFollowsCurrentItem: true
 | |
|                             currentIndex: user.highlightedIndex
 | |
|                             delegate: user.delegate
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|         Rectangle {
 | |
| color: "transparent"
 | |
| height: parent.height-20
 | |
| width:  parent.width-20
 | |
| anchors.top: parent.top
 | |
| anchors.right: parent.right
 | |
|         ListView {
 | |
|                         verticalLayoutDirection : ListView.BottomToTop
 | |
|                         id: mylistView
 | |
|                         focus: true
 | |
|                         height: parent.height
 | |
|                         spacing: 20
 | |
|                         model: userModel
 | |
|                         currentIndex: userModel.lastIndex
 | |
|                         delegate: userDelegate
 | |
|                         orientation: ListView.vertical
 | |
|                     }
 | |
| 
 | |
|         }
 | |
| //fin de codigo agregado para usuarios de windows //
 | |
|     Item {
 | |
|         width: dialog.width
 | |
|         height: dialog.height
 | |
|         anchors.horizontalCenter: parent.horizontalCenter
 | |
|         anchors.verticalCenter: parent.verticalCenter
 | |
|         Rectangle {
 | |
|             id: dialog
 | |
|             color: "transparent"
 | |
|             height: 270
 | |
|             width: 400
 | |
| 
 | |
|         }
 | |
|             Grid {
 | |
|                 columns: 1
 | |
|                 spacing: 20
 | |
|                 verticalItemAlignment: Grid.AlignVCenter
 | |
|                 horizontalItemAlignment: Grid.AlignHCenter
 | |
|                 anchors.horizontalCenter: parent.horizontalCenter
 | |
| 
 | |
|                 Column {
 | |
|                     Item {
 | |
| 
 | |
|                         Rectangle {
 | |
|                             id: mask
 | |
|                             width: 185
 | |
|                             height: 185
 | |
|                             radius: 100
 | |
|                             visible: false
 | |
|                         }
 | |
| 
 | |
|                         DropShadow {
 | |
|                             anchors.fill: mask
 | |
|                             width: mask.width
 | |
|                             height: mask.height
 | |
|                             horizontalOffset: 0
 | |
|                             verticalOffset: 0
 | |
|                             radius: 15.0
 | |
|                             samples: 15
 | |
|                             color: "#50000000"
 | |
|                             source: mask
 | |
|                             visible: false
 | |
|                         }
 | |
|                     }
 | |
|                     Image {
 | |
|                         id: ava
 | |
|                         width: 185
 | |
|                         height: 185
 | |
|                         fillMode: Image.PreserveAspectCrop
 | |
|                         layer.enabled: true
 | |
|                         layer.effect: OpacityMask {
 | |
|                             maskSource: mask
 | |
|                         }
 | |
|                         source: "/var/lib/AccountsService/icons/" + user.currentText
 | |
|                         onStatusChanged: {
 | |
|                             if (status == Image.Error)
 | |
|                                 return source = "images/.face.icon"
 | |
|                         }
 | |
|                     }
 | |
|                     Item {
 | |
|                     id: txtuser
 | |
|                     width: parent.width
 | |
|                     implicitHeight: usertext.height * 1.7
 | |
|                     Text {
 | |
|                     id: usertext
 | |
|                     anchors.horizontalCenter: parent.horizontalCenter
 | |
|                     anchors.bottom: parent.bottom
 | |
|                     text: user.currentText
 | |
|                     color: "white"
 | |
|                     opacity: 0.8
 | |
|                     font.pointSize: 28
 | |
|                           }
 | |
| 
 | |
|                     }
 | |
|                 }
 | |
| // user list//
 | |
|                 // Custom ComboBox for hack colors on DropDownMenu
 | |
| 
 | |
| Rectangle {
 | |
|     width: password.width
 | |
|     height: password.height
 | |
|     color: "transparent"
 | |
|      MouseArea {
 | |
|                     anchors.fill: parent
 | |
|                     onClicked: {
 | |
|                         wallpaper.source = "background-blur.jpg";
 | |
|                     }
 | |
|                 }
 | |
|                 TextField {
 | |
|                     id: password
 | |
|                     height: 32
 | |
|                     width: 250
 | |
|                     color: "#fff"
 | |
|                     echoMode: TextInput.Password
 | |
|                     focus: true
 | |
|                     font.weight: Font.DemiBold
 | |
|                     placeholderText: textConstants.password
 | |
|                     onAccepted: sddm.login(user.currentText, password.text,
 | |
|                                            session.currentIndex)
 | |
| 
 | |
| 
 | |
|                     background: Rectangle {
 | |
|                     id: formBg
 | |
|                     implicitWidth: parent.width
 | |
|                     implicitHeight: parent.height
 | |
|                     color: "#000"
 | |
|                     border.color: "#4Df8f8ff"
 | |
|                     border.width: 2
 | |
|                     opacity: 0.2
 | |
|                     radius: 6
 | |
|                     z: -1
 | |
|                     }
 | |
| 
 | |
|                     Image {
 | |
|                         id: caps
 | |
|                         width: 24
 | |
|                         height: 24
 | |
|                         opacity: 0
 | |
|                         state: keyboard.capsLock ? "activated" : ""
 | |
|                         anchors.right: password.right
 | |
|                         anchors.verticalCenter: parent.verticalCenter
 | |
|                         anchors.rightMargin: 10
 | |
|                         fillMode: Image.PreserveAspectFit
 | |
|                         source: "images/capslock.svg"
 | |
|                         sourceSize.width: 24
 | |
|                         sourceSize.height: 24
 | |
| 
 | |
|                         states: [
 | |
|                             State {
 | |
|                                 name: "activated"
 | |
|                                 PropertyChanges {
 | |
|                                     target: caps
 | |
|                                     opacity: 1
 | |
|                                 }
 | |
|                             },
 | |
|                             State {
 | |
|                                 name: ""
 | |
|                                 PropertyChanges {
 | |
|                                     target: caps
 | |
|                                     opacity: 0
 | |
|                                 }
 | |
|                             }
 | |
|                         ]
 | |
| 
 | |
|                         transitions: [
 | |
|                             Transition {
 | |
|                                 to: "activated"
 | |
|                                 NumberAnimation {
 | |
|                                     target: caps
 | |
|                                     property: "opacity"
 | |
|                                     from: 0
 | |
|                                     to: 1
 | |
|                                     duration: imageFadeIn
 | |
|                                 }
 | |
|                             },
 | |
| 
 | |
|                             Transition {
 | |
|                                 to: ""
 | |
|                                 NumberAnimation {
 | |
|                                     target: caps
 | |
|                                     property: "opacity"
 | |
|                                     from: 1
 | |
|                                     to: 0
 | |
|                                     duration: imageFadeOut
 | |
|                                 }
 | |
|                             }
 | |
|                         ]
 | |
|                     }
 | |
|                 }
 | |
| }
 | |
|                 Keys.onPressed: {
 | |
|                     if (event.key === Qt.Key_Return
 | |
|                             || event.key === Qt.Key_Enter) {
 | |
|                         sddm.login(user.currentText, password.text,
 | |
|                                    session.currentIndex)
 | |
|                         event.accepted = true
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // Custom ComboBox for hack colors on DropDownMenu
 | |
| 
 | |
|             }
 | |
|     }
 | |
| }
 |