v2.0.0
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import Sortable, { AutoScroll } from 'sortablejs/modular/sortable.core.esm'
|
||||
import { onMounted } from '@renderer/utils/vueTools'
|
||||
import { base as eventBaseName } from '@renderer/event/names'
|
||||
import { onMounted } from '@common/utils/vueTools'
|
||||
import { clearDownKeys } from '@renderer/event'
|
||||
|
||||
Sortable.mount(new AutoScroll())
|
||||
|
||||
@@ -28,13 +28,14 @@ export default ({ dom_list, dragingItemClassName, filter, onUpdate, onStart = no
|
||||
onUnchoose() {
|
||||
onEnd()
|
||||
// 处于拖动状态期间,键盘事件无法监听,拖动结束手动清理按下的键
|
||||
window.eventHub.emit(eventBaseName.setClearDownKeys)
|
||||
// window.app_event.emit(eventBaseName.setClearDownKeys)
|
||||
clearDownKeys()
|
||||
},
|
||||
onStart(event) {
|
||||
window.eventHub.emit(eventBaseName.dragStart)
|
||||
window.app_event.dragStart()
|
||||
},
|
||||
onEnd(event) {
|
||||
window.eventHub.emit(eventBaseName.dragEnd)
|
||||
window.app_event.dragEnd()
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { useI18n } from '@renderer/utils/vueTools'
|
||||
import { useI18n } from '@renderer/plugins/i18n'
|
||||
import { dialog } from '@renderer/plugins/Dialog'
|
||||
|
||||
export default () => {
|
||||
const { t } = useI18n()
|
||||
const t = useI18n()
|
||||
|
||||
|
||||
return (type) => {
|
||||
@@ -19,6 +19,7 @@ export default () => {
|
||||
message = t('list_import_tip__alldata')
|
||||
break
|
||||
case 'playListPart':
|
||||
case 'playListPart_v2':
|
||||
message = t('list_import_tip__playlist_part')
|
||||
break
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
import { onMounted, onBeforeUnmount, ref } from '@renderer/utils/vueTools'
|
||||
|
||||
export default name => {
|
||||
const keyDown = ref(false)
|
||||
const down = `key_${name}_down`
|
||||
const up = `key_${name}_up`
|
||||
|
||||
const handle_key_down = event => {
|
||||
if (!keyDown.value) {
|
||||
// console.log(event)
|
||||
switch (event.event.target.tagName) {
|
||||
case 'INPUT':
|
||||
case 'SELECT':
|
||||
case 'TEXTAREA':
|
||||
return
|
||||
default: if (event.event.target.isContentEditable) return
|
||||
}
|
||||
|
||||
keyDown.value = true
|
||||
}
|
||||
}
|
||||
|
||||
const handle_key_up = () => {
|
||||
if (keyDown.value) keyDown.value = false
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
window.eventHub.on(down, handle_key_down)
|
||||
window.eventHub.on(up, handle_key_up)
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.eventHub.off(down, handle_key_down)
|
||||
window.eventHub.off(up, handle_key_up)
|
||||
})
|
||||
|
||||
return keyDown
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
import { onMounted, onBeforeUnmount, ref } from '@common/utils/vueTools'
|
||||
|
||||
export default (name: string) => {
|
||||
const keyDown = ref(false)
|
||||
const down = `key_${name}_down`
|
||||
const up = `key_${name}_up`
|
||||
|
||||
const handle_key_down = (event: LX.KeyDownEevent) => {
|
||||
if (!keyDown.value) {
|
||||
// console.log(event)
|
||||
switch ((event.event?.target as HTMLElement).tagName) {
|
||||
case 'INPUT':
|
||||
case 'SELECT':
|
||||
case 'TEXTAREA':
|
||||
return
|
||||
default: if ((event.event?.target as HTMLElement).isContentEditable) return
|
||||
}
|
||||
|
||||
keyDown.value = true
|
||||
}
|
||||
}
|
||||
|
||||
const handle_key_up = () => {
|
||||
if (keyDown.value) keyDown.value = false
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
window.key_event.on(down, handle_key_down)
|
||||
window.key_event.on(up, handle_key_up)
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.key_event.off(down, handle_key_down)
|
||||
window.key_event.off(up, handle_key_up)
|
||||
})
|
||||
|
||||
return keyDown
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
import { ref, onMounted, onBeforeUnmount, watch, nextTick } from '@renderer/utils/vueTools'
|
||||
import { scrollTo, throttle, formatPlayTime2 } from '@renderer/utils'
|
||||
import { player as eventPlayerNames } from '@renderer/event/names'
|
||||
import { ref, onMounted, onBeforeUnmount, watch, nextTick } from '@common/utils/vueTools'
|
||||
import { throttle, formatPlayTime2 } from '@common/utils/common'
|
||||
import { scrollTo } from '@common/utils/renderer'
|
||||
import { play } from '@renderer/core/player/action'
|
||||
// import { player as eventPlayerNames } from '@renderer/event/names'
|
||||
|
||||
export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
export default ({ isPlay, lyric, playProgress, isShowLyricProgressSetting, offset }) => {
|
||||
const dom_lyric = ref(null)
|
||||
const dom_lyric_text = ref(null)
|
||||
const dom_skip_line = ref(null)
|
||||
@@ -28,10 +30,8 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
if (time == -1) return
|
||||
handleSkipMouseLeave()
|
||||
isStopScroll.value = false
|
||||
let offset = lyric.offset + lyric.tempOffset
|
||||
if (offset) offset = offset / 1000
|
||||
window.eventHub.emit(eventPlayerNames.setProgress, Math.max(time + offset, 0))
|
||||
if (!isPlay.value) window.eventHub.emit(eventPlayerNames.setPlay)
|
||||
window.app_event.setProgress(time)
|
||||
if (!isPlay.value) play()
|
||||
}
|
||||
const handleSkipMouseEnter = () => {
|
||||
isSkipMouseEnter = true
|
||||
@@ -51,13 +51,15 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
if (dom_pre_line === dom) return
|
||||
if (dom.tagName == 'SPAN') {
|
||||
dom = dom.parentNode.parentNode
|
||||
} else if (dom.classList.contains('font')) {
|
||||
} else if (dom.classList.contains('line')) {
|
||||
dom = dom.parentNode
|
||||
}
|
||||
if (dom.time == null) {
|
||||
if (lyric.lines.length) {
|
||||
time = dom.classList.contains('pre') ? 0 : lyric.lines[lyric.lines.length - 1].time ?? 0
|
||||
if (time) time = time / 1000
|
||||
time = Math.max(time - lyric.offset - lyric.tempOffset, 0)
|
||||
time /= 1000
|
||||
if (time > playProgress.maxPlayTime) time = playProgress.maxPlayTime
|
||||
timeStr.value = formatPlayTime2(time)
|
||||
} else {
|
||||
time = -1
|
||||
@@ -65,7 +67,9 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
}
|
||||
} else {
|
||||
time = dom.time
|
||||
if (time) time = time / 1000
|
||||
time = Math.max(time - lyric.offset - lyric.tempOffset, 0)
|
||||
time /= 1000
|
||||
if (time > playProgress.maxPlayTime) time = playProgress.maxPlayTime
|
||||
timeStr.value = formatPlayTime2(time)
|
||||
}
|
||||
dom_pre_line = dom
|
||||
@@ -100,31 +104,49 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
handleScrollLrc()
|
||||
}, 3000)
|
||||
}
|
||||
const handleLyricMouseDown = event => {
|
||||
const handleLyricDown = (y) => {
|
||||
// console.log(event)
|
||||
if (delayScrollTimeout) {
|
||||
clearTimeout(delayScrollTimeout)
|
||||
delayScrollTimeout = null
|
||||
}
|
||||
isMsDown.value = true
|
||||
msDownY = event.clientY
|
||||
msDownY = y
|
||||
msDownScrollY = dom_lyric.value.scrollTop
|
||||
}
|
||||
const handleLyricMouseDown = event => {
|
||||
handleLyricDown(event.clientY)
|
||||
}
|
||||
const handleLyricTouchStart = event => {
|
||||
if (event.changedTouches.length) {
|
||||
const touch = event.changedTouches[0]
|
||||
handleLyricDown(touch.clientY)
|
||||
}
|
||||
}
|
||||
const handleMouseMsUp = event => {
|
||||
isMsDown.value = false
|
||||
}
|
||||
const handleMouseMsMove = event => {
|
||||
const handleMove = (y) => {
|
||||
if (isMsDown.value) {
|
||||
if (!isStopScroll.value) isStopScroll.value = true
|
||||
if (cancelScrollFn) {
|
||||
cancelScrollFn()
|
||||
cancelScrollFn = null
|
||||
}
|
||||
dom_lyric.value.scrollTop = msDownScrollY + msDownY - event.clientY
|
||||
dom_lyric.value.scrollTop = msDownScrollY + msDownY - y
|
||||
startLyricScrollTimeout()
|
||||
setTime()
|
||||
}
|
||||
}
|
||||
const handleMouseMsMove = event => {
|
||||
handleMove(event.clientY)
|
||||
}
|
||||
const handleTouchMove = (e) => {
|
||||
if (e.changedTouches.length) {
|
||||
const touch = e.changedTouches[0]
|
||||
handleMove(touch.clientY)
|
||||
}
|
||||
}
|
||||
|
||||
const handleWheel = (event) => {
|
||||
console.log(event.deltaY)
|
||||
@@ -146,7 +168,7 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
dom_lyric_text.value.textContent = ''
|
||||
dom_lyric_text.value.appendChild(dom_line_content)
|
||||
nextTick(() => {
|
||||
dom_lines = dom_lyric.value.querySelectorAll('.lrc-content')
|
||||
dom_lines = dom_lyric.value.querySelectorAll('.line-content')
|
||||
handleScrollLrc()
|
||||
})
|
||||
}
|
||||
@@ -189,6 +211,8 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
onMounted(() => {
|
||||
document.addEventListener('mousemove', handleMouseMsMove)
|
||||
document.addEventListener('mouseup', handleMouseMsUp)
|
||||
document.addEventListener('touchmove', handleTouchMove)
|
||||
document.addEventListener('touchend', handleMouseMsUp)
|
||||
|
||||
initLrc(lyric.lines, null)
|
||||
nextTick(() => {
|
||||
@@ -199,6 +223,8 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
onBeforeUnmount(() => {
|
||||
document.removeEventListener('mousemove', handleMouseMsMove)
|
||||
document.removeEventListener('mouseup', handleMouseMsUp)
|
||||
document.removeEventListener('touchmove', handleTouchMove)
|
||||
document.removeEventListener('touchend', handleMouseMsUp)
|
||||
})
|
||||
|
||||
return {
|
||||
@@ -209,9 +235,11 @@ export default ({ isPlay, lyric, isShowLyricProgressSetting }) => {
|
||||
isMsDown,
|
||||
timeStr,
|
||||
handleLyricMouseDown,
|
||||
handleLyricTouchStart,
|
||||
handleWheel,
|
||||
handleSkipPlay,
|
||||
handleSkipMouseEnter,
|
||||
handleSkipMouseLeave,
|
||||
handleScrollLrc,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
import { onMounted, onBeforeUnmount, watch, reactive, ref, nextTick } from '@renderer/utils/vueTools'
|
||||
import { onMounted, onBeforeUnmount, watch, reactive, ref } from '@common/utils/vueTools'
|
||||
import { isFullscreen } from '@renderer/store'
|
||||
|
||||
let rootOffset = window.dt ? 0 : 8
|
||||
|
||||
export default ({ visible, location, onHide }) => {
|
||||
const transition1 = 'transform, opacity'
|
||||
@@ -10,17 +13,20 @@ export default ({ visible, location, onHide }) => {
|
||||
top: 0,
|
||||
opacity: 0,
|
||||
transitionProperty: 'transform, opacity',
|
||||
transform: 'scale(0) translate(0,0)',
|
||||
transform: 'scale(.8, .7) translate(0,0)',
|
||||
pointerEvents: 'none',
|
||||
})
|
||||
|
||||
const handleShow = () => {
|
||||
show = true
|
||||
menuStyles.opacity = 1
|
||||
menuStyles.transform = `scaleY(1) translate(${handleGetOffsetXY(location.value.x, location.value.y)})`
|
||||
menuStyles.transform = `scale(1) translate(${handleGetOffsetXY(location.value.x, location.value.y)})`
|
||||
menuStyles.pointerEvents = 'auto'
|
||||
}
|
||||
const handleHide = () => {
|
||||
menuStyles.opacity = 0
|
||||
menuStyles.transform = 'scale(0) translate(0, 0)'
|
||||
menuStyles.transform = 'scale(.8, .7) translate(0, 0)'
|
||||
menuStyles.pointerEvents = 'none'
|
||||
show = false
|
||||
}
|
||||
const handleGetOffsetXY = (left, top) => {
|
||||
@@ -33,8 +39,8 @@ export default ({ visible, location, onHide }) => {
|
||||
const offsetHeight = containerHeight - top - listHeight
|
||||
let x = 0
|
||||
let y = 0
|
||||
if (containerWidth > listWidth && offsetWidth < 17) {
|
||||
x = offsetWidth - 17
|
||||
if (containerWidth > listWidth && offsetWidth < 12) {
|
||||
x = offsetWidth - 12
|
||||
}
|
||||
if (containerHeight > listHeight && offsetHeight < 5) {
|
||||
y = offsetHeight - 5
|
||||
@@ -55,15 +61,19 @@ export default ({ visible, location, onHide }) => {
|
||||
visible ? handleShow() : handleHide()
|
||||
}, { immediate: true })
|
||||
|
||||
watch(isFullscreen, isFullscreen => {
|
||||
rootOffset = window.dt || isFullscreen ? 0 : 8
|
||||
}, { immediate: true })
|
||||
|
||||
watch(location, location => {
|
||||
menuStyles.left = location.x + 2 + 'px'
|
||||
menuStyles.top = location.y + 'px'
|
||||
nextTick(() => {
|
||||
if (show) {
|
||||
if (menuStyles.transitionProperty != transition2) menuStyles.transitionProperty = transition2
|
||||
menuStyles.transform = `scaleY(1) translate(${handleGetOffsetXY(location.x, location.y)})`
|
||||
}
|
||||
})
|
||||
menuStyles.left = location.x - rootOffset + 2 + 'px'
|
||||
menuStyles.top = location.y - rootOffset + 'px'
|
||||
// nextTick(() => {
|
||||
if (show) {
|
||||
if (menuStyles.transitionProperty != transition2) menuStyles.transitionProperty = transition2
|
||||
menuStyles.transform = `scale(1) translate(${handleGetOffsetXY(location.x, location.y)})`
|
||||
}
|
||||
// })
|
||||
}, { deep: true })
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
+11
-10
@@ -1,20 +1,21 @@
|
||||
import { appSetting, setTogglePlayMode } from '@renderer/store/setting'
|
||||
import {
|
||||
computed,
|
||||
useCommit,
|
||||
} from '@renderer/utils/vueTools'
|
||||
} from '@common/utils/vueTools'
|
||||
import { useI18n } from '@renderer/plugins/i18n'
|
||||
|
||||
const playNextModes = [
|
||||
'listLoop',
|
||||
'random',
|
||||
'list',
|
||||
'singleLoop',
|
||||
]
|
||||
|
||||
export default ({ setting, t }) => {
|
||||
const setPlayNextMode = useCommit('setPlayNextMode')
|
||||
'none',
|
||||
] as const
|
||||
|
||||
export default () => {
|
||||
const t = useI18n()
|
||||
const nextTogglePlayName = computed(() => {
|
||||
switch (setting.value.player.togglePlayMethod) {
|
||||
switch (appSetting['player.togglePlayMethod']) {
|
||||
case 'listLoop': return t('player__play_toggle_mode_list_loop')
|
||||
case 'random': return t('player__play_toggle_mode_random')
|
||||
case 'singleLoop': return t('player__play_toggle_mode_single_loop')
|
||||
@@ -24,9 +25,9 @@ export default ({ setting, t }) => {
|
||||
})
|
||||
|
||||
const toggleNextPlayMode = () => {
|
||||
let index = playNextModes.indexOf(setting.value.player.togglePlayMethod)
|
||||
if (++index >= playNextModes.length) index = -1
|
||||
setPlayNextMode(playNextModes[index] || '')
|
||||
let index = playNextModes.indexOf(appSetting['player.togglePlayMethod'])
|
||||
if (++index >= playNextModes.length) index = 0
|
||||
setTogglePlayMode(playNextModes[index] ?? playNextModes[0])
|
||||
}
|
||||
|
||||
return {
|
||||
@@ -1,6 +1,5 @@
|
||||
import { ref, onBeforeUnmount, toRef } from '@renderer/utils/vueTools'
|
||||
import { player as eventPlayerNames } from '@renderer/event/names'
|
||||
import { playProgress } from '@renderer/core/share/playProgress'
|
||||
import { ref, onBeforeUnmount, toRef } from '@common/utils/vueTools'
|
||||
import { playProgress } from '@renderer/store/player/playProgress'
|
||||
|
||||
export default () => {
|
||||
const isActiveTransition = ref(false)
|
||||
@@ -15,10 +14,10 @@ export default () => {
|
||||
isActiveTransition.value = true
|
||||
}
|
||||
|
||||
window.eventHub.on(eventPlayerNames.activeTransition, handleActiveTransition)
|
||||
window.app_event.on('activePlayProgressTransition', handleActiveTransition)
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.eventHub.off(eventPlayerNames.activeTransition, handleActiveTransition)
|
||||
window.app_event.off('activePlayProgressTransition', handleActiveTransition)
|
||||
})
|
||||
|
||||
return {
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
import { setListUpdateTime } from '@renderer/utils/data'
|
||||
import { setFetchingListStatus } from '@renderer/core/share/list'
|
||||
import { useAction, useCommit } from '@renderer/utils/vueTools'
|
||||
|
||||
export default () => {
|
||||
const getBoardListAll = useAction('leaderboard', 'getListAll')
|
||||
const getListDetailAll = useAction('songList', 'getListDetailAll')
|
||||
const setList = useCommit('list', 'setList')
|
||||
|
||||
const fetchList = (id, source, sourceListId) => {
|
||||
setFetchingListStatus(id, true)
|
||||
|
||||
let promise
|
||||
if (/board__/.test(sourceListId)) {
|
||||
const id = sourceListId.replace(/board__/, '')
|
||||
promise = getBoardListAll({ id, isRefresh: true })
|
||||
} else {
|
||||
promise = getListDetailAll({ source, id: sourceListId, isRefresh: true })
|
||||
}
|
||||
return promise.finally(() => {
|
||||
setFetchingListStatus(id, false)
|
||||
})
|
||||
}
|
||||
|
||||
return async targetListInfo => {
|
||||
const list = await fetchList(targetListInfo.id, targetListInfo.source, targetListInfo.sourceListId)
|
||||
// console.log(targetListInfo.list.length, list.length)
|
||||
setList({
|
||||
...targetListInfo,
|
||||
list,
|
||||
})
|
||||
setListUpdateTime(targetListInfo.id, Date.now())
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,29 @@
|
||||
import {
|
||||
computed,
|
||||
useCommit,
|
||||
} from '@renderer/utils/vueTools'
|
||||
} from '@common/utils/vueTools'
|
||||
import { useI18n } from '@renderer/plugins/i18n'
|
||||
import { appSetting, setLockDesktopLyric, setVisibleDesktopLyric } from '@renderer/store/setting'
|
||||
|
||||
export default ({ setting, t }) => {
|
||||
const setVisibleDesktopLyric = useCommit('setVisibleDesktopLyric')
|
||||
const setLockDesktopLyric = useCommit('setLockDesktopLyric')
|
||||
export default () => {
|
||||
const t = useI18n()
|
||||
|
||||
const toggleDesktopLyricBtnTitle = computed(() => {
|
||||
return `${
|
||||
setting.value.desktopLyric.enable
|
||||
appSetting['desktopLyric.enable']
|
||||
? t('player__desktop_lyric_off')
|
||||
: t('player__desktop_lyric_on')
|
||||
}(${
|
||||
setting.value.desktopLyric.isLock
|
||||
appSetting['desktopLyric.isLock']
|
||||
? t('player__desktop_lyric_unlock')
|
||||
: t('player__desktop_lyric_lock')
|
||||
})`
|
||||
})
|
||||
|
||||
const toggleDesktopLyric = () => {
|
||||
setVisibleDesktopLyric(!setting.value.desktopLyric.enable)
|
||||
setVisibleDesktopLyric(!appSetting['desktopLyric.enable'])
|
||||
}
|
||||
const toggleLockDesktopLyric = () => {
|
||||
setLockDesktopLyric(!setting.value.desktopLyric.isLock)
|
||||
setLockDesktopLyric(!appSetting['desktopLyric.isLock'])
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user