mirror of
https://github.com/kossLAN/dots.git
synced 2025-11-05 06:59:50 -05:00
Initial commit
This commit is contained in:
commit
05cd51b54e
148 changed files with 10112 additions and 0 deletions
177
bar/mpris/Card.qml
Normal file
177
bar/mpris/Card.qml
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import Quickshell
|
||||
import "../.."
|
||||
import "../../widgets" as Widgets
|
||||
|
||||
Rectangle {
|
||||
required property var player
|
||||
|
||||
radius: 5
|
||||
color: "transparent"
|
||||
implicitHeight: 220
|
||||
|
||||
RowLayout {
|
||||
id: cardLayout
|
||||
spacing: 15
|
||||
|
||||
anchors {
|
||||
fill: parent
|
||||
leftMargin: 10
|
||||
rightMargin: 10
|
||||
topMargin: 10 // Added top margin for better spacing
|
||||
bottomMargin: 10 // Added bottom margin for better spacing
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: mprisImage
|
||||
color: "transparent"
|
||||
radius: 10
|
||||
width: 200
|
||||
height: 200
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
visible: true
|
||||
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
source: player.trackArtUrl
|
||||
sourceSize.width: 1024
|
||||
sourceSize.height: 1024
|
||||
fillMode: Image.PreserveAspectFit
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: OpacityMask {
|
||||
source: Rectangle {
|
||||
width: mprisImage.width
|
||||
height: mprisImage.height
|
||||
radius: 10
|
||||
color: "white"
|
||||
}
|
||||
|
||||
maskSource: Rectangle {
|
||||
width: mprisImage.width
|
||||
height: mprisImage.height
|
||||
radius: 10
|
||||
color: "black"
|
||||
}
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: DropShadow {
|
||||
transparentBorder: true
|
||||
spread: 0.02
|
||||
samples: 25
|
||||
color: "#80000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
spacing: 5
|
||||
|
||||
Text {
|
||||
text: player.trackArtist
|
||||
color: "white"
|
||||
font.pointSize: 13
|
||||
font.bold: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
Text {
|
||||
text: player.trackTitle
|
||||
color: "white"
|
||||
font.pointSize: 13
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: 6
|
||||
|
||||
ColorQuantizer {
|
||||
id: colorQuantizer
|
||||
source: Qt.resolvedUrl(Media.trackedPlayer?.trackArtUrl ?? "")
|
||||
depth: 0
|
||||
rescaleSize: 64
|
||||
}
|
||||
|
||||
Text {
|
||||
text: timeStr(player.position)
|
||||
color: "white"
|
||||
|
||||
font {
|
||||
pointSize: 9
|
||||
bold: true
|
||||
}
|
||||
}
|
||||
|
||||
Widgets.RoundSlider {
|
||||
from: 0
|
||||
to: 1
|
||||
accentColor: colorQuantizer.colors[0]
|
||||
//value: root.node.audio.volume
|
||||
//onValueChanged: node.audio.volume = value
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 16
|
||||
}
|
||||
|
||||
Text {
|
||||
text: timeStr(player.length)
|
||||
color: "white"
|
||||
|
||||
font {
|
||||
pointSize: 9
|
||||
bold: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Music Controls
|
||||
RowLayout {
|
||||
spacing: 2
|
||||
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
||||
|
||||
Widgets.IconButton {
|
||||
implicitSize: 36
|
||||
activeRectangle: false
|
||||
padding: 4
|
||||
source: "root:resources/mpris/previous.svg"
|
||||
onClicked: player.previous()
|
||||
}
|
||||
|
||||
Widgets.IconButton {
|
||||
implicitSize: 36
|
||||
activeRectangle: false
|
||||
padding: 4
|
||||
source: player?.isPlaying ? "root:resources/mpris/pause.svg" : "root:resources/mpris/play.svg"
|
||||
onClicked: {
|
||||
if (!player.canPlay)
|
||||
return;
|
||||
player.isPlaying ? player.pause() : player.play();
|
||||
}
|
||||
}
|
||||
|
||||
Widgets.IconButton {
|
||||
implicitSize: 36
|
||||
activeRectangle: false
|
||||
padding: 4
|
||||
source: "root:resources/mpris/next.svg"
|
||||
onClicked: player.next()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function timeStr(time: int): string {
|
||||
const seconds = time % 60;
|
||||
const minutes = Math.floor(time / 60);
|
||||
|
||||
return `${minutes}:${seconds.toString().padStart(2, '0')}`;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue