upd: optimize sync scroll

This commit is contained in:
purocean
2022-01-20 17:27:46 +08:00
parent 19958ca08b
commit ec472ca93c
4 changed files with 29 additions and 9 deletions
+24 -2
View File
@@ -231,13 +231,14 @@ export default defineComponent({
}
}
function revealLine (startLine: number, endLine?: number) {
function revealLine (startLine: number) {
if (startLine <= 1) {
scrollTopTo(0)
return
}
const nodes = refViewWrapper.value!.querySelectorAll<HTMLElement>(`.markdown-body [${DOM_ATTR_NAME.SOURCE_LINE_START}]`)
let prevEl: HTMLElement | undefined
for (let i = 0; i < nodes.length; i++) {
const el = nodes[i]
@@ -250,10 +251,31 @@ export default defineComponent({
}
const lineNumber = parseInt(el.dataset.sourceLine || '0')
if (lineNumber >= startLine && lineNumber <= (endLine || Number.MAX_SAFE_INTEGER)) {
if (lineNumber < startLine) {
if (i === nodes.length - 1) {
refViewWrapper.value!.scrollTop = refViewWrapper.value!.scrollHeight - refViewWrapper.value!.clientHeight
break
}
prevEl = el
continue
}
if (lineNumber === startLine) {
el.scrollIntoView()
break
}
if (prevEl) {
const wrapperOffset = refViewWrapper.value!.scrollTop - refViewWrapper.value!.getBoundingClientRect().top
const prevOffset = wrapperOffset + prevEl.getBoundingClientRect().top
const elOffset = wrapperOffset + el.getBoundingClientRect().top
const prevLine = parseInt(prevEl.dataset.sourceLine || '0')
const top = Math.round((elOffset * (startLine - prevLine) + prevOffset * (lineNumber - startLine)) / (lineNumber - prevLine))
refViewWrapper.value!.scrollTop = top
break
}
}
}
+2 -3
View File
@@ -41,12 +41,11 @@ export default {
const savePosition = debounce(saveScrollPosition, 500)
editor.onDidScrollChange(() => {
const visibleRange = editor.getVisibleRanges()[0]
const startLine = Math.max(1, visibleRange.startLineNumber - 2)
const endLine = Math.max(startLine, visibleRange.endLineNumber)
const startLine = Math.max(1, visibleRange.startLineNumber - 1)
const top = editor.getScrollTop()
if (ctx.view.getEnableSyncScroll()) {
ctx.view.revealLine(startLine, startLine + (endLine - startLine) / 2)
ctx.view.revealLine(startLine)
}
savePosition({ editor: top })
})
+2 -3
View File
@@ -57,10 +57,9 @@ export async function refresh () {
/**
* Reveal line.
* @param startLine
* @param endLine
*/
export function revealLine (startLine: number, endLine?: number) {
getActionHandler('view.reveal-line')(startLine, endLine)
export function revealLine (startLine: number) {
getActionHandler('view.reveal-line')(startLine)
}
/**
+1 -1
View File
@@ -116,7 +116,7 @@ export type BuildInActions = {
'view.render-immediately': () => void,
'view.render': () => void,
'view.refresh': () => void,
'view.reveal-line': (startLine: number, endLine?: number) => void,
'view.reveal-line': (startLine: number) => void,
'view.scroll-top-to': (top: number) => void,
'view.get-content-html': () => string,
'view.get-view-dom': () => HTMLElement | null,