diff --git a/build-config/tests/play-mode-random.test.mjs b/build-config/tests/play-mode-random.test.mjs new file mode 100644 index 0000000000..1126627347 --- /dev/null +++ b/build-config/tests/play-mode-random.test.mjs @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict' + +import { resolvePlayModeSelection } from '../../src/renderer/core/player/playMode.mjs' + +const run = (name, fn) => { + try { + fn() + console.log(`PASS ${name}`) + } catch (err) { + console.error(`FAIL ${name}`) + throw err + } +} + +run('switching to random requests random queue reset', () => { + assert.deepEqual(resolvePlayModeSelection('listLoop', 'random'), { + nextMode: 'random', + shouldResetRandomQueue: true, + }) +}) + +run('clicking random again keeps mode and requests random queue reset', () => { + assert.deepEqual(resolvePlayModeSelection('random', 'random'), { + nextMode: 'random', + shouldResetRandomQueue: true, + }) +}) + +run('non-random repeated click does nothing special', () => { + assert.deepEqual(resolvePlayModeSelection('listLoop', 'listLoop'), { + nextMode: 'listLoop', + shouldResetRandomQueue: false, + }) +}) diff --git a/src/renderer/components/common/TogglePlayModeBtn.vue b/src/renderer/components/common/TogglePlayModeBtn.vue index ab5f2e5055..b45a553747 100644 --- a/src/renderer/components/common/TogglePlayModeBtn.vue +++ b/src/renderer/components/common/TogglePlayModeBtn.vue @@ -74,7 +74,7 @@ diff --git a/src/renderer/core/player/action.ts b/src/renderer/core/player/action.ts index 88995d0a99..274fae5390 100644 --- a/src/renderer/core/player/action.ts +++ b/src/renderer/core/player/action.ts @@ -282,6 +282,15 @@ export const resetRandomNextMusicInfo = () => { } } +export const resetRandomPlayQueue = () => { + resetRandomNextMusicInfo() + clearPlayedList() + + if (!playMusicInfo.musicInfo || playMusicInfo.isTempPlay) return + + addPlayedList({ ...(playMusicInfo as LX.Player.PlayMusicInfo) }) +} + export const getNextPlayMusicInfo = async(): Promise => { if (tempPlayList.length) { // 如果稍后播放列表存在歌曲则直接播放改列表的歌曲 const playMusicInfo = tempPlayList[0] diff --git a/src/renderer/core/player/playMode.mjs b/src/renderer/core/player/playMode.mjs new file mode 100644 index 0000000000..44030b4318 --- /dev/null +++ b/src/renderer/core/player/playMode.mjs @@ -0,0 +1,6 @@ +export const resolvePlayModeSelection = (currentMode, selectedMode) => { + return { + nextMode: selectedMode, + shouldResetRandomQueue: selectedMode === 'random', + } +} diff --git a/src/renderer/utils/compositions/useNextTogglePlay.ts b/src/renderer/utils/compositions/useNextTogglePlay.ts index 37047eaecf..676a3cfff3 100644 --- a/src/renderer/utils/compositions/useNextTogglePlay.ts +++ b/src/renderer/utils/compositions/useNextTogglePlay.ts @@ -3,6 +3,8 @@ import { computed, } from '@common/utils/vueTools' import { useI18n } from '@renderer/plugins/i18n' +import { resetRandomPlayQueue } from '@renderer/core/player' +import { resolvePlayModeSelection } from '@renderer/core/player/playMode.mjs' // const playNextModes = [ // 'listLoop', @@ -25,10 +27,9 @@ export default () => { }) const toggleNextPlayMode = (mode: LX.AppSetting['player.togglePlayMethod']) => { - if (mode == appSetting['player.togglePlayMethod']) return - // let index = playNextModes.indexOf(appSetting['player.togglePlayMethod']) - // if (++index >= playNextModes.length) index = 0 - setTogglePlayMode(mode) + const { nextMode, shouldResetRandomQueue } = resolvePlayModeSelection(appSetting['player.togglePlayMethod'], mode) + if (nextMode != appSetting['player.togglePlayMethod']) setTogglePlayMode(nextMode) + if (shouldResetRandomQueue) resetRandomPlayQueue() } return {