Files
leporello-js/src/editor/eval.js

68 lines
1.4 KiB
JavaScript
Raw Normal View History

2022-09-10 02:48:13 +08:00
import {ValueExplorer} from './value_explorer.js'
import {el} from './domutils.js'
export class Eval {
constructor(ui, container) {
this.ui = ui
this.container = container
this.container.addEventListener('keydown', (e) => {
if(e.key == 'Escape') {
this.escape()
}
})
// TODO jump to fn location, view function calls
// container.addEventListener('click', jump_to_fn_location)
}
escape() {
if(this.focusedFrom == null) {
this.ui.editor.focus()
} else {
this.focusedFrom.focus()
this.focusedFrom = null
}
}
show_value(value){
this.container.innerHTML = ''
const container = el('div', {'class': 'eval_content', tabindex: 0})
this.container.appendChild(container)
const explorer = new ValueExplorer({
container,
on_escape: () => this.escape()
})
explorer.render(value)
}
show_error(error){
this.container.innerHTML = ''
this.container.appendChild(el('span', 'eval_error', error.toString()))
}
show_value_or_error({ok, value, error}){
if(ok) {
this.show_value(value)
} else {
this.show_error(error)
}
}
clear_value_or_error() {
this.container.innerHTML = ''
}
focus_value_or_error(from) {
this.focusedFrom = from
if(this.container.childElementCount != 1) {
throw new Error('illegal state')
}
this.container.children[0].focus()
}
}