Browse Source

keep window state.

oldj 4 years ago
parent
commit
8631edb3c4

+ 64 - 7
package-lock.json

@@ -1,5 +1,5 @@
 {
-  "name": "v4.0",
+  "name": "SwitchHosts",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
@@ -8,6 +8,7 @@
       "dependencies": {
         "axios": "^0.21.1",
         "dayjs": "^1.10.4",
+        "electron-window-state": "^5.0.3",
         "lodash": "^4.17.21",
         "md5": "^2.3.0",
         "md5-file": "^5.0.0",
@@ -8656,6 +8657,37 @@
       "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==",
       "dev": true
     },
+    "node_modules/electron-window-state": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz",
+      "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==",
+      "dependencies": {
+        "jsonfile": "^4.0.0",
+        "mkdirp": "^0.5.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/electron-window-state/node_modules/jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/electron-window-state/node_modules/mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "dependencies": {
+        "minimist": "^1.2.5"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
     "node_modules/elliptic": {
       "version": "6.5.4",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
@@ -10433,7 +10465,7 @@
       "version": "4.2.6",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
       "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-      "dev": true
+      "devOptional": true
     },
     "node_modules/graceful-readlink": {
       "version": "1.0.1",
@@ -15208,8 +15240,7 @@
     "node_modules/minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "node_modules/mixin-deep": {
       "version": "1.3.2",
@@ -29964,6 +29995,33 @@
       "integrity": "sha512-fjt43CPXdPYwD9ybmKbNeLwZBmCVdLY2J5fGZub7/eMPuiqQznOGNXv/wurnpXIlE7ScHnvG9Zi+H4/i6uMKmw==",
       "dev": true
     },
+    "electron-window-state": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz",
+      "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==",
+      "requires": {
+        "jsonfile": "^4.0.0",
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "jsonfile": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+          "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+          "requires": {
+            "graceful-fs": "^4.1.6"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
     "elliptic": {
       "version": "6.5.4",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
@@ -31409,7 +31467,7 @@
       "version": "4.2.6",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
       "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-      "dev": true
+      "devOptional": true
     },
     "graceful-readlink": {
       "version": "1.0.1",
@@ -35108,8 +35166,7 @@
     "minimist": {
       "version": "1.2.5",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
     },
     "mixin-deep": {
       "version": "1.3.2",

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
   "dependencies": {
     "axios": "^0.21.1",
     "dayjs": "^1.10.4",
+    "electron-window-state": "^5.0.3",
     "lodash": "^4.17.21",
     "md5": "^2.3.0",
     "md5-file": "^5.0.0",

+ 31 - 3
src/main/actions/getBasicData.ts

@@ -4,9 +4,37 @@
  */
 
 import { swhdb } from '@main/data'
-import { IHostsBasicData, VersionType } from '@root/common/data'
+import {
+  IHostsBasicData,
+  IHostsListObject,
+  ITrashcanListObject,
+  VersionType,
+} from '@root/common/data'
+import { flatten } from '@root/common/hostsFn'
+import { v4 as uuid4 } from 'uuid'
 import version from '@root/version.json'
 
+const normalizeList = (list: IHostsListObject[]): IHostsListObject[] => {
+  let flat = flatten(list)
+  flat.map(item => {
+    if (!item.id) {
+      item.id = uuid4()
+    }
+  })
+
+  return list
+}
+
+const normalizeTrashcan = (list: ITrashcanListObject[]): ITrashcanListObject[] => {
+  list.map(item => {
+    if (!item.id) {
+      item.id = uuid4()
+    }
+  })
+
+  return list
+}
+
 export default async (): Promise<IHostsBasicData> => {
   const default_data: IHostsBasicData = {
     list: [],
@@ -14,8 +42,8 @@ export default async (): Promise<IHostsBasicData> => {
     version: version as VersionType,
   }
 
-  let list = await swhdb.list.tree.all()
-  let trashcan = await swhdb.list.trashcan.all()
+  let list = normalizeList(await swhdb.list.tree.all())
+  let trashcan = normalizeTrashcan(await swhdb.list.trashcan.all())
   let v = await swhdb.dict.meta.get('version', version)
 
   return {

+ 12 - 2
src/main/main.ts

@@ -11,6 +11,7 @@ import { makeMainMenu } from '@main/libs/menu'
 import version from '@root/version.json'
 import { app, BrowserWindow } from 'electron'
 import * as path from 'path'
+import windowStateKeeper from 'electron-window-state'
 
 let win: BrowserWindow | null
 let is_will_quit: boolean = false
@@ -18,9 +19,16 @@ let is_will_quit: boolean = false
 const createWindow = async () => {
   const configs = await configAll()
 
+  let main_window_state = windowStateKeeper({
+    defaultWidth: 800,
+    defaultHeight: 480,
+  })
+
   win = new BrowserWindow({
-    width: 800,
-    height: 480,
+    x: main_window_state.x,
+    y: main_window_state.y,
+    width: main_window_state.width,
+    height: main_window_state.height,
     minWidth: 300,
     minHeight: 200,
     autoHideMenuBar: true,
@@ -32,6 +40,8 @@ const createWindow = async () => {
     },
   })
 
+  main_window_state.manage(win)
+
   if (configs.hide_at_launch) {
     win.hide()
   }

+ 1 - 3
src/renderer/pages/index.tsx

@@ -1,5 +1,4 @@
 import { useModel } from '@@/plugin-model/useModel'
-import { VStack } from '@chakra-ui/react'
 import About from '@renderer/components/About'
 import EditHostsInfo from '@renderer/components/EditHostsInfo'
 import History from '@renderer/components/History'
@@ -7,7 +6,6 @@ import LeftPanel from '@renderer/components/LeftPanel'
 import Loading from '@renderer/components/Loading'
 import MainPanel from '@renderer/components/MainPanel'
 import PreferencePanel from '@renderer/components/Pref'
-import CommandsHistory from '@renderer/components/Pref/CommandsHistory'
 import SudoPasswordInput from '@renderer/components/SudoPasswordInput'
 import { actions, agent } from '@renderer/core/agent'
 import useOnBroadcast from '@renderer/core/useOnBroadcast'
@@ -84,7 +82,7 @@ export default () => {
       <div>
         <div className={styles.left} style={{
           width: left_width,
-          left: left_show ? 0 : -left_width
+          left: left_show ? 0 : -left_width,
         }}>
           <LeftPanel width={left_width}/>
         </div>

+ 1 - 1
src/renderer/styles/themes/light.less

@@ -61,7 +61,7 @@
   --swh-editor-gutter-bg: #fff;
 
   // tray
-  --swh-tray-header-bg: #daeafa;
+  --swh-tray-header-bg: #edebf1;
   --swh-tray-font-color: #000;
 
   // scroll bar