From 76c0cfbcb3d01871cacc33bf45e30d864421896a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=8C=E8=90=8C=E5=93=92=E8=B5=AB=E8=90=9D?= Date: Thu, 6 Apr 2023 15:57:36 +0800 Subject: [PATCH] :sparkles: Feature: users can set start mode now, mini window position will be remembered --- package.json | 2 +- public/i18n/en.yml | 5 +++ public/i18n/zh-CN.yml | 5 +++ public/i18n/zh-TW.yml | 5 +++ src/main/apis/app/system/index.ts | 67 +++++++++++++++++++++++++++-- src/main/events/ipcList.ts | 19 +++++++- src/main/events/remotes/menu.ts | 6 --- src/main/lifeCycle/index.ts | 31 ++++++++++++- src/renderer/pages/PicGoSetting.vue | 59 +++++++++++++++++++------ src/universal/types/i18n.d.ts | 5 +++ src/universal/types/types.d.ts | 1 + 11 files changed, 179 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index bde0ec8..662c376 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "piclist", - "version": "1.5.2", + "version": "1.5.3", "author": { "name": "Kuingsmile", "email": "msq@msq.pub" diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 95d50da..b43081b 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -1,6 +1,7 @@ LANG_DISPLAY_LABEL: 'English' ABOUT: About OPEN_MAIN_WINDOW: Open Main Window +OPEN_MINI_WINDOW: Open Mini Window CHOOSE_DEFAULT_PICBED: Choose Default Picbed OPEN_UPDATE_HELPER: Open Update Helper PRIVACY_AGREEMENT: Privacy Agreement @@ -111,6 +112,10 @@ SETTINGS_MIGRATE_FROM_PICGO_TITLE: Notice SETTINGS_MIGRATE_FROM_PICGO_CONTENT: Migrate from PicGo will overwrite your current settings and gallery, do you want to continue? SETTINGS_MIGRATE_FROM_PICGO_SUCCESS: Import succeed, please restart PicList SETTINGS_MIGRATE_FROM_PICGO_FAILED: Import failed +SETTINGS_START_MODE: Default Start Mode +SETTINGS_START_MODE_MINI: Mini Window +SETTINGS_START_MODE_MAIN: Main Window +SETTINGS_START_MODE_QUIET: Quiet Mode SETTINGS_CLICK_TO_OPEN: Click to Open SETTINGS_SET_LOG_FILE: Set Log File SETTINGS_CLICK_TO_SET: Click to Set diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index f3533b0..a9c3fc8 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -1,6 +1,7 @@ LANG_DISPLAY_LABEL: 中文 ABOUT: 关于 OPEN_MAIN_WINDOW: 打开主窗口 +OPEN_MINI_WINDOW: 打开mini窗口 CHOOSE_DEFAULT_PICBED: 选择默认图床 OPEN_UPDATE_HELPER: 打开更新助手 PRIVACY_AGREEMENT: 隐私协议 @@ -111,6 +112,10 @@ SETTINGS_MIGRATE_FROM_PICGO_TITLE: 通知 SETTINGS_MIGRATE_FROM_PICGO_CONTENT: 即将导入PicGo的配置文件和相册, 这将覆盖当前的配置文件和相册, 是否继续? SETTINGS_MIGRATE_FROM_PICGO_SUCCESS: 导入成功, 请重启PicList生效 SETTINGS_MIGRATE_FROM_PICGO_FAILED: 导入失败 +SETTINGS_START_MODE: 启动模式 +SETTINGS_START_MODE_MINI: mini窗口 +SETTINGS_START_MODE_MAIN: 主窗口 +SETTINGS_START_MODE_QUIET: 静默启动 SETTINGS_CLICK_TO_OPEN: 点击打开 SETTINGS_SET_LOG_FILE: 设置日志文件 SETTINGS_CLICK_TO_SET: 点击设置 diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index d378e78..3f187a9 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -1,6 +1,7 @@ LANG_DISPLAY_LABEL: 繁體中文 ABOUT: 關於 OPEN_MAIN_WINDOW: 打開主視窗 +OPEN_MINI_WINDOW: 打開mini視窗 CHOOSE_DEFAULT_PICBED: 選擇預設圖床 OPEN_UPDATE_HELPER: 開啟更新助手 PRIVACY_AGREEMENT: 隱私協議 @@ -111,6 +112,10 @@ SETTINGS_MIGRATE_FROM_PICGO_TITLE: 通知 SETTINGS_MIGRATE_FROM_PICGO_CONTENT: 即將導入PicGo的設定文件和相冊, 這將會覆蓋當前的設定, 是否繼續? SETTINGS_MIGRATE_FROM_PICGO_SUCCESS: 導入成功, 請重啟應用 SETTINGS_MIGRATE_FROM_PICGO_FAILED: 導入失敗 +SETTINGS_START_MODE: 啟動模式 +SETTINGS_START_MODE_MINI: mini窗口 +SETTINGS_START_MODE_MAIN: 主窗口 +SETTINGS_START_MODE_QUIET: 靜默啟動 SETTINGS_CLICK_TO_OPEN: 點擊打開 SETTINGS_SET_LOG_FILE: 設定記錄檔案 SETTINGS_CLICK_TO_SET: 點擊設定 diff --git a/src/main/apis/app/system/index.ts b/src/main/apis/app/system/index.ts index e0069eb..1c04212 100644 --- a/src/main/apis/app/system/index.ts +++ b/src/main/apis/app/system/index.ts @@ -6,7 +6,8 @@ import { dialog, clipboard, systemPreferences, - Notification + Notification, + screen } from 'electron' import uploader from 'apis/app/uploader' import db, { GalleryDB } from '~/main/apis/core/datastore' @@ -15,7 +16,6 @@ import { IWindowList } from '#/types/enum' import pasteTemplate from '~/main/utils/pasteTemplate' import pkg from 'root/package.json' import { ensureFilePath, handleCopyUrl } from '~/main/utils/common' -// import { T } from '#/i18n' import { T } from '~/main/i18n' import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion' import { buildPicBedListMenu } from '~/main/events/remotes/menu' @@ -80,7 +80,7 @@ export function createMenu () { export function createContextMenu () { if (process.platform === 'darwin' || process.platform === 'win32') { const submenu = buildPicBedListMenu() - contextMenu = Menu.buildFromTemplate([ + const template = [ { label: T('ABOUT'), click () { @@ -120,7 +120,39 @@ export function createContextMenu () { role: 'quit', label: T('QUIT') } - ]) + ] as any + if (process.platform === 'win32') { + template.splice(2, 0, + { + label: T('OPEN_MINI_WINDOW'), + click () { + const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)! + + if (db.get('settings.miniWindowOntop')) { + miniWindow.setAlwaysOnTop(true) + } + const { width, height } = screen.getPrimaryDisplay().workAreaSize + const lastPosition = db.get('settings.miniWindowPosition') + if (lastPosition) { + miniWindow.setPosition(lastPosition[0], lastPosition[1]) + } else { + miniWindow.setPosition(width - 100, height - 100) + } + miniWindow.on('close', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.on('move', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.show() + miniWindow.focus() + } + } + ) + } + contextMenu = Menu.buildFromTemplate(template) } else if (process.platform === 'linux') { // TODO 图床选择功能 // 由于在Linux难以像在Mac和Windows上那样在点击时构造ContextMenu, @@ -141,6 +173,33 @@ export function createContextMenu () { } } }, + { + label: T('OPEN_MINI_WINDOW'), + click () { + const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)! + + if (db.get('settings.miniWindowOntop')) { + miniWindow.setAlwaysOnTop(true) + } + const { width, height } = screen.getPrimaryDisplay().workAreaSize + const lastPosition = db.get('settings.miniWindowPosition') + if (lastPosition) { + miniWindow.setPosition(lastPosition[0], lastPosition[1]) + } else { + miniWindow.setPosition(width - 100, height - 100) + } + miniWindow.on('close', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.on('move', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.show() + miniWindow.focus() + } + }, { label: T('ABOUT'), click () { diff --git a/src/main/events/ipcList.ts b/src/main/events/ipcList.ts index 81db845..8222463 100644 --- a/src/main/events/ipcList.ts +++ b/src/main/events/ipcList.ts @@ -4,7 +4,8 @@ import { shell, Notification, IpcMainEvent, - BrowserWindow + BrowserWindow, + screen } from 'electron' import windowManager from 'apis/app/window/windowManager' import { IWindowList } from '#/types/enum' @@ -170,7 +171,21 @@ export default { if (db.get('settings.miniWindowOntop')) { miniWindow.setAlwaysOnTop(true) } - + const { width, height } = screen.getPrimaryDisplay().workAreaSize + const lastPosition = db.get('settings.miniWindowPosition') + if (lastPosition) { + miniWindow.setPosition(lastPosition[0], lastPosition[1]) + } else { + miniWindow.setPosition(width - 100, height - 100) + } + miniWindow.on('close', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.on('move', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) miniWindow.show() miniWindow.focus() settingWindow.hide() diff --git a/src/main/events/remotes/menu.ts b/src/main/events/remotes/menu.ts index 4e0457f..9737adc 100644 --- a/src/main/events/remotes/menu.ts +++ b/src/main/events/remotes/menu.ts @@ -49,12 +49,6 @@ const buildMiniPageMenu = () => { BrowserWindow.getFocusedWindow()!.hide() } }, - { - label: T('PRIVACY_AGREEMENT'), - click () { - privacyManager.show(false) - } - }, { label: T('RELOAD_APP'), click () { diff --git a/src/main/lifeCycle/index.ts b/src/main/lifeCycle/index.ts index 3fd15c6..39f9a1e 100644 --- a/src/main/lifeCycle/index.ts +++ b/src/main/lifeCycle/index.ts @@ -5,7 +5,8 @@ import { protocol, Notification, Menu, - dialog + dialog, + screen } from 'electron' import { createProtocol @@ -174,6 +175,34 @@ class LifeCycle { } await remoteNoticeHandler.init() remoteNoticeHandler.triggerHook(IRemoteNoticeTriggerHook.APP_START) + if (db.get('settings.startMode') === 'mini') { + windowManager.create(IWindowList.MINI_WINDOW) + const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)! + if (db.get('settings.miniWindowOntop')) { + miniWindow.setAlwaysOnTop(true) + } + const { width, height } = screen.getPrimaryDisplay().workAreaSize + const lastPosition = db.get('settings.miniWindowPosition') + if (lastPosition) { + miniWindow.setPosition(lastPosition[0], lastPosition[1]) + } else { + miniWindow.setPosition(width - 100, height - 100) + } + miniWindow.on('close', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.on('move', () => { + const position = miniWindow.getPosition() + db.set('settings.miniWindowPosition', position) + }) + miniWindow.show() + miniWindow.focus() + } else if (db.get('settings.startMode') === 'main') { + const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)! + settingWindow.show() + settingWindow.focus() + } } app.whenReady().then(readyFunction) } diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index aabe1e3..fb44740 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -42,6 +42,34 @@ /> + + + + + + + @@ -233,6 +261,17 @@ @change="handleMiniWindowOntop" /> + + + - - - - @@ -1004,6 +1031,7 @@ const languageList = i18nManager.languageList.map(item => ({ })) const currentLanguage = ref('zh-CN') +const currentStartMode = ref('quiet') const picBed = ref([]) @@ -1090,6 +1118,7 @@ async function initData () { form.isCustomMiniIcon = settings.isCustomMiniIcon || false form.customMiniIcon = settings.customMiniIcon || '' currentLanguage.value = settings.language ?? 'zh-CN' + currentStartMode.value = settings.startMode || 'quiet' customLink.value = settings.customLink || '$url' shortKey.upload = settings.shortKey.upload proxy.value = picBed.proxy || '' @@ -1403,6 +1432,12 @@ function handleLanguageChange (val: string) { sendToMain(GET_PICBEDS) } +function handleStartModeChange (val: 'quiet' | 'mini' | 'main') { + saveConfig({ + 'settings.startMode': val + }) +} + function goConfigPage () { sendToMain(OPEN_URL, 'https://piclist.cn/configure.html') } diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index 39ab4e3..ef33ba6 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -2,6 +2,7 @@ interface ILocales { LANG_DISPLAY_LABEL: string ABOUT: string OPEN_MAIN_WINDOW: string + OPEN_MINI_WINDOW: string CHOOSE_DEFAULT_PICBED: string OPEN_UPDATE_HELPER: string PRIVACY_AGREEMENT: string @@ -105,6 +106,10 @@ interface ILocales { SETTINGS_MIGRATE_FROM_PICGO_CONTENT: string SETTINGS_MIGRATE_FROM_PICGO_SUCCESS: string SETTINGS_MIGRATE_FROM_PICGO_FAILED: string + SETTINGS_START_MODE: string + SETTINGS_START_MODE_MINI: string + SETTINGS_START_MODE_MAIN: string + SETTINGS_START_MODE_QUIET: string SETTINGS_CLICK_TO_OPEN: string SETTINGS_SET_LOG_FILE: string SETTINGS_CLICK_TO_SET: string diff --git a/src/universal/types/types.d.ts b/src/universal/types/types.d.ts index 0f5a0d4..c48b6f4 100644 --- a/src/universal/types/types.d.ts +++ b/src/universal/types/types.d.ts @@ -115,6 +115,7 @@ interface IBrowserWindowOptions { icon?: string skipTaskbar?: boolean alwaysOnTop?: boolean + [propName: string]: any } interface IFileWithPath {