/ concept-collection / numbl-web-ide
Sign in
concept-collection / numbl-web-ide
numbl-web-ide / src / ide.ts
46 lines · 1.4 KBBlameHistoryRaw
1import { createWorkbench, type WorkbenchTheme } from 'minwebide';
2import { createNumblRunner } from './numbl/runner';
3import { openProjectFileSystem, touchProject, type ProjectInfo } from './projects';
5/** Opens the IDE for a project. Returns a disposable view. */
6export async function openIde(container: HTMLElement, project: ProjectInfo, theme: WorkbenchTheme): Promise<{ dispose(): void }> {
7 touchProject(project.id);
8 document.title = `${project.name} — numbl web IDE`;
10 const fs = await openProjectFileSystem(project.id);
12 const workbench = createWorkbench(container, {
13 fileSystem: fs,
14 theme,
15 workspaceName: project.name,
16 });
18 const numbl = createNumblRunner(fs, workbench);
19 workbench.registerRunner(numbl.runner);
21 // the project indicator: click to go back to the project list
22 workbench.statusBar.setItem('project', 'left', project.name, {
23 icon: 'folder-opened',
24 title: 'Back to projects',
25 onClick: () => { location.hash = '#/'; },
26 });
27 // replace the default branding item with the project indicator
28 workbench.statusBar.removeItem('branding');
30 // open the most useful starting file
31 for (const path of ['/waves.m', '/main.m', '/README.md']) {
32 const uri = fs.root.with({ path });
33 if (await fs.fileService.exists(uri)) {
34 await workbench.openFile(uri);
35 break;
36 }
37 }
39 return {
40 dispose() {
41 numbl.dispose();
42 workbench.dispose();
43 fs.dispose();
44 },
45 };
moveopenescclose