mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 21:14:28 -08:00
68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
|
|
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()
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
}
|