43 lines
1 KiB
TypeScript
43 lines
1 KiB
TypeScript
import { Callable, Callable1, LineEdit, Variant } from 'godot'
|
|
import { export_, onready } from 'godot.annotations'
|
|
|
|
export default class AutocompleteLine extends LineEdit {
|
|
@export_(Variant.Type.TYPE_BOOL)
|
|
private auto_suggest: boolean = true
|
|
|
|
@onready("SuggestionLine")
|
|
private suggestion!: LineEdit
|
|
|
|
autocomplete_list: string[] = []
|
|
last_autocomplete: number = -1
|
|
|
|
_on_text_changed!: Callable1<string>
|
|
|
|
_ready(): void {
|
|
this._on_text_changed = Callable.create(this, this.suggest)
|
|
|
|
if (this.auto_suggest) {
|
|
this.text_changed.connect(this._on_text_changed)
|
|
}
|
|
}
|
|
|
|
suggest(value: string): boolean {
|
|
const item = this.fuzzy_find(value)
|
|
|
|
if (item > -1) {
|
|
this.suggestion.text = this.autocomplete_list[item]
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
autocomplete(value?: string) {
|
|
this.text = value || this.suggestion.text
|
|
this.suggestion.clear()
|
|
}
|
|
|
|
fuzzy_find(value: string): number {
|
|
return this.autocomplete_list.findIndex(text => text.startsWith(value))
|
|
}
|
|
}
|