forked from Shinonome/dots-hyprland
196 lines
7.4 KiB
QML
196 lines
7.4 KiB
QML
import QtQuick
|
|
import QtQuick.Layouts
|
|
import qs
|
|
import qs.services
|
|
import qs.modules.common
|
|
import qs.modules.common.functions
|
|
import qs.modules.common.widgets
|
|
import qs.modules.common.widgets.widgetCanvas
|
|
import qs.modules.background.widgets
|
|
|
|
AbstractBackgroundWidget {
|
|
id: root
|
|
|
|
configEntryName: "clock"
|
|
|
|
implicitHeight: contentColumn.implicitHeight
|
|
implicitWidth: contentColumn.implicitWidth
|
|
|
|
property string clockStyle: Config.options.background.widgets.clock.style
|
|
property bool forceCenter: (GlobalStates.screenLocked && Config.options.lock.centerClock)
|
|
property bool wallpaperSafetyTriggered: false
|
|
needsColText: clockStyle === "digital"
|
|
x: forceCenter ? ((root.screenWidth - root.width) / 2) : targetX
|
|
y: forceCenter ? ((root.screenHeight - root.height) / 2) : targetY
|
|
visibleWhenLocked: true
|
|
|
|
property var textHorizontalAlignment: {
|
|
if (root.forceCenter)
|
|
return Text.AlignHCenter;
|
|
if (root.x < root.scaledScreenWidth / 3)
|
|
return Text.AlignLeft;
|
|
if (root.x > root.scaledScreenWidth * 2 / 3)
|
|
return Text.AlignRight;
|
|
return Text.AlignHCenter;
|
|
}
|
|
|
|
Column {
|
|
id: contentColumn
|
|
anchors.centerIn: parent
|
|
spacing: 6
|
|
|
|
FadeLoader {
|
|
id: cookieClockLoader
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
shown: root.clockStyle === "cookie"
|
|
sourceComponent: Column {
|
|
CookieClock {
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
FadeLoader {
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
shown: Config.options.background.widgets.clock.quote.enable && Config.options.background.widgets.clock.quote.text !== ""
|
|
sourceComponent: CookieQuote {}
|
|
}
|
|
}
|
|
}
|
|
|
|
FadeLoader {
|
|
id: digitalClockLoader
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
shown: root.clockStyle === "digital"
|
|
sourceComponent: ColumnLayout {
|
|
id: clockColumn
|
|
spacing: 6
|
|
|
|
ClockText {
|
|
font.pixelSize: 90
|
|
text: DateTime.time
|
|
}
|
|
ClockText {
|
|
Layout.topMargin: -5
|
|
text: DateTime.date
|
|
}
|
|
StyledText {
|
|
// Somehow gets fucked up if made a ClockText???
|
|
visible: Config.options.background.widgets.clock.quote.enable && Config.options.background.widgets.clock.quote.text.length > 0
|
|
Layout.fillWidth: true
|
|
horizontalAlignment: root.textHorizontalAlignment
|
|
font {
|
|
pixelSize: Appearance.font.pixelSize.normal
|
|
weight: 350
|
|
}
|
|
color: root.colText
|
|
style: Text.Raised
|
|
styleColor: Appearance.colors.colShadow
|
|
text: Config.options.background.widgets.clock.quote.text
|
|
}
|
|
}
|
|
}
|
|
Item {
|
|
id: statusText
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
implicitHeight: statusTextBg.implicitHeight
|
|
implicitWidth: statusTextBg.implicitWidth
|
|
StyledRectangularShadow {
|
|
target: statusTextBg
|
|
visible: statusTextBg.visible && root.clockStyle === "cookie"
|
|
opacity: statusTextBg.opacity
|
|
}
|
|
Rectangle {
|
|
id: statusTextBg
|
|
anchors.centerIn: parent
|
|
clip: true
|
|
opacity: (safetyStatusText.shown || lockStatusText.shown) ? 1 : 0
|
|
visible: opacity > 0
|
|
implicitHeight: statusTextRow.implicitHeight + 5 * 2
|
|
implicitWidth: statusTextRow.implicitWidth + 5 * 2
|
|
radius: Appearance.rounding.small
|
|
color: ColorUtils.transparentize(Appearance.colors.colSecondaryContainer, root.clockStyle === "cookie" ? 0 : 1)
|
|
|
|
Behavior on implicitWidth {
|
|
animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on implicitHeight {
|
|
animation: Appearance.animation.elementResize.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on opacity {
|
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
|
}
|
|
|
|
RowLayout {
|
|
id: statusTextRow
|
|
anchors.centerIn: parent
|
|
spacing: 14
|
|
Item {
|
|
Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignLeft
|
|
implicitWidth: 1
|
|
}
|
|
ClockStatusText {
|
|
id: safetyStatusText
|
|
shown: root.wallpaperSafetyTriggered
|
|
statusIcon: "hide_image"
|
|
statusText: Translation.tr("Wallpaper safety enforced")
|
|
}
|
|
ClockStatusText {
|
|
id: lockStatusText
|
|
shown: GlobalStates.screenLocked && Config.options.lock.showLockedText
|
|
statusIcon: "lock"
|
|
statusText: Translation.tr("Locked")
|
|
}
|
|
Item {
|
|
Layout.fillWidth: root.textHorizontalAlignment !== Text.AlignRight
|
|
implicitWidth: 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
component ClockText: StyledText {
|
|
Layout.fillWidth: true
|
|
horizontalAlignment: root.textHorizontalAlignment
|
|
font {
|
|
family: Appearance.font.family.expressive
|
|
pixelSize: 20
|
|
weight: Font.DemiBold
|
|
}
|
|
color: root.colText
|
|
style: Text.Raised
|
|
styleColor: Appearance.colors.colShadow
|
|
animateChange: Config.options.background.widgets.clock.digital.animateChange
|
|
}
|
|
component ClockStatusText: Row {
|
|
id: statusTextRow
|
|
property alias statusIcon: statusIconWidget.text
|
|
property alias statusText: statusTextWidget.text
|
|
property bool shown: true
|
|
property color textColor: root.clockStyle === "cookie" ? Appearance.colors.colOnSecondaryContainer : root.colText
|
|
opacity: shown ? 1 : 0
|
|
visible: opacity > 0
|
|
Behavior on opacity {
|
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
|
}
|
|
spacing: 4
|
|
MaterialSymbol {
|
|
id: statusIconWidget
|
|
anchors.verticalCenter: statusTextRow.verticalCenter
|
|
iconSize: Appearance.font.pixelSize.huge
|
|
color: statusTextRow.textColor
|
|
style: Text.Raised
|
|
styleColor: Appearance.colors.colShadow
|
|
}
|
|
ClockText {
|
|
id: statusTextWidget
|
|
color: statusTextRow.textColor
|
|
anchors.verticalCenter: statusTextRow.verticalCenter
|
|
font {
|
|
pixelSize: Appearance.font.pixelSize.large
|
|
weight: Font.Normal
|
|
}
|
|
style: Text.Raised
|
|
styleColor: Appearance.colors.colShadow
|
|
}
|
|
}
|
|
}
|