diff --git a/src/main/level/sublevels/keys.ts b/src/main/level/sublevels/keys.ts index 53eae44b..78969c8b 100644 --- a/src/main/level/sublevels/keys.ts +++ b/src/main/level/sublevels/keys.ts @@ -13,4 +13,5 @@ export const levelKeys = { userPreferences: "userPreferences", language: "language", sqliteMigrationDone: "sqliteMigrationDone", + screenState: "screenState", }; diff --git a/src/main/services/window-manager.ts b/src/main/services/window-manager.ts index 2d0bf24d..37874d60 100644 --- a/src/main/services/window-manager.ts +++ b/src/main/services/window-manager.ts @@ -17,34 +17,15 @@ import { HydraApi } from "./hydra-api"; import UserAgent from "user-agents"; import { db, gamesSublevel, levelKeys } from "@main/level"; import { slice, sortBy } from "lodash-es"; -import type { UserPreferences } from "@types"; +import type { ScreenState, UserPreferences } from "@types"; import { AuthPage } from "@shared"; import { isStaging } from "@main/constants"; export class WindowManager { public static mainWindow: Electron.BrowserWindow | null = null; - private static loadMainWindowURL(hash = "") { - // HMR for renderer base on electron-vite cli. - // Load the remote URL for development or the local html file for production. - if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { - this.mainWindow?.loadURL( - `${process.env["ELECTRON_RENDERER_URL"]}#/${hash}` - ); - } else { - this.mainWindow?.loadFile( - path.join(__dirname, "../renderer/index.html"), - { - hash, - } - ); - } - } - - public static createMainWindow() { - if (this.mainWindow) return; - - this.mainWindow = new BrowserWindow({ + private static initialConfigInitializationMainWindow: Electron.BrowserWindowConstructorOptions = + { width: 1200, height: 720, minWidth: 1024, @@ -63,7 +44,69 @@ export class WindowManager { sandbox: false, }, show: false, + }; + + private static async saveScreenConfig({ + ...configScreenWhenClosed + }: { + x: number | undefined; + y: number | undefined; + width: number; + height: number; + isMaximized: boolean; + }) { + await db.put(levelKeys.screenState, configScreenWhenClosed, { + valueEncoding: "json", }); + } + + private static async loadScreenConfig() { + const data = await db.get(levelKeys.screenState, { + valueEncoding: "json", + }); + return data ?? {}; + } + private static updateInitialConfig( + newConfig: Partial + ) { + this.initialConfigInitializationMainWindow = { + ...this.initialConfigInitializationMainWindow, + ...newConfig, + }; + } + + private static loadMainWindowURL(hash = "") { + // HMR for renderer base on electron-vite cli. + // Load the remote URL for development or the local html file for production. + if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { + this.mainWindow?.loadURL( + `${process.env["ELECTRON_RENDERER_URL"]}#/${hash}` + ); + } else { + this.mainWindow?.loadFile( + path.join(__dirname, "../renderer/index.html"), + { + hash, + } + ); + } + } + + public static async createMainWindow() { + if (this.mainWindow) return; + + const { isMaximized = false, ...configWithoutMaximized } = + await this.loadScreenConfig(); + + this.updateInitialConfig(configWithoutMaximized); + + this.mainWindow = new BrowserWindow( + this.initialConfigInitializationMainWindow + ); + + if (isMaximized) { + this.mainWindow.maximize(); + } this.mainWindow.webContents.session.webRequest.onBeforeSendHeaders( (details, callback) => { @@ -141,9 +184,26 @@ export class WindowManager { } ); + if (this.mainWindow) { + const lastBounds = this.mainWindow.getBounds(); + const isMaximized = this.mainWindow.isMaximized() ?? false; + const screenConfig = isMaximized + ? { + x: undefined, + y: undefined, + height: this.initialConfigInitializationMainWindow.height!, + width: this.initialConfigInitializationMainWindow.width!, + isMaximized: true, + } + : { ...lastBounds, isMaximized }; + + await this.saveScreenConfig(screenConfig); + } + if (userPreferences?.preferQuitInsteadOfHiding) { app.quit(); } + WindowManager.mainWindow?.setProgressBar(-1); WindowManager.mainWindow = null; }); diff --git a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx index 37e0ff1f..9dc531f4 100644 --- a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx +++ b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx @@ -196,7 +196,6 @@ export function HeroPanelActions() { {game.favorite ? : } -