36 lines
1.5 KiB
TypeScript
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)
|
|
}
|
|
}
|