diff --git a/CHANGELOG.md b/CHANGELOG.md index 42c418b..ef29dc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -574,6 +574,3 @@ ### :package: Chore * add picgo bump-version ([37f1d34](https://github.com/Molunerfinn/PicGo/commit/37f1d34)) - - - diff --git a/package.json b/package.json index 9506095..9f0d4e0 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", "release": "vue-cli-service electron:build --publish always", - "upload-dist": "node ./scripts/upload-dist-to-cos.js" + "upload-dist": "node ./scripts/upload-dist.js" }, "dependencies": { "@element-plus/icons-vue": "^2.0.10", diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 5f4dc00..559ff51 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -114,13 +114,14 @@ SETTINGS_NOT_CONFIG_OPTIONS: Not Config Options SETTINGS_USE_BUILTIN_CLIPBOARD_UPLOAD: Use Builtin Clipboard to Upload SETTINGS_CHOOSE_LANGUAGE: Choose Language UPLOADER_CONFIG_NAME: Configuration Name +BUILTIN_CLIPBOARD_TIPS: Use builtin clipboard function to upload instead of using scripts UPLOADER_CONFIG_PLACEHOLDER: Please Enter Configuration Name SELECTED_SETTING_HINT: Selected SETTINGS_ENCODE_OUTPUT_URL: Encode Output(or Copyed) URL +SETTINGS_SHOW_DOCK_ICON: Show Dock icon # shortcut-page -BUILTIN_CLIPBOARD_TIPS: Use builtin clipboard function to upload instead of using scripts SHORTCUT_NAME: Shortcut Name SHORTCUT_BIND: Shortcut Binding SHORTCUT_STATUS: Status @@ -161,33 +162,6 @@ PLUGIN_DOING_SOMETHING: Doing... PLUGIN_LIST: Plugin List PLUGIN_IMPORT_LOCAL: Import Local Plugins -# toolbox -TOOLBOX: Toolbox -TOOLBOX_TITLE: Troubleshoot PicGo runtime issues -TOOLBOX_SUB_TITLE: Scan the following items immediately to fix usage issues -TOOLBOX_CHECK_CONFIG_FILE_BROKEN: Check if the configuration file is damaged -TOOLBOX_CHECK_GALLERY_FILE_BROKEN: Check if the album file is damaged -TOOLBOX_CHECK_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: Check if there is a problem with clipboard picture upload -TOOLBOX_CHECK_PROBLEM_WITH_PROXY: Check if the proxy settings are normal -TOOLBOX_FIX_DONE_NEED_RELOAD: Repair completed, need to restart to take effect, restart or not -TOOLBOX_CANT_AUTO_FIX: Unable to automatically repair, please repair the following problems yourself -TOOLBOX_START_SCAN: Start scanning -TOOLBOX_RE_SCAN: Re scanning -TOOLBOX_START_FIX: Start fixing -TOOLBOX_SUCCESS_TIPS: Congratulations, no problems were found -TOOLBOX_CHECK_CONFIG_FILE_PATH_TIPS: "The configuration file path is: ${path}" -TOOLBOX_CHECK_CONFIG_FILE_BROKEN_TIPS: The configuration file is damaged -TOOLBOX_CHECK_GALLERY_FILE_PATH_TIPS: "The album file path is: ${path}" -TOOLBOX_CHECK_GALLERY_FILE_BROKEN_TIPS: The album file is damaged -TOOLBOX_CHECK_PROXY_SUCCESS_TIPS: Proxy settings normal -TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: No proxy settings -TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: Proxy settings incorrect -TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: Proxy settings unavailable -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: "The temporary folder path for clipboard pictures is: ${path}" -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: "The temporary folder for clipboard pictures does not exist: ${path}" -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: "Please create the folder yourself: ${path}" - - # tips TIPS_REMOVE_LINK: This operation will remove the picture from the album, continue? @@ -217,6 +191,32 @@ DISABLE_PLUGIN: Disable Plugin UNINSTALL_PLUGIN: Uninstall Plugin UPDATE_PLUGIN: Update Plugin +# toolbox +TOOLBOX: Toolbox +TOOLBOX_TITLE: Troubleshoot PicGo runtime issues +TOOLBOX_SUB_TITLE: Scan the following items immediately to fix usage issues +TOOLBOX_CHECK_CONFIG_FILE_BROKEN: Check if the configuration file is damaged +TOOLBOX_CHECK_GALLERY_FILE_BROKEN: Check if the album file is damaged +TOOLBOX_CHECK_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: Check if there is a problem with clipboard picture upload +TOOLBOX_CHECK_PROBLEM_WITH_PROXY: Check if the proxy settings are normal +TOOLBOX_FIX_DONE_NEED_RELOAD: Repair completed, need to restart to take effect, restart or not +TOOLBOX_CANT_AUTO_FIX: Unable to automatically repair, please repair the following problems yourself +TOOLBOX_START_SCAN: Start scanning +TOOLBOX_RE_SCAN: Re scanning +TOOLBOX_START_FIX: Start fixing +TOOLBOX_SUCCESS_TIPS: Congratulations, no problems were found +TOOLBOX_CHECK_CONFIG_FILE_PATH_TIPS: "The configuration file path is: ${path}" +TOOLBOX_CHECK_CONFIG_FILE_BROKEN_TIPS: The configuration file is damaged +TOOLBOX_CHECK_GALLERY_FILE_PATH_TIPS: "The album file path is: ${path}" +TOOLBOX_CHECK_GALLERY_FILE_BROKEN_TIPS: The album file is damaged +TOOLBOX_CHECK_PROXY_SUCCESS_TIPS: Proxy settings normal +TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: No proxy settings +TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: Proxy settings incorrect +TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: Proxy settings unavailable +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: "The temporary folder path for clipboard pictures is: ${path}" +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: "The temporary folder for clipboard pictures does not exist: ${path}" +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: "Please create the folder yourself: ${path}" + # tips TIPS_NOTICE: Tips TIPS_WARNING: Warning diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index 6336667..fbd42b3 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -118,6 +118,7 @@ UPLOADER_CONFIG_NAME: 图床配置名 UPLOADER_CONFIG_PLACEHOLDER: 请输入配置名称 SELECTED_SETTING_HINT: 已选中 SETTINGS_ENCODE_OUTPUT_URL: 输出(复制) URL 时进行转义 +SETTINGS_SHOW_DOCK_ICON: 显示 Dock 栏图标 # shortcut-page diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index 0edf20c..7cd2e1b 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -118,6 +118,7 @@ UPLOADER_CONFIG_NAME: 圖床配置名 UPLOADER_CONFIG_PLACEHOLDER: 請輸入配置名稱 SELECTED_SETTING_HINT: 已選中 SETTINGS_ENCODE_OUTPUT_URL: 輸出(複製) URL 時進行轉義 +SETTINGS_SHOW_DOCK_ICON: 顯示 Dock 欄圖示 # shortcut-page @@ -161,33 +162,6 @@ PLUGIN_DOING_SOMETHING: 進行中 PLUGIN_LIST: 插件列表 PLUGIN_IMPORT_LOCAL: 導入本地插件 -# toolbox -TOOLBOX: 工具箱 -TOOLBOX_TITLE: 排查 PicGo 執行時問題 -TOOLBOX_SUB_TITLE: 立即掃描以下項目,修復使用問題 -TOOLBOX_CHECK_CONFIG_FILE_BROKEN: 檢查配置文件是否損壞 -TOOLBOX_CHECK_GALLERY_FILE_BROKEN: 檢查相冊文件是否損壞 -TOOLBOX_CHECK_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: 檢查剪貼板圖片上傳是否存在問題 -TOOLBOX_CHECK_PROBLEM_WITH_PROXY: 檢查代理設置是否正常 -TOOLBOX_FIX_DONE_NEED_RELOAD: 修復完成,需要重啓生效,是否重啓 -TOOLBOX_CANT_AUTO_FIX: 無法自動修復,請自行修復以下問題 -TOOLBOX_START_SCAN: 開始掃描 -TOOLBOX_RE_SCAN: 重新掃描 -TOOLBOX_START_FIX: 開始修復 -TOOLBOX_SUCCESS_TIPS: 恭喜你,沒有檢查出問題 -TOOLBOX_CHECK_CONFIG_FILE_PATH_TIPS: 配置文件路徑是:${path} -TOOLBOX_CHECK_CONFIG_FILE_BROKEN_TIPS: 配置文件已損壞 -TOOLBOX_CHECK_GALLERY_FILE_PATH_TIPS: 相冊文件路徑是:${path} -TOOLBOX_CHECK_GALLERY_FILE_BROKEN_TIPS: 相冊文件已損壞 -TOOLBOX_CHECK_PROXY_SUCCESS_TIPS: 代理設置正常 -TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: 無代理設置 -TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: 代理設置不正確 -TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: 代理設置不可用 -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: 剪貼板圖片臨時文件夾路徑是:${path} -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: 剪貼板圖片臨時文件夾不存在:${path} -TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: 請自行創建文件夾:${path} - - # tips TIPS_REMOVE_LINK: 此操作將在相簿中移除該圖片,是否繼續? @@ -217,6 +191,32 @@ DISABLE_PLUGIN: 禁用插件 UNINSTALL_PLUGIN: 卸載插件 UPDATE_PLUGIN: 更新插件 +# toolbox +TOOLBOX: 工具箱 +TOOLBOX_TITLE: 排查 PicGo 執行時問題 +TOOLBOX_SUB_TITLE: 立即掃描以下項目,修復使用問題 +TOOLBOX_CHECK_CONFIG_FILE_BROKEN: 檢查配置文件是否損壞 +TOOLBOX_CHECK_GALLERY_FILE_BROKEN: 檢查相冊文件是否損壞 +TOOLBOX_CHECK_PROBLEM_WITH_CLIPBOARD_PIC_UPLOAD: 檢查剪貼板圖片上傳是否存在問題 +TOOLBOX_CHECK_PROBLEM_WITH_PROXY: 檢查代理設置是否正常 +TOOLBOX_FIX_DONE_NEED_RELOAD: 修復完成,需要重啓生效,是否重啓 +TOOLBOX_CANT_AUTO_FIX: 無法自動修復,請自行修復以下問題 +TOOLBOX_START_SCAN: 開始掃描 +TOOLBOX_RE_SCAN: 重新掃描 +TOOLBOX_START_FIX: 開始修復 +TOOLBOX_SUCCESS_TIPS: 恭喜你,沒有檢查出問題 +TOOLBOX_CHECK_CONFIG_FILE_PATH_TIPS: 配置文件路徑是:${path} +TOOLBOX_CHECK_CONFIG_FILE_BROKEN_TIPS: 配置文件已損壞 +TOOLBOX_CHECK_GALLERY_FILE_PATH_TIPS: 相冊文件路徑是:${path} +TOOLBOX_CHECK_GALLERY_FILE_BROKEN_TIPS: 相冊文件已損壞 +TOOLBOX_CHECK_PROXY_SUCCESS_TIPS: 代理設置正常 +TOOLBOX_CHECK_PROXY_NO_PROXY_TIPS: 無代理設置 +TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_CORRECT: 代理設置不正確 +TOOLBOX_CHECK_PROXY_PROXY_IS_NOT_WORKING: 代理設置不可用 +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_TIPS: 剪貼板圖片臨時文件夾路徑是:${path} +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_NOT_EXIST_TIPS: 剪貼板圖片臨時文件夾不存在:${path} +TOOLBOX_CHECK_CLIPBOARD_FILE_PATH_ERROR_TIPS: 請自行創建文件夾:${path} + # tips TIPS_NOTICE: 注意 TIPS_WARNING: 警告 diff --git a/scripts/upload-dist.js b/scripts/upload-dist.js index 1ab3bed..d33eba0 100644 --- a/scripts/upload-dist.js +++ b/scripts/upload-dist.js @@ -2,24 +2,24 @@ // upload version file to cos require('dotenv').config() -const crypto = require('crypto') +// const crypto = require('crypto') +// const axios = require('axios').default const fs = require('fs') -const mime = require('mime-types') const pkg = require('../package.json') const configList = require('./config') -const axios = require('axios').default +const mime = require('mime-types') const path = require('path') const distPath = path.join(__dirname, '../dist_electron') const S3Client = require('@aws-sdk/client-s3').S3Client const Upload = require('@aws-sdk/lib-storage').Upload +// const BUCKET = 'picgo-1251750343' +// const COS_SECRET_ID = process.env.PICGO_ENV_COS_SECRET_ID +// const COS_SECRET_KEY = process.env.PICGO_ENV_COS_SECRET_KEY -const BUCKET = 'picgo-1251750343' const S3_BUCKET = 'picgo' // const AREA = 'ap-chengdu' const VERSION = pkg.version const FILE_PATH = `${VERSION}/` -const COS_SECRET_ID = process.env.PICGO_ENV_COS_SECRET_ID -const COS_SECRET_KEY = process.env.PICGO_ENV_COS_SECRET_KEY const S3_SECRET_ID = process.env.PICGO_ENV_S3_SECRET_ID const S3_SECRET_KEY = process.env.PICGO_ENV_S3_SECRET_KEY const S3_ACCOUNT_ID = process.env.PICGO_ENV_S3_ACCOUNT_ID @@ -35,83 +35,83 @@ const S3Options = { } // https://cloud.tencent.com/document/product/436/7778#signature -/** - * @param {string} fileName - * @returns - */ -const generateSignature = (fileName, folder = FILE_PATH) => { - const secretKey = COS_SECRET_ID - // const area = AREA - const bucket = BUCKET - const path = folder - const today = Math.floor(new Date().getTime() / 1000) - const tomorrow = today + 86400 - const signTime = `${today};${tomorrow}` - const signKey = crypto.createHmac('sha1', secretKey).update(signTime).digest('hex') - const httpString = `put\n/${path}${fileName}\n\nhost=${bucket}.cos.accelerate.myqcloud.com\n` - const sha1edHttpString = crypto.createHash('sha1').update(httpString).digest('hex') - const stringToSign = `sha1\n${signTime}\n${sha1edHttpString}\n` - const signature = crypto.createHmac('sha1', signKey).update(stringToSign).digest('hex') - return { - signature, - signTime - } -} +// /** +// * @param {string} fileName +// * @returns +// */ +// const generateSignature = (fileName, folder = FILE_PATH) => { +// const secretKey = COS_SECRET_ID +// // const area = AREA +// const bucket = BUCKET +// const path = folder +// const today = Math.floor(new Date().getTime() / 1000) +// const tomorrow = today + 86400 +// const signTime = `${today};${tomorrow}` +// const signKey = crypto.createHmac('sha1', secretKey).update(signTime).digest('hex') +// const httpString = `put\n/${path}${fileName}\n\nhost=${bucket}.cos.accelerate.myqcloud.com\n` +// const sha1edHttpString = crypto.createHash('sha1').update(httpString).digest('hex') +// const stringToSign = `sha1\n${signTime}\n${sha1edHttpString}\n` +// const signature = crypto.createHmac('sha1', signKey).update(stringToSign).digest('hex') +// return { +// signature, +// signTime +// } +// } -/** - * - * @param {string} fileName - * @param {Buffer} fileBuffer - * @param {{ signature: string, signTime: string }} signature - * @returns - */ -const getReqOptions = (fileName, fileBuffer, signature, folder = FILE_PATH) => { - return { - method: 'PUT', - url: `http://${BUCKET}.cos.accelerate.myqcloud.com/${encodeURI(folder)}${encodeURI(fileName)}`, - headers: { - Host: `${BUCKET}.cos.accelerate.myqcloud.com`, - Authorization: `q-sign-algorithm=sha1&q-ak=${COS_SECRET_KEY}&q-sign-time=${signature.signTime}&q-key-time=${signature.signTime}&q-header-list=host&q-url-param-list=&q-signature=${signature.signature}`, - contentType: mime.lookup(fileName), - useAgent: `PicGo;${pkg.version};null;null` - }, - maxContentLength: Infinity, - maxBodyLength: Infinity, - data: fileBuffer, - resolveWithFullResponse: true - } -} +// /** +// * +// * @param {string} fileName +// * @param {Buffer} fileBuffer +// * @param {{ signature: string, signTime: string }} signature +// * @returns +// */ +// const getReqOptions = (fileName, fileBuffer, signature, folder = FILE_PATH) => { +// return { +// method: 'PUT', +// url: `http://${BUCKET}.cos.accelerate.myqcloud.com/${encodeURI(folder)}${encodeURI(fileName)}`, +// headers: { +// Host: `${BUCKET}.cos.accelerate.myqcloud.com`, +// Authorization: `q-sign-algorithm=sha1&q-ak=${COS_SECRET_KEY}&q-sign-time=${signature.signTime}&q-key-time=${signature.signTime}&q-header-list=host&q-url-param-list=&q-signature=${signature.signature}`, +// contentType: mime.lookup(fileName), +// useAgent: `PicGo;${pkg.version};null;null` +// }, +// maxContentLength: Infinity, +// maxBodyLength: Infinity, +// data: fileBuffer, +// resolveWithFullResponse: true +// } +// } /** * a backup for version file */ -const uploadVersionFile = async () => { - try { - const platform = process.platform - if (configList[platform]) { - let versionFileHasUploaded = false - for (const [, config] of configList[platform].entries()) { - const versionFilePath = path.join(distPath, config['version-file']) - let versionFileName = config['version-file'] - if (VERSION.toLocaleLowerCase().includes('beta')) { - versionFileName = versionFileName.replace('.yml', '.beta.yml') - } - // upload version file - if (!versionFileHasUploaded) { - const signature = generateSignature(versionFileName, '') - const reqOptions = getReqOptions(versionFileName, fs.readFileSync(versionFilePath), signature, '') - console.log('[PicGo Version File] Uploading...', versionFileName) - await axios.request(reqOptions) - versionFileHasUploaded = true - } - } - } else { - console.warn('platform not supported!', platform) - } - } catch (e) { - console.error(e) - } -} +// const uploadVersionFile = async () => { +// try { +// const platform = process.platform +// if (configList[platform]) { +// let versionFileHasUploaded = false +// for (const [, config] of configList[platform].entries()) { +// const versionFilePath = path.join(distPath, config['version-file']) +// let versionFileName = config['version-file'] +// if (VERSION.toLocaleLowerCase().includes('beta')) { +// versionFileName = versionFileName.replace('.yml', '.beta.yml') +// } +// // upload version file +// if (!versionFileHasUploaded) { +// const signature = generateSignature(versionFileName, '') +// const reqOptions = getReqOptions(versionFileName, fs.readFileSync(versionFilePath), signature, '') +// console.log('[PicGo Version File] Uploading...', versionFileName) +// await axios.request(reqOptions) +// versionFileHasUploaded = true +// } +// } +// } else { +// console.warn('platform not supported!', platform) +// } +// } catch (e) { +// console.error(e) +// } +// } const uploadDist = async () => { try { @@ -152,7 +152,7 @@ const uploadDist = async () => { Bucket: S3_BUCKET, Key: `${versionFileName}`, Body: fs.createReadStream(versionFilePath), - ContentType: 'application/octet-stream' + ContentType: mime.lookup(versionFileName) } }) console.log('[PicGo Version File] Uploading...', versionFileName) @@ -169,7 +169,6 @@ const uploadDist = async () => { } const main = async () => { - await uploadVersionFile() await uploadDist() } diff --git a/src/main/apis/app/system/index.ts b/src/main/apis/app/system/index.ts index 5a52fc7..de4bab9 100644 --- a/src/main/apis/app/system/index.ts +++ b/src/main/apis/app/system/index.ts @@ -23,6 +23,7 @@ import { buildPicBedListMenu } from '~/main/events/remotes/menu' let contextMenu: Menu | null let menu: Menu | null let tray: Tray | null +// need to build new menu export function createContextMenu () { if (process.platform === 'darwin' || process.platform === 'win32') { const submenu = buildPicBedListMenu() @@ -131,6 +132,7 @@ export function createContextMenu () { } ]) } + return contextMenu! } const getTrayIcon = () => { @@ -252,7 +254,21 @@ export function createTray () { } } +export function handleDockIcon () { + if (process.platform === 'darwin') { + if (db.get('settings.showDockIcon') !== false) { + app.dock.show() + app.dock.setMenu(createContextMenu()) + } else { + app.dock.hide() + } + } +} + export function createMenu () { + if (menu) { + return menu + } if (process.env.NODE_ENV !== 'development') { const template = [{ label: 'Edit', diff --git a/src/main/apis/app/window/windowList.ts b/src/main/apis/app/window/windowList.ts index 301ca41..16a09b5 100644 --- a/src/main/apis/app/window/windowList.ts +++ b/src/main/apis/app/window/windowList.ts @@ -60,6 +60,7 @@ windowList.set(IWindowList.SETTING_WINDOW, { isValid: true, multiple: false, options () { + const showDockIcon = db.get('settings.showDockIcon') !== false const options: IBrowserWindowOptions = { height: 450, width: 800, @@ -71,6 +72,7 @@ windowList.set(IWindowList.SETTING_WINDOW, { title: 'PicGo', vibrancy: 'ultra-dark', transparent: true, + skipTaskbar: !showDockIcon, titleBarStyle: 'hidden', webPreferences: { backgroundThrottling: false, @@ -86,6 +88,7 @@ windowList.set(IWindowList.SETTING_WINDOW, { options.backgroundColor = '#3f3c37' options.transparent = false options.icon = `${__static}/logo.png` + options.skipTaskbar = false } return options }, diff --git a/src/main/events/rpc/routes/system.ts b/src/main/events/rpc/routes/system.ts index d51eceb..85bc08b 100644 --- a/src/main/events/rpc/routes/system.ts +++ b/src/main/events/rpc/routes/system.ts @@ -1,6 +1,7 @@ -import { IRPCActionType } from '~/universal/types/enum' +import { IRPCActionType, IWindowList } from '~/universal/types/enum' import { RPCRouter } from '../router' import { app, clipboard, shell } from 'electron' +import windowManager from '~/main/apis/app/window/windowManager' const systemRouter = new RPCRouter() @@ -17,6 +18,18 @@ systemRouter const [text] = args as ICopyTextArgs return clipboard.writeText(text) }) + .add(IRPCActionType.SHOW_DOCK_ICON, async (args) => { + const [visible] = args as IShowDockIconArgs + app.dock[visible ? 'show' : 'hide']() + const win = windowManager.get(IWindowList.SETTING_WINDOW) + if (!visible) { + win?.show() + win?.focus() + win?.setSkipTaskbar(true) + } else { + win?.setSkipTaskbar(false) + } + }) export { systemRouter diff --git a/src/main/lifeCycle/index.ts b/src/main/lifeCycle/index.ts index add21c1..fb18d86 100644 --- a/src/main/lifeCycle/index.ts +++ b/src/main/lifeCycle/index.ts @@ -23,7 +23,7 @@ import { uploadClipboardFiles } from 'apis/app/uploader/apis' import { - createTray + createTray, handleDockIcon } from 'apis/app/system' import server from '~/main/server/index' import updateChecker from '~/main/utils/updateChecker' @@ -36,6 +36,7 @@ import picgo from 'apis/core/picgo' import fixPath from './fixPath' import { initI18n } from '~/main/utils/handleI18n' import { remoteNoticeHandler } from 'apis/app/remoteNotice' +import { isMacOS } from '../utils/getMacOSVersion' const isDevelopment = process.env.NODE_ENV !== 'production' @@ -84,6 +85,7 @@ class LifeCycle { windowManager.create(IWindowList.TRAY_WINDOW) windowManager.create(IWindowList.SETTING_WINDOW) createTray() + handleDockIcon() db.set('needReload', false) updateChecker() // 不需要阻塞 @@ -130,6 +132,13 @@ class LifeCycle { if (!windowManager.has(IWindowList.SETTING_WINDOW)) { windowManager.create(IWindowList.SETTING_WINDOW) } + // click dock to open setting window + if (isMacOS) { + handleDockIcon() + if (db.get('settings.showDockIcon') !== false) { + windowManager.get(IWindowList.SETTING_WINDOW)?.show() + } + } }) app.setLoginItemSettings({ openAtLogin: db.get('settings.autoStart') || false diff --git a/src/renderer/components/settings/CheckboxFormItem.vue b/src/renderer/components/settings/CheckboxFormItem.vue new file mode 100644 index 0000000..3fd1da1 --- /dev/null +++ b/src/renderer/components/settings/CheckboxFormItem.vue @@ -0,0 +1,64 @@ + + + + diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 9f70951..e9f8fd8 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -242,6 +242,13 @@ @change="handleEncodeOutputURL" /> + | null>(null) @@ -569,7 +577,8 @@ const form = reactive({ useBuiltinClipboard: false, language: 'zh-CN', logFileSizeLimit: 10, - encodeOutputURL: true + encodeOutputURL: true, + showDockIcon: true }) const languageList = i18nManager.languageList.map(item => ({ @@ -667,6 +676,7 @@ async function initData () { enable: true } form.logFileSizeLimit = enforceNumber(settings.logFileSizeLimit) || 10 + form.showDockIcon = settings.showDockIcon === undefined ? true : settings.showDockIcon } } @@ -921,6 +931,10 @@ function handleLanguageChange (val: string) { sendToMain(GET_PICBEDS) } +function handleShowDockIcon (val: ICheckBoxValueType) { + sendRPC(IRPCActionType.SHOW_DOCK_ICON, val) +} + function goConfigPage () { sendToMain(OPEN_URL, 'https://picgo.github.io/PicGo-Doc/zh/guide/config.html#picgo设置') } diff --git a/src/universal/types/enum.ts b/src/universal/types/enum.ts index 53c7f53..a944c9d 100644 --- a/src/universal/types/enum.ts +++ b/src/universal/types/enum.ts @@ -70,7 +70,8 @@ export enum IRPCActionType { // system rpc RELOAD_APP = 'RELOAD_APP', OPEN_FILE = 'OPEN_FILE', - COPY_TEXT = 'COPY_TEXT' + COPY_TEXT = 'COPY_TEXT', + SHOW_DOCK_ICON = 'SHOW_DOCK_ICON', } export enum IToolboxItemType { diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index 85248d3..176a235 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -113,6 +113,7 @@ interface ILocales { UPLOADER_CONFIG_PLACEHOLDER: string SELECTED_SETTING_HINT: string SETTINGS_ENCODE_OUTPUT_URL: string + SETTINGS_SHOW_DOCK_ICON: string SHORTCUT_NAME: string SHORTCUT_BIND: string SHORTCUT_STATUS: string diff --git a/src/universal/types/rpc.d.ts b/src/universal/types/rpc.d.ts index 4576900..e0899ae 100644 --- a/src/universal/types/rpc.d.ts +++ b/src/universal/types/rpc.d.ts @@ -7,6 +7,7 @@ type IGetLatestVersionArgs = [isCheckBetaVersion: boolean] type IToolboxCheckArgs = [type: import('./enum').IToolboxItemType] type IOpenFileArgs = [filePath: string] type ICopyTextArgs = [text: string] +type IShowDockIconArgs = [visible: boolean] interface IRPCServer { start: () => void diff --git a/src/universal/types/view.d.ts b/src/universal/types/view.d.ts index f0c3b6b..7ac77ea 100644 --- a/src/universal/types/view.d.ts +++ b/src/universal/types/view.d.ts @@ -13,6 +13,7 @@ interface ISettingForm { language: string logFileSizeLimit: number encodeOutputURL: boolean + showDockIcon: boolean } interface IShortKeyMap { diff --git a/src/universal/utils/static.ts b/src/universal/utils/static.ts index 046e545..1dc8fd0 100644 --- a/src/universal/utils/static.ts +++ b/src/universal/utils/static.ts @@ -1,5 +1,5 @@ export const CLIPBOARD_IMAGE_FOLDER = 'picgo-clipboard-images' export const RELEASE_URL = 'https://api.github.com/repos/Molunerfinn/PicGo/releases' -export const RELEASE_URL_BACKUP = 'https://picgo-1251750343.cos.ap-chengdu.myqcloud.com' +export const RELEASE_URL_BACKUP = 'https://picgo-release.molunerfinn.com' export const STABLE_RELEASE_URL = 'https://github.com/Molunerfinn/PicGo/releases/latest' export const BETA_RELEASE_URL = 'https://github.com/Molunerfinn/PicGo/releases' diff --git a/vue.config.js b/vue.config.js index c6ffaf1..e999079 100644 --- a/vue.config.js +++ b/vue.config.js @@ -66,7 +66,7 @@ const config = { mac: { icon: 'build/icons/icon.icns', extendInfo: { - LSUIElement: 1 + LSUIElement: 0 }, target: [{ target: 'dmg',