///
import "bootstrap";
import { ipcRenderer } from "electron";
import React from "react";
import { createRoot } from "react-dom/client";
import { configure } from "mobx";
import { observer } from "mobx-react";
import { loadExtensions } from "eez-studio-shared/extensions/extensions";
import { getNodeModuleFolders } from "eez-studio-shared/extensions/yarn";
import * as notification from "eez-studio-ui/notification";
import { showAboutBox } from "eez-studio-ui/about-box";
import type * as ImportInstrumentDefinitionModule from "instrument/import-instrument-definition";
import { handleDragAndDrop } from "home/drag-and-drop";
import { loadTabs, ProjectEditorTab, tabs } from "home/tabs-store";
import { settingsController } from "home/settings";
import { App } from "home/app";
import { openProject } from "home/tabs-store";
import { LineMarkers } from "project-editor/flow/connection-line/ConnectionLineComponent";
import "home/settings";
import { extensionsCatalog } from "./extensions-manager/catalog";
import { buildProject } from "home/build-project";
import { layoutModels } from "eez-studio-ui/side-dock";
configure({ enforceActions: "observed", useProxies: "always" });
// make sure we store all the values waiting to be stored inside blur event handler
function blurAll() {
var tmp = document.createElement("input");
document.body.appendChild(tmp);
tmp.focus();
document.body.removeChild(tmp);
}
async function beforeAppClose() {
blurAll();
for (const tab of tabs.tabs) {
if (tab.beforeAppClose) {
if (!(await tab.beforeAppClose())) {
return false;
}
}
}
const {
destroyExtensions
} = require("eez-studio-shared/extensions/extensions");
destroyExtensions();
layoutModels.saveToLocalStorage();
return true;
}
ipcRenderer.on("beforeClose", async () => {
if (await beforeAppClose()) {
ipcRenderer.send("readyToClose");
}
});
ipcRenderer.on("reload", async () => {
if (await beforeAppClose()) {
ipcRenderer.send("reload");
}
});
ipcRenderer.on("switch-theme", async () => {
settingsController.switchTheme(!settingsController.isDarkTheme);
});
ipcRenderer.on(
"importInstrumentDefinitionFile",
(sender: any, filePath: string) => {
const { importInstrumentDefinition } =
require("instrument/import-instrument-definition") as typeof ImportInstrumentDefinitionModule;
importInstrumentDefinition(filePath);
}
);
ipcRenderer.on("show-about-box", async () => {
showAboutBox();
});
ipcRenderer.on(
"open-project",
async (sender: any, filePath: any, runMode: boolean) => {
openProject(filePath, runMode);
}
);
ipcRenderer.on(
"build-project",
async (sender: any, filePath: any, runMode: boolean) => {
buildProject(filePath);
}
);
ipcRenderer.on("load-debug-info", async (sender: any, filePath: any) => {
try {
let tab = tabs.activeTab;
if (tab instanceof ProjectEditorTab) {
tab.loadDebugInfo(filePath);
}
} catch (err) {
console.error(err);
}
});
ipcRenderer.on("save-debug-info", () => {
try {
let tab = tabs.activeTab;
if (tab instanceof ProjectEditorTab) {
tab.saveDebugInfo();
}
} catch (err) {
console.error(err);
}
});
ipcRenderer.on("new-project", async (sender: any, filePath: any) => {
const { showNewProjectWizard } = await import(
"project-editor/project/ui/Wizard"
);
showNewProjectWizard();
});
ipcRenderer.on("add-instrument", async (sender: any, filePath: any) => {
const { showAddInstrumentDialog } = await import(
"instrument/add-instrument-dialog"
);
const { defaultInstrumentsStore } = await import("home/instruments");
showAddInstrumentDialog(instrumentId => {
setTimeout(() => {
defaultInstrumentsStore.selectedInstrumentId = instrumentId;
}, 100);
});
});
const Main = observer(
class Main extends React.Component<{ children: React.ReactNode }> {
render() {
return (
<>
{this.props.children}
{notification.container}
>
);
}
}
);
async function main() {
const params = new URLSearchParams(location.search);
const buildProject = params.get("build-project") === "1";
let nodeModuleFolders: string[];
try {
nodeModuleFolders = await getNodeModuleFolders();
} catch (err) {
console.info(`Failed to get node module folders.`);
nodeModuleFolders = [];
}
await loadExtensions(nodeModuleFolders);
extensionsCatalog.load();
if (!buildProject) {
loadTabs();
const root = createRoot(document.getElementById("EezStudio_Content")!);
root.render(
);
handleDragAndDrop();
}
ipcRenderer.send("open-command-line-project");
}
main();
// setTimeout(() => {
// require("eez-studio-shared/module-stat");
// }, 1000);