diff --git a/editor/src/dashboard/create.tsx b/editor/src/dashboard/create.tsx index a434ac8ec..5fafdeeaf 100644 --- a/editor/src/dashboard/create.tsx +++ b/editor/src/dashboard/create.tsx @@ -25,6 +25,7 @@ import { EditorProjectPackageManager, IEditorProject, EditorProjectTemplate } fr export interface IDashboardCreateProjectDialogProps { isOpened: boolean; + closeDashboardOnProjectOpen: boolean; onClose: () => void; } @@ -101,7 +102,7 @@ export function DashboardCreateProjectDialog(props: IDashboardCreateProjectDialo }); if (result) { - ipcRenderer.send("dashboard:open-project", projectAbsolutePath); + ipcRenderer.send("dashboard:open-project", projectAbsolutePath, props.closeDashboardOnProjectOpen); } } catch (e) { showAlert("An unexpected error occured", e.message); diff --git a/editor/src/dashboard/item.tsx b/editor/src/dashboard/item.tsx index f96374a9f..87f0a858d 100644 --- a/editor/src/dashboard/item.tsx +++ b/editor/src/dashboard/item.tsx @@ -27,7 +27,7 @@ import { DashboardProgressComponent } from "./progress"; export interface IDashboardProjectItemProps { isOpened: boolean; project: ProjectType; - + closeDashboardOnProjectOpen: boolean; onRemove: () => void; } @@ -127,6 +127,10 @@ export function DashboardProjectItem(props: IDashboardProjectItemProps) { setPlayingAddress(""); } + function handleLoadProject() { + ipcRenderer.send("dashboard:open-project", props.project.absolutePath, props.closeDashboardOnProjectOpen); + } + function handleOpenInVisualStudioCode() { execNodePty(`code "${dirname(props.project.absolutePath)}"`); } @@ -135,7 +139,7 @@ export function DashboardProjectItem(props: IDashboardProjectItemProps) { setContextMenuOpen(o)}>
ipcRenderer.send("dashboard:open-project", props.project.absolutePath)} + onDoubleClick={handleLoadProject} className={` group flex flex-col w-full rounded-lg cursor-pointer select-none @@ -169,7 +173,7 @@ export function DashboardProjectItem(props: IDashboardProjectItemProps) { - ipcRenderer.send("dashboard:open-project", props.project.absolutePath)}>Open + Open ipcRenderer.send("editor:show-item", props.project.absolutePath)}> {`Show in ${isDarwin() ? "Finder" : "Explorer"}`} @@ -214,7 +218,7 @@ export function DashboardProjectItem(props: IDashboardProjectItemProps) {
- ipcRenderer.send("dashboard:open-project", props.project.absolutePath)}>Open + Open ipcRenderer.send("editor:show-item", props.project.absolutePath)}> {`Show in ${isDarwin() ? "Finder" : "Explorer"}`} diff --git a/editor/src/dashboard/main.tsx b/editor/src/dashboard/main.tsx index 46ab0b868..67a9ed6ba 100644 --- a/editor/src/dashboard/main.tsx +++ b/editor/src/dashboard/main.tsx @@ -15,13 +15,20 @@ import { wait } from "../tools/tools"; import { openSingleFileDialog } from "../tools/dialog"; import { ProjectType, projectsKey } from "../tools/project"; import { checkNodeJSAvailable, nodeJSAvailable } from "../tools/process"; -import { tryAddProjectToLocalStorage, tryGetProjectsFromLocalStorage } from "../tools/local-storage"; +import { + tryAddProjectToLocalStorage, + tryGetCloseDashboardOnProjectOpenFromLocalStorage, + tryGetProjectsFromLocalStorage, + trySetCloseDashboardOnProjectOpenInLocalStorage, +} from "../tools/local-storage"; import { DashboardProjectItem } from "./item"; import { DashboardCreateProjectDialog } from "./create"; import { DashboardWindowControls } from "./window-controls"; import packageJson from "../../package.json"; +import { Switch } from "../ui/shadcn/ui/switch"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/shadcn/ui/tooltip"; export function createDashboard(): void { const theme = localStorage.getItem("editor-theme") ?? "dark"; @@ -48,6 +55,7 @@ export interface IDashboardState { openedProjects: string[]; createProject: boolean; + closeDashboardOnProjectOpen: boolean; } export class Dashboard extends Component { @@ -59,48 +67,61 @@ export class Dashboard extends Component { projects: tryGetProjectsFromLocalStorage(), createProject: false, + closeDashboardOnProjectOpen: tryGetCloseDashboardOnProjectOpenFromLocalStorage(), }; webFrame.setZoomFactor(0.8); } public render(): ReactNode { - return ( - <> -
- - - -
-
Dashboard
+ const handleKeepDashboardChanged = (checked: boolean): void => { + const shouldClose = !checked; -
- -
Babylon.js Editor v{packageJson.version}
-
-
-
+ this.setState({ + closeDashboardOnProjectOpen: shouldClose, + }); - - - + trySetCloseDashboardOnProjectOpenInLocalStorage(shouldClose); + }; - -
-
Projects
- -
- - + return ( + <> +
+
+ + + +
+
Dashboard
+ +
+ +
Babylon.js Editor v{packageJson.version}
+
-
- + + + + + + + +
+
Projects
+ +
+ + +
+
+
+
- + {!this.state.projects.length &&
No project found.
} {this.state.projects.length && ( @@ -110,16 +131,39 @@ export class Dashboard extends Component { project={project} key={project.absolutePath} isOpened={this.state.openedProjects.includes(project.absolutePath)} + closeDashboardOnProjectOpen={this.state.closeDashboardOnProjectOpen} onRemove={() => this._tryRemoveProjectFromLocalStorage(project)} /> ))}
)} + + +
+ +
+ + + + + Keep dashboard open + + + If enabled, the dashboard will stay open when a project starts. +
+ If disabled, the dashboard will close when a project starts and reopen after the project is closed. +
+
+
+
+
+
{ this.setState({ createProject: false, diff --git a/editor/src/index.ts b/editor/src/index.ts index 1d65e2990..b1d1abe02 100644 --- a/editor/src/index.ts +++ b/editor/src/index.ts @@ -107,9 +107,20 @@ async function openDashboard(): Promise { dashboardWindow.focus(); } -ipcMain.on("dashboard:open-project", (_, file) => { +function closeDashboard(): void { + if (dashboardWindow) { + dashboardWindow.close(); + dashboardWindow = null; + } +} + +ipcMain.on("dashboard:open-project", (_, file: string, shouldCloseDashboard?: boolean) => { openProject(file); dashboardWindow?.minimize(); + + if (shouldCloseDashboard) { + closeDashboard(); + } }); ipcMain.on("dashboard:update-projects", () => { @@ -138,7 +149,7 @@ async function openProject(filePath: string): Promise { notifyWindows("dashboard:opened-projects", openedProjects); if (openedProjects.length === 0) { - dashboardWindow?.restore(); + openDashboard(); } }); diff --git a/editor/src/tools/local-storage.ts b/editor/src/tools/local-storage.ts index 61b3844fd..cace0ae01 100644 --- a/editor/src/tools/local-storage.ts +++ b/editor/src/tools/local-storage.ts @@ -54,7 +54,7 @@ export function tryGetExperimentalFeaturesEnabledFromLocalStorage(): boolean { } /** - * Sets wether or not experimental features are enabled in the local storage. + * Sets whether or not experimental features are enabled in the local storage. * @param enabled defines wether or not experimental features are enabled. */ export function trySetExperimentalFeaturesEnabledInLocalStorage(enabled: boolean): void { @@ -64,3 +64,26 @@ export function trySetExperimentalFeaturesEnabledInLocalStorage(enabled: boolean // Catch silently. } } + +/** + * Returns wether or not the dashboard should be closed when a project is opened. + */ +export function tryGetCloseDashboardOnProjectOpenFromLocalStorage(): boolean { + try { + return localStorage.getItem("babylonjs-editor-close-dashboard-on-project-open") === "true"; + } catch (e) { + return false; + } +} + +/** + * Sets whether or not the dashboard should be closed when a project is opened. + * @param enabled defines whether or not the dashboard should be closed when a project is opened. + */ +export function trySetCloseDashboardOnProjectOpenInLocalStorage(enabled: boolean): void { + try { + localStorage.setItem("babylonjs-editor-close-dashboard-on-project-open", JSON.stringify(enabled)); + } catch (e) { + // Catch silently. + } +}