From 27628da458be98066c2304d3f6d1dcf4848d7d58 Mon Sep 17 00:00:00 2001 From: PiEgg Date: Sun, 20 Feb 2022 12:35:18 +0800 Subject: [PATCH] :sparkles: Feature: add upload-clipboard-image from electron' clipboard ISSUES CLOSED: #822 --- src/main/apis/app/uploader/apis.ts | 14 +++++++++++-- src/main/apis/app/uploader/index.ts | 31 ++++++++++++++++++++++++++++- src/renderer/pages/PicGoSetting.vue | 18 ++++++++++++++++- src/universal/i18n/zh-CN.ts | 1 + src/universal/types/view.d.ts | 1 + 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/main/apis/app/uploader/apis.ts b/src/main/apis/app/uploader/apis.ts index dcce9d7..8f93e5d 100644 --- a/src/main/apis/app/uploader/apis.ts +++ b/src/main/apis/app/uploader/apis.ts @@ -10,9 +10,19 @@ import db, { GalleryDB } from '~/main/apis/core/datastore' import { handleCopyUrl } from '~/main/utils/common' import { handleUrlEncode } from '#/utils/common' import { T } from '#/i18n/index' -export const uploadClipboardFiles = async (): Promise => { +// import dayjs from 'dayjs' + +const handleClipboardUploading = async (): Promise => { + const useBuiltinClipboard = !!db.get('settings.useBuiltinClipboard') const win = windowManager.getAvailableWindow() - const img = await uploader.setWebContents(win!.webContents).upload() + if (useBuiltinClipboard) { + return await uploader.setWebContents(win!.webContents).uploadWithBuildInClipboard() + } + return await uploader.setWebContents(win!.webContents).upload() +} + +export const uploadClipboardFiles = async (): Promise => { + const img = await handleClipboardUploading() if (img !== false) { if (img.length > 0) { const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW) diff --git a/src/main/apis/app/uploader/index.ts b/src/main/apis/app/uploader/index.ts index 92e267b..fbf5bb2 100644 --- a/src/main/apis/app/uploader/index.ts +++ b/src/main/apis/app/uploader/index.ts @@ -2,7 +2,8 @@ import { Notification, BrowserWindow, ipcMain, - WebContents + WebContents, + clipboard } from 'electron' import dayjs from 'dayjs' import picgo from '@core/picgo' @@ -15,6 +16,8 @@ import { showNotification, calcDurationRange } from '~/main/utils/common' import { RENAME_FILE_NAME, TALKING_DATA_EVENT } from '~/universal/events/constants' import logger from '@core/picgo/logger' import { T } from '~/universal/i18n' +import fse from 'fs-extra' +import path from 'path' const waitForShow = (webcontent: WebContents) => { return new Promise((resolve) => { @@ -109,6 +112,32 @@ class Uploader { return this } + /** + * use electron's clipboard image to upload + */ + async uploadWithBuildInClipboard (): Promise { + let filePath = '' + try { + const nativeImage = clipboard.readImage() + if (nativeImage.isEmpty()) { + return false + } + const buffer = nativeImage.toPNG() + const baseDir = picgo.baseDir + const fileName = `${dayjs().format('YYYYMMDDHHmmSSS')}.png` + filePath = path.join(baseDir, fileName) + await fse.writeFile(filePath, buffer) + return await this.upload([filePath]) + } catch (e: any) { + logger.error(e) + return false + } finally { + if (filePath) { + fse.unlink(filePath) + } + } + } + async upload (img?: IUploadOption): Promise { try { const startTime = Date.now() diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index ca928e0..80f3a81 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -128,6 +128,16 @@ @change="handleAutoCopyUrl" > + + + @@ -371,7 +381,8 @@ export default class extends Vue { miniWindowOntop: false, logLevel: ['all'], autoCopyUrl: true, - checkBetaUpdate: true + checkBetaUpdate: true, + useBuiltinClipboard: false } picBed: IPicBedType[] = [] @@ -446,6 +457,7 @@ export default class extends Vue { this.form.logLevel = this.initLogLevel(settings.logLevel || []) this.form.autoCopyUrl = settings.autoCopy === undefined ? true : settings.autoCopy this.form.checkBetaUpdate = settings.checkBetaUpdate === undefined ? true : settings.checkBetaUpdate + this.form.useBuiltinClipboard = settings.useBuiltinClipboard === undefined ? false : settings.useBuiltinClipboard this.customLink.value = settings.customLink || '$url' this.shortKey.upload = settings.shortKey.upload @@ -539,6 +551,10 @@ export default class extends Vue { this.saveConfig('settings.checkBetaUpdate', val) } + useBuiltinClipboardChange (val: boolean) { + this.saveConfig('settings.useBuiltinClipboard', val) + } + handleShowPicBedListChange (val: string[]) { const list = this.picBed.map(item => { if (!val.includes(item.name)) { diff --git a/src/universal/i18n/zh-CN.ts b/src/universal/i18n/zh-CN.ts index d2917fd..58b7cdc 100644 --- a/src/universal/i18n/zh-CN.ts +++ b/src/universal/i18n/zh-CN.ts @@ -103,6 +103,7 @@ export const ZH_CN = { SETTINGS_DEFAULT_PICBED: '设置默认图床', SETTINGS_SET_DEFAULT_PICBED: '设为默认图床', SETTINGS_NOT_CONFIG_OPTIONS: '暂无配置项', + SETTINGS_USE_BUILTIN_CLIPBOARD_UPLOAD: '使用内置剪贴板上传', // shortcut page SHORTCUT_NAME: '快捷键名称', diff --git a/src/universal/types/view.d.ts b/src/universal/types/view.d.ts index feb066b..3cabc14 100644 --- a/src/universal/types/view.d.ts +++ b/src/universal/types/view.d.ts @@ -9,6 +9,7 @@ interface ISettingForm { logLevel: string[] autoCopyUrl: boolean checkBetaUpdate: boolean + useBuiltinClipboard: boolean } interface IShortKeyMap {