1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-14 09:42:10 -04:00

osd: reverse media playback icons and handle screen changes

This commit is contained in:
bbedward
2026-02-13 15:43:46 -05:00
parent 242660c51d
commit 3a7430f6da
3 changed files with 64 additions and 9 deletions

View File

@@ -9,6 +9,20 @@ Singleton {
property var currentOSDsByScreen: ({}) property var currentOSDsByScreen: ({})
Connections {
target: Quickshell
function onScreensChanged() {
const activeNames = {};
for (let i = 0; i < Quickshell.screens.length; i++)
activeNames[Quickshell.screens[i].name] = true;
for (const screenName in osdManager.currentOSDsByScreen) {
if (activeNames[screenName])
continue;
osdManager.currentOSDsByScreen[screenName] = null;
}
}
}
function showOSD(osd) { function showOSD(osd) {
if (!osd || !osd.screen) if (!osd || !osd.screen)
return; return;

View File

@@ -16,18 +16,28 @@ DankOSD {
autoHideInterval: 3000 autoHideInterval: 3000
enableMouseInteraction: true enableMouseInteraction: true
function getPlaybackIcon() { property string _displayIcon: "music_note"
if (!player)
return "music_note"; function updatePlaybackIcon() {
if (!player) {
_displayIcon = "music_note";
iconDebounce.stop();
return;
}
let icon = "music_note";
switch (player.playbackState) { switch (player.playbackState) {
case MprisPlaybackState.Playing: case MprisPlaybackState.Playing:
return "play_arrow"; icon = "pause";
break;
case MprisPlaybackState.Paused: case MprisPlaybackState.Paused:
case MprisPlaybackState.Stopped: case MprisPlaybackState.Stopped:
return "pause"; icon = "play_arrow";
default: break;
return "music_note";
} }
if (icon === _displayIcon)
return;
iconDebounce.pendingIcon = icon;
iconDebounce.restart();
} }
function togglePlaying() { function togglePlaying() {
@@ -38,6 +48,13 @@ DankOSD {
property bool _pendingShow: false property bool _pendingShow: false
Timer {
id: iconDebounce
interval: 150
property string pendingIcon: "music_note"
onTriggered: root._displayIcon = pendingIcon
}
Image { Image {
id: artPreloader id: artPreloader
source: TrackArtService._bgArtSource source: TrackArtService._bgArtSource
@@ -86,6 +103,7 @@ DankOSD {
if (!SettingsData.osdMediaPlaybackEnabled) if (!SettingsData.osdMediaPlaybackEnabled)
return; return;
root.updatePlaybackIcon();
TrackArtService.loadArtwork(player.trackArtUrl); TrackArtService.loadArtwork(player.trackArtUrl);
if (!player.trackArtUrl || player.trackArtUrl === "") { if (!player.trackArtUrl || player.trackArtUrl === "") {
@@ -202,7 +220,7 @@ DankOSD {
DankIcon { DankIcon {
anchors.centerIn: parent anchors.centerIn: parent
name: getPlaybackIcon() name: root._displayIcon
size: Theme.iconSize size: Theme.iconSize
color: playPauseButton.containsMouse ? Theme.primary : Theme.surfaceText color: playPauseButton.containsMouse ? Theme.primary : Theme.surfaceText
} }
@@ -272,7 +290,7 @@ DankOSD {
DankIcon { DankIcon {
anchors.centerIn: parent anchors.centerIn: parent
name: getPlaybackIcon() name: root._displayIcon
size: Theme.iconSize size: Theme.iconSize
color: playPauseButtonVert.containsMouse ? Theme.primary : Theme.surfaceText color: playPauseButtonVert.containsMouse ? Theme.primary : Theme.surfaceText
} }

View File

@@ -66,6 +66,29 @@ PanelWindow {
screen: modelData screen: modelData
visible: false visible: false
Connections {
target: Quickshell
function onScreensChanged() {
if (!root.visible && !root.shouldBeVisible)
return;
const currentScreenName = root.screen?.name;
if (!currentScreenName) {
root.hide();
return;
}
for (let i = 0; i < Quickshell.screens.length; i++) {
if (Quickshell.screens[i].name === currentScreenName)
return;
}
root.shouldBeVisible = false;
root.visible = false;
hideTimer.stop();
closeTimer.stop();
osdHidden();
}
}
WlrLayershell.layer: WlrLayershell.Overlay WlrLayershell.layer: WlrLayershell.Overlay
WlrLayershell.exclusiveZone: -1 WlrLayershell.exclusiveZone: -1
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None WlrLayershell.keyboardFocus: WlrKeyboardFocus.None