2023-08-07 04:36:27 -04:00
|
|
|
|
// External dependencies
|
2022-08-25 08:04:50 -04:00
|
|
|
|
import fs from 'fs-extra'
|
2023-08-07 04:36:27 -04:00
|
|
|
|
import { cloneDeep } from 'lodash'
|
|
|
|
|
|
|
|
|
|
// Electron modules
|
2020-01-10 09:34:08 -05:00
|
|
|
|
import {
|
|
|
|
|
app,
|
|
|
|
|
Menu,
|
|
|
|
|
Tray,
|
|
|
|
|
dialog,
|
|
|
|
|
clipboard,
|
2023-04-06 03:57:36 -04:00
|
|
|
|
Notification,
|
2023-04-12 04:22:02 -04:00
|
|
|
|
screen,
|
|
|
|
|
nativeTheme
|
2020-01-10 09:34:08 -05:00
|
|
|
|
} from 'electron'
|
2023-08-07 04:36:27 -04:00
|
|
|
|
|
|
|
|
|
// Custom utilities and modules
|
2020-04-10 11:28:46 -04:00
|
|
|
|
import uploader from 'apis/app/uploader'
|
2021-07-26 23:58:24 -04:00
|
|
|
|
import db, { GalleryDB } from '~/main/apis/core/datastore'
|
2020-04-10 11:28:46 -04:00
|
|
|
|
import windowManager from 'apis/app/window/windowManager'
|
2024-04-09 03:03:32 -04:00
|
|
|
|
import { IPasteStyle, IWindowList } from '#/types/enum'
|
2022-01-04 10:40:28 -05:00
|
|
|
|
import pasteTemplate from '~/main/utils/pasteTemplate'
|
2020-01-10 09:34:08 -05:00
|
|
|
|
import pkg from 'root/package.json'
|
2024-06-07 10:59:08 -04:00
|
|
|
|
import { ensureFilePath, handleCopyUrl, setTray, tray } from '~/main/utils/common'
|
2022-08-20 04:44:55 -04:00
|
|
|
|
import { T } from '~/main/i18n'
|
2022-08-07 10:34:26 -04:00
|
|
|
|
import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion'
|
2022-12-31 07:44:19 -05:00
|
|
|
|
import { buildPicBedListMenu } from '~/main/events/remotes/menu'
|
2023-04-10 06:45:04 -04:00
|
|
|
|
import clipboardPoll from '~/main/utils/clipboardPoll'
|
2023-04-10 04:06:37 -04:00
|
|
|
|
import picgo from '../../core/picgo'
|
|
|
|
|
import { uploadClipboardFiles } from '../uploader/apis'
|
2024-04-09 03:03:32 -04:00
|
|
|
|
import { configPaths } from '~/universal/utils/configPaths'
|
2023-08-07 04:36:27 -04:00
|
|
|
|
|
2020-01-10 09:34:08 -05:00
|
|
|
|
let contextMenu: Menu | null
|
2023-04-05 01:02:17 -04:00
|
|
|
|
|
2023-04-10 04:06:37 -04:00
|
|
|
|
export function setDockMenu () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const isListeningClipboard = db.get(configPaths.settings.isListeningClipboard) || false
|
|
|
|
|
const autoCloseMiniWindow = db.get(configPaths.settings.autoCloseMiniWindow) || false
|
2023-04-10 04:06:37 -04:00
|
|
|
|
const dockMenu = Menu.buildFromTemplate([
|
|
|
|
|
{
|
|
|
|
|
label: T('OPEN_MAIN_WINDOW'),
|
|
|
|
|
click () {
|
|
|
|
|
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)
|
|
|
|
|
settingWindow!.show()
|
|
|
|
|
settingWindow!.focus()
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.MINI_WINDOW) && autoCloseMiniWindow) {
|
|
|
|
|
windowManager.get(IWindowList.MINI_WINDOW)!.hide()
|
|
|
|
|
}
|
2023-04-10 04:06:37 -04:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('START_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, true)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
clipboardPoll.startListening()
|
|
|
|
|
clipboardPoll.on('change', () => {
|
2023-04-10 04:06:37 -04:00
|
|
|
|
picgo.log.info('clipboard changed')
|
|
|
|
|
uploadClipboardFiles()
|
|
|
|
|
})
|
|
|
|
|
setDockMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: !isListeningClipboard
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('STOP_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, false)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
clipboardPoll.stopListening()
|
2023-04-10 07:50:36 -04:00
|
|
|
|
clipboardPoll.removeAllListeners()
|
2023-04-10 04:06:37 -04:00
|
|
|
|
setDockMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: isListeningClipboard
|
|
|
|
|
}
|
|
|
|
|
])
|
|
|
|
|
app.dock.setMenu(dockMenu)
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-05 01:02:17 -04:00
|
|
|
|
export function createMenu () {
|
|
|
|
|
const submenu = buildPicBedListMenu()
|
|
|
|
|
const appMenu = Menu.buildFromTemplate([
|
|
|
|
|
{
|
|
|
|
|
label: 'PicList',
|
|
|
|
|
submenu: [
|
|
|
|
|
{
|
|
|
|
|
label: T('OPEN_MAIN_WINDOW'),
|
|
|
|
|
click () {
|
|
|
|
|
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMiniWindow = db.get(configPaths.settings.autoCloseMiniWindow) || false
|
2023-04-05 01:02:17 -04:00
|
|
|
|
settingWindow!.show()
|
|
|
|
|
settingWindow!.focus()
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.MINI_WINDOW) && autoCloseMiniWindow) {
|
|
|
|
|
windowManager.get(IWindowList.MINI_WINDOW)!.hide()
|
|
|
|
|
}
|
2023-04-05 01:02:17 -04:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('RELOAD_APP'),
|
|
|
|
|
click () {
|
|
|
|
|
app.relaunch()
|
|
|
|
|
app.exit(0)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('CHOOSE_DEFAULT_PICBED'),
|
|
|
|
|
type: 'submenu',
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
submenu
|
|
|
|
|
},
|
2023-04-12 03:37:42 -04:00
|
|
|
|
{
|
|
|
|
|
label: 'Edit',
|
2023-04-12 04:22:02 -04:00
|
|
|
|
// @ts-ignore
|
2023-04-12 03:37:42 -04:00
|
|
|
|
submenu: [
|
2023-04-12 04:22:02 -04:00
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Undo', accelerator: 'CmdOrCtrl+Z', selector: 'undo:' },
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', selector: 'redo:' },
|
2023-04-12 03:37:42 -04:00
|
|
|
|
{ type: 'separator' },
|
2023-04-12 04:22:02 -04:00
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Cut', accelerator: 'CmdOrCtrl+X', selector: 'cut:' },
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Copy', accelerator: 'CmdOrCtrl+C', selector: 'copy:' },
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Paste', accelerator: 'CmdOrCtrl+V', selector: 'paste:' },
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{ label: 'Select All', accelerator: 'CmdOrCtrl+A', selector: 'selectAll:' }
|
2023-04-12 03:37:42 -04:00
|
|
|
|
]
|
|
|
|
|
},
|
2023-04-05 01:02:17 -04:00
|
|
|
|
{
|
|
|
|
|
label: T('QUIT'),
|
|
|
|
|
submenu: [
|
|
|
|
|
{
|
|
|
|
|
label: T('QUIT'),
|
|
|
|
|
role: 'quit'
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
])
|
|
|
|
|
Menu.setApplicationMenu(appMenu)
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-28 05:44:07 -04:00
|
|
|
|
export function createContextMenu () {
|
2023-05-24 05:14:21 -04:00
|
|
|
|
const ClipboardWatcher = clipboardPoll
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const isListeningClipboard = db.get(configPaths.settings.isListeningClipboard) || false
|
2021-03-28 05:44:07 -04:00
|
|
|
|
if (process.platform === 'darwin' || process.platform === 'win32') {
|
2022-12-31 07:44:19 -05:00
|
|
|
|
const submenu = buildPicBedListMenu()
|
2023-04-06 03:57:36 -04:00
|
|
|
|
const template = [
|
2020-12-28 20:59:50 -05:00
|
|
|
|
{
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('OPEN_MAIN_WINDOW'),
|
2021-03-28 05:44:07 -04:00
|
|
|
|
click () {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMiniWindow = db.get(configPaths.settings.autoCloseMiniWindow) || false
|
2020-12-28 20:59:50 -05:00
|
|
|
|
settingWindow!.show()
|
|
|
|
|
settingWindow!.focus()
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.MINI_WINDOW) && autoCloseMiniWindow) {
|
|
|
|
|
windowManager.get(IWindowList.MINI_WINDOW)!.hide()
|
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('CHOOSE_DEFAULT_PICBED'),
|
2020-12-28 20:59:50 -05:00
|
|
|
|
type: 'submenu',
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
submenu
|
|
|
|
|
},
|
2023-04-10 04:06:37 -04:00
|
|
|
|
{
|
|
|
|
|
label: T('START_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, true)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
ClipboardWatcher.startListening()
|
|
|
|
|
ClipboardWatcher.on('change', () => {
|
2023-04-10 04:06:37 -04:00
|
|
|
|
picgo.log.info('clipboard changed')
|
|
|
|
|
uploadClipboardFiles()
|
|
|
|
|
})
|
|
|
|
|
createContextMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: !isListeningClipboard
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('STOP_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, false)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
ClipboardWatcher.stopListening()
|
2023-04-10 07:50:36 -04:00
|
|
|
|
ClipboardWatcher.removeAllListeners()
|
2023-04-10 04:06:37 -04:00
|
|
|
|
createContextMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: isListeningClipboard
|
|
|
|
|
},
|
2020-12-28 20:59:50 -05:00
|
|
|
|
{
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('RELOAD_APP'),
|
2021-03-28 05:44:07 -04:00
|
|
|
|
click () {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
app.relaunch()
|
|
|
|
|
app.exit(0)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{
|
|
|
|
|
role: 'quit',
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('QUIT')
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
2023-04-06 03:57:36 -04:00
|
|
|
|
] as any
|
|
|
|
|
if (process.platform === 'win32') {
|
|
|
|
|
template.splice(2, 0,
|
|
|
|
|
{
|
|
|
|
|
label: T('OPEN_MINI_WINDOW'),
|
|
|
|
|
click () {
|
|
|
|
|
const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)!
|
2023-04-10 07:50:36 -04:00
|
|
|
|
miniWindow.removeAllListeners()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
if (db.get(configPaths.settings.miniWindowOntop)) {
|
2023-04-06 03:57:36 -04:00
|
|
|
|
miniWindow.setAlwaysOnTop(true)
|
|
|
|
|
}
|
|
|
|
|
const { width, height } = screen.getPrimaryDisplay().workAreaSize
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const lastPosition = db.get(configPaths.settings.miniWindowPosition)
|
2023-04-06 03:57:36 -04:00
|
|
|
|
if (lastPosition) {
|
|
|
|
|
miniWindow.setPosition(lastPosition[0], lastPosition[1])
|
|
|
|
|
} else {
|
|
|
|
|
miniWindow.setPosition(width - 100, height - 100)
|
|
|
|
|
}
|
2023-04-10 07:50:36 -04:00
|
|
|
|
const setPositionFunc = () => {
|
2023-04-06 03:57:36 -04:00
|
|
|
|
const position = miniWindow.getPosition()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.miniWindowPosition, position)
|
2023-04-10 07:50:36 -04:00
|
|
|
|
}
|
|
|
|
|
miniWindow.on('close', setPositionFunc)
|
|
|
|
|
miniWindow.on('move', setPositionFunc)
|
2023-04-06 03:57:36 -04:00
|
|
|
|
miniWindow.show()
|
|
|
|
|
miniWindow.focus()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMainWindow = db.get(configPaths.settings.autoCloseMainWindow) || false
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.SETTING_WINDOW) && autoCloseMainWindow) {
|
|
|
|
|
windowManager.get(IWindowList.SETTING_WINDOW)!.hide()
|
|
|
|
|
}
|
2023-04-06 03:57:36 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
contextMenu = Menu.buildFromTemplate(template)
|
2021-03-28 05:44:07 -04:00
|
|
|
|
} else if (process.platform === 'linux') {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
// TODO 图床选择功能
|
|
|
|
|
// 由于在Linux难以像在Mac和Windows上那样在点击时构造ContextMenu,
|
|
|
|
|
// 暂时取消这个选单,避免引起和设置中启用的图床不一致
|
|
|
|
|
|
|
|
|
|
// TODO 重启应用功能
|
|
|
|
|
// 目前的实现无法正常工作
|
|
|
|
|
|
|
|
|
|
contextMenu = Menu.buildFromTemplate([
|
|
|
|
|
{
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('OPEN_MAIN_WINDOW'),
|
2021-03-28 05:44:07 -04:00
|
|
|
|
click () {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMiniWindow = db.get(configPaths.settings.autoCloseMiniWindow) || false
|
2020-12-28 20:59:50 -05:00
|
|
|
|
settingWindow!.show()
|
|
|
|
|
settingWindow!.focus()
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.MINI_WINDOW) && autoCloseMiniWindow) {
|
|
|
|
|
windowManager.get(IWindowList.MINI_WINDOW)!.hide()
|
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
}
|
|
|
|
|
},
|
2023-04-06 03:57:36 -04:00
|
|
|
|
{
|
|
|
|
|
label: T('OPEN_MINI_WINDOW'),
|
|
|
|
|
click () {
|
|
|
|
|
const miniWindow = windowManager.get(IWindowList.MINI_WINDOW)!
|
2023-04-10 07:50:36 -04:00
|
|
|
|
miniWindow.removeAllListeners()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
if (db.get(configPaths.settings.miniWindowOntop)) {
|
2023-04-06 03:57:36 -04:00
|
|
|
|
miniWindow.setAlwaysOnTop(true)
|
|
|
|
|
}
|
|
|
|
|
const { width, height } = screen.getPrimaryDisplay().workAreaSize
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const lastPosition = db.get(configPaths.settings.miniWindowPosition)
|
2023-04-06 03:57:36 -04:00
|
|
|
|
if (lastPosition) {
|
|
|
|
|
miniWindow.setPosition(lastPosition[0], lastPosition[1])
|
|
|
|
|
} else {
|
|
|
|
|
miniWindow.setPosition(width - 100, height - 100)
|
|
|
|
|
}
|
2023-04-10 07:50:36 -04:00
|
|
|
|
const setPositionFunc = () => {
|
2023-04-06 03:57:36 -04:00
|
|
|
|
const position = miniWindow.getPosition()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.miniWindowPosition, position)
|
2023-04-10 07:50:36 -04:00
|
|
|
|
}
|
|
|
|
|
miniWindow.on('close', setPositionFunc)
|
|
|
|
|
miniWindow.on('move', setPositionFunc)
|
2023-04-06 03:57:36 -04:00
|
|
|
|
miniWindow.show()
|
|
|
|
|
miniWindow.focus()
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMainWindow = db.get(configPaths.settings.autoCloseMainWindow) || false
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.SETTING_WINDOW) && autoCloseMainWindow) {
|
|
|
|
|
windowManager.get(IWindowList.SETTING_WINDOW)!.hide()
|
|
|
|
|
}
|
2023-04-06 03:57:36 -04:00
|
|
|
|
}
|
|
|
|
|
},
|
2023-04-10 04:06:37 -04:00
|
|
|
|
{
|
|
|
|
|
label: T('START_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, true)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
ClipboardWatcher.startListening()
|
|
|
|
|
ClipboardWatcher.on('change', () => {
|
2023-04-10 04:06:37 -04:00
|
|
|
|
picgo.log.info('clipboard changed')
|
|
|
|
|
uploadClipboardFiles()
|
|
|
|
|
})
|
|
|
|
|
createContextMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: !isListeningClipboard
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
label: T('STOP_WATCH_CLIPBOARD'),
|
|
|
|
|
click () {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
db.set(configPaths.settings.isListeningClipboard, false)
|
2023-04-10 06:45:04 -04:00
|
|
|
|
ClipboardWatcher.stopListening()
|
2023-04-10 07:50:36 -04:00
|
|
|
|
ClipboardWatcher.removeAllListeners()
|
2023-04-10 04:06:37 -04:00
|
|
|
|
createContextMenu()
|
|
|
|
|
},
|
|
|
|
|
enabled: isListeningClipboard
|
|
|
|
|
},
|
2020-12-28 20:59:50 -05:00
|
|
|
|
{
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('ABOUT'),
|
2021-03-28 05:44:07 -04:00
|
|
|
|
click () {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
dialog.showMessageBox({
|
2023-01-16 10:27:33 -05:00
|
|
|
|
title: 'PicList',
|
|
|
|
|
message: 'PicList',
|
2020-12-28 20:59:50 -05:00
|
|
|
|
buttons: ['Ok'],
|
2023-01-16 10:27:33 -05:00
|
|
|
|
detail: `Version: ${pkg.version}\nAuthor: Kuingsmile\nGithub: https://github.com/Kuingsmile/PicList`
|
2021-03-28 05:44:07 -04:00
|
|
|
|
})
|
2020-12-28 20:59:50 -05:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
{
|
|
|
|
|
role: 'quit',
|
2022-01-09 21:20:56 -05:00
|
|
|
|
label: T('QUIT')
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
])
|
|
|
|
|
}
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-07 10:34:26 -04:00
|
|
|
|
const getTrayIcon = () => {
|
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
|
const isMacOSGreaterThan11 = isMacOSVersionGreaterThanOrEqualTo('11')
|
2022-10-20 22:46:54 -04:00
|
|
|
|
return isMacOSGreaterThan11 ? `${__static}/menubar-newdarwinTemplate.png` : `${__static}/menubar.png`
|
2022-08-07 10:34:26 -04:00
|
|
|
|
} else {
|
|
|
|
|
return `${__static}/menubar-nodarwin.png`
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-07 10:59:08 -04:00
|
|
|
|
export function createTray (tooltip: string) {
|
2022-08-07 10:34:26 -04:00
|
|
|
|
const menubarPic = getTrayIcon()
|
2024-06-07 10:59:08 -04:00
|
|
|
|
setTray(new Tray(menubarPic))
|
|
|
|
|
tray.setToolTip(tooltip)
|
2020-12-28 20:59:50 -05:00
|
|
|
|
// click事件在Mac和Windows上可以触发(在Ubuntu上无法触发,Unity不支持)
|
2021-03-28 05:44:07 -04:00
|
|
|
|
if (process.platform === 'darwin' || process.platform === 'win32') {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
tray.on('right-click', () => {
|
2020-01-10 09:34:08 -05:00
|
|
|
|
if (windowManager.has(IWindowList.TRAY_WINDOW)) {
|
|
|
|
|
windowManager.get(IWindowList.TRAY_WINDOW)!.hide()
|
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
createContextMenu()
|
|
|
|
|
tray!.popUpContextMenu(contextMenu!)
|
|
|
|
|
})
|
2024-06-07 10:59:08 -04:00
|
|
|
|
tray.on('click', (_, bounds) => {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
|
toggleWindow(bounds)
|
2022-08-25 08:04:50 -04:00
|
|
|
|
setTimeout(async () => {
|
2022-01-04 10:40:28 -05:00
|
|
|
|
const img = clipboard.readImage()
|
|
|
|
|
const obj: ImgInfo[] = []
|
2020-12-28 20:59:50 -05:00
|
|
|
|
if (!img.isEmpty()) {
|
|
|
|
|
// 从剪贴板来的图片默认转为png
|
2022-08-25 08:04:50 -04:00
|
|
|
|
// https://github.com/electron/electron/issues/9035
|
|
|
|
|
const imgPath = clipboard.read('public.file-url')
|
|
|
|
|
if (imgPath) {
|
|
|
|
|
const decodePath = ensureFilePath(imgPath)
|
|
|
|
|
if (decodePath === imgPath) {
|
|
|
|
|
obj.push({
|
|
|
|
|
imgUrl: imgPath
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
if (decodePath !== '') {
|
|
|
|
|
// 带有中文的路径,无法直接被img.src所使用,会被转义
|
|
|
|
|
const base64 = await fs.readFile(decodePath.replace('file://', ''), { encoding: 'base64' })
|
|
|
|
|
obj.push({
|
|
|
|
|
imgUrl: `data:image/png;base64,${base64}`
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
const imgUrl = img.toDataURL()
|
|
|
|
|
obj.push({
|
|
|
|
|
width: img.getSize().width,
|
|
|
|
|
height: img.getSize().height,
|
|
|
|
|
imgUrl
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
}
|
|
|
|
|
windowManager.get(IWindowList.TRAY_WINDOW)!.webContents.send('clipboardFiles', obj)
|
|
|
|
|
}, 0)
|
|
|
|
|
} else {
|
|
|
|
|
if (windowManager.has(IWindowList.TRAY_WINDOW)) {
|
|
|
|
|
windowManager.get(IWindowList.TRAY_WINDOW)!.hide()
|
|
|
|
|
}
|
|
|
|
|
const settingWindow = windowManager.get(IWindowList.SETTING_WINDOW)
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const autoCloseMiniWindow = db.get(configPaths.settings.autoCloseMiniWindow) || false
|
2020-12-28 20:59:50 -05:00
|
|
|
|
settingWindow!.show()
|
|
|
|
|
settingWindow!.focus()
|
2023-07-20 01:57:07 -04:00
|
|
|
|
if (windowManager.has(IWindowList.MINI_WINDOW) && autoCloseMiniWindow) {
|
|
|
|
|
windowManager.get(IWindowList.MINI_WINDOW)!.hide()
|
|
|
|
|
}
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
})
|
2020-01-10 09:34:08 -05:00
|
|
|
|
|
2020-12-28 20:59:50 -05:00
|
|
|
|
tray.on('drag-enter', () => {
|
2023-04-12 04:22:02 -04:00
|
|
|
|
if (nativeTheme.shouldUseDarkColors) {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
tray!.setImage(`${__static}/upload-dark.png`)
|
|
|
|
|
} else {
|
|
|
|
|
tray!.setImage(`${__static}/upload.png`)
|
|
|
|
|
}
|
|
|
|
|
})
|
2020-01-10 09:34:08 -05:00
|
|
|
|
|
2020-12-28 20:59:50 -05:00
|
|
|
|
tray.on('drag-end', () => {
|
2023-04-12 10:33:02 -04:00
|
|
|
|
tray!.setImage(getTrayIcon())
|
2020-12-28 20:59:50 -05:00
|
|
|
|
})
|
2020-01-10 09:34:08 -05:00
|
|
|
|
|
2021-04-25 11:28:08 -04:00
|
|
|
|
// drop-files only be supported in macOS
|
|
|
|
|
// so the tray window must be available
|
2024-06-07 10:59:08 -04:00
|
|
|
|
tray.on('drop-files', async (_: Event, files: string[]) => {
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const pasteStyle = db.get(configPaths.settings.pasteStyle) || IPasteStyle.MARKDOWN
|
2023-04-18 07:33:49 -04:00
|
|
|
|
const rawInput = cloneDeep(files)
|
2020-12-28 20:59:50 -05:00
|
|
|
|
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)!
|
|
|
|
|
const imgs = await uploader
|
|
|
|
|
.setWebContents(trayWindow.webContents)
|
|
|
|
|
.upload(files)
|
2024-04-09 03:03:32 -04:00
|
|
|
|
const deleteLocalFile = db.get(configPaths.settings.deleteLocalFile) || false
|
2020-12-28 20:59:50 -05:00
|
|
|
|
if (imgs !== false) {
|
|
|
|
|
const pasteText: string[] = []
|
|
|
|
|
for (let i = 0; i < imgs.length; i++) {
|
2023-04-18 07:33:49 -04:00
|
|
|
|
if (deleteLocalFile) {
|
|
|
|
|
await fs.remove(rawInput[i])
|
|
|
|
|
}
|
2024-04-09 03:03:32 -04:00
|
|
|
|
pasteText.push(await (pasteTemplate(pasteStyle, imgs[i], db.get(configPaths.settings.customLink))))
|
|
|
|
|
const isShowResultNotification = db.get(configPaths.settings.uploadResultNotification) === undefined ? true : !!db.get(configPaths.settings.uploadResultNotification)
|
2023-07-18 02:54:50 -04:00
|
|
|
|
if (isShowResultNotification) {
|
|
|
|
|
const notification = new Notification({
|
|
|
|
|
title: T('UPLOAD_SUCCEED'),
|
|
|
|
|
body: imgs[i].imgUrl!
|
|
|
|
|
// icon: files[i]
|
|
|
|
|
})
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
notification.show()
|
|
|
|
|
}, i * 100)
|
|
|
|
|
}
|
2021-07-26 23:58:24 -04:00
|
|
|
|
await GalleryDB.getInstance().insert(imgs[i])
|
2020-12-28 20:59:50 -05:00
|
|
|
|
}
|
|
|
|
|
handleCopyUrl(pasteText.join('\n'))
|
|
|
|
|
trayWindow.webContents.send('dragFiles', imgs)
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
2020-12-28 20:59:50 -05:00
|
|
|
|
})
|
|
|
|
|
// toggleWindow()
|
2021-03-28 05:44:07 -04:00
|
|
|
|
} else if (process.platform === 'linux') {
|
2020-12-28 20:59:50 -05:00
|
|
|
|
// click事件在Ubuntu上无法触发,Unity不支持(在Mac和Windows上可以触发)
|
|
|
|
|
// 需要使用 setContextMenu 设置菜单
|
|
|
|
|
createContextMenu()
|
|
|
|
|
tray!.setContextMenu(contextMenu)
|
|
|
|
|
}
|
2020-01-10 09:34:08 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const toggleWindow = (bounds: IBounds) => {
|
|
|
|
|
const trayWindow = windowManager.get(IWindowList.TRAY_WINDOW)!
|
|
|
|
|
if (trayWindow.isVisible()) {
|
|
|
|
|
trayWindow.hide()
|
|
|
|
|
} else {
|
|
|
|
|
trayWindow.setPosition(bounds.x - 98 + 11, bounds.y, false)
|
|
|
|
|
trayWindow.webContents.send('updateFiles')
|
|
|
|
|
trayWindow.show()
|
|
|
|
|
trayWindow.focus()
|
|
|
|
|
}
|
|
|
|
|
}
|