1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-29 16:02:51 -05:00

media: fix player button control popup things

This commit is contained in:
bbedward
2025-11-24 20:51:05 -05:00
parent fa98a27c90
commit 5288d042ca
4 changed files with 761 additions and 737 deletions

View File

@@ -1,11 +1,7 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Effects
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.Mpris
import Quickshell.Wayland
import qs.Common
import qs.Services
import qs.Widgets
import qs.Modules.DankDash
@@ -27,42 +23,130 @@ DankPopout {
property bool __focusArmed: false
property bool __contentReady: false
property var __mediaTabRef: null
property int __dropdownType: 0
property point __dropdownAnchor: Qt.point(0, 0)
property bool __dropdownRightEdge: false
property var __dropdownPlayer: null
property var __dropdownPlayers: []
function __showVolumeDropdown(pos, rightEdge, player, players) {
__dropdownAnchor = pos;
__dropdownRightEdge = rightEdge;
__dropdownPlayer = player;
__dropdownPlayers = players;
__dropdownType = 1;
}
function __showAudioDevicesDropdown(pos, rightEdge) {
__dropdownAnchor = pos;
__dropdownRightEdge = rightEdge;
__dropdownType = 2;
}
function __showPlayersDropdown(pos, rightEdge, player, players) {
__dropdownAnchor = pos;
__dropdownRightEdge = rightEdge;
__dropdownPlayer = player;
__dropdownPlayers = players;
__dropdownType = 3;
}
function __hideDropdowns() {
__volumeCloseTimer.stop();
__dropdownType = 0;
__mediaTabRef?.resetDropdownStates();
}
function __startCloseTimer() {
__volumeCloseTimer.restart();
}
function __stopCloseTimer() {
__volumeCloseTimer.stop();
}
Timer {
id: __volumeCloseTimer
interval: 400
onTriggered: {
if (__dropdownType === 1) {
__hideDropdowns();
}
}
}
overlayContent: Component {
MediaDropdownOverlay {
dropdownType: root.__dropdownType
anchorPos: root.__dropdownAnchor
isRightEdge: root.__dropdownRightEdge
activePlayer: root.__dropdownPlayer
allPlayers: root.__dropdownPlayers
onCloseRequested: root.__hideDropdowns()
onPanelEntered: root.__stopCloseTimer()
onPanelExited: root.__startCloseTimer()
onVolumeChanged: volume => {
const player = root.__dropdownPlayer;
const isChrome = player?.identity?.toLowerCase().includes("chrome") || player?.identity?.toLowerCase().includes("chromium");
const usePlayerVolume = player && player.volumeSupported && !isChrome;
if (usePlayerVolume) {
player.volume = volume;
} else if (AudioService.sink?.audio) {
AudioService.sink.audio.volume = volume;
}
}
onPlayerSelected: player => {
const currentPlayer = MprisController.activePlayer;
if (currentPlayer && currentPlayer !== player && currentPlayer.canPause) {
currentPlayer.pause();
}
MprisController.activePlayer = player;
root.__hideDropdowns();
}
onDeviceSelected: device => {
root.__hideDropdowns();
}
}
}
function __tryFocusOnce() {
if (!__focusArmed)
return
const win = root.window
return;
const win = root.window;
if (!win || !win.visible)
return
return;
if (!contentLoader.item)
return
return;
if (win.requestActivate)
win.requestActivate()
contentLoader.item.forceActiveFocus(Qt.TabFocusReason)
win.requestActivate();
contentLoader.item.forceActiveFocus(Qt.TabFocusReason);
if (contentLoader.item.activeFocus)
__focusArmed = false
__focusArmed = false;
}
onDashVisibleChanged: {
if (dashVisible) {
__focusArmed = true
__contentReady = !!contentLoader.item
open()
__tryFocusOnce()
__focusArmed = true;
__contentReady = !!contentLoader.item;
open();
__tryFocusOnce();
} else {
__focusArmed = false
__contentReady = false
close()
__focusArmed = false;
__contentReady = false;
__hideDropdowns();
close();
}
}
Connections {
target: contentLoader
function onLoaded() {
__contentReady = true
__contentReady = true;
if (__focusArmed)
__tryFocusOnce()
__tryFocusOnce();
}
}
@@ -71,12 +155,12 @@ DankPopout {
enabled: !!root.window
function onVisibleChanged() {
if (__focusArmed)
__tryFocusOnce()
__tryFocusOnce();
}
}
onBackgroundClicked: {
dashVisible = false
dashVisible = false;
}
content: Component {
@@ -90,7 +174,7 @@ DankPopout {
Component.onCompleted: {
if (root.shouldBeVisible) {
mainContainer.forceActiveFocus()
mainContainer.forceActiveFocus();
}
}
@@ -99,54 +183,54 @@ DankPopout {
function onShouldBeVisibleChanged() {
if (root.shouldBeVisible) {
Qt.callLater(function () {
mainContainer.forceActiveFocus()
})
mainContainer.forceActiveFocus();
});
}
}
}
Keys.onPressed: function (event) {
if (event.key === Qt.Key_Escape) {
root.dashVisible = false
event.accepted = true
return
root.dashVisible = false;
event.accepted = true;
return;
}
if (event.key === Qt.Key_Tab && !(event.modifiers & Qt.ShiftModifier)) {
let nextIndex = root.currentTabIndex + 1
let nextIndex = root.currentTabIndex + 1;
while (nextIndex < tabBar.model.length && tabBar.model[nextIndex] && tabBar.model[nextIndex].isAction) {
nextIndex++
nextIndex++;
}
if (nextIndex >= tabBar.model.length) {
nextIndex = 0
nextIndex = 0;
}
root.currentTabIndex = nextIndex
event.accepted = true
return
root.currentTabIndex = nextIndex;
event.accepted = true;
return;
}
if (event.key === Qt.Key_Backtab || (event.key === Qt.Key_Tab && (event.modifiers & Qt.ShiftModifier))) {
let prevIndex = root.currentTabIndex - 1
let prevIndex = root.currentTabIndex - 1;
while (prevIndex >= 0 && tabBar.model[prevIndex] && tabBar.model[prevIndex].isAction) {
prevIndex--
prevIndex--;
}
if (prevIndex < 0) {
prevIndex = tabBar.model.length - 1
prevIndex = tabBar.model.length - 1;
while (prevIndex >= 0 && tabBar.model[prevIndex] && tabBar.model[prevIndex].isAction) {
prevIndex--
prevIndex--;
}
}
if (prevIndex >= 0) {
root.currentTabIndex = prevIndex
root.currentTabIndex = prevIndex;
}
event.accepted = true
return
event.accepted = true;
return;
}
if (root.currentTabIndex === 2 && wallpaperTab.handleKeyEvent) {
if (wallpaperTab.handleKeyEvent(event)) {
event.accepted = true
return
event.accepted = true;
return;
}
}
}
@@ -171,50 +255,54 @@ DankPopout {
focus: false
activeFocusOnTab: false
nextFocusTarget: {
const item = pages.currentItem
const item = pages.currentItem;
if (!item)
return null
return null;
if (item.focusTarget)
return item.focusTarget
return item
return item.focusTarget;
return item;
}
model: {
let tabs = [{
"icon": "dashboard",
"text": I18n.tr("Overview")
}, {
"icon": "music_note",
"text": I18n.tr("Media")
}, {
"icon": "wallpaper",
"text": I18n.tr("Wallpapers")
}]
let tabs = [
{
"icon": "dashboard",
"text": I18n.tr("Overview")
},
{
"icon": "music_note",
"text": I18n.tr("Media")
},
{
"icon": "wallpaper",
"text": I18n.tr("Wallpapers")
}
];
if (SettingsData.weatherEnabled) {
tabs.push({
"icon": "wb_sunny",
"text": I18n.tr("Weather")
})
"icon": "wb_sunny",
"text": I18n.tr("Weather")
});
}
tabs.push({
"icon": "settings",
"text": I18n.tr("Settings"),
"isAction": true
})
return tabs
"icon": "settings",
"text": I18n.tr("Settings"),
"isAction": true
});
return tabs;
}
onTabClicked: function (index) {
root.currentTabIndex = index
root.currentTabIndex = index;
}
onActionTriggered: function (index) {
let settingsIndex = SettingsData.weatherEnabled ? 4 : 3
let settingsIndex = SettingsData.weatherEnabled ? 4 : 3;
if (index === settingsIndex) {
dashVisible = false
settingsModal.show()
dashVisible = false;
settingsModal.show();
}
}
}
@@ -229,14 +317,14 @@ DankPopout {
width: parent.width
implicitHeight: {
if (currentIndex === 0)
return overviewTab.implicitHeight
return overviewTab.implicitHeight;
if (currentIndex === 1)
return mediaTab.implicitHeight
return mediaTab.implicitHeight;
if (currentIndex === 2)
return wallpaperTab.implicitHeight
return wallpaperTab.implicitHeight;
if (SettingsData.weatherEnabled && currentIndex === 3)
return weatherTab.implicitHeight
return overviewTab.implicitHeight
return weatherTab.implicitHeight;
return overviewTab.implicitHeight;
}
currentIndex: root.currentTabIndex
@@ -244,24 +332,42 @@ DankPopout {
id: overviewTab
onCloseDash: {
root.dashVisible = false
root.dashVisible = false;
}
onSwitchToWeatherTab: {
if (SettingsData.weatherEnabled) {
tabBar.currentIndex = 3
tabBar.tabClicked(3)
tabBar.currentIndex = 3;
tabBar.tabClicked(3);
}
}
onSwitchToMediaTab: {
tabBar.currentIndex = 1
tabBar.tabClicked(1)
tabBar.currentIndex = 1;
tabBar.tabClicked(1);
}
}
MediaPlayerTab {
id: mediaTab
targetScreen: root.screen
popoutX: root.alignedX
popoutY: root.alignedY
popoutWidth: root.alignedWidth
popoutHeight: root.alignedHeight
contentOffsetY: Theme.spacingM + 48 + Theme.spacingS + Theme.spacingXS
Component.onCompleted: root.__mediaTabRef = this
onShowVolumeDropdown: (pos, screen, rightEdge, player, players) => {
root.__showVolumeDropdown(pos, rightEdge, player, players);
}
onShowAudioDevicesDropdown: (pos, screen, rightEdge) => {
root.__showAudioDevicesDropdown(pos, rightEdge);
}
onShowPlayersDropdown: (pos, screen, rightEdge, player, players) => {
root.__showPlayersDropdown(pos, rightEdge, player, players);
}
onHideDropdowns: root.__hideDropdowns()
onVolumeButtonExited: root.__startCloseTimer()
}
WallpaperTab {