优化列表全选机制,修复列表未获得焦点时仍然可以全选的问题

pull/1761/head
lyswhut 2023-12-05 11:14:44 +08:00
parent 7d504f9231
commit cac2d0e050
8 changed files with 24 additions and 18 deletions

View File

@ -17,6 +17,7 @@
- 更新zh-tw翻译 - 更新zh-tw翻译
- 自定义源列显示源版本号、作者名字 - 自定义源列显示源版本号、作者名字
- 优化列表全选机制,修复列表未获得焦点时仍然可以全选的问题
### 修复 ### 修复

View File

@ -47,7 +47,7 @@ export default {
}, },
label: { label: {
type: String, type: String,
required: true, default: undefined,
}, },
disabled: { disabled: {
type: Boolean, type: Boolean,

View File

@ -155,7 +155,7 @@ export default {
listItemHeight, listItemHeight,
handleSelectData, handleSelectData,
removeAllSelect, removeAllSelect,
} = useList({ props }) } = useList({ props, listRef })
const { const {
handlePlayMusic, handlePlayMusic,

View File

@ -1,10 +1,11 @@
import { computed, watch, ref, onBeforeUnmount } from '@common/utils/vueTools' import { computed, watch, ref, onBeforeUnmount, type Ref } from '@common/utils/vueTools'
import { isFullscreen } from '@renderer/store' import { isFullscreen } from '@renderer/store'
import { appSetting } from '@renderer/store/setting' import { appSetting } from '@renderer/store/setting'
import { getFontSizeWithScreen } from '@renderer/utils' import { getFontSizeWithScreen } from '@renderer/utils'
const useKeyEvent = ({ handleSelectAllData }: { const useKeyEvent = ({ handleSelectAllData, listRef }: {
handleSelectAllData: () => void handleSelectAllData: () => void
listRef: Ref<any>
}) => { }) => {
const keyEvent = { const keyEvent = {
isShiftDown: false, isShiftDown: false,
@ -24,7 +25,7 @@ const useKeyEvent = ({ handleSelectAllData }: {
keyEvent.isModDown &&= false keyEvent.isModDown &&= false
} }
const handle_key_mod_a_down = ({ event }: LX.KeyDownEevent) => { const handle_key_mod_a_down = ({ event }: LX.KeyDownEevent) => {
if (!event || (event.target as HTMLElement).tagName == 'INPUT') return if (!event || (event.target as HTMLElement).tagName == 'INPUT' || document.activeElement != listRef.value?.$el) return
event.preventDefault() event.preventDefault()
if (event.repeat) return if (event.repeat) return
keyEvent.isModDown = false keyEvent.isModDown = false
@ -48,10 +49,11 @@ const useKeyEvent = ({ handleSelectAllData }: {
} }
export default ({ props }: { export default ({ props, listRef }: {
props: { props: {
list: LX.Music.MusicInfoOnline[] list: LX.Music.MusicInfoOnline[]
} }
listRef: Ref<any>
}) => { }) => {
const selectedList = ref<LX.Music.MusicInfoOnline[]>([]) const selectedList = ref<LX.Music.MusicInfoOnline[]>([])
let lastSelectIndex = -1 let lastSelectIndex = -1
@ -66,7 +68,7 @@ export default ({ props }: {
removeAllSelect() removeAllSelect()
selectedList.value = [...props.list] selectedList.value = [...props.list]
} }
const keyEvent = useKeyEvent({ handleSelectAllData }) const keyEvent = useKeyEvent({ handleSelectAllData, listRef })
const handleSelectData = (clickIndex: number) => { const handleSelectData = (clickIndex: number) => {
if (keyEvent.isShiftDown) { if (keyEvent.isShiftDown) {

View File

@ -20,7 +20,7 @@
</div> </div>
<div v-if="list.length" ref="dom_listContent" :class="$style.content"> <div v-if="list.length" ref="dom_listContent" :class="$style.content">
<base-virtualized-list <base-virtualized-list
v-slot="{ item, index }" :list="list" key-name="id" :item-height="listItemHeight" ref="listRef" v-slot="{ item, index }" :list="list" key-name="id" :item-height="listItemHeight"
container-class="scroll" content-class="list" container-class="scroll" content-class="list"
> >
<div <div
@ -68,6 +68,7 @@
<script> <script>
// import { checkPath, openDirInExplorer, openUrl } from '@common/utils/electron' // import { checkPath, openDirInExplorer, openUrl } from '@common/utils/electron'
import { ref } from '@common/utils/vueTools'
import useListInfo from './useListInfo' import useListInfo from './useListInfo'
import useList from './useList' import useList from './useList'
import useTab from './useTab' import useTab from './useTab'
@ -80,6 +81,7 @@ import { appSetting } from '@renderer/store/setting'
export default { export default {
name: 'Download', name: 'Download',
setup() { setup() {
const listRef = ref()
const { tabs, activeTab } = useTab() const { tabs, activeTab } = useTab()
const { const {
@ -95,7 +97,7 @@ export default {
listItemHeight, listItemHeight,
removeAllSelect, removeAllSelect,
handleSelectData, handleSelectData,
} = useList({ list, listAll }) } = useList({ listRef, list, listAll })
const { const {
handlePlayMusic, handlePlayMusic,
@ -196,6 +198,7 @@ export default {
return quality == 'flac24bit' ? 'FLAC Hires' : quality?.toUpperCase() return quality == 'flac24bit' ? 'FLAC Hires' : quality?.toUpperCase()
} }
return { return {
listRef,
list, list,
downloadStatus, downloadStatus,
rightClickSelectedIndex, rightClickSelectedIndex,

View File

@ -3,7 +3,7 @@ import { isFullscreen } from '@renderer/store'
import { getFontSizeWithScreen } from '@renderer/utils' import { getFontSizeWithScreen } from '@renderer/utils'
import { appSetting } from '@renderer/store/setting' import { appSetting } from '@renderer/store/setting'
const useKeyEvent = ({ handleSelectAllData }) => { const useKeyEvent = ({ listRef, handleSelectAllData }) => {
const keyEvent = { const keyEvent = {
isShiftDown: false, isShiftDown: false,
isModDown: false, isModDown: false,
@ -22,7 +22,7 @@ const useKeyEvent = ({ handleSelectAllData }) => {
keyEvent.isModDown &&= false keyEvent.isModDown &&= false
} }
const handle_key_mod_a_down = ({ event }) => { const handle_key_mod_a_down = ({ event }) => {
if (event.target.tagName == 'INPUT') return if (event.target.tagName == 'INPUT' || document.activeElement != listRef.value?.$el) return
event.preventDefault() event.preventDefault()
if (event.repeat) return if (event.repeat) return
keyEvent.isModDown = false keyEvent.isModDown = false
@ -45,7 +45,7 @@ const useKeyEvent = ({ handleSelectAllData }) => {
return keyEvent return keyEvent
} }
export default ({ list, listAll }) => { export default ({ listRef, list, listAll }) => {
const selectedList = ref([]) const selectedList = ref([])
let lastSelectIndex = -1 let lastSelectIndex = -1
@ -60,7 +60,7 @@ export default ({ list, listAll }) => {
removeAllSelect() removeAllSelect()
selectedList.value = [...list.value] selectedList.value = [...list.value]
} }
const keyEvent = useKeyEvent({ handleSelectAllData }) const keyEvent = useKeyEvent({ handleSelectAllData, listRef })
const handleSelectData = clickIndex => { const handleSelectData = clickIndex => {
if (keyEvent.isShiftDown) { if (keyEvent.isShiftDown) {

View File

@ -164,7 +164,7 @@ export default {
listItemHeight, listItemHeight,
handleSelectData, handleSelectData,
removeAllSelect, removeAllSelect,
} = useList({ list }) } = useList({ listRef, list })
const { const {
handlePlayMusic, handlePlayMusic,

View File

@ -3,7 +3,7 @@ import { isFullscreen } from '@renderer/store'
import { getFontSizeWithScreen } from '@renderer/utils' import { getFontSizeWithScreen } from '@renderer/utils'
import { appSetting } from '@renderer/store/setting' import { appSetting } from '@renderer/store/setting'
const useKeyEvent = ({ handleSelectAllData }) => { const useKeyEvent = ({ handleSelectAllData, listRef }) => {
const keyEvent = { const keyEvent = {
isShiftDown: false, isShiftDown: false,
isModDown: false, isModDown: false,
@ -22,7 +22,7 @@ const useKeyEvent = ({ handleSelectAllData }) => {
keyEvent.isModDown &&= false keyEvent.isModDown &&= false
} }
const handle_key_mod_a_down = ({ event }) => { const handle_key_mod_a_down = ({ event }) => {
if (event.target.tagName == 'INPUT') return if (event.target.tagName == 'INPUT' || document.activeElement != listRef.value?.$el) return
event.preventDefault() event.preventDefault()
if (event.repeat) return if (event.repeat) return
keyEvent.isModDown = false keyEvent.isModDown = false
@ -45,7 +45,7 @@ const useKeyEvent = ({ handleSelectAllData }) => {
return keyEvent return keyEvent
} }
export default ({ list }) => { export default ({ listRef, list }) => {
const selectedList = ref([]) const selectedList = ref([])
let lastSelectIndex = -1 let lastSelectIndex = -1
@ -60,7 +60,7 @@ export default ({ list }) => {
removeAllSelect() removeAllSelect()
selectedList.value = [...list.value] selectedList.value = [...list.value]
} }
const keyEvent = useKeyEvent({ handleSelectAllData }) const keyEvent = useKeyEvent({ listRef, handleSelectAllData })
const handleSelectData = clickIndex => { const handleSelectData = clickIndex => {
if (keyEvent.isShiftDown) { if (keyEvent.isShiftDown) {