153 lines
4.0 KiB
QML
153 lines
4.0 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Wayland
|
|
import Quickshell.Services.Mpris
|
|
|
|
import "Healthbar"
|
|
|
|
PanelWindow {
|
|
id: healthbarWindow
|
|
|
|
anchors {
|
|
left: true
|
|
right: true
|
|
bottom: true
|
|
}
|
|
|
|
WlrLayershell.layer: WlrLayer.Top
|
|
WlrLayershell.focusable: false
|
|
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
|
|
WlrLayershell.namespace: "deltarune-quickshell-bottom"
|
|
|
|
visible: ShellStateManager.shellOpen
|
|
exclusionMode: ExclusionMode.Ignore
|
|
aboveWindows: true
|
|
focusable: false
|
|
|
|
mask: Region {}
|
|
|
|
implicitHeight: 137
|
|
color: "#000000"
|
|
|
|
property string currentSongText: "♪ NO SONG"
|
|
|
|
function formatSong(player) {
|
|
if (!player)
|
|
return "";
|
|
|
|
const title = String(player.trackTitle || "");
|
|
if (title.length === 0)
|
|
return "";
|
|
|
|
const artist = String(player.trackArtist || "");
|
|
const album = String(player.trackAlbum || "");
|
|
const core = artist.length > 0 ? (artist + " - " + title) : title;
|
|
return album.length > 0 ? (core + " (" + album + ")") : core;
|
|
}
|
|
|
|
function updateSongText() {
|
|
let playingSong = "";
|
|
let fallbackSong = "";
|
|
|
|
for (let i = 0; i < mprisRepeater.count; i++) {
|
|
const item = mprisRepeater.itemAt(i);
|
|
if (!item || !item.player)
|
|
continue;
|
|
|
|
const candidate = formatSong(item.player);
|
|
if (candidate.length === 0)
|
|
continue;
|
|
|
|
if (fallbackSong.length === 0)
|
|
fallbackSong = candidate;
|
|
|
|
if (item.player.isPlaying) {
|
|
playingSong = candidate;
|
|
break;
|
|
}
|
|
}
|
|
|
|
const chosen = playingSong.length > 0 ? playingSong : fallbackSong;
|
|
currentSongText = chosen.length > 0 ? ("♪ " + chosen) : "♪ NO SONG";
|
|
}
|
|
|
|
Repeater {
|
|
id: mprisRepeater
|
|
model: Mpris.players
|
|
|
|
delegate: Item {
|
|
required property var modelData
|
|
property var player: modelData
|
|
visible: false
|
|
|
|
Connections {
|
|
target: player
|
|
function onTrackChanged() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
function onPostTrackChanged() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
function onPlaybackStateChanged() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: Mpris.players
|
|
ignoreUnknownSignals: true
|
|
function onCountChanged() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
function onModelReset() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
function onRowsInserted() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
function onRowsRemoved() {
|
|
healthbarWindow.updateSongText();
|
|
}
|
|
}
|
|
|
|
Healthbar {}
|
|
|
|
Text {
|
|
x: parent.width - width - 24 + 1
|
|
y: parent.height - height - 8 + 1
|
|
width: Math.floor(parent.width * 0.45)
|
|
elide: Text.ElideRight
|
|
color: "#04047c"
|
|
text: healthbarWindow.currentSongText
|
|
font.family: "8bitoperator JVE"
|
|
font.pixelSize: 28
|
|
font.letterSpacing: 1
|
|
renderType: Text.NativeRendering
|
|
font.hintingPreference: Font.PreferNoHinting
|
|
smooth: false
|
|
antialiasing: false
|
|
horizontalAlignment: Text.AlignRight
|
|
}
|
|
|
|
Text {
|
|
x: parent.width - width - 24
|
|
y: parent.height - height - 8
|
|
width: Math.floor(parent.width * 0.45)
|
|
elide: Text.ElideRight
|
|
color: "#ffffff"
|
|
text: healthbarWindow.currentSongText
|
|
font.family: "8bitoperator JVE"
|
|
font.pixelSize: 28
|
|
font.letterSpacing: 1
|
|
renderType: Text.NativeRendering
|
|
font.hintingPreference: Font.PreferNoHinting
|
|
smooth: false
|
|
antialiasing: false
|
|
horizontalAlignment: Text.AlignRight
|
|
}
|
|
|
|
Component.onCompleted: updateSongText()
|
|
}
|