export class WidgetSearcher extends R.WidgetSearcher { events: Leaf.EventEmitter<{ widget }> constructor() { super() this.UI.input.focus() this.widgetList.events.listenBy(this, "child/add", (child) => { child.events.listenBy(this, "select", () => { this.select(child) }) }) } public isInitPath(path) { this.events.emit("widget", path) } onKeyupInput(e) { if (e.which === Leaf.Key.enter) { this.applyFirst() } else { this.displayUIByName(this.UI.input.value) } } displayUIByName(name) { if (!TestR) { return } this.widgetList.empty() let matches = TestR.widgets.filter(item => item.toLowerCase().indexOf(name.toLowerCase()) >= 0).slice(0, 10) matches.forEach(name => this.widgetList.push(new WidgetListItem(name))) if (matches.length === 0) { this.ViewModel.sets({ empty: true }) } else { this.ViewModel.sets({ empty: false }) } this.ViewModel.sets({ open: true }) } private applyFirst() { let first = this.widgetList[0] as WidgetListItem if (!first) return this.select(first) } private select(item: WidgetListItem) { this.widgetList.empty() this.ViewModel.sets({ open: false }) this.events.emit("widget", item.path) } } export class WidgetListItem extends R.WidgetSearcher.WidgetListItem { constructor(public path: string) { super() this.ViewModel.sets({ widgetPath: path }) } onClick() { this.events.emit("select") } }