✨ feat(vscode): 代码阅读库规则卡片不再吞掉字段中间的方法,编辑时收起子块

This commit is contained in:
cruldra committed 2026-09-26 19:58:43 +08:00
1 parent c803fd457f
commit 2251e67ef8
15 files changed
+280 -54

No files matched your search

+9 -7
View File
@@ -5,6 +5,7 @@ import type { ViewState } from './viewState'
import { TriangleAlert } from 'lucide-react'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { BlockLevel } from './BlockTree'
import { coveredByEditing, startEditing } from './editing'
import { applyFilter, keptWhileEditing } from './filter'
import { FilterBar } from './FilterBar'
import { useDefinitionLinks } from './useDefinitionLinks'
@@ -18,10 +19,6 @@ type BlockModes = Pick<ViewState, 'editing' | 'folds'>
const NONE: ReadonlySet<string> = new Set()
function toggled(ids: string[], id: string): string[] {
return ids.includes(id) ? ids.filter(x => x !== id) : [...ids, id]
}
function savedBlockModes(): BlockModes {
const { editing, folds } = viewState.get()
return { editing, folds }
@@ -41,6 +38,7 @@ export function App(): ReactElement | null {
const editing = useRef(view.editing)
const collapsed = useMemo(() => collapsedIds(doc?.blocks ?? [], view.folds), [doc, view.folds])
const filter = useMemo(() => applyFilter(doc?.blocks ?? [], excluded, keep), [doc, excluded, keep])
const covered = useMemo(() => coveredByEditing(doc?.blocks ?? [], new Set(view.editing)), [doc, view.editing])
/** 记下这几块、属性行、子行折叠还是展开,从此不再按默认 */
const setFolded = useCallback((ids: string[], folded: boolean) => setView(prev => ({
...prev,
@@ -50,7 +48,7 @@ export function App(): ReactElement | null {
const show = useCallback((ids: string[]) => setKeep(prev => new Set([...prev, ...ids])), [])
const revealed = useCallback(() => setReveal(null), [])
useScrollPosition(doc)
useReveal(doc, reveal, collapsed, filter.hidden, show, expand, revealed)
useReveal(doc, reveal, collapsed, filter.hidden, covered, show, expand, revealed)
useDefinitionLinks(doc?.version)
const highlight = useOccurrences(doc?.version, doc?.translatorId)
@@ -88,15 +86,19 @@ export function App(): ReactElement | null {
collapsed,
hidden: filter.hidden,
temporary: filter.temporary,
covered,
kindName: kind => kindNames.get(kind) ?? kind,
focusId,
onFocused,
onToggleEdit: (id) => {
setFocusId(view.editing.includes(id) ? null : id)
setView(prev => ({ ...prev, editing: toggled(prev.editing, id) }))
setView(prev => ({
...prev,
editing: prev.editing.includes(id) ? prev.editing.filter(other => other !== id) : startEditing(doc.blocks, prev.editing, id),
}))
},
onToggleFold: id => setFolded([id], !collapsed.has(id)),
}, [doc, view, collapsed, filter, kindNames, focusId, onFocused, setFolded])
}, [doc, view, collapsed, filter, covered, kindNames, focusId, onFocused, setFolded])
if (!doc || !tree)
return null