From dcaa49cddc1a075eb2825637b7681e61223ba45d Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Mon, 11 Aug 2025 01:38:37 +1000 Subject: [PATCH] lock: add media + some fixes --- assets/shaders/opacitymask.frag | 19 ++++++ assets/shaders/opacitymask.frag.qsb | Bin 0 -> 1337 bytes modules/lock/Center.qml | 5 +- modules/lock/Content.qml | 12 ++++ modules/lock/LockSurface.qml | 1 + modules/lock/Media.qml | 95 ++++++++++++++++++++++++++++ 6 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 assets/shaders/opacitymask.frag create mode 100644 assets/shaders/opacitymask.frag.qsb create mode 100644 modules/lock/Media.qml diff --git a/assets/shaders/opacitymask.frag b/assets/shaders/opacitymask.frag new file mode 100644 index 00000000..94a80b8a --- /dev/null +++ b/assets/shaders/opacitymask.frag @@ -0,0 +1,19 @@ +#version 440 + +layout(location = 0) in vec2 qt_TexCoord0; +layout(location = 0) out vec4 fragColor; + +layout(std140, binding = 0) uniform buf { + // qt_Matrix and qt_Opacity must always be both present + // if the built-in vertex shader is used. + mat4 qt_Matrix; + float qt_Opacity; +}; + +layout(binding = 1) uniform sampler2D source; +layout(binding = 2) uniform sampler2D maskSource; + +void main() +{ + fragColor = texture(source, qt_TexCoord0.st) * (texture(maskSource, qt_TexCoord0.st).a) * qt_Opacity; +} diff --git a/assets/shaders/opacitymask.frag.qsb b/assets/shaders/opacitymask.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..7bf97c280f5b98e09f7e83c6dc2c678d7901e9ec GIT binary patch literal 1337 zcmV-91;+XS01%LPoZVM#Pa8)N9@`KXLtdaHAx%gwp^fYoxyEs-s1Aq<(l$~e+8Cvk zEOa`~XLG^6bME$tQN&;9$Nq+X>Hq7Os-4-L^R3S|L8>ZMJ#_eH_L*m9pPk*a0bmXQ zX7JA7y#jARfC>BHzyNl@$G-qtP{FY*-tZS+FySJCC1_)S1sxgOmEns1gQ1t;5F!kx zClemQ20ra-n5?8%^}WOt0;yfB5@4PY+Zy^>{IJX+d(g)q8$$$~a?0(vwrLmTT!0X# z5n(nPRRJjSBr=l%mZ67PLO6!T#GveX*)Dor;?Gv%%KethuH~tydH4t(vUd^lQJM1? zLZ9EgXuK$gqE)UvrWJ)NkdrtXy9#-!1>HT%^~gUbIY`W$^yi5KpU8igbC7)*KkqY7 zY(LP(7gP9U#%DD z9M4Hr==ladk=O>_HxZv_@n@uO29*YhC4ZgmIriPcrvl^CtrFX}5lPKkV7>+R&odv{ zm)S@8uQFej@z)?;JB25Ek$rLeGRI#>dxhsh*B5Nx;(AxmzQc2&`Q2sh?{H4acb9Xo zGC$e(*hl;Z^JkdffTS-d{sCi&?<-uREF}AnYWM>^w9cF8B@M3d{5N^-OFX}y5S5o} zrZ7ud%yph~9CITTbCWUT{}Fvu%O~uo8h&BiZRV%3Z_r1zukn2EGe5w!A`bN9!TcSSZc0F_! zLJ>r^Fb<=3;eEltt7nOt@m82GEfKhby7Wl~a_;pl+ZCtv!Wo7}p4;|=9>p5wqYcfY z5`D3u6IFkhcTM2A5!(7 zX-darHPJLDY}BCb1X7Bxjlk)+p>TrYVI{6H@ZXs|>kZZ@wX6+ll)@b9j8T~C*l)K( zM-=T!Nf(}xTucgDE2-7kkK5&`%CN=S>-7lYZKx$^2unDIsX!*Liw+J6JkFX3H^RIz z#+(2rvQq$dpCw$IHPIJe9~f%^?%Bo<&tJVZcLF~Q&F5Y}5^+C_2Vv&@XFu=k?Y-Kq zD7hwZ>_s9)qLqXUjo0SB6?7cI6tWWuU`}sGC2v_NQ%tEn-kphN!;ojSxW9Be@^MR2C? zNBYXLknG3o?`y7SccYeLJncEc>YDf!yXziq6%v2w_F7-kzw*%*9$X=v<(}1ZLKM(3 zWYna$_;B}L=!E2OsFj1R3UNPmecMaIiMr=_T59!F zj0y2u3P#4OdT_9A*uICRCnx)m+6l+isV2)>AHI)T>L?hVFU@9rrcS|WCq{zZkl6TO zP*e>xNDTHeUyMm;(m3KO4PRgJgz4Ti-k+%j@>4w)?@Yx})CyQfZOZ3tOpZvEGafbh vMWQvdulkr8c~+LqZ { + if (!root.lock.locked) + return; + if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) inputField.placeholder.animate = false; diff --git a/modules/lock/Content.qml b/modules/lock/Content.qml index b7d3ddbc..176dc8e5 100644 --- a/modules/lock/Content.qml +++ b/modules/lock/Content.qml @@ -36,9 +36,21 @@ RowLayout { Layout.fillWidth: true Layout.fillHeight: true + radius: Appearance.rounding.small + color: Colours.tPalette.m3surfaceContainer + } + + StyledClippingRect { + Layout.fillWidth: true + implicitHeight: media.implicitHeight + bottomLeftRadius: Appearance.rounding.large radius: Appearance.rounding.small color: Colours.tPalette.m3surfaceContainer + + Media { + id: media + } } } diff --git a/modules/lock/LockSurface.qml b/modules/lock/LockSurface.qml index 3fe44d3b..a5120707 100644 --- a/modules/lock/LockSurface.qml +++ b/modules/lock/LockSurface.qml @@ -62,6 +62,7 @@ WlSessionLockSurface { target: lockIcon property: "opacity" to: 1 + duration: Appearance.anim.durations.large } Anim { target: background diff --git a/modules/lock/Media.qml b/modules/lock/Media.qml new file mode 100644 index 00000000..055ed624 --- /dev/null +++ b/modules/lock/Media.qml @@ -0,0 +1,95 @@ +pragma ComponentBehavior: Bound + +import qs.components +import qs.services +import qs.config +import Quickshell +import QtQuick +import QtQuick.Layouts + +Item { + id: root + + anchors.left: parent.left + anchors.right: parent.right + implicitHeight: layout.implicitHeight + + Image { + anchors.fill: parent + source: Players.active?.trackArtUrl ?? null + + asynchronous: true + fillMode: Image.PreserveAspectCrop + sourceSize.width: width + sourceSize.height: height + + layer.enabled: true + layer.effect: ShaderEffect { + required property Item source + readonly property Item maskSource: mask + + fragmentShader: `file://${Quickshell.shellDir}/assets/shaders/opacitymask.frag.qsb` + } + } + + Rectangle { + id: mask + + anchors.fill: parent + layer.enabled: true + visible: false + + gradient: Gradient { + orientation: Gradient.Horizontal + + GradientStop { + position: 0 + color: Qt.rgba(0, 0, 0, 0.5) + } + GradientStop { + position: 0.4 + color: Qt.rgba(0, 0, 0, 0.2) + } + GradientStop { + position: 0.8 + color: Qt.rgba(0, 0, 0, 0) + } + } + } + + ColumnLayout { + id: layout + + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: Appearance.padding.large + + StyledText { + Layout.topMargin: Appearance.padding.large + text: qsTr("Now playing") + color: Colours.palette.m3outline + } + + StyledText { + Layout.fillWidth: true + text: Players.active?.trackArtist ?? qsTr("No media") + color: Colours.palette.m3primary + horizontalAlignment: Text.AlignHCenter + font.pointSize: Appearance.font.size.large + font.weight: 500 + elide: Text.ElideRight + } + + StyledText { + Layout.fillWidth: true + text: Players.active?.trackTitle ?? qsTr("No media") + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideRight + } + + RowLayout { + Layout.fillWidth: true + Layout.bottomMargin: Appearance.padding.large + } + } +}