diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index 6267ecaa..216b03d9 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -185,7 +185,7 @@ Singleton { property bool waveProgressEnabled: true property bool scrollTitleEnabled: true property bool audioVisualizerEnabled: true - property bool audioScrollEnabled: true + property string audioScrollMode: "volume" property bool clockCompactMode: false property bool focusedWindowCompactMode: false property bool runningAppsCompactMode: true diff --git a/quickshell/Common/settings/SettingsSpec.js b/quickshell/Common/settings/SettingsSpec.js index be204ab0..80e74290 100644 --- a/quickshell/Common/settings/SettingsSpec.js +++ b/quickshell/Common/settings/SettingsSpec.js @@ -95,7 +95,7 @@ var SPEC = { waveProgressEnabled: { def: true }, scrollTitleEnabled: { def: true }, audioVisualizerEnabled: { def: true }, - audioScrollEnabled: { def: true }, + audioScrollMode: { def: "volume" }, clockCompactMode: { def: false }, focusedWindowCompactMode: { def: false }, runningAppsCompactMode: { def: true }, diff --git a/quickshell/Modules/DankBar/Widgets/Media.qml b/quickshell/Modules/DankBar/Widgets/Media.qml index 2f2d5b16..a20cf9ed 100644 --- a/quickshell/Modules/DankBar/Widgets/Media.qml +++ b/quickshell/Modules/DankBar/Widgets/Media.qml @@ -54,38 +54,67 @@ BasePill { property real touchpadThreshold: 100 onWheel: function (wheelEvent) { - if (!usePlayerVolume) - return; - if (!SettingsData.audioScrollEnabled) + if (SettingsData.audioScrollMode === "nothing") return; - wheelEvent.accepted = true; + if (SettingsData.audioScrollMode === "volume") { + if (!usePlayerVolume) + return; - const deltaY = wheelEvent.angleDelta.y; - const isMouseWheelY = Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; + wheelEvent.accepted = true; - const currentVolume = activePlayer.volume * 100; + const deltaY = wheelEvent.angleDelta.y; + const isMouseWheelY = Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; - let newVolume = currentVolume; - if (isMouseWheelY) { - if (deltaY > 0) { - newVolume = Math.min(100, currentVolume + 5); - } else if (deltaY < 0) { - newVolume = Math.max(0, currentVolume - 5); - } - } else { - scrollAccumulatorY += deltaY; - if (Math.abs(scrollAccumulatorY) >= touchpadThreshold) { - if (scrollAccumulatorY > 0) { - newVolume = Math.min(100, currentVolume + 1); - } else { - newVolume = Math.max(0, currentVolume - 1); + const currentVolume = activePlayer.volume * 100; + + let newVolume = currentVolume; + if (isMouseWheelY) { + if (deltaY > 0) { + newVolume = Math.min(100, currentVolume + 5); + } else if (deltaY < 0) { + newVolume = Math.max(0, currentVolume - 5); + } + } else { + scrollAccumulatorY += deltaY; + if (Math.abs(scrollAccumulatorY) >= touchpadThreshold) { + if (scrollAccumulatorY > 0) { + newVolume = Math.min(100, currentVolume + 1); + } else { + newVolume = Math.max(0, currentVolume - 1); + } + scrollAccumulatorY = 0; + } + } + + activePlayer.volume = newVolume / 100; + } else if (SettingsData.audioScrollMode === "song") { + if (!activePlayer) + return; + + wheelEvent.accepted = true; + + const deltaY = wheelEvent.angleDelta.y; + const isMouseWheelY = Math.abs(deltaY) >= 120 && (Math.abs(deltaY) % 120) === 0; + + if (isMouseWheelY) { + if (deltaY > 0) { + activePlayer.previous(); + } else { + activePlayer.next(); + } + } else { + scrollAccumulatorY += deltaY; + if (Math.abs(scrollAccumulatorY) >= touchpadThreshold) { + if (scrollAccumulatorY > 0) { + activePlayer.previous(); + } else { + activePlayer.next(); + } + scrollAccumulatorY = 0; } - scrollAccumulatorY = 0; } } - - activePlayer.volume = newVolume / 100; } content: Component { diff --git a/quickshell/Modules/Settings/MediaPlayerTab.qml b/quickshell/Modules/Settings/MediaPlayerTab.qml index 32aebefd..a8f30548 100644 --- a/quickshell/Modules/Settings/MediaPlayerTab.qml +++ b/quickshell/Modules/Settings/MediaPlayerTab.qml @@ -46,11 +46,24 @@ Item { onToggled: checked => SettingsData.set("audioVisualizerEnabled", checked) } - SettingsToggleRow { + SettingsDropdownRow { + property var scrollOpts: { + "Change Volume": "volume", + "Change Song": "song", + "Nothing": "nothing" + } + text: I18n.tr("Scroll Wheel") - description: I18n.tr("Scroll on widget changes media volume") - checked: SettingsData.audioScrollEnabled - onToggled: checked => SettingsData.set("audioScrollEnabled", checked) + description: I18n.tr("Scroll wheel behavior on media widget") + settingKey: "audioScrollMode" + tags: ["media", "music", "scroll"] + options: Object.keys(scrollOpts).sort() + currentValue: { + Object.keys(scrollOpts).find(key => scrollOpts[key] === SettingsData.audioScrollMode) ?? "volume" + } + onValueChanged: value => { + SettingsData.set("audioScrollMode", scrollOpts[value]) + } } } } diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index c7dde9a8..503a5edc 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -2549,6 +2549,27 @@ "icon": "lock", "description": "If the field is hidden, it will appear as soon as a key is pressed." }, + { + "section": "lockBeforeSuspend", + "label": "Lock before suspend", + "tabIndex": 11, + "category": "Lock Screen", + "keywords": [ + "automatic", + "automatically", + "before", + "lock", + "login", + "password", + "prepares", + "screen", + "security", + "sleep", + "suspend", + "system" + ], + "description": "Automatically lock the screen when the system prepares to suspend" + }, { "section": "lockScreenShowPasswordField", "label": "Show Password Field", @@ -2981,6 +3002,7 @@ "playback", "player", "progress", + "scroll", "settings", "spotify", "statusbar", @@ -2991,6 +3013,24 @@ "icon": "music_note", "description": "Use animated wave progress bars for media playback" }, + { + "section": "audioScrollMode", + "label": "Scroll Wheel", + "tabIndex": 16, + "category": "Media Player", + "keywords": [ + "behavior", + "media", + "mpris", + "music", + "player", + "scroll", + "spotify", + "wheel", + "widget" + ], + "description": "Scroll wheel behavior on media widget" + }, { "section": "notificationTimeoutCritical", "label": "Critical Priority", @@ -3466,27 +3506,6 @@ "icon": "schedule", "description": "Gradually fade the screen before locking with a configurable grace period" }, - { - "section": "lockBeforeSuspend", - "label": "Lock before suspend", - "tabIndex": 21, - "category": "Power & Sleep", - "keywords": [ - "automatically", - "before", - "energy", - "lock", - "power", - "prepares", - "screen", - "security", - "shutdown", - "sleep", - "suspend", - "system" - ], - "description": "Automatically lock the screen when the system prepares to suspend" - }, { "section": "powerConfirmation", "label": "Power Action Confirmation",