From 1e481edc67bdf29e4b3fb16aec7ff6a3335af5c0 Mon Sep 17 00:00:00 2001 From: Lasy <1255352506@qq.com> Date: Fri, 3 Apr 2020 20:00:43 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E2=80=9C=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E6=97=B6=E6=9C=80=E5=B0=8F=E5=8C=96=E5=88=B0=E6=89=98?= =?UTF-8?q?=E7=9B=98=E2=80=9D=E7=9A=84=E8=AE=BE=E7=BD=AE=20(#166)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加托盘设置,调整主进程代码架构 --- build-config/main/webpack.config.base.js | 2 + package-lock.json | 2 +- src/main/events/_name.js | 5 + src/main/events/index.js | 16 +- src/main/events/tray.js | 14 + src/main/index.js | 84 ++---- src/main/modules/appMenu.js | 43 ++++ src/main/modules/index.js | 2 + src/main/modules/tray.js | 42 +++ .../{events => rendererEvents}/appName.js | 0 .../{events => rendererEvents}/clearCache.js | 0 .../getCacheSize.js | 0 .../getEnvParams.js | 0 src/main/rendererEvents/index.js | 14 + .../{events => rendererEvents}/musicMeta.js | 0 .../{events => rendererEvents}/progressBar.js | 0 .../{events => rendererEvents}/request.js | 0 .../restartWindow.js | 0 .../{events => rendererEvents}/selectDir.js | 0 .../setIgnoreMouseEvent.js | 0 .../setWindowSize.js | 0 .../showSaveDialog.js | 0 .../trafficLight.js | 6 +- src/main/rendererEvents/tray.js | 17 ++ .../{events => rendererEvents}/winEvent.js | 0 src/main/utils/autoUpdate.js | 7 +- src/main/utils/index.js | 16 +- src/renderer/components/core/Toolbar.vue | 4 +- src/renderer/lang/cns/view/setting.json | 2 + src/renderer/lang/cnt/view/setting.json | 2 + src/renderer/lang/en/view/setting.json | 242 +++++++++--------- src/renderer/utils/index.js | 7 +- src/renderer/views/Setting.vue | 15 +- src/static/images/tray/256x256.ico | Bin 0 -> 7602 bytes src/static/images/tray/512x512.icns | Bin 0 -> 43120 bytes src/static/images/tray/512x512.png | Bin 0 -> 16571 bytes 36 files changed, 340 insertions(+), 202 deletions(-) create mode 100644 src/main/events/_name.js create mode 100644 src/main/events/tray.js create mode 100644 src/main/modules/appMenu.js create mode 100644 src/main/modules/index.js create mode 100644 src/main/modules/tray.js rename src/main/{events => rendererEvents}/appName.js (100%) rename src/main/{events => rendererEvents}/clearCache.js (100%) rename src/main/{events => rendererEvents}/getCacheSize.js (100%) rename src/main/{events => rendererEvents}/getEnvParams.js (100%) create mode 100644 src/main/rendererEvents/index.js rename src/main/{events => rendererEvents}/musicMeta.js (100%) rename src/main/{events => rendererEvents}/progressBar.js (100%) rename src/main/{events => rendererEvents}/request.js (100%) rename src/main/{events => rendererEvents}/restartWindow.js (100%) rename src/main/{events => rendererEvents}/selectDir.js (100%) rename src/main/{events => rendererEvents}/setIgnoreMouseEvent.js (100%) rename src/main/{events => rendererEvents}/setWindowSize.js (100%) rename src/main/{events => rendererEvents}/showSaveDialog.js (100%) rename src/main/{events => rendererEvents}/trafficLight.js (73%) create mode 100644 src/main/rendererEvents/tray.js rename src/main/{events => rendererEvents}/winEvent.js (100%) create mode 100644 src/static/images/tray/256x256.ico create mode 100644 src/static/images/tray/512x512.icns create mode 100644 src/static/images/tray/512x512.png diff --git a/build-config/main/webpack.config.base.js b/build-config/main/webpack.config.base.js index 01a2d03d..fc5be7d5 100644 --- a/build-config/main/webpack.config.base.js +++ b/build-config/main/webpack.config.base.js @@ -9,6 +9,8 @@ module.exports = { }, resolve: { alias: { + '@': path.join(__dirname, '../../src/main'), + events: path.join(__dirname, '../../src/main/events'), common: path.join(__dirname, '../../src/common'), }, extensions: ['*', '.js', '.json', '.node'], diff --git a/package-lock.json b/package-lock.json index 0fa10792..00e4bbc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "0.16.0", + "version": "0.17.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/main/events/_name.js b/src/main/events/_name.js new file mode 100644 index 00000000..95d4d37c --- /dev/null +++ b/src/main/events/_name.js @@ -0,0 +1,5 @@ +exports.tray = { + create: 'create', + destroy: 'destroy', +} + diff --git a/src/main/events/index.js b/src/main/events/index.js index 0ad3cfed..15015415 100644 --- a/src/main/events/index.js +++ b/src/main/events/index.js @@ -1,13 +1,5 @@ +global.lx_event = {} -require('./request') -// require('./appName') -require('./progressBar') -require('./trafficLight') -require('./musicMeta') -require('./selectDir') -require('./setWindowSize') -require('./showSaveDialog') -require('./clearCache') -require('./getCacheSize') -require('./setIgnoreMouseEvent') -require('./getEnvParams') +const Tray = require('./tray') + +if (!global.lx_event.setting) global.lx_event.tray = new Tray() diff --git a/src/main/events/tray.js b/src/main/events/tray.js new file mode 100644 index 00000000..39867f43 --- /dev/null +++ b/src/main/events/tray.js @@ -0,0 +1,14 @@ +const { EventEmitter } = require('events') +const { tray: TRAY_EVENT_NAME } = require('./_name') + +class Tray extends EventEmitter { + create() { + this.emit(TRAY_EVENT_NAME.create) + } + + destroy() { + this.emit(TRAY_EVENT_NAME.destroy) + } +} + +module.exports = Tray diff --git a/src/main/index.js b/src/main/index.js index 59c46d88..f54798d4 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,4 +1,4 @@ -const { app, BrowserWindow, Menu } = require('electron') +const { app, BrowserWindow } = require('electron') const path = require('path') // 单例应用程序 @@ -15,28 +15,28 @@ app.on('second-instance', (event, argv, cwd) => { } }) -const isDev = process.env.NODE_ENV !== 'production' +const isDev = global.isDev = process.env.NODE_ENV !== 'production' // https://github.com/electron/electron/issues/18397 app.allowRendererProcessReuse = !isDev -const { getWindowSizeInfo, parseEnv } = require('./utils') +const { getAppSetting, parseEnv, getWindowSizeInfo } = require('./utils') global.envParams = parseEnv() require('../common/error') require('./events') -const winEvent = require('./events/winEvent') +require('./rendererEvents') +const winEvent = require('./rendererEvents/winEvent') const autoUpdate = require('./utils/autoUpdate') -const { isLinux, isMac } = require('../common/utils') - +const { isMac, isLinux } = require('../common/utils') let mainWindow let winURL -let isFirstCheckedUpdate = true if (isDev) { - global.__static = path.join(__dirname, '../static') + // eslint-disable-next-line no-undef + global.__static = __static winURL = 'http://localhost:9080' } else { global.__static = path.join(__dirname, '/static') @@ -44,7 +44,7 @@ if (isDev) { } function createWindow() { - let windowSizeInfo = getWindowSizeInfo() + const windowSizeInfo = getWindowSizeInfo(global.appSetting) /** * Initial window options */ @@ -71,61 +71,27 @@ function createWindow() { winEvent(mainWindow) // mainWindow.webContents.openDevTools() - if (!isDev) { - autoUpdate(isFirstCheckedUpdate) - isFirstCheckedUpdate = false - } + if (!isDev) autoUpdate() } -if (isMac) { - const template = [ - { - label: app.getName(), - submenu: [ - { label: '关于洛雪音乐', role: 'about' }, - { type: 'separator' }, - { label: '隐藏', role: 'hide' }, - { label: '显示其他', role: 'hideothers' }, - { label: '显示全部', role: 'unhide' }, - { type: 'separator' }, - { label: '退出', accelerator: 'Command+Q', click: () => app.quit() }, - ], - }, - { - label: '窗口', - role: 'window', - submenu: [ - { label: '最小化', role: 'minimize' }, - { label: '关闭', role: 'close' }, - ], - }, - { - label: '编辑', - submenu: [ - { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, - { label: '恢复', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, - { type: 'separator' }, - { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' }, - { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' }, - { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' }, - { label: '选择全部', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, - ], - }, - ] - - Menu.setApplicationMenu(Menu.buildFromTemplate(template)) -} else { - Menu.setApplicationMenu(null) +function init() { + global.appSetting = getAppSetting() + createWindow() + global.lx_event.tray.create() } -app.on('ready', createWindow) - -app.on('window-all-closed', () => { - if (!isMac) app.quit() -}) +app.on('ready', init) app.on('activate', () => { - if (mainWindow === null) { - createWindow() + if (mainWindow === null) return init() +}) + +app.on('window-all-closed', () => { + if (isMac) { + global.lx_event.tray.destroy() + } else { + app.quit() } }) + +require('./modules') diff --git a/src/main/modules/appMenu.js b/src/main/modules/appMenu.js new file mode 100644 index 00000000..89bfd837 --- /dev/null +++ b/src/main/modules/appMenu.js @@ -0,0 +1,43 @@ +const { app, Menu } = require('electron') +const { isMac } = require('../../common/utils') + +if (isMac) { + const template = [ + { + label: app.getName(), + submenu: [ + { label: '关于洛雪音乐', role: 'about' }, + { type: 'separator' }, + { label: '隐藏', role: 'hide' }, + { label: '显示其他', role: 'hideothers' }, + { label: '显示全部', role: 'unhide' }, + { type: 'separator' }, + { label: '退出', accelerator: 'Command+Q', click: () => app.quit() }, + ], + }, + { + label: '窗口', + role: 'window', + submenu: [ + { label: '最小化', role: 'minimize' }, + { label: '关闭', role: 'close' }, + ], + }, + { + label: '编辑', + submenu: [ + { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: '恢复', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: '选择全部', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, + ], + }, + ] + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)) +} else { + Menu.setApplicationMenu(null) +} diff --git a/src/main/modules/index.js b/src/main/modules/index.js new file mode 100644 index 00000000..bd79f0da --- /dev/null +++ b/src/main/modules/index.js @@ -0,0 +1,2 @@ +require('./appMenu') +require('./tray') diff --git a/src/main/modules/tray.js b/src/main/modules/tray.js new file mode 100644 index 00000000..5337c21c --- /dev/null +++ b/src/main/modules/tray.js @@ -0,0 +1,42 @@ +const { Tray, Menu } = require('electron') +const { isMac, isWin } = require('../../common/utils') +const { tray: TRAY_EVENT_NAME } = require('../events/_name') +const path = require('path') +global.lx_event.tray.on(TRAY_EVENT_NAME.create, () => { + createTray() +}) +global.lx_event.tray.on(TRAY_EVENT_NAME.destroy, () => { + destroyTray() +}) + +let tray +function createTray() { + if (tray && !tray.isDestroyed() && global.appSetting.tray && global.appSetting.tray.isShow) return + + const iconPath = path.join(global.__static, 'images/tray', isWin ? '256x256.ico' : isMac ? '512x512.icns' : '512x512.png') + + // 托盘 + tray = new Tray(iconPath) + + const contextMenu = Menu.buildFromTemplate([ + { + label: '退出', + role: 'quit', + }, + ]) + tray.setToolTip('洛雪音乐助手') + tray.setContextMenu(contextMenu) + tray.on('click', () => { + const mainWindow = global.mainWindow + if (!mainWindow) return + mainWindow.isVisible() + ? mainWindow.focus() + : mainWindow.show() + }) +} + +function destroyTray() { + if (!tray) return + tray.destroy() + tray = null +} diff --git a/src/main/events/appName.js b/src/main/rendererEvents/appName.js similarity index 100% rename from src/main/events/appName.js rename to src/main/rendererEvents/appName.js diff --git a/src/main/events/clearCache.js b/src/main/rendererEvents/clearCache.js similarity index 100% rename from src/main/events/clearCache.js rename to src/main/rendererEvents/clearCache.js diff --git a/src/main/events/getCacheSize.js b/src/main/rendererEvents/getCacheSize.js similarity index 100% rename from src/main/events/getCacheSize.js rename to src/main/rendererEvents/getCacheSize.js diff --git a/src/main/events/getEnvParams.js b/src/main/rendererEvents/getEnvParams.js similarity index 100% rename from src/main/events/getEnvParams.js rename to src/main/rendererEvents/getEnvParams.js diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js new file mode 100644 index 00000000..a555a5bd --- /dev/null +++ b/src/main/rendererEvents/index.js @@ -0,0 +1,14 @@ + +require('./request') +// require('./appName') +require('./progressBar') +require('./trafficLight') +require('./musicMeta') +require('./selectDir') +require('./setWindowSize') +require('./showSaveDialog') +require('./clearCache') +require('./getCacheSize') +require('./setIgnoreMouseEvent') +require('./getEnvParams') +require('./tray') diff --git a/src/main/events/musicMeta.js b/src/main/rendererEvents/musicMeta.js similarity index 100% rename from src/main/events/musicMeta.js rename to src/main/rendererEvents/musicMeta.js diff --git a/src/main/events/progressBar.js b/src/main/rendererEvents/progressBar.js similarity index 100% rename from src/main/events/progressBar.js rename to src/main/rendererEvents/progressBar.js diff --git a/src/main/events/request.js b/src/main/rendererEvents/request.js similarity index 100% rename from src/main/events/request.js rename to src/main/rendererEvents/request.js diff --git a/src/main/events/restartWindow.js b/src/main/rendererEvents/restartWindow.js similarity index 100% rename from src/main/events/restartWindow.js rename to src/main/rendererEvents/restartWindow.js diff --git a/src/main/events/selectDir.js b/src/main/rendererEvents/selectDir.js similarity index 100% rename from src/main/events/selectDir.js rename to src/main/rendererEvents/selectDir.js diff --git a/src/main/events/setIgnoreMouseEvent.js b/src/main/rendererEvents/setIgnoreMouseEvent.js similarity index 100% rename from src/main/events/setIgnoreMouseEvent.js rename to src/main/rendererEvents/setIgnoreMouseEvent.js diff --git a/src/main/events/setWindowSize.js b/src/main/rendererEvents/setWindowSize.js similarity index 100% rename from src/main/events/setWindowSize.js rename to src/main/rendererEvents/setWindowSize.js diff --git a/src/main/events/showSaveDialog.js b/src/main/rendererEvents/showSaveDialog.js similarity index 100% rename from src/main/events/showSaveDialog.js rename to src/main/rendererEvents/showSaveDialog.js diff --git a/src/main/events/trafficLight.js b/src/main/rendererEvents/trafficLight.js similarity index 73% rename from src/main/events/trafficLight.js rename to src/main/rendererEvents/trafficLight.js index 2be309f5..d6e02b29 100644 --- a/src/main/events/trafficLight.js +++ b/src/main/rendererEvents/trafficLight.js @@ -1,7 +1,6 @@ // const { app } = require('electron') const { mainOn } = require('../../common/ipc') - mainOn('min', event => { if (global.mainWindow) { global.mainWindow.minimize() @@ -12,10 +11,11 @@ mainOn('max', event => { global.mainWindow.maximize() } }) -mainOn('close', event => { +mainOn('close', (event, params) => { if (global.mainWindow) { + // console.log('close', params) + if (params && params.isToTray) return global.mainWindow.hide() // global.mainWindowdow.destroy() - // console.log('close') // app.quit() global.mainWindow.close() } diff --git a/src/main/rendererEvents/tray.js b/src/main/rendererEvents/tray.js new file mode 100644 index 00000000..127abf4f --- /dev/null +++ b/src/main/rendererEvents/tray.js @@ -0,0 +1,17 @@ +// const { app } = require('electron') +const { mainOn } = require('../../common/ipc') + +mainOn('changeTray', (event, params) => { + switch (params.action) { + case 'create': + global.lx_event.tray.create() + break + case 'destroy': + global.lx_event.tray.destroy() + break + + default: + break + } +}) + diff --git a/src/main/events/winEvent.js b/src/main/rendererEvents/winEvent.js similarity index 100% rename from src/main/events/winEvent.js rename to src/main/rendererEvents/winEvent.js diff --git a/src/main/utils/autoUpdate.js b/src/main/utils/autoUpdate.js index 84ddd8d8..2e2cc857 100644 --- a/src/main/utils/autoUpdate.js +++ b/src/main/utils/autoUpdate.js @@ -5,6 +5,9 @@ const { mainOn } = require('../../common/ipc') autoUpdater.logger = log // autoUpdater.autoDownload = false autoUpdater.logger.transports.file.level = 'info' + +let isFirstCheckedUpdate = true + log.info('App starting...') @@ -67,7 +70,7 @@ const handleSendEvent = action => { } } -module.exports = isFirstCheckedUpdate => { +module.exports = () => { if (!isFirstCheckedUpdate) { if (waitEvent.length) { waitEvent.forEach((event, index) => { @@ -79,6 +82,8 @@ module.exports = isFirstCheckedUpdate => { } return } + isFirstCheckedUpdate = false + autoUpdater.on('checking-for-update', () => { sendStatusToWindow('Checking for update...') }) diff --git a/src/main/utils/index.js b/src/main/utils/index.js index 4f328a6a..1f932106 100644 --- a/src/main/utils/index.js +++ b/src/main/utils/index.js @@ -1,12 +1,22 @@ const Store = require('electron-store') const { windowSizeList } = require('../../common/config') -exports.getWindowSizeInfo = () => { - let electronStore = new Store() - const { windowSizeId = 1 } = electronStore.get('setting') || {} +exports.getWindowSizeInfo = ({ windowSizeId = 1 } = {}) => { return windowSizeList.find(i => i.id === windowSizeId) || windowSizeList[0] } +exports.getAppSetting = () => { + let electronStore = new Store() + const defaultSetting = { + windowSizeId: 1, + tray: { + isShow: false, + isToTray: false, + }, + } + return Object.assign(defaultSetting, electronStore.get('setting') || {}) +} + exports.parseEnv = () => { const params = {} const rx = /^-\w+/ diff --git a/src/renderer/components/core/Toolbar.vue b/src/renderer/components/core/Toolbar.vue index f778c611..15a3242f 100644 --- a/src/renderer/components/core/Toolbar.vue +++ b/src/renderer/components/core/Toolbar.vue @@ -119,7 +119,9 @@ export default { rendererSend('max') }, close() { - rendererSend('close') + rendererSend('close', { + isToTray: this.setting.tray.isToTray, + }) }, }, } diff --git a/src/renderer/lang/cns/view/setting.json b/src/renderer/lang/cns/view/setting.json index c2817346..c621500f 100644 --- a/src/renderer/lang/cns/view/setting.json +++ b/src/renderer/lang/cns/view/setting.json @@ -18,6 +18,8 @@ "basic_window_size_medium": "中", "basic_window_size_big": "大", "basic_window_size_larger": "较大", + "basic_to_tray_title": "关闭时不退出软件将其最小化到系统托盘", + "basic_to_tray": "关闭时最小化到系统托盘", "basic_lang_title": "软件显示的语言", "basic_lang": "语言", diff --git a/src/renderer/lang/cnt/view/setting.json b/src/renderer/lang/cnt/view/setting.json index 3899b757..c3569e07 100644 --- a/src/renderer/lang/cnt/view/setting.json +++ b/src/renderer/lang/cnt/view/setting.json @@ -18,6 +18,8 @@ "basic_window_size_medium": "中", "basic_window_size_big": "大", "basic_window_size_larger": "較大", + "basic_to_tray_title": "關閉時不退出軟件將其最小化到系統托盤", + "basic_to_tray": "關閉時最小化到系統托盤", "basic_lang_title": "軟件顯示的語言", "basic_lang": "語言", "play": "播放設置", diff --git a/src/renderer/lang/en/view/setting.json b/src/renderer/lang/en/view/setting.json index 51b777f3..f5bb6c55 100644 --- a/src/renderer/lang/en/view/setting.json +++ b/src/renderer/lang/en/view/setting.json @@ -1,120 +1,122 @@ -{ - "basic": "General", - "basic_theme": "Theme", - "basic_animation_title": "Animation effect of the pop-up layer", - "basic_animation": "Random pop-up animation", - "basic_source_title": "Choose a music source", - "basic_source_test": "Test API (Available for most software features)", - "basic_source_temp": "Temporary API (some features not available; workaround if Test API unavailable)", - "basic_source": "Music source", - "basic_sourcename_title": "Select the name of music source", - "basic_sourcename_real": "Original", - "basic_sourcename_alias": "Aliases", - "basic_sourcename": "Source name", - "basic_window_size_title": "Set the window size", - "basic_window_size": "Window size", - "basic_window_size_smaller": "Smaller", - "basic_window_size_small": "Small", - "basic_window_size_medium": "Medium", - "basic_window_size_big": "Large", - "basic_window_size_larger": "Larger", - "basic_lang_title": "The language displayed in the software", - "basic_lang": "Language", - - "play": "Play", - "play_toggle_title": "If none selected, it stopped when the music playing is done.", - "play_toggle": "Playback mode", - "play_toggle_list_loop": "Playlist repeat", - "play_toggle_random": "Playlist shuffle", - "play_toggle_list": "Play in order", - "play_toggle_single_loop": "Single repeat", - "play_quality_title": "The 320k quality is preferred for playing", - "play_quality": "Prefer High Quality 320k", - "play_task_bar_title": "Show playing progress on the taskbar", - "play_task_bar": "Taskbar play progress bar", - "play_mediaDevice_title": "Select a media device for audio output", - "play_mediaDevice": "Audio output", - "play_mediaDevice_refresh_btn_title": "Refresh audio device list", - "play_mediaDevice_refresh_btn": "Refresh", - - "search": "Search", - "search_hot_title": "Select whether to show popular searches", - "search_hot": "Top Searches", - "search_history_title": "Select whether to show search history", - "search_history": "Search history", - - "list": "List", - "list_source_title": "Select whether to show music source", - "list_source": "Select whether to show music source (for Your Library only)", - "list_scroll_title": "Select whether to remember the playlist scrollbar position", - "list_scroll": "Remember playlist scrolling position (for Your library only)", - - "download": "Download", - "download_path_title": "Define the path to downloading", - "download_path": "Download path", - "download_path_label": "Current:", - "download_path_open_label": "Click to open this path", - "download_path_change_btn": "Change", - "download_name_title": "Select the music naming method for downloading", - "download_name": "Music file naming", - "download_embed_pic_title": "Select whether to embed the cover into the music file", - "download_embed_pic": "Embedding cover (supports MP3 format only)", - "download_lyric_title": "Select whether to download the lyrics file", - "download_lyric": "Lyrics download", - "download_name1": "Title - Artist", - "download_name2": "Artist - Title", - "download_name3": "Title only", - "download_select_save_path": "Select the save path", - - "network": "Network", - "network_proxy_title": "Proxy (False setting would block Internet connections)", - "network_proxy_host": "Host", - "network_proxy_port": "Port", - "network_proxy_username": "Username", - "network_proxy_password": "Password", - - "odc": "Auto clear", - "odc_clear_search_input": "Clear the search box when you are not searching", - "odc_clear_search_list": "Clear the search list when you are not searching", - - "backup": "Backup and restore", - "backup_part": "Partially", - "backup_part_import_list": "Import lists", - "backup_part_export_list": "Export lists", - "backup_part_import_setting": "Import settings", - "backup_part_export_setting": "Export settings", - "backup_all": "All (Settings and Recently Played)", - "backup_all_import": "Import", - "backup_all_export": "Export", - "backup_all_import_desc": "Select a backup file", - "backup_all_export_desc": "Select the backup to...", - "backup_part_import_setting_desc": "Select the Settings file", - "backup_part_export_setting_desc": "Save the list to...", - "backup_part_import_list_desc": "Select a list backup", - "backup_part_export_list_desc": "Save the list to...", - - "other": "Extras", - "other_cache": "Cache size (Not recommended since resources such as pictures after the cache is cleaned need re-downloading. The software will dynamically manage the cache size based on disk space)", - "other_cache_label": "Cache size used:", - "other_cache_label_title": "Currently used cache size", - "other_cache_clear_btn": "Clear cache", - - "update": "Update", - "update_latest_label": "Latest version: ", - "update_unknown": "Unknown", - "update_current_label": "Current version: ", - "update_downloading": "Update is found and being downloaded...⏳", - "update_progress": "Download progress: ", - "update_latest": "The software is up-to-date, enjoy yourself!🥂", - "update_open_version_modal_btn": "Open the update window🚀", - "update_checking": "Checking for updates...", - "update_init": "Initializing update...", - - "about": "About lx-music-desktop", - - - "is_enable": "Enabled", - "is_show": "Showed", - "click_open": "Click to open", - "click_copy": "Click to copy" -} +{ + "basic": "General", + "basic_theme": "Theme", + "basic_animation_title": "Animation effect of the pop-up layer", + "basic_animation": "Random pop-up animation", + "basic_source_title": "Choose a music source", + "basic_source_test": "Test API (Available for most software features)", + "basic_source_temp": "Temporary API (some features not available; workaround if Test API unavailable)", + "basic_source": "Music source", + "basic_sourcename_title": "Select the name of music source", + "basic_sourcename_real": "Original", + "basic_sourcename_alias": "Aliases", + "basic_sourcename": "Source name", + "basic_window_size_title": "Set the window size", + "basic_window_size": "Window size", + "basic_window_size_smaller": "Smaller", + "basic_window_size_small": "Small", + "basic_window_size_medium": "Medium", + "basic_window_size_big": "Large", + "basic_window_size_larger": "Larger", + "basic_to_tray_title": "Minimize it to the system tray without closing the software when closing", + "basic_to_tray": "Minimize to system tray when closing", + "basic_lang_title": "The language displayed in the software", + "basic_lang": "Language", + + "play": "Play", + "play_toggle_title": "If none selected, it stopped when the music playing is done.", + "play_toggle": "Playback mode", + "play_toggle_list_loop": "Playlist repeat", + "play_toggle_random": "Playlist shuffle", + "play_toggle_list": "Play in order", + "play_toggle_single_loop": "Single repeat", + "play_quality_title": "The 320k quality is preferred for playing", + "play_quality": "Prefer High Quality 320k", + "play_task_bar_title": "Show playing progress on the taskbar", + "play_task_bar": "Taskbar play progress bar", + "play_mediaDevice_title": "Select a media device for audio output", + "play_mediaDevice": "Audio output", + "play_mediaDevice_refresh_btn_title": "Refresh audio device list", + "play_mediaDevice_refresh_btn": "Refresh", + + "search": "Search", + "search_hot_title": "Select whether to show popular searches", + "search_hot": "Top Searches", + "search_history_title": "Select whether to show search history", + "search_history": "Search history", + + "list": "List", + "list_source_title": "Select whether to show music source", + "list_source": "Select whether to show music source (for Your Library only)", + "list_scroll_title": "Select whether to remember the playlist scrollbar position", + "list_scroll": "Remember playlist scrolling position (for Your library only)", + + "download": "Download", + "download_path_title": "Define the path to downloading", + "download_path": "Download path", + "download_path_label": "Current:", + "download_path_open_label": "Click to open this path", + "download_path_change_btn": "Change", + "download_name_title": "Select the music naming method for downloading", + "download_name": "Music file naming", + "download_embed_pic_title": "Select whether to embed the cover into the music file", + "download_embed_pic": "Embedding cover (supports MP3 format only)", + "download_lyric_title": "Select whether to download the lyrics file", + "download_lyric": "Lyrics download", + "download_name1": "Title - Artist", + "download_name2": "Artist - Title", + "download_name3": "Title only", + "download_select_save_path": "Select the save path", + + "network": "Network", + "network_proxy_title": "Proxy (False setting would block Internet connections)", + "network_proxy_host": "Host", + "network_proxy_port": "Port", + "network_proxy_username": "Username", + "network_proxy_password": "Password", + + "odc": "Auto clear", + "odc_clear_search_input": "Clear the search box when you are not searching", + "odc_clear_search_list": "Clear the search list when you are not searching", + + "backup": "Backup and restore", + "backup_part": "Partially", + "backup_part_import_list": "Import lists", + "backup_part_export_list": "Export lists", + "backup_part_import_setting": "Import settings", + "backup_part_export_setting": "Export settings", + "backup_all": "All (Settings and Recently Played)", + "backup_all_import": "Import", + "backup_all_export": "Export", + "backup_all_import_desc": "Select a backup file", + "backup_all_export_desc": "Select the backup to...", + "backup_part_import_setting_desc": "Select the Settings file", + "backup_part_export_setting_desc": "Save the list to...", + "backup_part_import_list_desc": "Select a list backup", + "backup_part_export_list_desc": "Save the list to...", + + "other": "Extras", + "other_cache": "Cache size (Not recommended since resources such as pictures after the cache is cleaned need re-downloading. The software will dynamically manage the cache size based on disk space)", + "other_cache_label": "Cache size used:", + "other_cache_label_title": "Currently used cache size", + "other_cache_clear_btn": "Clear cache", + + "update": "Update", + "update_latest_label": "Latest version: ", + "update_unknown": "Unknown", + "update_current_label": "Current version: ", + "update_downloading": "Update is found and being downloaded...⏳", + "update_progress": "Download progress: ", + "update_latest": "The software is up-to-date, enjoy yourself!🥂", + "update_open_version_modal_btn": "Open the update window🚀", + "update_checking": "Checking for updates...", + "update_init": "Initializing update...", + + "about": "About lx-music-desktop", + + + "is_enable": "Enabled", + "is_show": "Showed", + "click_open": "Click to open", + "click_copy": "Click to copy" +} diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 2d4582a7..c4351dff 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -177,7 +177,7 @@ export const isChildren = (parent, children) => { * @param {*} setting */ export const updateSetting = (setting, version) => { - const defaultVersion = '1.0.19' + const defaultVersion = '1.0.22' if (!version) { if (setting) { version = setting.version @@ -238,6 +238,10 @@ export const updateSetting = (setting, version) => { password: '', }, }, + tray: { + isShow: false, + isToTray: false, + }, windowSizeId: 2, themeId: 0, langId: 'cns', @@ -264,6 +268,7 @@ export const updateSetting = (setting, version) => { setting = defaultSetting } if (setting.apiSource != 'temp') setting.apiSource = 'test' // 强制设置回 test 接口源 + return { setting, version: defaultVersion } } diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index 21d17c45..1068926c 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -28,6 +28,11 @@ div.scroll(:class="$style.setting") material-checkbox(v-for="(item, index) in windowSizeList" :id="`setting_window_size_${item.id}`" name="setting_window_size" @change="handleWindowSizeChange" :class="$style.gapLeft" need v-model="current_setting.windowSizeId" :value="item.id" :label="$t('view.setting.basic_window_size_' + item.name)" :key="item.id") + dd(:title="$t('view.setting.basic_to_tray_title')") + h3 {{$t('view.setting.basic_to_tray')}} + div + material-checkbox(id="setting_to_tray" v-model="current_setting.tray.isToTray" @change="handleToTrayChange" :label="$t('view.setting.is_enable')") + dd(:title="$t('view.setting.basic_lang_title')") h3 {{$t('view.setting.basic_lang')}} div @@ -361,7 +366,11 @@ export default { themeId: 0, sourceId: 0, randomAnimate: true, - apiSource: 'messoer', + tray: { + isShow: false, + isToTray: false, + }, + apiSource: 'temp', }, languageList, cacheSize: '0 B', @@ -612,6 +621,10 @@ export default { handleMediaDeviceChange(audioDevice) { this.setMediaDeviceId(audioDevice.deviceId) }, + handleToTrayChange(isToTray) { + this.current_setting.tray.isShow = isToTray + rendererSend('changeTray', { action: isToTray ? 'create' : 'destroy' }) + }, }, } diff --git a/src/static/images/tray/256x256.ico b/src/static/images/tray/256x256.ico new file mode 100644 index 0000000000000000000000000000000000000000..a961683defa298d1c3762a952f8bbf694f4ebd16 GIT binary patch literal 7602 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 F@jrfBY54#E literal 0 HcmV?d00001 diff --git a/src/static/images/tray/512x512.icns b/src/static/images/tray/512x512.icns new file mode 100644 index 0000000000000000000000000000000000000000..8bb1977e2b3d986f9af0d9c4204c96a08a18d94d GIT binary patch literal 43120 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 SMxzUAk~Qe0L?#`w`o92dA;o?G literal 0 HcmV?d00001 diff --git a/src/static/images/tray/512x512.png b/src/static/images/tray/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6e3c399aa979c7913047e037af7a7843e8b69e GIT binary patch literal 16571 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 literal 0 HcmV?d00001 From e350c5f0700ea932bb139271b291a20bd4d5162a Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 3 Apr 2020 20:09:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=8D=A2=E8=A1=8C?= =?UTF-8?q?=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/lang/en/core/aside.json | 24 +++++++------- src/renderer/lang/en/core/player.json | 32 +++++++++---------- .../lang/en/material/download_modal.json | 12 +++---- .../en/material/download_multiple_modal.json | 14 ++++---- .../lang/en/material/list_add_modal.json | 10 +++--- .../en/material/list_add_multiple_modal.json | 8 ++--- .../lang/en/material/list_buttons.json | 22 ++++++------- src/renderer/lang/en/material/pagination.json | 10 +++--- src/renderer/lang/en/material/song_list.json | 24 +++++++------- src/renderer/lang/en/view/download.json | 28 ++++++++-------- src/renderer/lang/en/view/list.json | 22 ++++++------- src/renderer/lang/en/view/search.json | 32 +++++++++---------- src/renderer/lang/en/view/song_list.json | 10 +++--- 13 files changed, 124 insertions(+), 124 deletions(-) diff --git a/src/renderer/lang/en/core/aside.json b/src/renderer/lang/en/core/aside.json index 24aa91f1..311828d6 100644 --- a/src/renderer/lang/en/core/aside.json +++ b/src/renderer/lang/en/core/aside.json @@ -1,12 +1,12 @@ -{ - "online_music": "Online music", - "search": "Search", - "song_list": "Playlists", - "leaderboard": "Charts", - "my_music": "Your Library", - "default_list": "Recently Played", - "love_list": "Favorites", - "other": "Extras", - "download": "Downloads", - "setting": "Settings" -} +{ + "online_music": "Online music", + "search": "Search", + "song_list": "Playlists", + "leaderboard": "Charts", + "my_music": "Your Library", + "default_list": "Recently Played", + "love_list": "Favorites", + "other": "Extras", + "download": "Downloads", + "setting": "Settings" +} diff --git a/src/renderer/lang/en/core/player.json b/src/renderer/lang/en/core/player.json index 2676a8b2..4a4e883f 100644 --- a/src/renderer/lang/en/core/player.json +++ b/src/renderer/lang/en/core/player.json @@ -1,16 +1,16 @@ -{ - "copy_title": " (Click to copy)", - "volume": "Volume: ", - "pause": "Pause", - "play": "Play", - "next": "Next", - "playing": "Now playing...", - "stop": "Paused", - "end": "Stopped", - "refresh_url": "Music URL expired, refreshing...", - "error": "Error loading music. Switch to next song after 5 seconds", - "loading": "Music loading...", - "buffering": "Buffering...", - "geting_url": "Getting music link...", - "lyric_error": "Failed to get lyrics" -} +{ + "copy_title": " (Click to copy)", + "volume": "Volume: ", + "pause": "Pause", + "play": "Play", + "next": "Next", + "playing": "Now playing...", + "stop": "Paused", + "end": "Stopped", + "refresh_url": "Music URL expired, refreshing...", + "error": "Error loading music. Switch to next song after 5 seconds", + "loading": "Music loading...", + "buffering": "Buffering...", + "geting_url": "Getting music link...", + "lyric_error": "Failed to get lyrics" +} diff --git a/src/renderer/lang/en/material/download_modal.json b/src/renderer/lang/en/material/download_modal.json index 8e4b938d..364d0268 100644 --- a/src/renderer/lang/en/material/download_modal.json +++ b/src/renderer/lang/en/material/download_modal.json @@ -1,6 +1,6 @@ -{ - "btn_tip": "Tencent and NetEase sources only support 128k audio quality", - "lossless": "Lossless", - "high_quality": "High Quality", - "normal": "Normal" -} +{ + "btn_tip": "Tencent and NetEase sources only support 128k audio quality", + "lossless": "Lossless", + "high_quality": "High Quality", + "normal": "Normal" +} diff --git a/src/renderer/lang/en/material/download_multiple_modal.json b/src/renderer/lang/en/material/download_multiple_modal.json index 47ce0fa0..ade41005 100644 --- a/src/renderer/lang/en/material/download_multiple_modal.json +++ b/src/renderer/lang/en/material/download_multiple_modal.json @@ -1,7 +1,7 @@ -{ - "tip": "{len} song selected", - "tip2": "Select preferred download quality", - "normal": "Normal", - "high_quality": "High Quality", - "lossless": "Lossless" -} +{ + "tip": "{len} song selected", + "tip2": "Select preferred download quality", + "normal": "Normal", + "high_quality": "High Quality", + "lossless": "Lossless" +} diff --git a/src/renderer/lang/en/material/list_add_modal.json b/src/renderer/lang/en/material/list_add_modal.json index eefec34a..c28f5586 100644 --- a/src/renderer/lang/en/material/list_add_modal.json +++ b/src/renderer/lang/en/material/list_add_modal.json @@ -1,5 +1,5 @@ -{ - "title_first": "Add", - "title_last": "to...", - "btn_title": "Add the song(s) to {name}" -} +{ + "title_first": "Add", + "title_last": "to...", + "btn_title": "Add the song(s) to {name}" +} diff --git a/src/renderer/lang/en/material/list_add_multiple_modal.json b/src/renderer/lang/en/material/list_add_multiple_modal.json index ffef0636..b440e03d 100644 --- a/src/renderer/lang/en/material/list_add_multiple_modal.json +++ b/src/renderer/lang/en/material/list_add_multiple_modal.json @@ -1,4 +1,4 @@ -{ - "title": "Add the selected {num} song(s) to ...", - "btn_title": "Add the song(s) to {name}" -} +{ + "title": "Add the selected {num} song(s) to ...", + "btn_title": "Add the song(s) to {name}" +} diff --git a/src/renderer/lang/en/material/list_buttons.json b/src/renderer/lang/en/material/list_buttons.json index 47a2c4ac..9ec42288 100644 --- a/src/renderer/lang/en/material/list_buttons.json +++ b/src/renderer/lang/en/material/list_buttons.json @@ -1,11 +1,11 @@ -{ - "play": "Play", - "add_to": "Add to...", - "download": "Download", - "add": "Add", - "start": "Start", - "pause": "Pause", - "file": "Locate the file", - "search": "Search", - "remove": "Remove" -} +{ + "play": "Play", + "add_to": "Add to...", + "download": "Download", + "add": "Add", + "start": "Start", + "pause": "Pause", + "file": "Locate the file", + "search": "Search", + "remove": "Remove" +} diff --git a/src/renderer/lang/en/material/pagination.json b/src/renderer/lang/en/material/pagination.json index 25ada224..25e9a07d 100644 --- a/src/renderer/lang/en/material/pagination.json +++ b/src/renderer/lang/en/material/pagination.json @@ -1,5 +1,5 @@ -{ - "prev": "Previous page", - "next": "Next page", - "page": "Page {num}" -} +{ + "prev": "Previous page", + "next": "Next page", + "page": "Page {num}" +} diff --git a/src/renderer/lang/en/material/song_list.json b/src/renderer/lang/en/material/song_list.json index a1bd82fd..381e7195 100644 --- a/src/renderer/lang/en/material/song_list.json +++ b/src/renderer/lang/en/material/song_list.json @@ -1,12 +1,12 @@ -{ - "select_all": "Select all", - "unselect_all": "Select none", - "name": "Name", - "singer": "Artist", - "album": "Album", - "action": "Manage", - "time": "Length", - "lossless": "Lossless", - "high_quality": "High Quality", - "loding_list": "Loading the list..." -} +{ + "select_all": "Select all", + "unselect_all": "Select none", + "name": "Name", + "singer": "Artist", + "album": "Album", + "action": "Manage", + "time": "Length", + "lossless": "Lossless", + "high_quality": "High Quality", + "loding_list": "Loading the list..." +} diff --git a/src/renderer/lang/en/view/download.json b/src/renderer/lang/en/view/download.json index 2d9108d2..75752126 100644 --- a/src/renderer/lang/en/view/download.json +++ b/src/renderer/lang/en/view/download.json @@ -1,14 +1,14 @@ -{ - "select_all": "Select all", - "unselect_all": "Select none", - "name": "Name", - "progress": "Progress", - "status": "State", - "quality": "Quality", - "action": "Manage", - "all": "All", - "runing": "Downloading", - "paused": "Paused", - "error": "Error", - "finished": "Completed" -} +{ + "select_all": "Select all", + "unselect_all": "Select none", + "name": "Name", + "progress": "Progress", + "status": "State", + "quality": "Quality", + "action": "Manage", + "all": "All", + "runing": "Downloading", + "paused": "Paused", + "error": "Error", + "finished": "Completed" +} diff --git a/src/renderer/lang/en/view/list.json b/src/renderer/lang/en/view/list.json index 80206690..baa08b6b 100644 --- a/src/renderer/lang/en/view/list.json +++ b/src/renderer/lang/en/view/list.json @@ -1,11 +1,11 @@ -{ - "select_all": "Select all", - "unselect_all": "Unselect all", - "name": "Name", - "singer": "Artist", - "album": "Album", - "action": "Manage", - "time": "Length", - "loding_list": "Loading...", - "no_item": "Nothing's here..." -} +{ + "select_all": "Select all", + "unselect_all": "Unselect all", + "name": "Name", + "singer": "Artist", + "album": "Album", + "action": "Manage", + "time": "Length", + "loding_list": "Loading...", + "no_item": "Nothing's here..." +} diff --git a/src/renderer/lang/en/view/search.json b/src/renderer/lang/en/view/search.json index dcc06b84..2c9c83e1 100644 --- a/src/renderer/lang/en/view/search.json +++ b/src/renderer/lang/en/view/search.json @@ -1,16 +1,16 @@ -{ - "select_all": "Select all", - "unselect_all": "Unselect all", - "name": "Name", - "singer": "Artist", - "album": "Album", - "action": "Manage", - "time": "Length", - "lossless": "SQ", - "high_quality": "HQ", - "no_item": "Search what I want to 😉", - "hot_search": "Top Searches", - "history_search": "History Searches", - "history_clear": "Clear History", - "history_remove": "Right click to remove this entry" -} +{ + "select_all": "Select all", + "unselect_all": "Unselect all", + "name": "Name", + "singer": "Artist", + "album": "Album", + "action": "Manage", + "time": "Length", + "lossless": "SQ", + "high_quality": "HQ", + "no_item": "Search what I want to 😉", + "hot_search": "Top Searches", + "history_search": "History Searches", + "history_clear": "Clear History", + "history_remove": "Right click to remove this entry" +} diff --git a/src/renderer/lang/en/view/song_list.json b/src/renderer/lang/en/view/song_list.json index 274b7005..b87eae77 100644 --- a/src/renderer/lang/en/view/song_list.json +++ b/src/renderer/lang/en/view/song_list.json @@ -1,5 +1,5 @@ -{ - "back": "Back", - "loding_list": "Loading the list...", - "loding_list_fail": "List loading failed" -} +{ + "back": "Back", + "loding_list": "Loading the list...", + "loding_list_fail": "List loading failed" +}