summaryrefslogtreecommitdiff
path: root/modules/lock
diff options
context:
space:
mode:
Diffstat (limited to 'modules/lock')
-rw-r--r--modules/lock/Center.qml415
-rw-r--r--modules/lock/Fetch.qml165
-rw-r--r--modules/lock/NotifDock.qml145
-rw-r--r--modules/lock/NotifGroup.qml316
-rw-r--r--modules/lock/WeatherInfo.qml176
5 files changed, 0 insertions, 1217 deletions
diff --git a/modules/lock/Center.qml b/modules/lock/Center.qml
deleted file mode 100644
index a120f5b..0000000
--- a/modules/lock/Center.qml
+++ /dev/null
@@ -1,415 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.components.controls
-import qs.services
-import qs.config
-import qs.utils
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property var lock
- readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440)
- readonly property int centerWidth: Config.lock.sizes.centerWidth * centerScale
-
- Layout.preferredWidth: centerWidth
- Layout.fillWidth: false
- Layout.fillHeight: true
-
- spacing: Appearance.spacing.large * 2
-
- RowLayout {
- Layout.alignment: Qt.AlignHCenter
- spacing: Appearance.spacing.small
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: Time.hourStr
- color: Colours.palette.m3secondary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: ":"
- color: Colours.palette.m3primary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- StyledText {
- Layout.alignment: Qt.AlignVCenter
- text: Time.minuteStr
- color: Colours.palette.m3secondary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 3 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
-
- Loader {
- Layout.leftMargin: Appearance.spacing.small
- Layout.alignment: Qt.AlignVCenter
-
- active: Config.services.useTwelveHourClock
- visible: active
-
- sourceComponent: StyledText {
- text: Time.amPmStr
- color: Colours.palette.m3primary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * 2 * root.centerScale)
- font.family: Appearance.font.family.clock
- font.bold: true
- }
- }
- }
-
- StyledText {
- Layout.alignment: Qt.AlignHCenter
- Layout.topMargin: -Appearance.padding.large * 2
-
- text: Time.format("dddd, d MMMM yyyy")
- color: Colours.palette.m3tertiary
- font.pointSize: Math.floor(Appearance.font.size.extraLarge * root.centerScale)
- font.family: Appearance.font.family.mono
- font.bold: true
- }
-
- StyledClippingRect {
- Layout.topMargin: Appearance.spacing.large * 2
- Layout.alignment: Qt.AlignHCenter
-
- implicitWidth: root.centerWidth / 2
- implicitHeight: root.centerWidth / 2
-
- color: Colours.tPalette.m3surfaceContainer
- radius: Appearance.rounding.full
-
- MaterialIcon {
- anchors.centerIn: parent
-
- text: "person"
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Math.floor(root.centerWidth / 4)
- }
-
- Image {
- id: pfp
-
- anchors.fill: parent
- source: Paths.face
- }
- }
-
- StyledRect {
- Layout.alignment: Qt.AlignHCenter
-
- implicitWidth: root.centerWidth * 0.8
- implicitHeight: input.implicitHeight + Appearance.padding.small * 2
-
- color: Colours.tPalette.m3surfaceContainer
- radius: Appearance.rounding.full
-
- focus: true
- onActiveFocusChanged: {
- if (!activeFocus)
- forceActiveFocus();
- }
-
- Keys.onPressed: event => {
- if (root.lock.unlocking)
- return;
-
- if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return)
- inputField.placeholder.animate = false;
-
- root.lock.pam.handleKey(event);
- }
-
- StateLayer {
- hoverEnabled: false
- cursorShape: Qt.IBeamCursor
-
- function onClicked(): void {
- parent.forceActiveFocus();
- }
- }
-
- RowLayout {
- id: input
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.small
- spacing: Appearance.spacing.normal
-
- Item {
- implicitWidth: implicitHeight
- implicitHeight: fprintIcon.implicitHeight + Appearance.padding.small * 2
-
- MaterialIcon {
- id: fprintIcon
-
- anchors.centerIn: parent
- animate: true
- text: {
- if (root.lock.pam.fprint.tries >= Config.lock.maxFprintTries)
- return "fingerprint_off";
- if (root.lock.pam.fprint.active)
- return "fingerprint";
- return "lock";
- }
- color: root.lock.pam.fprint.tries >= Config.lock.maxFprintTries ? Colours.palette.m3error : Colours.palette.m3onSurface
- opacity: root.lock.pam.passwd.active ? 0 : 1
-
- Behavior on opacity {
- Anim {}
- }
- }
-
- CircularIndicator {
- anchors.fill: parent
- running: root.lock.pam.passwd.active
- }
- }
-
- InputField {
- id: inputField
-
- pam: root.lock.pam
- }
-
- StyledRect {
- implicitWidth: implicitHeight
- implicitHeight: enterIcon.implicitHeight + Appearance.padding.small * 2
-
- color: root.lock.pam.buffer ? Colours.palette.m3primary : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2)
- radius: Appearance.rounding.full
-
- StateLayer {
- color: root.lock.pam.buffer ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface
-
- function onClicked(): void {
- root.lock.pam.passwd.start();
- }
- }
-
- MaterialIcon {
- id: enterIcon
-
- anchors.centerIn: parent
- text: "arrow_forward"
- color: root.lock.pam.buffer ? Colours.palette.m3onPrimary : Colours.palette.m3onSurface
- font.weight: 500
- }
- }
- }
- }
-
- Item {
- Layout.fillWidth: true
- Layout.topMargin: -Appearance.spacing.large
-
- implicitHeight: Math.max(message.implicitHeight, stateMessage.implicitHeight)
-
- Behavior on implicitHeight {
- Anim {}
- }
-
- StyledText {
- id: stateMessage
-
- readonly property string msg: {
- if (Hypr.kbLayout !== Hypr.defaultKbLayout) {
- if (Hypr.capsLock && Hypr.numLock)
- return qsTr("Caps lock and Num lock are ON.\nKeyboard layout: %1").arg(Hypr.kbLayoutFull);
- if (Hypr.capsLock)
- return qsTr("Caps lock is ON. Kb layout: %1").arg(Hypr.kbLayoutFull);
- if (Hypr.numLock)
- return qsTr("Num lock is ON. Kb layout: %1").arg(Hypr.kbLayoutFull);
- return qsTr("Keyboard layout: %1").arg(Hypr.kbLayoutFull);
- }
-
- if (Hypr.capsLock && Hypr.numLock)
- return qsTr("Caps lock and Num lock are ON.");
- if (Hypr.capsLock)
- return qsTr("Caps lock is ON.");
- if (Hypr.numLock)
- return qsTr("Num lock is ON.");
-
- return "";
- }
-
- property bool shouldBeVisible
-
- onMsgChanged: {
- if (msg) {
- if (opacity > 0) {
- animate = true;
- text = msg;
- animate = false;
- } else {
- text = msg;
- }
- shouldBeVisible = true;
- } else {
- shouldBeVisible = false;
- }
- }
-
- anchors.left: parent.left
- anchors.right: parent.right
-
- scale: shouldBeVisible && !message.msg ? 1 : 0.7
- opacity: shouldBeVisible && !message.msg ? 1 : 0
- color: Colours.palette.m3onSurfaceVariant
- animateProp: "opacity"
-
- font.family: Appearance.font.family.mono
- horizontalAlignment: Qt.AlignHCenter
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
- lineHeight: 1.2
-
- Behavior on scale {
- Anim {}
- }
-
- Behavior on opacity {
- Anim {}
- }
- }
-
- StyledText {
- id: message
-
- readonly property Pam pam: root.lock.pam
- readonly property string msg: {
- if (pam.fprintState === "error")
- return qsTr("FP ERROR: %1").arg(pam.fprint.message);
- if (pam.state === "error")
- return qsTr("PW ERROR: %1").arg(pam.passwd.message);
-
- if (pam.lockMessage)
- return pam.lockMessage;
-
- if (pam.state === "max" && pam.fprintState === "max")
- return qsTr("Maximum password and fingerprint attempts reached.");
- if (pam.state === "max") {
- if (pam.fprint.available)
- return qsTr("Maximum password attempts reached. Please use fingerprint.");
- return qsTr("Maximum password attempts reached.");
- }
- if (pam.fprintState === "max")
- return qsTr("Maximum fingerprint attempts reached. Please use password.");
-
- if (pam.state === "fail") {
- if (pam.fprint.available)
- return qsTr("Incorrect password. Please try again or use fingerprint.");
- return qsTr("Incorrect password. Please try again.");
- }
- if (pam.fprintState === "fail")
- return qsTr("Fingerprint not recognized (%1/%2). Please try again or use password.").arg(pam.fprint.tries).arg(Config.lock.maxFprintTries);
-
- return "";
- }
-
- anchors.left: parent.left
- anchors.right: parent.right
-
- scale: 0.7
- opacity: 0
- color: Colours.palette.m3error
-
- font.pointSize: Appearance.font.size.small
- font.family: Appearance.font.family.mono
- horizontalAlignment: Qt.AlignHCenter
- wrapMode: Text.WrapAtWordBoundaryOrAnywhere
-
- onMsgChanged: {
- if (msg) {
- if (opacity > 0) {
- animate = true;
- text = msg;
- animate = false;
-
- exitAnim.stop();
- if (scale < 1)
- appearAnim.restart();
- else
- flashAnim.restart();
- } else {
- text = msg;
- exitAnim.stop();
- appearAnim.restart();
- }
- } else {
- appearAnim.stop();
- flashAnim.stop();
- exitAnim.start();
- }
- }
-
- Connections {
- target: root.lock.pam
-
- function onFlashMsg(): void {
- exitAnim.stop();
- if (message.scale < 1)
- appearAnim.restart();
- else
- flashAnim.restart();
- }
- }
-
- Anim {
- id: appearAnim
-
- target: message
- properties: "scale,opacity"
- to: 1
- onFinished: flashAnim.restart()
- }
-
- SequentialAnimation {
- id: flashAnim
-
- loops: 2
-
- FlashAnim {
- to: 0.3
- }
- FlashAnim {
- to: 1
- }
- }
-
- ParallelAnimation {
- id: exitAnim
-
- Anim {
- target: message
- property: "scale"
- to: 0.7
- duration: Appearance.anim.durations.large
- }
- Anim {
- target: message
- property: "opacity"
- to: 0
- duration: Appearance.anim.durations.large
- }
- }
- }
- }
-
- component FlashAnim: NumberAnimation {
- target: message
- property: "opacity"
- duration: Appearance.anim.durations.small
- easing.type: Easing.Linear
- }
-}
diff --git a/modules/lock/Fetch.qml b/modules/lock/Fetch.qml
deleted file mode 100644
index ded5608..0000000
--- a/modules/lock/Fetch.qml
+++ /dev/null
@@ -1,165 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.components.effects
-import qs.services
-import qs.config
-import qs.utils
-import Quickshell.Services.UPower
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.large * 2
- anchors.topMargin: Appearance.padding.large
-
- spacing: Appearance.spacing.small
-
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: false
- spacing: Appearance.spacing.normal
-
- StyledRect {
- implicitWidth: prompt.implicitWidth + Appearance.padding.normal * 2
- implicitHeight: prompt.implicitHeight + Appearance.padding.normal * 2
-
- color: Colours.palette.m3primary
- radius: Appearance.rounding.small
-
- MonoText {
- id: prompt
-
- anchors.centerIn: parent
- text: ">"
- font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal
- color: Colours.palette.m3onPrimary
- }
- }
-
- MonoText {
- Layout.fillWidth: true
- text: "caelestiafetch.sh"
- font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal
- elide: Text.ElideRight
- }
-
- WrappedLoader {
- Layout.fillHeight: true
- active: !iconLoader.active
-
- sourceComponent: OsLogo {}
- }
- }
-
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: false
- spacing: height * 0.15
-
- WrappedLoader {
- id: iconLoader
-
- Layout.fillHeight: true
- active: root.width > 320
-
- sourceComponent: OsLogo {}
- }
-
- ColumnLayout {
- Layout.fillWidth: true
- Layout.topMargin: Appearance.padding.normal
- Layout.bottomMargin: Appearance.padding.normal
- Layout.leftMargin: iconLoader.active ? 0 : width * 0.1
- spacing: Appearance.spacing.normal
-
- WrappedLoader {
- Layout.fillWidth: true
- active: !batLoader.active && root.height > 200
-
- sourceComponent: FetchText {
- text: `OS : ${SysInfo.osPrettyName || SysInfo.osName}`
- }
- }
-
- WrappedLoader {
- Layout.fillWidth: true
- active: root.height > (batLoader.active ? 200 : 110)
-
- sourceComponent: FetchText {
- text: `WM : ${SysInfo.wm}`
- }
- }
-
- WrappedLoader {
- Layout.fillWidth: true
- active: !batLoader.active || root.height > 110
-
- sourceComponent: FetchText {
- text: `USER: ${SysInfo.user}`
- }
- }
-
- FetchText {
- text: `UP : ${SysInfo.uptime}`
- }
-
- WrappedLoader {
- id: batLoader
-
- Layout.fillWidth: true
- active: UPower.displayDevice.isLaptopBattery
-
- sourceComponent: FetchText {
- text: `BATT: ${[UPowerDeviceState.Charging, UPowerDeviceState.FullyCharged, UPowerDeviceState.PendingCharge].includes(UPower.displayDevice.state) ? "(+) " : ""}${Math.round(UPower.displayDevice.percentage * 100)}%`
- }
- }
- }
- }
-
- WrappedLoader {
- Layout.alignment: Qt.AlignHCenter
- active: root.height > 180
-
- sourceComponent: RowLayout {
- spacing: Appearance.spacing.large
-
- Repeater {
- model: Math.max(0, Math.min(8, root.width / (Appearance.font.size.larger * 2 + Appearance.spacing.large)))
-
- StyledRect {
- required property int index
-
- implicitWidth: implicitHeight
- implicitHeight: Appearance.font.size.larger * 2
- color: Colours.palette[`term${index}`]
- radius: Appearance.rounding.small
- }
- }
- }
- }
-
- component WrappedLoader: Loader {
- visible: active
- }
-
- component OsLogo: ColouredIcon {
- source: SysInfo.osLogo
- implicitSize: height
- colour: Colours.palette.m3primary
- layer.enabled: Config.lock.recolourLogo || SysInfo.isDefaultLogo
- }
-
- component FetchText: MonoText {
- Layout.fillWidth: true
- font.pointSize: root.width > 400 ? Appearance.font.size.larger : Appearance.font.size.normal
- elide: Text.ElideRight
- }
-
- component MonoText: StyledText {
- font.family: Appearance.font.family.mono
- }
-}
diff --git a/modules/lock/NotifDock.qml b/modules/lock/NotifDock.qml
deleted file mode 100644
index 01f7e4b..0000000
--- a/modules/lock/NotifDock.qml
+++ /dev/null
@@ -1,145 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.components.containers
-import qs.components.effects
-import qs.services
-import qs.config
-import Quickshell
-import Quickshell.Widgets
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property var lock
-
- anchors.fill: parent
- anchors.margins: Appearance.padding.large
-
- spacing: Appearance.spacing.smaller
-
- StyledText {
- Layout.fillWidth: true
- text: Notifs.list.length > 0 ? qsTr("%1 notification%2").arg(Notifs.list.length).arg(Notifs.list.length === 1 ? "" : "s") : qsTr("Notifications")
- color: Colours.palette.m3outline
- font.family: Appearance.font.family.mono
- font.weight: 500
- elide: Text.ElideRight
- }
-
- ClippingRectangle {
- id: clipRect
-
- Layout.fillWidth: true
- Layout.fillHeight: true
-
- radius: Appearance.rounding.small
- color: "transparent"
-
- Loader {
- anchors.centerIn: parent
- active: opacity > 0
- opacity: Notifs.list.length > 0 ? 0 : 1
-
- sourceComponent: ColumnLayout {
- spacing: Appearance.spacing.large
-
- Image {
- asynchronous: true
- source: Qt.resolvedUrl(`${Quickshell.shellDir}/assets/dino.png`)
- fillMode: Image.PreserveAspectFit
- sourceSize.width: clipRect.width * 0.8
-
- layer.enabled: true
- layer.effect: Colouriser {
- colorizationColor: Colours.palette.m3outlineVariant
- brightness: 1
- }
- }
-
- StyledText {
- Layout.alignment: Qt.AlignHCenter
- text: qsTr("No Notifications")
- color: Colours.palette.m3outlineVariant
- font.pointSize: Appearance.font.size.large
- font.family: Appearance.font.family.mono
- font.weight: 500
- }
- }
-
- Behavior on opacity {
- Anim {
- duration: Appearance.anim.durations.extraLarge
- }
- }
- }
-
- StyledListView {
- anchors.fill: parent
-
- spacing: Appearance.spacing.small
- clip: true
-
- model: ScriptModel {
- values: {
- const list = Notifs.notClosed.map(n => [n.appName, null]);
- return [...new Map(list).keys()];
- }
- }
-
- delegate: NotifGroup {}
-
- add: Transition {
- Anim {
- property: "opacity"
- from: 0
- to: 1
- }
- Anim {
- property: "scale"
- from: 0
- to: 1
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- }
-
- remove: Transition {
- Anim {
- property: "opacity"
- to: 0
- }
- Anim {
- property: "scale"
- to: 0.6
- }
- }
-
- move: Transition {
- Anim {
- properties: "opacity,scale"
- to: 1
- }
- Anim {
- property: "y"
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- }
-
- displaced: Transition {
- Anim {
- properties: "opacity,scale"
- to: 1
- }
- Anim {
- property: "y"
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- }
- }
- }
-}
diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml
deleted file mode 100644
index 7796090..0000000
--- a/modules/lock/NotifGroup.qml
+++ /dev/null
@@ -1,316 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.components.effects
-import qs.services
-import qs.config
-import qs.utils
-import Quickshell
-import Quickshell.Widgets
-import Quickshell.Services.Notifications
-import QtQuick
-import QtQuick.Layouts
-
-StyledRect {
- id: root
-
- required property string modelData
-
- readonly property list<var> notifs: Notifs.list.filter(notif => notif.appName === modelData)
- readonly property string image: notifs.find(n => n.image.length > 0)?.image ?? ""
- readonly property string appIcon: notifs.find(n => n.appIcon.length > 0)?.appIcon ?? ""
- readonly property string urgency: notifs.some(n => n.urgency === NotificationUrgency.Critical) ? "critical" : notifs.some(n => n.urgency === NotificationUrgency.Normal) ? "normal" : "low"
-
- property bool expanded
-
- anchors.left: parent?.left
- anchors.right: parent?.right
- implicitHeight: content.implicitHeight + Appearance.padding.normal * 2
-
- clip: true
- radius: Appearance.rounding.normal
- color: root.urgency === "critical" ? Colours.palette.m3secondaryContainer : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2)
-
- RowLayout {
- id: content
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.top: parent.top
- anchors.margins: Appearance.padding.normal
-
- spacing: Appearance.spacing.normal
-
- Item {
- Layout.alignment: Qt.AlignLeft | Qt.AlignTop
- implicitWidth: Config.notifs.sizes.image
- implicitHeight: Config.notifs.sizes.image
-
- Component {
- id: imageComp
-
- Image {
- source: Qt.resolvedUrl(root.image)
- fillMode: Image.PreserveAspectCrop
- cache: false
- asynchronous: true
- width: Config.notifs.sizes.image
- height: Config.notifs.sizes.image
- }
- }
-
- Component {
- id: appIconComp
-
- ColouredIcon {
- implicitSize: Math.round(Config.notifs.sizes.image * 0.6)
- source: Quickshell.iconPath(root.appIcon)
- colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer
- layer.enabled: root.appIcon.endsWith("symbolic")
- }
- }
-
- Component {
- id: materialIconComp
-
- MaterialIcon {
- text: Icons.getNotifIcon(root.notifs[0]?.summary, root.urgency)
- color: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer
- font.pointSize: Appearance.font.size.large
- }
- }
-
- ClippingRectangle {
- anchors.fill: parent
- color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 3) : Colours.palette.m3secondaryContainer
- radius: Appearance.rounding.full
-
- Loader {
- anchors.centerIn: parent
- sourceComponent: root.image ? imageComp : root.appIcon ? appIconComp : materialIconComp
- }
- }
-
- Loader {
- anchors.right: parent.right
- anchors.bottom: parent.bottom
- active: root.appIcon && root.image
-
- sourceComponent: StyledRect {
- implicitWidth: Config.notifs.sizes.badge
- implicitHeight: Config.notifs.sizes.badge
-
- color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.palette.m3surfaceContainerHighest : Colours.palette.m3secondaryContainer
- radius: Appearance.rounding.full
-
- ColouredIcon {
- anchors.centerIn: parent
- implicitSize: Math.round(Config.notifs.sizes.badge * 0.6)
- source: Quickshell.iconPath(root.appIcon)
- colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer
- layer.enabled: root.appIcon.endsWith("symbolic")
- }
- }
- }
- }
-
- ColumnLayout {
- Layout.topMargin: -Appearance.padding.small
- Layout.bottomMargin: -Appearance.padding.small / 2 - (root.expanded ? 0 : spacing)
- Layout.fillWidth: true
- spacing: Math.round(Appearance.spacing.small / 2)
-
- RowLayout {
- Layout.bottomMargin: -parent.spacing
- Layout.fillWidth: true
- spacing: Appearance.spacing.smaller
-
- StyledText {
- Layout.fillWidth: true
- text: root.modelData
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.small
- elide: Text.ElideRight
- }
-
- StyledText {
- animate: true
- text: root.notifs[0]?.timeStr ?? ""
- color: Colours.palette.m3outline
- font.pointSize: Appearance.font.size.small
- }
-
- StyledRect {
- implicitWidth: expandBtn.implicitWidth + Appearance.padding.smaller * 2
- implicitHeight: groupCount.implicitHeight + Appearance.padding.small
-
- color: root.urgency === "critical" ? Colours.palette.m3error : Colours.layer(Colours.palette.m3surfaceContainerHighest, 2)
- radius: Appearance.rounding.full
-
- opacity: root.notifs.length > Config.notifs.groupPreviewNum ? 1 : 0
- Layout.preferredWidth: root.notifs.length > Config.notifs.groupPreviewNum ? implicitWidth : 0
-
- StateLayer {
- color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface
-
- function onClicked(): void {
- root.expanded = !root.expanded;
- }
- }
-
- RowLayout {
- id: expandBtn
-
- anchors.centerIn: parent
- spacing: Appearance.spacing.small / 2
-
- StyledText {
- id: groupCount
-
- Layout.leftMargin: Appearance.padding.small / 2
- animate: true
- text: root.notifs.length
- color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface
- font.pointSize: Appearance.font.size.small
- }
-
- MaterialIcon {
- Layout.rightMargin: -Appearance.padding.small / 2
- animate: true
- text: root.expanded ? "expand_less" : "expand_more"
- color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface
- }
- }
-
- Behavior on opacity {
- Anim {}
- }
-
- Behavior on Layout.preferredWidth {
- Anim {}
- }
- }
- }
-
- Repeater {
- model: ScriptModel {
- values: root.notifs.slice(0, Config.notifs.groupPreviewNum)
- }
-
- NotifLine {
- id: notif
-
- ParallelAnimation {
- running: true
-
- Anim {
- target: notif
- property: "opacity"
- from: 0
- to: 1
- }
- Anim {
- target: notif
- property: "scale"
- from: 0.7
- to: 1
- }
- Anim {
- target: notif.Layout
- property: "preferredHeight"
- from: 0
- to: notif.implicitHeight
- }
- }
-
- ParallelAnimation {
- running: notif.modelData.closed
- onFinished: notif.modelData.unlock(notif)
-
- Anim {
- target: notif
- property: "opacity"
- to: 0
- }
- Anim {
- target: notif
- property: "scale"
- to: 0.7
- }
- Anim {
- target: notif.Layout
- property: "preferredHeight"
- to: 0
- }
- }
- }
- }
-
- Loader {
- Layout.fillWidth: true
-
- opacity: root.expanded ? 1 : 0
- Layout.preferredHeight: root.expanded ? implicitHeight : 0
- active: opacity > 0
-
- sourceComponent: ColumnLayout {
- Repeater {
- model: ScriptModel {
- values: root.notifs.slice(Config.notifs.groupPreviewNum)
- }
-
- NotifLine {}
- }
- }
-
- Behavior on opacity {
- Anim {}
- }
- }
- }
- }
-
- Behavior on implicitHeight {
- Anim {
- duration: Appearance.anim.durations.expressiveDefaultSpatial
- easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
- }
- }
-
- component NotifLine: StyledText {
- id: notifLine
-
- required property Notifs.Notif modelData
-
- Layout.fillWidth: true
- textFormat: Text.MarkdownText
- text: {
- const summary = modelData.summary.replace(/\n/g, " ");
- const body = modelData.body.replace(/\n/g, " ");
- const colour = root.urgency === "critical" ? Colours.palette.m3secondary : Colours.palette.m3outline;
-
- if (metrics.text === metrics.elidedText)
- return `${summary} <span style='color:${colour}'>${body}</span>`;
-
- const t = metrics.elidedText.length - 3;
- if (t < summary.length)
- return `${summary.slice(0, t)}...`;
-
- return `${summary} <span style='color:${colour}'>${body.slice(0, t - summary.length)}...</span>`;
- }
- color: root.urgency === "critical" ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface
-
- Component.onCompleted: modelData.lock(this)
- Component.onDestruction: modelData.unlock(this)
-
- TextMetrics {
- id: metrics
-
- text: `${notifLine.modelData.summary} ${notifLine.modelData.body}`.replace(/\n/g, " ")
- font.pointSize: notifLine.font.pointSize
- font.family: notifLine.font.family
- elideWidth: notifLine.width
- elide: Text.ElideRight
- }
- }
-}
diff --git a/modules/lock/WeatherInfo.qml b/modules/lock/WeatherInfo.qml
deleted file mode 100644
index d6c25af..0000000
--- a/modules/lock/WeatherInfo.qml
+++ /dev/null
@@ -1,176 +0,0 @@
-pragma ComponentBehavior: Bound
-
-import qs.components
-import qs.services
-import qs.config
-import qs.utils
-import QtQuick
-import QtQuick.Layouts
-
-ColumnLayout {
- id: root
-
- required property int rootHeight
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.margins: Appearance.padding.large * 2
-
- spacing: Appearance.spacing.small
-
- Loader {
- Layout.topMargin: Appearance.padding.large * 2
- Layout.bottomMargin: -Appearance.padding.large
- Layout.alignment: Qt.AlignHCenter
-
- active: root.rootHeight > 610
- visible: active
-
- sourceComponent: StyledText {
- text: qsTr("Weather")
- color: Colours.palette.m3primary
- font.pointSize: Appearance.font.size.extraLarge
- font.weight: 500
- }
- }
-
- RowLayout {
- Layout.fillWidth: true
- spacing: Appearance.spacing.large
-
- MaterialIcon {
- animate: true
- text: Weather.icon
- color: Colours.palette.m3secondary
- font.pointSize: Appearance.font.size.extraLarge * 2.5
- }
-
- ColumnLayout {
- spacing: Appearance.spacing.small
-
- StyledText {
- Layout.fillWidth: true
-
- animate: true
- text: Weather.description
- color: Colours.palette.m3secondary
- font.pointSize: Appearance.font.size.large
- font.weight: 500
- elide: Text.ElideRight
- }
-
- StyledText {
- Layout.fillWidth: true
-
- animate: true
- text: qsTr("Humidity: %1%").arg(Weather.humidity)
- color: Colours.palette.m3onSurfaceVariant
- font.pointSize: Appearance.font.size.normal
- elide: Text.ElideRight
- }
- }
-
- Loader {
- Layout.rightMargin: Appearance.padding.smaller
- active: root.width > 400
- visible: active
-
- sourceComponent: ColumnLayout {
- spacing: Appearance.spacing.small
-
- StyledText {
- Layout.fillWidth: true
-
- animate: true
- text: Weather.temp
- color: Colours.palette.m3primary
- horizontalAlignment: Text.AlignRight
- font.pointSize: Appearance.font.size.extraLarge
- font.weight: 500
- elide: Text.ElideLeft
- }
-
- StyledText {
- Layout.fillWidth: true
-
- animate: true
- text: qsTr("Feels like: %1").arg(Weather.feelsLike)
- color: Colours.palette.m3outline
- horizontalAlignment: Text.AlignRight
- font.pointSize: Appearance.font.size.smaller
- elide: Text.ElideLeft
- }
- }
- }
- }
-
- Loader {
- id: forecastLoader
-
- Layout.topMargin: Appearance.spacing.smaller
- Layout.bottomMargin: Appearance.padding.large * 2
- Layout.fillWidth: true
-
- active: root.rootHeight > 820
- visible: active
-
- sourceComponent: RowLayout {
- spacing: Appearance.spacing.large
-
- Repeater {
- model: {
- const forecast = Weather.hourlyForecast;
- const count = root.width < 320 ? 3 : root.width < 400 ? 4 : 5;
- if (!forecast)
- return Array.from({
- length: count
- }, () => null);
-
- return forecast.slice(0, count);
- }
-
- ColumnLayout {
- id: forecastHour
-
- required property var modelData
-
- Layout.fillWidth: true
- spacing: Appearance.spacing.small
-
- StyledText {
- Layout.fillWidth: true
- text: {
- const hour = forecastHour.modelData?.hour ?? 0;
- return hour > 12 ? `${(hour - 12).toString().padStart(2, "0")} PM` : `${hour.toString().padStart(2, "0")} AM`;
- }
- color: Colours.palette.m3outline
- horizontalAlignment: Text.AlignHCenter
- font.pointSize: Appearance.font.size.larger
- }
-
- MaterialIcon {
- Layout.alignment: Qt.AlignHCenter
- text: forecastHour.modelData?.icon ?? "cloud_alert"
- font.pointSize: Appearance.font.size.extraLarge * 1.5
- font.weight: 500
- }
-
- StyledText {
- Layout.alignment: Qt.AlignHCenter
- text: Config.services.useFahrenheit ? `${forecastHour.modelData?.tempF ?? 0}°F` : `${forecastHour.modelData?.tempC ?? 0}°C`
- color: Colours.palette.m3secondary
- font.pointSize: Appearance.font.size.larger
- }
- }
- }
- }
- }
-
- Timer {
- running: true
- triggeredOnStart: true
- repeat: true
- interval: 900000 // 15 minutes
- onTriggered: Weather.reload()
- }
-}