blob: 8ed478c4634f767385a1d27c4d54ef562734649d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Qt5Compat.GraphicalEffects
import Quickshell
import Quickshell.Widgets
import Quickshell.Services.Mpris
import qs.services as Services
import qs.config
import qs.components
Item {
id: root
readonly property MprisPlayer activePlayer: Services.Mpris.activePlayer
readonly property real progress: (activePlayer?.positionSupported && activePlayer?.lengthSupported && activePlayer.length > 0) ? activePlayer.position / activePlayer.length : 0
readonly property string cleanedTitle: cleanMusicTitle(activePlayer?.trackTitle)
function cleanMusicTitle(title) {
if (!title)
return "";
title = title.replace(/\s*\([^)]*\)/g, " ");
title = title.replace(/\s*\[[^\]]*\]/g, " ");
title = title.replace(/\s*\{[^\}]*\}/g, " ");
title = title.replace(/\s*【[^】]*】/g, " ");
title = title.replace(/\s*《[^》]*》/g, " ");
title = title.replace(/\s*「[^」]*」/g, " ");
title = title.replace(/\s*『[^』]*』/g, " ");
return title.trim();
}
implicitWidth: activePlayer ? rect.implicitWidth - General.rectMargin / 1.2 : 0
height: Bar.height + General.rectMargin / 1.5
opacity: activePlayer ? 1 : 0
Rectangle {
id: rect
anchors.verticalCenter: parent.verticalCenter
implicitWidth: layout.width + General.rectMargin * 4
height: parent.height - General.rectMargin
radius: Style.rounding.smaller
color: "transparent"
ProgressBar {
id: pBar
anchors.fill: parent
from: 0
to: 1
value: root.progress
background: Rectangle {
anchors.fill: parent
color: WallustColors.color4
radius: Style.rounding.smaller
}
contentItem: Item {
Rectangle {
width: pBar.visualPosition * parent.width
height: parent.height
color: WallustColors.color3
radius: Style.rounding.smaller
Behavior on width {
NumberAnimation {
duration: General.animateDuration / 2
}
}
}
}
}
RowLayout {
id: layout
anchors.centerIn: parent
spacing: Bar.resourceIconTextSpacing / 1.5
Item {
Layout.preferredWidth: childrenRect.width
Layout.preferredHeight: childrenRect.height
width: Bar.appIconSize
height: Bar.appIconSize
Image {
id: image
anchors.fill: parent
source: activePlayer?.trackArtUrl
fillMode: Image.PreserveAspectFit
visible: false
}
Rectangle {
id: mask
anchors.fill: parent
radius: 6
visible: false
}
OpacityMask {
anchors.fill: parent
source: image
maskSource: mask
}
}
IText {
animate: true
text: root.cleanedTitle
}
}
}
Behavior on opacity {
NumberAnimation {
duration: General.animateDuration / 4
}
}
Behavior on implicitWidth {
ISpringAnimation {
spring: General.springAnimationSpring * 2
damping: General.springAnimationDamping * 1.3
}
}
}
|