Update dotfiles (2026-01-19 19:48:47)
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 34 34"
|
||||
height="34"
|
||||
width="34">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="M 17,1 C 8.163444,1 1,8.163444 1,17 1,25.836556 8.163444,33 17,33 25.836556,33 33,25.836556 33,17 33,8.163444 25.836556,1 17,1 Z m 0,1 C 25.284271,2 32,8.7157288 32,17 32,25.284271 25.284271,32 17,32 8.7157288,32 2,25.284271 2,17 2,8.7157288 8.7157288,2 17,2 Z"
|
||||
id="path831" />
|
||||
<path
|
||||
id="path816"
|
||||
d="M 17 11 C 13.686292 11 11 13.686292 11 17 C 11 20.313708 13.686292 23 17 23 C 20.313708 23 23 20.313708 23 17 C 23 13.686292 20.313708 11 17 11 z M 17 12 A 5 5 0 0 1 22 17 A 5 5 0 0 1 17 22 A 5 5 0 0 1 12 17 A 5 5 0 0 1 17 12 z "
|
||||
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.71428573;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="512" height="512"><path d="M23.821,11.181v0C22.943,9.261,19.5,3,12,3S1.057,9.261.179,11.181a1.969,1.969,0,0,0,0,1.64C1.057,14.739,4.5,21,12,21s10.943-6.261,11.821-8.181A1.968,1.968,0,0,0,23.821,11.181ZM12,18a6,6,0,1,1,6-6A6.006,6.006,0,0,1,12,18Z"/><circle cx="12" cy="12" r="4"/></svg>
|
||||
|
After Width: | Height: | Size: 426 B |
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512.19 512.19" style="enable-background:new 0 0 512.19 512.19;" xml:space="preserve" width="512" height="512">
|
||||
<g>
|
||||
<path d="M496.543,200.771c-19.259-31.537-43.552-59.707-71.915-83.392l59.733-59.733c8.185-8.475,7.95-21.98-0.525-30.165 c-8.267-7.985-21.374-7.985-29.641,0l-64.96,65.045c-40.269-23.918-86.306-36.385-133.141-36.053 c-132.075,0-207.339,90.411-240.448,144.299c-20.862,33.743-20.862,76.379,0,110.123c19.259,31.537,43.552,59.707,71.915,83.392 l-59.733,59.733c-8.475,8.185-8.71,21.691-0.525,30.165c8.185,8.475,21.691,8.71,30.165,0.525c0.178-0.172,0.353-0.347,0.525-0.525 l65.109-65.109c40.219,23.915,86.201,36.402,132.992,36.117c132.075,0,207.339-90.411,240.448-144.299 C517.405,277.151,517.405,234.515,496.543,200.771z M128.095,255.833c-0.121-70.575,56.992-127.885,127.567-128.006 c26.703-0.046,52.75,8.275,74.481,23.793l-30.976,30.976c-13.004-7.842-27.887-12.022-43.072-12.096 c-47.128,0-85.333,38.205-85.333,85.333c0.074,15.185,4.254,30.068,12.096,43.072l-30.976,30.976 C136.414,308.288,128.096,282.394,128.095,255.833z M256.095,383.833c-26.561-0.001-52.455-8.319-74.048-23.787l30.976-30.976 c13.004,7.842,27.887,12.022,43.072,12.096c47.128,0,85.333-38.205,85.333-85.333c-0.074-15.185-4.254-30.068-12.096-43.072 l30.976-30.976c41.013,57.434,27.702,137.242-29.732,178.255C308.845,375.558,282.798,383.879,256.095,383.833z"/>
|
||||
</g>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="34"
|
||||
height="34"
|
||||
viewBox="0 0 34 34"
|
||||
version="1.1"
|
||||
id="svg8">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
transform="matrix(1.000593,0,0,1.0006688,0.99050505,-287.73702)">
|
||||
<path
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.00189281;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="M 19.001953,1.1308594 V 2 H 19 v 11 h 1 V 2.3359375 A 15,15 45 0 1 32,17 15,15 45 0 1 21.001953,31.455078 v 1.033203 A 16.009488,16.010701 45 0 0 33.009766,17 16.009488,16.010701 45 0 0 19.001953,1.1308594 Z M 12.998047,1.5117188 A 16.009488,16.010701 45 0 0 0.99023438,17 16.009488,16.010701 45 0 0 14.998047,32.869141 V 32 H 15 V 21 H 14 V 31.664062 A 15,15 45 0 1 2,17 15,15 45 0 1 12.998047,2.5449219 Z"
|
||||
transform="matrix(0.70668771,-0.70663419,0.70668771,0.70663419,-8.0273788,304.53335)"
|
||||
id="path817" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 34 34"
|
||||
height="34"
|
||||
width="34">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
id="path822"
|
||||
d="M 14 1 L 14 13 L 15 13 L 15 1 L 14 1 z M 19 1 L 19 13 L 20 13 L 20 1 L 19 1 z M 9 3.1855469 C 4.1702837 5.9748853 1.0026451 11.162345 1 17 C 1 25.836556 8.163444 33 17 33 C 25.836556 33 33 25.836556 33 17 C 32.99593 11.163669 29.828666 5.9780498 25 3.1894531 L 25 4.3496094 C 29.280842 7.0494632 31.988612 11.788234 32 17 C 32 25.284271 25.284271 32 17 32 C 8.7157288 32 2 25.284271 2 17 C 2.0120649 11.788824 4.7195457 7.0510246 9 4.3515625 L 9 3.1855469 z "
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="svg8"
|
||||
version="1.1"
|
||||
viewBox="0 0 34 34"
|
||||
height="34"
|
||||
width="34">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
|
||||
d="M 17,1 C 8.163444,1 1,8.163444 1,17 1,25.836556 8.163444,33 17,33 25.836556,33 33,25.836556 33,17 33,8.163444 25.836556,1 17,1 Z m 0,1 C 25.284271,2 32,8.7157288 32,17 32,25.284271 25.284271,32 17,32 8.7157288,32 2,25.284271 2,17 2,8.7157288 8.7157288,2 17,2 Z m -4,9 v 12 h 1 V 11 Z m 7,0 v 12 h 1 V 11 Z"
|
||||
id="path831" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="28"
|
||||
width="28"
|
||||
id="svg12"
|
||||
xml:space="preserve"
|
||||
viewBox="0 0 28 28"
|
||||
y="0px"
|
||||
x="0px"
|
||||
version="1.1"
|
||||
sodipodi:docname="user.svgz"
|
||||
inkscape:version="0.92.2 2405546, 2018-03-11"><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:window-height="843"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="3.2721019"
|
||||
inkscape:cx="11.317087"
|
||||
inkscape:cy="22.626613"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="22"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg12" /><metadata
|
||||
id="metadata18"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs16" /><g
|
||||
id="g6"
|
||||
transform="scale(0.06862745)"><g
|
||||
id="g4"><path
|
||||
id="path2"
|
||||
d="M 204,204 C 260.1,204 306,158.1 306,102 306,45.9 260.1,0 204,0 147.9,0 102,45.9 102,102 c 0,56.1 45.9,102 102,102 z m 0,51 C 135.15,255 0,288.15 0,357 v 51 H 408 V 357 C 408,288.15 272.85,255 204,255 Z"
|
||||
inkscape:connector-curvature="0" /></g></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -0,0 +1,70 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Column {
|
||||
id: clock
|
||||
|
||||
width: parent.width / 2
|
||||
spacing: 0
|
||||
|
||||
Label {
|
||||
id:headerTextLabel
|
||||
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
font.pointSize: root.font.pointSize * 4
|
||||
color: config.HeaderTextColor
|
||||
renderType: Text.NativeRendering
|
||||
text: config.HeaderText
|
||||
}
|
||||
|
||||
Label {
|
||||
id: timeLabel
|
||||
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
font.pointSize: root.font.pointSize * 9
|
||||
font.bold: true
|
||||
color: config.TimeTextColor
|
||||
renderType: Text.QtRendering
|
||||
|
||||
function updateTime() {
|
||||
text = new Date().toLocaleTimeString(Qt.locale(config.Locale), config.HourFormat == "long" ? Locale.LongFormat : config.HourFormat !== "" ? config.HourFormat : Locale.ShortFormat)
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
id: dateLabel
|
||||
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
color: config.DateTextColor
|
||||
font.pointSize: root.font.pointSize * 3
|
||||
font.bold: true
|
||||
renderType: Text.QtRendering
|
||||
|
||||
function updateTime() {
|
||||
text = new Date().toLocaleDateString(Qt.locale(config.Locale), config.DateFormat == "short" ? Locale.ShortFormat : config.DateFormat !== "" ? config.DateFormat : Locale.LongFormat)
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
interval: 1000
|
||||
repeat: true
|
||||
running: true
|
||||
onTriggered: {
|
||||
dateLabel.updateTime()
|
||||
timeLabel.updateTime()
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
dateLabel.updateTime()
|
||||
timeLabel.updateTime()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,526 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Column {
|
||||
id: inputContainer
|
||||
|
||||
Layout.fillWidth: true
|
||||
|
||||
property ComboBox exposeSession: sessionSelect.exposeSession
|
||||
property bool failed
|
||||
|
||||
Item {
|
||||
id: errorMessageField
|
||||
|
||||
// change also in selectSession
|
||||
height: root.font.pointSize * 2
|
||||
width: parent.width / 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
Label {
|
||||
id: errorMessage
|
||||
|
||||
width: parent.width
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
|
||||
text: failed ? config.TranslateLoginFailedWarning || textConstants.loginFailed + "!" : keyboard.capsLock ? config.TranslateCapslockWarning || textConstants.capslockWarning : null
|
||||
font.pointSize: root.font.pointSize * 0.8
|
||||
font.italic: true
|
||||
color: config.WarningColor
|
||||
opacity: 0
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "fail"
|
||||
when: failed
|
||||
PropertyChanges {
|
||||
target: errorMessage
|
||||
opacity: 1
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "capslock"
|
||||
when: keyboard.capsLock
|
||||
PropertyChanges {
|
||||
target: errorMessage
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "opacity"
|
||||
duration: 100
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: usernameField
|
||||
|
||||
height: root.font.pointSize * 4.5
|
||||
width: parent.width / 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
ComboBox {
|
||||
id: selectUser
|
||||
|
||||
width: parent.height
|
||||
height: parent.height
|
||||
anchors.left: parent.left
|
||||
z: 2
|
||||
|
||||
model: userModel
|
||||
currentIndex: model.lastIndex
|
||||
textRole: "name"
|
||||
hoverEnabled: true
|
||||
onActivated: {
|
||||
username.text = currentText
|
||||
}
|
||||
|
||||
property var popkey: config.RightToLeftLayout == "true" ? Qt.Key_Right : Qt.Key_Left
|
||||
Keys.onPressed: function(event) {
|
||||
if (event.key == Qt.Key_Down && !popup.opened)
|
||||
username.forceActiveFocus();
|
||||
if ((event.key == Qt.Key_Up || event.key == popkey) && !popup.opened)
|
||||
popup.open();
|
||||
}
|
||||
KeyNavigation.down: username
|
||||
KeyNavigation.right: username
|
||||
|
||||
delegate: ItemDelegate {
|
||||
// minus padding
|
||||
width: popupHandler.width - 20
|
||||
anchors.horizontalCenter: popupHandler.horizontalCenter
|
||||
|
||||
contentItem: Text {
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
|
||||
text: model.name
|
||||
font.pointSize: root.font.pointSize * 0.8
|
||||
font.capitalization: Font.AllLowercase
|
||||
font.family: root.font.family
|
||||
color: config.DropdownTextColor
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: selectUser.highlightedIndex === index ? config.DropdownSelectedBackgroundColor : "transparent"
|
||||
}
|
||||
}
|
||||
|
||||
indicator: Button {
|
||||
id: usernameIcon
|
||||
|
||||
width: selectUser.height * 1
|
||||
height: parent.height
|
||||
anchors.left: parent.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.leftMargin: selectUser.height * 0
|
||||
|
||||
icon.height: parent.height * 0.25
|
||||
icon.width: parent.height * 0.25
|
||||
enabled: false
|
||||
icon.color: config.UserIconColor
|
||||
icon.source: Qt.resolvedUrl("../Assets/User.svg")
|
||||
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "transparent"
|
||||
}
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "transparent"
|
||||
}
|
||||
|
||||
popup: Popup {
|
||||
id: popupHandler
|
||||
|
||||
implicitHeight: contentItem.implicitHeight
|
||||
width: usernameField.width
|
||||
y: parent.height - username.height / 3
|
||||
x: config.RightToLeftLayout == "true" ? -loginButton.width + selectUser.width : 0
|
||||
rightMargin: config.RightToLeftLayout == "true" ? root.padding + usernameField.width / 2 : undefined
|
||||
padding: 10
|
||||
|
||||
contentItem: ListView {
|
||||
implicitHeight: contentHeight + 20
|
||||
|
||||
clip: true
|
||||
model: selectUser.popup.visible ? selectUser.delegateModel : null
|
||||
currentIndex: selectUser.highlightedIndex
|
||||
ScrollIndicator.vertical: ScrollIndicator { }
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
radius: config.RoundCorners / 2
|
||||
color: config.DropdownBackgroundColor
|
||||
layer.enabled: true
|
||||
}
|
||||
|
||||
enter: Transition {
|
||||
NumberAnimation { property: "opacity"; from: 0; to: 1 }
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "pressed"
|
||||
when: selectUser.down
|
||||
PropertyChanges {
|
||||
target: usernameIcon
|
||||
icon.color: Qt.lighter(config.HoverUserIconColor, 1.1)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hovered"
|
||||
when: selectUser.hovered
|
||||
PropertyChanges {
|
||||
target: usernameIcon
|
||||
icon.color: Qt.lighter(config.HoverUserIconColor, 1.2)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "focused"
|
||||
when: selectUser.activeFocus
|
||||
PropertyChanges {
|
||||
target: usernameIcon
|
||||
icon.color: config.HoverUserIconColor
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "color, border.color, icon.color"
|
||||
duration: 150
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: username
|
||||
|
||||
anchors.centerIn: parent
|
||||
height: root.font.pointSize * 3
|
||||
width: parent.width
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
z: 1
|
||||
|
||||
text: config.ForceLastUser == "true" ? selectUser.currentText : null
|
||||
color: config.LoginFieldTextColor
|
||||
font.bold: true
|
||||
font.capitalization: config.AllowUppercaseLettersInUsernames == "false" ? Font.AllLowercase : Font.MixedCase
|
||||
placeholderText: config.TranslatePlaceholderUsername || textConstants.userName
|
||||
placeholderTextColor: config.PlaceholderTextColor
|
||||
selectByMouse: true
|
||||
renderType: Text.QtRendering
|
||||
|
||||
onFocusChanged:{
|
||||
if(focus)
|
||||
selectAll()
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: config.LoginFieldBackgroundColor
|
||||
opacity: 0.6
|
||||
border.color: "transparent"
|
||||
border.width: parent.activeFocus ? 2 : 1
|
||||
radius: config.RoundCorners || 0
|
||||
}
|
||||
|
||||
onAccepted: config.AllowUppercaseLettersInUsernames == "false" ? sddm.login(username.text.toLowerCase(), password.text, sessionSelect.selectedSession) : sddm.login(username.text, password.text, sessionSelect.selectedSession)
|
||||
KeyNavigation.down: passwordIcon
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "focused"
|
||||
when: username.activeFocus
|
||||
PropertyChanges {
|
||||
target: username.background
|
||||
border.color: config.HighlightBorderColor
|
||||
}
|
||||
PropertyChanges {
|
||||
target: username
|
||||
color: Qt.lighter(config.LoginFieldTextColor, 1.15)
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
id: passwordField
|
||||
|
||||
height: root.font.pointSize * 4.5
|
||||
width: parent.width / 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
Button {
|
||||
id: passwordIcon
|
||||
|
||||
height: parent.height
|
||||
width: selectUser.height * 1
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: selectUser.height * 0
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
z: 2
|
||||
|
||||
icon.height: parent.height * 0.25
|
||||
icon.width: parent.height * 0.25
|
||||
icon.color: config.PasswordIconColor
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password2.svg")
|
||||
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "transparent"
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "visiblePasswordFocused"
|
||||
when: passwordIcon.checked && passwordIcon.activeFocus
|
||||
PropertyChanges {
|
||||
target: passwordIcon
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password.svg")
|
||||
icon.color: config.HoverPasswordIconColor
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "visiblePasswordHovered"
|
||||
when: passwordIcon.checked && passwordIcon.hovered
|
||||
PropertyChanges {
|
||||
target: passwordIcon
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password.svg")
|
||||
icon.color: config.HoverPasswordIconColor
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "visiblePassword"
|
||||
when: passwordIcon.checked
|
||||
PropertyChanges {
|
||||
target: passwordIcon
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password.svg")
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hiddenPasswordFocused"
|
||||
when: passwordIcon.enabled && passwordIcon.activeFocus
|
||||
PropertyChanges {
|
||||
target: passwordIcon
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password2.svg")
|
||||
icon.color: config.HoverPasswordIconColor
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hiddenPasswordHovered"
|
||||
when: passwordIcon.hovered
|
||||
PropertyChanges {
|
||||
target: passwordIcon
|
||||
icon.source: Qt.resolvedUrl("../Assets/Password2.svg")
|
||||
icon.color: config.HoverPasswordIconColor
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
onClicked: toggle()
|
||||
Keys.onReturnPressed: toggle()
|
||||
Keys.onEnterPressed: toggle()
|
||||
KeyNavigation.down: password
|
||||
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: password
|
||||
|
||||
height: root.font.pointSize * 3
|
||||
width: parent.width
|
||||
anchors.centerIn: parent
|
||||
horizontalAlignment: TextInput.AlignHCenter
|
||||
|
||||
font.bold: true
|
||||
color: config.PasswordFieldTextColor
|
||||
focus: config.PasswordFocus == "true" ? true : false
|
||||
echoMode: passwordIcon.checked ? TextInput.Normal : TextInput.Password
|
||||
placeholderText: config.TranslatePlaceholderPassword || textConstants.password
|
||||
placeholderTextColor: config.PlaceholderTextColor
|
||||
passwordCharacter: "•"
|
||||
passwordMaskDelay: config.HideCompletePassword == "true" ? undefined : 1000
|
||||
renderType: Text.QtRendering
|
||||
selectByMouse: true
|
||||
|
||||
background: Rectangle {
|
||||
color: config.PasswordFieldBackgroundColor
|
||||
opacity: 0.6
|
||||
border.color: "transparent"
|
||||
border.width: parent.activeFocus ? 2 : 1
|
||||
radius: config.RoundCorners || 0
|
||||
}
|
||||
onAccepted: config.AllowUppercaseLettersInUsernames == "false" ? sddm.login(username.text.toLowerCase(), password.text, sessionSelect.selectedSession) : sddm.login(username.text, password.text, sessionSelect.selectedSession)
|
||||
KeyNavigation.down: loginButton
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "focused"
|
||||
when: password.activeFocus
|
||||
PropertyChanges {
|
||||
target: password.background
|
||||
border.color: config.HighlightBorderColor
|
||||
}
|
||||
PropertyChanges {
|
||||
target: password
|
||||
color: Qt.lighter(config.LoginFieldTextColor, 1.15)
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "color, border.color"
|
||||
duration: 150
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Item {
|
||||
id: login
|
||||
|
||||
// important
|
||||
// try 4 or 9 ...
|
||||
height: root.font.pointSize * 9
|
||||
width: parent.width / 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
visible: config.HideLoginButton == "true" ? false : true
|
||||
|
||||
Button {
|
||||
id: loginButton
|
||||
|
||||
height: root.font.pointSize * 3
|
||||
implicitWidth: parent.width
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
text: config.TranslateLogin || textConstants.login
|
||||
enabled: config.AllowEmptyPassword == "true" || username.text != "" && password.text != "" ? true : false
|
||||
hoverEnabled: true
|
||||
|
||||
contentItem: Text {
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
font.bold: true
|
||||
font.pointSize: root.font.pointSize
|
||||
font.family: root.font.family
|
||||
color: config.LoginButtonTextColor
|
||||
text: parent.text
|
||||
opacity: 0.0
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
id: buttonBackground
|
||||
|
||||
color: config.LoginButtonBackgroundColor
|
||||
opacity: 0.0
|
||||
radius: config.RoundCorners || 0
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "pressed"
|
||||
when: loginButton.down
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: Qt.darker(config.LoginButtonBackgroundColor, 1.1)
|
||||
opacity: 0.0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: loginButton.contentItem
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hovered"
|
||||
when: loginButton.hovered
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: Qt.lighter(config.LoginButtonBackgroundColor, 1.15)
|
||||
opacity: 0.0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: loginButton.contentItem
|
||||
opacity: 0.0
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "focused"
|
||||
when: loginButton.activeFocus
|
||||
PropertyChanges {
|
||||
target: buttonBackground
|
||||
color: Qt.lighter(config.LoginButtonBackgroundColor, 1.2)
|
||||
opacity: 0.0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: loginButton.contentItem
|
||||
opacity: 0.0
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "enabled"
|
||||
when: loginButton.enabled
|
||||
PropertyChanges {
|
||||
target: buttonBackground;
|
||||
color: config.LoginButtonBackgroundColor;
|
||||
opacity: 0.0
|
||||
}
|
||||
PropertyChanges {
|
||||
target: loginButton.contentItem;
|
||||
opacity: 0.0
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "opacity, color";
|
||||
duration: 300
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
onClicked: config.AllowUppercaseLettersInUsernames == "false" ? sddm.login(username.text.toLowerCase(), password.text, sessionSelect.selectedSession) : sddm.login(username.text, password.text, sessionSelect.selectedSession)
|
||||
Keys.onReturnPressed: clicked()
|
||||
Keys.onEnterPressed: clicked()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: sddm
|
||||
function onLoginSucceeded() {}
|
||||
function onLoginFailed() {
|
||||
failed = true
|
||||
resetError.running ? resetError.stop() && resetError.start() : resetError.start()
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: resetError
|
||||
interval: 2000
|
||||
onTriggered: failed = false
|
||||
running: false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import SddmComponents 2.0 as SDDM
|
||||
|
||||
ColumnLayout {
|
||||
id: formContainer
|
||||
SDDM.TextConstants { id: textConstants }
|
||||
|
||||
property int p: config.ScreenPadding == "" ? 0 : config.ScreenPadding
|
||||
property string a: config.FormPosition
|
||||
|
||||
Clock {
|
||||
id: clock
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
// important
|
||||
Layout.preferredHeight: root.height / 2
|
||||
Layout.leftMargin: p != "0" ? a == "left" ? -p : a == "right" ? p : 0 : 0
|
||||
}
|
||||
|
||||
Input {
|
||||
id: input
|
||||
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.preferredHeight: root.height / 20
|
||||
Layout.leftMargin: p != "0" ? a == "left" ? -p : a == "right" ? p : 0 : 0
|
||||
Layout.topMargin: 0
|
||||
}
|
||||
|
||||
SystemButtons {
|
||||
id: systemButtons
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
Layout.preferredHeight: root.height / 5
|
||||
Layout.maximumHeight: root.height / 5
|
||||
Layout.leftMargin: p != "0" ? a == "left" ? -p : a == "right" ? p : 0 : 0
|
||||
|
||||
exposedSession: input.exposeSession
|
||||
}
|
||||
|
||||
SessionButton {
|
||||
id: sessionSelect
|
||||
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
|
||||
Layout.preferredHeight: root.height / 54
|
||||
Layout.maximumHeight: root.height / 54
|
||||
Layout.leftMargin: p != "0" ? a == "left" ? -p : a == "right" ? p : 0 : 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,149 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
Item {
|
||||
id: sessionButton
|
||||
|
||||
height: root.font.pointSize
|
||||
width: parent.width / 2
|
||||
|
||||
property var selectedSession: selectSession.currentIndex
|
||||
property string textConstantSession
|
||||
property int loginButtonWidth
|
||||
property ComboBox exposeSession: selectSession
|
||||
|
||||
ComboBox {
|
||||
id: selectSession
|
||||
|
||||
// important
|
||||
// change also in errorMessage
|
||||
height: root.font.pointSize * 2
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
hoverEnabled: true
|
||||
model: sessionModel
|
||||
currentIndex: model.lastIndex
|
||||
textRole: "name"
|
||||
|
||||
Keys.onPressed: function(event) {
|
||||
if ((event.key == Qt.Key_Left || event.key == Qt.Key_Right) && !popup.opened) {
|
||||
popup.open();
|
||||
}
|
||||
}
|
||||
|
||||
delegate: ItemDelegate {
|
||||
// minus padding
|
||||
width: popupHandler.width - 20
|
||||
anchors.horizontalCenter: popupHandler.horizontalCenter
|
||||
|
||||
contentItem: Text {
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
|
||||
text: model.name
|
||||
font.pointSize: root.font.pointSize * 0.8
|
||||
font.family: root.font.family
|
||||
color: config.DropdownTextColor
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: selectSession.highlightedIndex === index ? config.DropdownSelectedBackgroundColor : "transparent"
|
||||
}
|
||||
}
|
||||
|
||||
indicator {
|
||||
visible: false
|
||||
}
|
||||
|
||||
contentItem: Text {
|
||||
id: displayedItem
|
||||
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
text: (config.TranslateSessionSelection || "Session") + " (" + selectSession.currentText + ")"
|
||||
color: config.SessionButtonTextColor
|
||||
font.pointSize: root.font.pointSize * 0.8
|
||||
font.family: root.font.family
|
||||
|
||||
Keys.onReleased: parent.popup.open()
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
height: parent.visualFocus ? 2 : 0
|
||||
width: displayedItem.implicitWidth
|
||||
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
popup: Popup {
|
||||
id: popupHandler
|
||||
|
||||
implicitHeight: contentItem.implicitHeight
|
||||
width: sessionButton.width
|
||||
y: parent.height - 1
|
||||
x: -popupHandler.width/2 + displayedItem.width/2
|
||||
padding: 10
|
||||
|
||||
contentItem: ListView {
|
||||
implicitHeight: contentHeight + 20
|
||||
|
||||
clip: true
|
||||
model: selectSession.popup.visible ? selectSession.delegateModel : null
|
||||
currentIndex: selectSession.highlightedIndex
|
||||
ScrollIndicator.vertical: ScrollIndicator { }
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
radius: config.RoundCorners / 2
|
||||
color: config.DropdownBackgroundColor
|
||||
layer.enabled: true
|
||||
}
|
||||
|
||||
enter: Transition {
|
||||
NumberAnimation { property: "opacity"; from: 0; to: 1 }
|
||||
}
|
||||
}
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "pressed"
|
||||
when: selectSession.down
|
||||
PropertyChanges {
|
||||
target: displayedItem
|
||||
color: Qt.darker(config.HoverSessionButtonTextColor, 1.1)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hovered"
|
||||
when: selectSession.hovered
|
||||
PropertyChanges {
|
||||
target: displayedItem
|
||||
color: Qt.lighter(config.HoverSessionButtonTextColor, 1.1)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "focused"
|
||||
when: selectSession.visualFocus
|
||||
PropertyChanges {
|
||||
target: displayedItem
|
||||
color: config.HoverSessionButtonTextColor
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "color"
|
||||
duration: 150
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import QtQuick.Controls 2.15
|
||||
|
||||
RowLayout {
|
||||
|
||||
spacing: root.font.pointSize
|
||||
|
||||
property var shutdown: ["Shutdown", config.TranslateShutdown || textConstants.shutdown, sddm.canPowerOff]
|
||||
property var reboot: ["Reboot", config.TranslateReboot || textConstants.reboot, sddm.canReboot]
|
||||
property var suspend: ["Suspend", config.TranslateSuspend || textConstants.suspend, sddm.canSuspend]
|
||||
property var hibernate: ["Hibernate", config.TranslateHibernate || textConstants.hibernate, sddm.canHibernate]
|
||||
|
||||
property ComboBox exposedSession
|
||||
|
||||
Repeater {
|
||||
id: systemButtons
|
||||
|
||||
model: [shutdown, reboot, suspend, hibernate]
|
||||
|
||||
RoundButton {
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
||||
Layout.topMargin: root.font.pointSize * 6.5
|
||||
|
||||
text: modelData[1]
|
||||
font.pointSize: root.font.pointSize * 0.8
|
||||
icon.source: modelData ? Qt.resolvedUrl("../Assets/" + modelData[0] + ".svg") : ""
|
||||
icon.height: 2 * Math.round((root.font.pointSize * 3) / 2)
|
||||
icon.width: 2 * Math.round((root.font.pointSize * 3) / 2)
|
||||
icon.color: config.SystemButtonsIconsColor
|
||||
palette.buttonText: config.SystemButtonsIconsColor
|
||||
display: AbstractButton.TextUnderIcon
|
||||
visible: config.HideSystemButtons != "true" && (config.BypassSystemButtonsChecks == "true" ? 1 : modelData[2])
|
||||
hoverEnabled: true
|
||||
|
||||
background: Rectangle {
|
||||
height: 2
|
||||
width: parent.width
|
||||
|
||||
color: "transparent"
|
||||
}
|
||||
|
||||
Keys.onReturnPressed: clicked()
|
||||
onClicked: {
|
||||
parent.forceActiveFocus()
|
||||
index == 0 ? sddm.powerOff() : index == 1 ? sddm.reboot() : index == 2 ? sddm.suspend() : sddm.hibernate()
|
||||
}
|
||||
KeyNavigation.left: index > 0 ? parent.children[index-1] : null
|
||||
|
||||
states: [
|
||||
State {
|
||||
name: "pressed"
|
||||
when: parent.children[index].down
|
||||
PropertyChanges {
|
||||
target: parent.children[index]
|
||||
icon.color: root.palette.buttonText
|
||||
palette.buttonText: Qt.darker(root.palette.buttonText, 1.1)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "hovered"
|
||||
when: parent.children[index].hovered
|
||||
PropertyChanges {
|
||||
target: parent.children[index]
|
||||
icon.color: root.palette.buttonText
|
||||
palette.buttonText: Qt.lighter(root.palette.buttonText, 1.1)
|
||||
}
|
||||
},
|
||||
State {
|
||||
name: "focused"
|
||||
when: parent.children[index].activeFocus
|
||||
PropertyChanges {
|
||||
target: parent.children[index]
|
||||
icon.color: root.palette.buttonText
|
||||
palette.buttonText: root.palette.buttonText
|
||||
}
|
||||
}
|
||||
]
|
||||
transitions: [
|
||||
Transition {
|
||||
PropertyAnimation {
|
||||
properties: "palette.buttonText, border.color"
|
||||
duration: 150
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
// Config created by Keyitdev https://github.com/Keyitdev/sddm-astronaut-theme
|
||||
// Copyright (C) 2022-2025 Keyitdev
|
||||
// Based on https://github.com/MarianArlt/sddm-sugar-dark
|
||||
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuick.Effects
|
||||
import QtMultimedia
|
||||
|
||||
import "Components"
|
||||
|
||||
Pane {
|
||||
id: root
|
||||
|
||||
height: config.ScreenHeight || Screen.height
|
||||
width: config.ScreenWidth || Screen.ScreenWidth
|
||||
padding: config.ScreenPadding
|
||||
|
||||
LayoutMirroring.enabled: config.RightToLeftLayout == "true" ? true : Qt.application.layoutDirection === Qt.RightToLeft
|
||||
LayoutMirroring.childrenInherit: true
|
||||
|
||||
palette.window: config.BackgroundColor
|
||||
palette.highlight: config.HighlightBackgroundColor
|
||||
palette.highlightedText: config.HighlightTextColor
|
||||
palette.buttonText: config.HoverSystemButtonsIconsColor
|
||||
|
||||
font.family: config.Font
|
||||
font.pointSize: config.FontSize !== "" ? config.FontSize : parseInt(height / 80) || 13
|
||||
|
||||
focus: true
|
||||
|
||||
property bool leftleft: config.HaveFormBackground == "true" &&
|
||||
config.PartialBlur == "false" &&
|
||||
config.FormPosition == "left" &&
|
||||
config.BackgroundHorizontalAlignment == "left"
|
||||
|
||||
property bool leftcenter: config.HaveFormBackground == "true" &&
|
||||
config.PartialBlur == "false" &&
|
||||
config.FormPosition == "left" &&
|
||||
config.BackgroundHorizontalAlignment == "center"
|
||||
|
||||
property bool rightright: config.HaveFormBackground == "true" &&
|
||||
config.PartialBlur == "false" &&
|
||||
config.FormPosition == "right" &&
|
||||
config.BackgroundHorizontalAlignment == "right"
|
||||
|
||||
property bool rightcenter: config.HaveFormBackground == "true" &&
|
||||
config.PartialBlur == "false" &&
|
||||
config.FormPosition == "right" &&
|
||||
config.BackgroundHorizontalAlignment == "center"
|
||||
|
||||
Item {
|
||||
id: sizeHelper
|
||||
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
anchors.fill: parent
|
||||
|
||||
Rectangle {
|
||||
id: tintLayer
|
||||
|
||||
height: parent.height
|
||||
width: parent.width
|
||||
anchors.fill: parent
|
||||
z: 1
|
||||
color: config.DimBackgroundColor
|
||||
opacity: config.DimBackground
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: formBackground
|
||||
|
||||
anchors.fill: form
|
||||
anchors.centerIn: form
|
||||
z: 1
|
||||
|
||||
color: config.FormBackgroundColor
|
||||
visible: config.HaveFormBackground == "true" ? true : false
|
||||
opacity: config.PartialBlur == "true" ? 0.3 : 1
|
||||
}
|
||||
|
||||
LoginForm {
|
||||
id: form
|
||||
|
||||
height: parent.height
|
||||
width: parent.width / 2.5
|
||||
anchors.left: config.FormPosition == "left" ? parent.left : undefined
|
||||
anchors.horizontalCenter: config.FormPosition == "center" ? parent.horizontalCenter : undefined
|
||||
anchors.right: config.FormPosition == "right" ? parent.right : undefined
|
||||
z: 1
|
||||
}
|
||||
|
||||
Image {
|
||||
id: backgroundPlaceholderImage
|
||||
|
||||
z: 10
|
||||
source: config.BackgroundPlaceholder
|
||||
visible: false
|
||||
}
|
||||
|
||||
AnimatedImage {
|
||||
id: backgroundImage
|
||||
|
||||
MediaPlayer {
|
||||
id: player
|
||||
|
||||
videoOutput: videoOutput
|
||||
autoPlay: true
|
||||
playbackRate: config.BackgroundSpeed == "" ? 1.0 : config.BackgroundSpeed
|
||||
loops: -1
|
||||
onPlayingChanged: {
|
||||
console.log("Video started.")
|
||||
backgroundPlaceholderImage.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
VideoOutput {
|
||||
id: videoOutput
|
||||
|
||||
fillMode: config.CropBackground == "true" ? VideoOutput.PreserveAspectCrop : VideoOutput.PreserveAspectFit
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
height: parent.height
|
||||
width: config.HaveFormBackground == "true" && config.FormPosition != "center" && config.PartialBlur != "true" ? parent.width - formBackground.width : parent.width
|
||||
anchors.left: leftleft || leftcenter ? formBackground.right : undefined
|
||||
anchors.right: rightright || rightcenter ? formBackground.left : undefined
|
||||
|
||||
horizontalAlignment: config.BackgroundHorizontalAlignment == "left" ?
|
||||
Image.AlignLeft :
|
||||
config.BackgroundHorizontalAlignment == "right" ?
|
||||
Image.AlignRight : Image.AlignHCenter
|
||||
|
||||
verticalAlignment: config.BackgroundVerticalAlignment == "top" ?
|
||||
Image.AlignTop :
|
||||
config.BackgroundVerticalAlignment == "bottom" ?
|
||||
Image.AlignBottom : Image.AlignVCenter
|
||||
|
||||
speed: config.BackgroundSpeed == "" ? 1.0 : config.BackgroundSpeed
|
||||
paused: config.PauseBackground == "true" ? 1 : 0
|
||||
fillMode: config.CropBackground == "true" ? Image.PreserveAspectCrop : Image.PreserveAspectFit
|
||||
asynchronous: true
|
||||
cache: true
|
||||
clip: true
|
||||
mipmap: true
|
||||
|
||||
Component.onCompleted:{
|
||||
var fileType = config.Background.substring(config.Background.lastIndexOf(".") + 1)
|
||||
const videoFileTypes = ["avi", "mp4", "mov", "mkv", "m4v", "webm"];
|
||||
if (videoFileTypes.includes(fileType)) {
|
||||
backgroundPlaceholderImage.visible = true;
|
||||
player.source = Qt.resolvedUrl(config.Background)
|
||||
player.play();
|
||||
}
|
||||
else{
|
||||
backgroundImage.source = config.background || config.Background
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: backgroundImage
|
||||
onClicked: parent.forceActiveFocus()
|
||||
}
|
||||
|
||||
ShaderEffectSource {
|
||||
id: blurMask
|
||||
|
||||
height: parent.height
|
||||
width: form.width
|
||||
anchors.centerIn: form
|
||||
|
||||
sourceItem: backgroundImage
|
||||
sourceRect: Qt.rect(x,y,width,height)
|
||||
visible: config.FullBlur == "true" || config.PartialBlur == "true" ? true : false
|
||||
}
|
||||
|
||||
MultiEffect {
|
||||
id: blur
|
||||
|
||||
height: parent.height
|
||||
|
||||
// width: config.FullBlur == "true" ? parent.width : form.width
|
||||
// anchors.centerIn: config.FullBlur == "true" ? parent : form
|
||||
|
||||
// This solves problem when FullBlur and HaveFormBackground is set to true but PartialBlur is false and FormPosition isn't center.
|
||||
width: (config.FullBlur == "true" && config.PartialBlur == "false" && config.FormPosition != "center" ) ? parent.width - formBackground.width : config.FullBlur == "true" ? parent.width : form.width
|
||||
anchors.centerIn: config.FullBlur == "true" ? backgroundImage : form
|
||||
|
||||
source: config.FullBlur == "true" ? backgroundImage : blurMask
|
||||
blurEnabled: true
|
||||
autoPaddingEnabled: false
|
||||
blur: config.Blur == "" ? 2.0 : config.Blur
|
||||
blurMax: config.BlurMax == "" ? 48 : config.BlurMax
|
||||
visible: config.FullBlur == "true" || config.PartialBlur == "true" ? true : false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
# sddm-astronaut-theme
|
||||
|
||||

|
||||

|
||||
[](https://ko-fi.com/keyitdev)
|
||||
|
||||
[sddm-astronaut-theme](https://github.com/Keyitdev/sddm-astronaut-theme) is a series of themes for the [SDDM](https://github.com/sddm/sddm/) display manager made by **[Keyitdev](https://github.com/Keyitdev)**.
|
||||
|
||||
It's written using the latest version of Qt, which is **Qt6**. Its key features include **virtual keyboard support** and an **installation script**. This theme also support **animated wallpapers**. You can easily change its appearance by choosing another of the ten pre-made themes or creating your own. Each of these themes was created by modifying just one file - **[config](./Themes/astronaut.conf)**.
|
||||
|
||||
All themes were created for 1080p. However, they should work well in other resolutions.
|
||||
|
||||
## Preview of all themes
|
||||
|
||||

|
||||
|
||||
## Preview of animated themes
|
||||
|
||||
https://github.com/user-attachments/assets/2cfc947e-4621-4e98-b5f3-07d5e224b80c
|
||||
|
||||
<h2><a href="https://youtu.be/4tQ56xh7wBc" target="_blank">Watch more on Youtube!</a></h2>
|
||||
<details>
|
||||
<summary><h2>Detailed previews</h2></summary>
|
||||
|
||||
**Astronaut**|**Black hole**
|
||||
|:--:|:--:|
|
||||
|
|
||||
**Japanese aesthetic**|**Pixel sakura static**
|
||||
|
|
||||
**Purple leaves**|**Cyberpunk**
|
||||
|
|
||||
**Post-apocalyptic hacker**|**xxx**
|
||||
|
|
||||
|
||||
**Hyprland Kath**
|
||||
|
||||
https://github.com/user-attachments/assets/1d926e76-44f7-4d99-ac6d-d1abcd7ed688
|
||||
|
||||
**Pixel sakura**
|
||||
|
||||
https://github.com/user-attachments/assets/ea004765-7e84-4a0d-90cd-aaac97679f62
|
||||
|
||||
**Jake the dog**
|
||||
|
||||
https://github.com/user-attachments/assets/181d48c2-f152-45f5-b568-21145be180f6
|
||||
|
||||
</details>
|
||||
|
||||
## Installation
|
||||
|
||||
### Automatic Installation
|
||||
|
||||
```sh
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/keyitdev/sddm-astronaut-theme/master/setup.sh)"
|
||||
```
|
||||
> Works on distributions using pacman, xbps-install, dnf, zypper.
|
||||
> Remember to always read the scripts you run from the internet.
|
||||
|
||||
### Manual Installation
|
||||
|
||||
1. Install **dependencies**
|
||||
|
||||
[`sddm >= 0.21.0`](https://github.com/sddm/sddm), [`qt6 >= 6.8`](https://doc.qt.io/qt-6/index.html), [`qt6-svg >= 6.8`](https://doc.qt.io/qt-6/qtsvg-index.html), [`qt6-virtualkeyboard >= 6.8`](https://doc.qt.io/qt-6/qtvirtualkeyboard-index.html), [`qt6-multimedia >= 6.8`](https://doc.qt.io/qt-6/qtmultimedia-index.html)
|
||||
|
||||
You may also want to install additional video codecs like h.264.
|
||||
|
||||
```sh
|
||||
sddm qt6-svg qt6-virtualkeyboard qt6-multimedia-ffmpeg # Arch
|
||||
sddm qt6-svg qt6-virtualkeyboard qt6-multimedia # Void
|
||||
sddm qt6-qtsvg qt6-qtvirtualkeyboard qt6-qtmultimedia # Fedora
|
||||
sddm-qt6 libQt6Svg6 qt6-virtualkeyboard qt6-virtualkeyboard-imports qt6-multimedia qt6-multimedia-imports # OpenSUSE
|
||||
```
|
||||
|
||||
2. Clone this repository
|
||||
```sh
|
||||
sudo git clone -b master --depth 1 https://github.com/keyitdev/sddm-astronaut-theme.git /usr/share/sddm/themes/sddm-astronaut-theme
|
||||
```
|
||||
3. Copy fonts to `/usr/share/fonts/`
|
||||
```sh
|
||||
sudo cp -r /usr/share/sddm/themes/sddm-astronaut-theme/Fonts/* /usr/share/fonts/
|
||||
```
|
||||
4. Edit `/etc/sddm.conf`
|
||||
```sh
|
||||
echo "[Theme]
|
||||
Current=sddm-astronaut-theme" | sudo tee /etc/sddm.conf
|
||||
```
|
||||
5. Edit `/etc/sddm.conf.d/virtualkbd.conf`
|
||||
```sh
|
||||
echo "[General]
|
||||
InputMethod=qtvirtualkeyboard" | sudo tee /etc/sddm.conf.d/virtualkbd.conf
|
||||
```
|
||||
|
||||
## Selecting a theme
|
||||
|
||||
You can select theme by editing [metadata](./metadata.desktop) (`/usr/share/sddm/themes/sddm-astronaut-theme/metadata.desktop`).
|
||||
|
||||
Just edit this line:
|
||||
```
|
||||
ConfigFile=Themes/astronaut.conf
|
||||
```
|
||||
All available configs are in [Themes](./Themes/) directory.
|
||||
|
||||
## Previewing a theme
|
||||
|
||||
You can preview the set theme without logging out by runnning:
|
||||
```sh
|
||||
sddm-greeter-qt6 --test-mode --theme /usr/share/sddm/themes/sddm-astronaut-theme/
|
||||
```
|
||||
> Note that depending on the system configuration, the preview may differ slightly from the actual login screen.
|
||||
|
||||
## Sources
|
||||
|
||||
Initially the theme was independed fork of [MarianArlt's theme](https://github.com/MarianArlt/sddm-sugar-dark) but now the project has come a long way and started to significantly deviate from the original.
|
||||
Many of the wallpapers and fonts used in this project are very popular and copied from one user to another, so I don't know who the original creator is.
|
||||
I also redesigned many of them, but here are links to some of the orginal artists who created these wonderful wallpapers:
|
||||
|
||||
- Astronaut: [wallpaper](https://wallhaven.cc/w/e76pew), [font](https://fonts.google.com/specimen/Open+Sans/about)
|
||||
- Black hole: [wallpaper](https://images2.alphacoders.com/114/1141632.jpg), [font](https://www.1001fonts.com/espacion-font.html)
|
||||
- Japanese aesthetic: [wallpaper](https://imgur.com/a/pua0dYx) by [gharly](https://www.artstation.com/gharly), [font](https://www.1001fonts.com/electroharmonix-font.html)
|
||||
- Purple leaves: [wallpaper](https://wallha.com/wallpaper/artwork-abstract-leaves-purple-texture-pattern-1414432), [font](https://fonts.google.com/specimen/Open+Sans/about)
|
||||
- Cyberpunk: [wallpaper](https://images5.alphacoders.com/133/1330479.png) by [patrika](https://alphacoders.com/users/profile/227699/patrika), [font](https://www.1001fonts.com/kognigear-font.html)
|
||||
- Post-apocalyptic hacker: [wallpaper](https://images.alphacoders.com/137/thumb-1920-1375178.png) by [patrika](https://alphacoders.com/users/profile/227699/patrika), [font](https://www.1001fonts.com/fragile-bombers-font.html)
|
||||
- Hyprland Kath: [wallpaper](https://motionbgs.com/andvari-last-origin), [font](https://www.1001fonts.com/pixelon-font.html)
|
||||
- Pixel sakura: [wallpaper](https://imgur.com/gallery/sakura-tree-with-petals-flying-off-t5tg4N8), [font](https://www.1001fonts.com/arcadeclassic-font.html)
|
||||
- Jake the dog: [wallpaper](https://motionbgs.com/jake-the-dog), [font](https://fontmeme.com/fonts/thunderman-font/)
|
||||
|
||||
## Supporting project
|
||||
|
||||
You can support me simply by dropping a **star** on **[github](https://github.com/Keyitdev/sddm-astronaut-theme)** or giving a **subscription** on **[YouTube](http://www.youtube.com/channel/UCVoGVyAP2sHPQyegwBMJKyQ?sub_confirmation=1)**.
|
||||
|
||||
If you enjoyed it and would like to show your appreciation, you can make a **[donation](https://ko-fi.com/keyitdev)** using **[kofi](https://ko-fi.com/keyitdev)**.
|
||||
|
||||
[](https://ko-fi.com/keyitdev)
|
||||
|
||||
Distributed under the **[GPLv3+](https://www.gnu.org/licenses/gpl-3.0.html) License**.
|
||||
Copyright (C) 2022-2025 Keyitdev.
|
||||
@@ -0,0 +1,152 @@
|
||||
[General]
|
||||
#################### General ####################
|
||||
|
||||
ScreenWidth="2560"
|
||||
ScreenHeight="1440"
|
||||
ScreenPadding=""
|
||||
# Default 0, Options: from 0 to min(screen width/2,screen height/2).
|
||||
|
||||
Font="Pixelon"
|
||||
FontSize="24"
|
||||
# Default is screen height divided by 80 (1080/80=13.5), Options: 0-inf.
|
||||
|
||||
KeyboardSize="0.4"
|
||||
# Default 0.4, Options 0.1-1.0
|
||||
|
||||
RoundCorners="20"
|
||||
|
||||
Locale=""
|
||||
# Locale for data and time format. I suggest leaving it blank.
|
||||
HourFormat="HH:mm"
|
||||
# Default Locale.ShortFormat.
|
||||
DateFormat="dddd d"
|
||||
# Default Locale.LongFormat.
|
||||
|
||||
HeaderText="InoriShio"
|
||||
# You can put somehting fun.
|
||||
|
||||
#################### Background ####################
|
||||
|
||||
BackgroundPlaceholder=""
|
||||
# Must be a relative path.
|
||||
# Background displayed before the actual background is loaded.
|
||||
# Use only if the background is a video, otherwise leave blank.
|
||||
# Connected with: Background.
|
||||
Background="Backgrounds/Bocchi.mp4"
|
||||
# Must be a relative path.
|
||||
# Supports: png, jpg, jpeg, webp, gif, avi, mp4, mov, mkv, m4v, webm.
|
||||
BackgroundSpeed=""
|
||||
# Default 1.0. Options: 0.0-10.0 (can go higher).
|
||||
# Speed of animated wallpaper.
|
||||
# Connected with: Background.
|
||||
PauseBackground=""
|
||||
# Default false.
|
||||
# If set to true, stops playback of gifs. Works only with gifs.
|
||||
# Connected with: Background.
|
||||
DimBackground="0.0"
|
||||
# Options: 0.0-1.0.
|
||||
# Connected with: DimBackgroundColor
|
||||
CropBackground="true"
|
||||
# Default false.
|
||||
# Crop or fit background.
|
||||
# Connected with: BackgroundHorizontalAlignment and BackgroundVerticalAlignment dosn't work when set to true.
|
||||
BackgroundHorizontalAlignment="center"
|
||||
# Default: center, Options: left, center, right.
|
||||
# Horizontal position of the background picture.
|
||||
# Connected with: CropBackground must be set to false.
|
||||
BackgroundVerticalAlignment="center"
|
||||
# Horizontal position of the background picture.
|
||||
# Default: center, Options: bottom, center, top.
|
||||
# Connected with: CropBackground must be set to false.
|
||||
|
||||
#################### Colors ####################
|
||||
|
||||
HeaderTextColor="#21222c"
|
||||
DateTextColor="#21222c"
|
||||
TimeTextColor="#21222c"
|
||||
|
||||
FormBackgroundColor="#21222c"
|
||||
BackgroundColor="#21222c"
|
||||
DimBackgroundColor="#21222c"
|
||||
|
||||
LoginFieldBackgroundColor="#21222c"
|
||||
PasswordFieldBackgroundColor="#21222c"
|
||||
LoginFieldTextColor="#ffffff"
|
||||
PasswordFieldTextColor="#ffffff"
|
||||
UserIconColor="#ffffff"
|
||||
PasswordIconColor="#ffffff"
|
||||
|
||||
PlaceholderTextColor="#7c6f64"
|
||||
WarningColor="#32302f"
|
||||
|
||||
LoginButtonTextColor="#32302f"
|
||||
LoginButtonBackgroundColor="#ffffff"
|
||||
SystemButtonsIconsColor="#32302f"
|
||||
SessionButtonTextColor="#32302f"
|
||||
|
||||
DropdownTextColor="#ffffff"
|
||||
DropdownSelectedBackgroundColor="#7c6f64"
|
||||
DropdownBackgroundColor="#32302f"
|
||||
|
||||
HighlightTextColor="#877bb0"
|
||||
HighlightBackgroundColor="#ffffff"
|
||||
HighlightBorderColor="transparent"
|
||||
|
||||
HoverUserIconColor="#877bb0"
|
||||
HoverPasswordIconColor="#877bb0"
|
||||
HoverSystemButtonsIconsColor="#7c6f64"
|
||||
HoverSessionButtonTextColor="#7c6f64"
|
||||
|
||||
#################### Form ####################
|
||||
|
||||
PartialBlur=""
|
||||
# Default false.
|
||||
FullBlur=""
|
||||
# Default false.
|
||||
# If you use FullBlur I recommend setting BlurMax to 64 and Blur to 1.0.
|
||||
BlurMax=""
|
||||
# Default 48, Options: 2-64 (can go higher because depends on Blur).
|
||||
# Connected with: Blur.
|
||||
Blur=""
|
||||
# Default 2.0, Options: 0.0-3.0 (without 3.0).
|
||||
# Connected with: BlurMax.
|
||||
|
||||
HaveFormBackground="false"
|
||||
# Form background is transparent if set to false.
|
||||
# Connected with: PartialBlur and BackgroundColor.
|
||||
FormPosition="left"
|
||||
# Default: left, Options: left, center, right.
|
||||
|
||||
#################### Interface Behavior ####################
|
||||
|
||||
HideSystemButtons="true"
|
||||
HideLoginButton="false"
|
||||
|
||||
ForceLastUser="true"
|
||||
# If set to true last successfully logged in user appeares automatically in the username field.
|
||||
PasswordFocus="true"
|
||||
# Automaticaly focuses password field.
|
||||
HideCompletePassword="true"
|
||||
# Hides the password while typing.
|
||||
AllowEmptyPassword="false"
|
||||
# Enable login for users without a password.
|
||||
AllowUppercaseLettersInUsernames="false"
|
||||
# Do not change this! Uppercase letters are generally not allowed in usernames. This option is only for systems that differ from this standard!
|
||||
BypassSystemButtonsChecks="false"
|
||||
# Skips checking if sddm can perform shutdown, restart, suspend or hibernate, always displays all system buttons.
|
||||
RightToLeftLayout="false"
|
||||
# Revert the layout either because you would like the login to be on the right hand side or SDDM won't respect your language locale for some reason. This will reverse the current position of FormPosition if it is either left or right and in addition position some smaller elements on the right hand side of the form itself (also when FormPosition is set to center).
|
||||
|
||||
#################### Translation ####################
|
||||
|
||||
# These don't necessarily need to translate anything. You can enter whatever you want here.
|
||||
TranslatePlaceholderUsername=""
|
||||
TranslatePlaceholderPassword=""
|
||||
TranslateLogin=""
|
||||
TranslateLoginFailedWarning=""
|
||||
TranslateCapslockWarning=""
|
||||
TranslateSuspend=""
|
||||
TranslateHibernate=""
|
||||
TranslateReboot=""
|
||||
TranslateShutdown=""
|
||||
TranslateSessionSelection=""
|
||||
@@ -0,0 +1,14 @@
|
||||
[SddmGreeterTheme]
|
||||
Name=inorishio-theme
|
||||
Description=cream-da-la-cream
|
||||
Author=inorishio
|
||||
Website=https://github.com/inorishio
|
||||
License=GPL-3.0-or-later
|
||||
Type=sddm-theme
|
||||
Version=1.3
|
||||
ConfigFile=Themes/inorishio_aesthetic.conf
|
||||
MainScript=Main.qml
|
||||
TranslationsDirectory=translations
|
||||
Theme-Id=sddm-astronaut-theme
|
||||
Theme-API=2.0
|
||||
QtVersion=6
|
||||