instanceTable = {
const editorInstance = editor({
world,
value: viewof hashState.value.source,
autosave: (source) => updateHashState({source}),
width: '100%',
height: '100%',
style: {maxWidth: '100%', height: '100%', cursor: 'text'},
options: {lineWrapping: true},
})
const editorActions = {
get editor() {
return editorInstance.actions
},
get source() {
return this.editor.source
},
set source(v) {
return this.editor.source = v
},
reveal(mark) {
this.editor.reveal(mark)
},
select(mark) {
this.editor.select(mark)
},
focus() {
this.editor.focus()
}
}
function svelteInstance(...args) {
const generator = svelteRender(...args)
const {value} = generator.next()
const svelteComponent = getComponent(value)
return {
svelteComponent,
refresh() {
if (svelteComponent.refresh) {
svelteComponent.refresh()
}
},
element: value,
kill: () => setTimeout(() => generator.return(), 0),
}
}
const instanceTable = new InstanceTable({
'editor': () => {
return {
title: "Editor",
refresh() {
this.element.editor.refresh()
},
element: editorInstance,
}
},
'table': () => {
return {
title: "Table",
element: table([
{name: "Adam", food: "Pizza"},
])
}
},
// 'trellis': () => ({
// title: "Plot",
// ...svelteInstance(TrellisView, {
// height: 300,
// data: generatedPromises(() => world.generator(w => {
// try {
// const scenarios = w.scenarios()
// console.log("scenarios", scenarios)
// if (scenarios && scenarios[0]) {
// const result = scenarios[0].worker.samples()
// console.log("result", result)
// return result
// }
// } catch (e) {
// console.log(e)
// }
// return {values: [], schema: []}
// }), {values: [], schema: []}),
// }),
// }),
'parallel-coordinates': () => {
return {
title: "Parallel Coordinates",
...svelteInstance(ParallelCoordinatesView, {
height: 300,
fontFamily,
labelFontSize: 14,
tickFontSize: 12,
data: derivedPromises(
workerScenarioStore,
scenario => world.generator(() => {
return scenario ? scenario.samples() : {samplingGroups: []}
}),
{samplingGroups: []},
),
}),
}
},
'browser': () => ({
title: "Browser",
...svelteInstance(
svelte `
{#if src}
<iframe style="border: 0" width="100%" height="100%" src="{src}" />
{/if}
<script>
export let selectionStore
export let scenarioStore
let src
$: scenario = $scenarioStore
$: selectedComponentDef = $selectionStore.find(d => d.type === "component-def")
$: selectedUse = selectedComponentDef && Array.from(scenario.usesOf(selectedComponentDef.component))[0]
$: src = selectedUse && selectedUse.attrs.url
</script>
`,
{
scenarioStore: generatedPromises(() => {
return world.generator(w => {
const sc = w.scenarios()[0]
return sc && sc.ui
})
}),
selectionStore: generatedPromises(() => {
return world.generator(w => {
const r = w.selected()
return r
})
}, []),
},
)
}),
'map': () => ({
title: "Map",
...svelteInstance(MapView, {
drag,
defaultFontFamily: "'Barlow Semi Condensed', sans-serif",
defaultFontStyle: undefined,
defaultFontColor: "#555",
defaultFontWeight: 600,
axisFontFamily: "'Barlow', sans-serif",
axisLetterSpacing: 2,
axisFontSize: 13,
axisFontColor: "#777",
axisFontWeight: 800,
xExtent,
yExtent,
highlight: generatedPromises(() => world.generator(w => {
const selectedKeys = new Set(w.selected(d => d.key))
return d => selectedKeys.has(d.key)
}), d => false),
editorActions,
positions: readableInput(viewof positions),
meridians: readableInput(viewof meridians),
yAnchor: readableInput(viewof yAnchor),
xAnchor: readableInput(viewof xAnchor),
},
html`<div style="height: 100%;" class="min-half-height"></div>`),
}),
'console': () => {
let updateView
let id
return {
title: "Console",
mount({view: {id: _id}, updateView: _updateView}) {
updateView = _updateView
id = _id
this.svelteComponent.focus()
},
...svelteInstance(ConsoleView, {
styleMaxHeight: '30rem', // really just here to test scrolling
styleHeight: '100%',
runCommand(text) {
if (text === "open") {
return {text, flags: {}, result: "opening..."}
}
try {
const type = text
const entry = instanceTable.find(id)
if (entry && entry.type !== type) {
const {instance} = instanceTable.kill(id) || {}
instance && instance.kill && instance.kill()
instanceTable.make(id, type)
updateView({type})
}
return {text, flags: {}, result: "launching..."}
} catch (e) {
return {text, flags: {error: true}, result: e.message}
}
},
},
html`<div style="height: 100%"></div>`),
}
},
// 'search': () => ({
// title: "Search",
// ...svelteInstance(Search, {
// components: generatedPromises(() => world.generator(w => w.components())),
// drag,
// width: '100%',
// xExtent,
// yExtent,
// positions: readableInput(viewof positions),
// yAnchor: readableInput(viewof yAnchor),
// xAnchor: readableInput(viewof xAnchor),
// }),
// }),
'inspector': () => {
return {
title: "Inspector",
...svelteInstance(SelectionView, {
editorActions,
scenarioStore: generatedPromises(() => {
return world.generator(w => {
const sc = w.scenarios()[0]
return sc && sc.ui
})
}),
selectionStore: generatedPromises(() => {
return world.generator(w => {
const r = w.selected()
return r
})
}, []),
}),
}
},
})
// This is a weird thing to do...
instanceTable.editorActions = editorActions
window.instanceTable = instanceTable
return Generators.disposable(instanceTable, et => et.killAll().forEach(t => t.kill && t.kill()))
}