diff --git a/publish/changeLog.md b/publish/changeLog.md index f96ea0e1..eb3ca794 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,4 +1,9 @@ +### 新增 + +- 新增我的列表名右键菜单-排序歌曲-随机乱序功能,使用它可以对选中列表内歌曲进行随机重排(#1440) + ### 修复 - 修复字体设置某些字体无法应用的问题 - 修复搜索提示功能失效的问题(#1452, @Folltoshe) +- 修复我的列表名右键菜单-排序歌曲按专辑名排序无效的问题(#1440) diff --git a/src/common/utils/common.ts b/src/common/utils/common.ts index 21797d3b..146bbad5 100644 --- a/src/common/utils/common.ts +++ b/src/common/utils/common.ts @@ -225,3 +225,23 @@ export const arrPushByPosition = (list: T[], newList: T[], position: number) } return list } + + +// https://stackoverflow.com/a/2450976 +export const arrShuffle = (array: T[]) => { + let currentIndex = array.length + let randomIndex + + // While there remain elements to shuffle. + while (currentIndex != 0) { + // Pick a remaining element. + randomIndex = Math.floor(Math.random() * currentIndex) + currentIndex--; + + // And swap it with the current element. + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], array[currentIndex]] + } + + return array +} diff --git a/src/lang/en-us.json b/src/lang/en-us.json index c1b9c95f..3a89b82b 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -125,6 +125,7 @@ "list_sort_modal_by_down": "Descending", "list_sort_modal_by_field": "Sort field", "list_sort_modal_by_name": "Song name", + "list_sort_modal_by_random": "Random", "list_sort_modal_by_singer": "Singer name", "list_sort_modal_by_source": "Song source", "list_sort_modal_by_time": "Duration", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index c898d6f0..e36c9e26 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -125,6 +125,7 @@ "list_sort_modal_by_down": "降序", "list_sort_modal_by_field": "排序字段", "list_sort_modal_by_name": "歌曲名", + "list_sort_modal_by_random": "随机乱序", "list_sort_modal_by_singer": "歌手名", "list_sort_modal_by_source": "歌曲源", "list_sort_modal_by_time": "时长", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 353422b7..0587da8e 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -125,6 +125,7 @@ "list_sort_modal_by_down": "降序", "list_sort_modal_by_field": "排序字段", "list_sort_modal_by_name": "歌曲名", + "list_sort_modal_by_random": "隨機亂序", "list_sort_modal_by_singer": "歌手名", "list_sort_modal_by_source": "歌曲源", "list_sort_modal_by_time": "時長", diff --git a/src/renderer/views/List/MyList/components/ListSortModal.vue b/src/renderer/views/List/MyList/components/ListSortModal.vue index 00919d05..1bcdd68a 100644 --- a/src/renderer/views/List/MyList/components/ListSortModal.vue +++ b/src/renderer/views/List/MyList/components/ListSortModal.vue @@ -10,31 +10,31 @@
  • @@ -54,6 +54,12 @@ need="need" value="down" :label="$t('list_sort_modal_by_down')" /> +
  • + +
  • @@ -96,7 +102,7 @@ export default { sortType.value = '' } const verify = () => { - return !!sortField.value && !!sortType.value + return !!sortType.value && (!!sortField.value || sortType.value == 'random') } const handleSort = async() => { if (!verify()) return @@ -125,9 +131,14 @@ export default { } }) + const disabledSortFislds = computed(() => { + return sortType.value == 'random' + }) + return { sortField, sortType, + disabledSortFislds, closeModal, handleSort, handleAfterLeave, diff --git a/src/renderer/worker/main/list.ts b/src/renderer/worker/main/list.ts index 92f12dc9..566442e6 100644 --- a/src/renderer/worker/main/list.ts +++ b/src/renderer/worker/main/list.ts @@ -1,6 +1,6 @@ // import { throttle } from '@common/utils' -import { filterFileName, sortInsert, similar, arrPushByPosition } from '@common/utils/common' +import { filterFileName, sortInsert, similar, arrPushByPosition, arrShuffle } from '@common/utils/common' import { joinPath, saveStrToFile } from '@common/utils/nodejs' import { createLocalMusicInfo } from '@renderer/utils/music' @@ -79,63 +79,69 @@ const getIntv = (musicInfo: LX.Music.MusicInfo) => { * @param localeId 排序语言 * @returns */ -export const sortListMusicInfo = async(list: LX.Music.MusicInfo[], sortType: 'up' | 'down', fieldName: 'name' | 'singer' | 'albumName' | 'interval' | 'source', localeId: string) => { +export const sortListMusicInfo = async(list: LX.Music.MusicInfo[], sortType: 'up' | 'down' | 'random', fieldName: 'name' | 'singer' | 'albumName' | 'interval' | 'source', localeId: string) => { // console.log(sortType, fieldName, localeId) // const locale = new Intl.Locale(localeId) - if (sortType == 'up') { - if (fieldName == 'interval') { - list.sort((a, b) => { - if (a.interval == null) { - return b.interval == null ? 0 : -1 - } else return b.interval == null ? 1 : getIntv(a) - getIntv(b) - }) - } else { - switch (fieldName) { - case 'name': - case 'singer': - case 'source': - list.sort((a, b) => { - if (a[fieldName] == null) { - return b[fieldName] == null ? 0 : -1 - } else return b[fieldName] == null ? 1 : a[fieldName].localeCompare(b[fieldName], localeId) - }) - break - case 'albumName': - list.sort((a, b) => { - if (a.meta.albumName == null) { - return b.meta.albumName == null ? 0 : -1 - } else return b.meta.albumName == null ? 1 : a.meta.albumName.localeCompare(b.meta.albumName, localeId) - }) - break + switch (sortType) { + case 'random': + arrShuffle(list) + break + case 'up': + if (fieldName == 'interval') { + list.sort((a, b) => { + if (a.interval == null) { + return b.interval == null ? 0 : -1 + } else return b.interval == null ? 1 : getIntv(a) - getIntv(b) + }) + } else { + switch (fieldName) { + case 'name': + case 'singer': + case 'source': + list.sort((a, b) => { + if (a[fieldName] == null) { + return b[fieldName] == null ? 0 : -1 + } else return b[fieldName] == null ? 1 : a[fieldName].localeCompare(b[fieldName], localeId) + }) + break + case 'albumName': + list.sort((a, b) => { + if (a.meta.albumName == null) { + return b.meta.albumName == null ? 0 : -1 + } else return b.meta.albumName == null ? 1 : a.meta.albumName.localeCompare(b.meta.albumName, localeId) + }) + break + } } - } - } else { - if (fieldName == 'interval') { - list.sort((a, b) => { - if (a.interval == null) { - return b.interval == null ? 0 : 1 - } else return b.interval == null ? -1 : getIntv(b) - getIntv(a) - }) - } else { - switch (fieldName) { - case 'name': - case 'singer': - case 'source': - list.sort((a, b) => { - if (a[fieldName] == null) { - return b[fieldName] == null ? 0 : 1 - } else return b[fieldName] == null ? -1 : b[fieldName].localeCompare(a[fieldName], localeId) - }) - break - case 'albumName': - list.sort((a, b) => { - if (a.meta.albumName == null) { - return b.meta.albumName == null ? 0 : 1 - } else return b.meta.albumName == null ? -1 : b.meta.albumName.localeCompare(a.meta.albumName, localeId) - }) - break + break + case 'down': + if (fieldName == 'interval') { + list.sort((a, b) => { + if (a.interval == null) { + return b.interval == null ? 0 : 1 + } else return b.interval == null ? -1 : getIntv(b) - getIntv(a) + }) + } else { + switch (fieldName) { + case 'name': + case 'singer': + case 'source': + list.sort((a, b) => { + if (a[fieldName] == null) { + return b[fieldName] == null ? 0 : 1 + } else return b[fieldName] == null ? -1 : b[fieldName].localeCompare(a[fieldName], localeId) + }) + break + case 'albumName': + list.sort((a, b) => { + if (a.meta.albumName == null) { + return b.meta.albumName == null ? 0 : 1 + } else return b.meta.albumName == null ? -1 : b.meta.albumName.localeCompare(a.meta.albumName, localeId) + }) + break + } } - } + break } return list }