Files
superwork/vscode/src/codeReader/editor/occurrenceNavigation.ts
T

36 lines
1.5 KiB
TypeScript

/** 在高亮着的名字的各处出现之间跳:两条命令、快捷键的 when 子句用的上下文键。 */
export const NEXT_OCCURRENCE = 'superpowers.codeReader.nextOccurrence'
export const PREVIOUS_OCCURRENCE = 'superpowers.codeReader.previousOccurrence'
/** 活动的预览里能用键盘跳(有高亮、页面有焦点、焦点不在输入框里)。 */
export const OCCURRENCES_CONTEXT = 'superpowers.codeReader.hasOccurrences'
/**
* 上下文键跟着各预览报来的状态走:有一个预览能跳就是真(同一时刻只有一个页面有焦点),变了才设。
* 预览关掉时当它不能跳;标签页切走时页面失了焦点,自己会报不能跳。
*/
export class NavigationContext<Owner> {
private readonly available = new Set<Owner>()
private value = false
constructor(private readonly set: (value: boolean) => void) {}
update(owner: Owner, available: boolean): void {
if (available)
this.available.add(owner)
else
this.available.delete(owner)
const value = this.available.size > 0
if (value === this.value)
return
this.value = value
this.set(value)
}
/** 命令发给哪个预览:报了能跳的那个;从命令面板运行时页面没焦点,就发给活动的那个。 */
target(owners: Iterable<Owner>, active: (owner: Owner) => boolean): Owner | undefined {
const list = [...owners]
return list.find(owner => this.available.has(owner)) ?? list.find(active)
}
}