From 0f55795ca9c5cb2bf53ee8088d3308fce1d206db Mon Sep 17 00:00:00 2001 From: alger Date: Tue, 1 Apr 2025 23:22:26 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0=E8=BF=B7?= =?UTF-8?q?=E4=BD=A0=E6=A8=A1=E5=BC=8F=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=BF=B7=E4=BD=A0=E7=AA=97=E5=8F=A3=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=8E=E9=9A=90=E8=97=8F=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=A1=B9=E4=BB=A5=E6=8E=A7=E5=88=B6=E8=BF=B7?= =?UTF-8?q?=E4=BD=A0=E6=92=AD=E6=94=BE=E6=A0=8F=E5=92=8C=E6=AD=8C=E8=AF=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BC=98=E5=8C=96=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BB=A5=E9=80=82=E5=BA=94=E8=BF=B7=E4=BD=A0?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/i18n/lang/en-US/settings.ts | 4 +- src/i18n/lang/zh-CN/player.ts | 3 +- src/i18n/lang/zh-CN/settings.ts | 4 +- src/main/modules/window.ts | 110 +++- src/preload/index.d.ts | 4 + src/preload/index.ts | 4 + src/renderer/App.vue | 25 +- src/renderer/assets/css/base.css | 1 + .../components/lyric/LyricSettings.vue | 16 +- .../components/player/MiniPlayBar.vue | 591 ++++++++++++++++++ .../player}/MobilePlayBar.vue | 0 .../player}/PlayBar.vue | 58 +- src/renderer/hooks/MusicHook.ts | 2 +- src/renderer/layout/AppLayout.vue | 26 +- src/renderer/layout/MiniLayout.vue | 16 + src/renderer/layout/components/MusicFull.vue | 78 ++- src/renderer/layout/components/TitleBar.vue | 8 + src/renderer/router/index.ts | 41 +- src/renderer/store/modules/settings.ts | 7 + src/renderer/utils/shortcut.ts | 81 +++ 20 files changed, 990 insertions(+), 89 deletions(-) create mode 100644 src/renderer/components/player/MiniPlayBar.vue rename src/renderer/{layout/components => components/player}/MobilePlayBar.vue (100%) rename src/renderer/{layout/components => components/player}/PlayBar.vue (90%) create mode 100644 src/renderer/layout/MiniLayout.vue create mode 100644 src/renderer/utils/shortcut.ts diff --git a/src/i18n/lang/en-US/settings.ts b/src/i18n/lang/en-US/settings.ts index 2e5f67c..0e5ab57 100644 --- a/src/i18n/lang/en-US/settings.ts +++ b/src/i18n/lang/en-US/settings.ts @@ -181,7 +181,9 @@ export default { default: 'Default', light: 'Light', dark: 'Dark' - } + }, + hideMiniPlayBar: 'Hide Mini Play Bar', + hideLyrics: 'Hide Lyrics' }, shortcutSettings: { title: 'Shortcut Settings', diff --git a/src/i18n/lang/zh-CN/player.ts b/src/i18n/lang/zh-CN/player.ts index fb4b1cf..d1f5e00 100644 --- a/src/i18n/lang/zh-CN/player.ts +++ b/src/i18n/lang/zh-CN/player.ts @@ -48,7 +48,8 @@ export default { next: '下一首', volume: '音量', favorite: '已收藏{name}', - unFavorite: '已取消收藏{name}' + unFavorite: '已取消收藏{name}', + miniPlayBar: '迷你播放栏' }, eq: { title: '均衡器', diff --git a/src/i18n/lang/zh-CN/settings.ts b/src/i18n/lang/zh-CN/settings.ts index 551cdbe..334e198 100644 --- a/src/i18n/lang/zh-CN/settings.ts +++ b/src/i18n/lang/zh-CN/settings.ts @@ -181,7 +181,9 @@ export default { default: '默认', light: '亮色', dark: '暗色' - } + }, + hideMiniPlayBar: '隐藏迷你播放栏', + hideLyrics: '隐藏歌词' }, shortcutSettings: { title: '快捷键设置', diff --git a/src/main/modules/window.ts b/src/main/modules/window.ts index 04b0c99..c5c48c9 100644 --- a/src/main/modules/window.ts +++ b/src/main/modules/window.ts @@ -1,10 +1,19 @@ import { is } from '@electron-toolkit/utils'; -import { app, BrowserWindow, globalShortcut, ipcMain, session, shell } from 'electron'; +import { app, BrowserWindow, globalShortcut, ipcMain, screen, session, shell } from 'electron'; import Store from 'electron-store'; import { join } from 'path'; const store = new Store(); +// 保存主窗口的大小和位置 +let mainWindowState = { + width: 1200, + height: 780, + x: undefined as number | undefined, + y: undefined as number | undefined, + isMaximized: false +}; + /** * 初始化代理设置 */ @@ -71,10 +80,109 @@ export function initializeWindowManager() { } }); + ipcMain.on('mini-window', (event) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + // 保存当前窗口状态 + const [width, height] = win.getSize(); + const [x, y] = win.getPosition(); + mainWindowState = { + width, + height, + x, + y, + isMaximized: win.isMaximized() + }; + + // 获取屏幕尺寸 + const { width: screenWidth } = screen.getPrimaryDisplay().workAreaSize; + + // 设置迷你窗口的大小和位置 + win.unmaximize(); + win.setMinimumSize(340, 64); + win.setMaximumSize(340, 64); + win.setSize(340, 64); + win.setPosition(screenWidth - 340, 20); + win.setAlwaysOnTop(true); + win.setSkipTaskbar(false); + win.setResizable(false); + + // 导航到迷你模式路由 + win.webContents.send('navigate', '/mini'); + + // 发送事件到渲染进程,通知切换到迷你模式 + win.webContents.send('mini-mode', true); + } + }); + + // 恢复窗口 + ipcMain.on('restore-window', (event) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + // 恢复窗口的大小调整功能 + win.setResizable(true); + win.setMaximumSize(0, 0); + + // 恢复窗口的最小尺寸限制 + win.setMinimumSize(1200, 780); + + // 恢复窗口状态 + if (mainWindowState.isMaximized) { + win.maximize(); + } else { + win.setSize(mainWindowState.width, mainWindowState.height); + if (mainWindowState.x !== undefined && mainWindowState.y !== undefined) { + win.setPosition(mainWindowState.x, mainWindowState.y); + } + } + + win.setAlwaysOnTop(false); + win.setSkipTaskbar(false); + + // 导航回主页面 + win.webContents.send('navigate', '/'); + + // 发送事件到渲染进程,通知退出迷你模式 + win.webContents.send('mini-mode', false); + } + }); + // 监听代理设置变化 store.onDidChange('set.proxyConfig', () => { initializeProxy(); }); + + // 监听窗口大小调整事件 + ipcMain.on('resize-window', (event, width, height) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + // 设置窗口的大小 + console.log(`调整窗口大小: ${width} x ${height}`); + win.setSize(width, height); + } + }); + + // 专门用于迷你模式下调整窗口大小的事件 + ipcMain.on('resize-mini-window', (event, showPlaylist) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + if (showPlaylist) { + console.log('主进程: 扩大迷你窗口至 340 x 400'); + // 调整最大尺寸限制,允许窗口变大 + win.setMinimumSize(340, 64); + win.setMaximumSize(340, 400); + // 调整窗口尺寸 + win.setSize(340, 400); + } else { + console.log('主进程: 缩小迷你窗口至 340 x 64'); + // 强制重置尺寸限制,确保窗口可以缩小 + win.setMaximumSize(340, 64); + win.setMinimumSize(340, 64); + // 调整窗口尺寸 + win.setSize(340, 64); + } + } + }); } /** diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index ec889bc..e55192a 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -11,7 +11,11 @@ declare global { close: () => void; dragStart: (data: string) => void; miniTray: () => void; + miniWindow: () => void; + restore: () => void; restart: () => void; + resizeWindow: (width: number, height: number) => void; + resizeMiniWindow: (showPlaylist: boolean) => void; unblockMusic: (id: number, data: any) => Promise; onLyricWindowClosed: (callback: () => void) => void; startDownload: (url: string) => void; diff --git a/src/preload/index.ts b/src/preload/index.ts index 206eb55..dee5014 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -8,7 +8,11 @@ const api = { close: () => ipcRenderer.send('close-window'), dragStart: (data) => ipcRenderer.send('drag-start', data), miniTray: () => ipcRenderer.send('mini-tray'), + miniWindow: () => ipcRenderer.send('mini-window'), + restore: () => ipcRenderer.send('restore-window'), restart: () => ipcRenderer.send('restart'), + resizeWindow: (width, height) => ipcRenderer.send('resize-window', width, height), + resizeMiniWindow: (showPlaylist) => ipcRenderer.send('resize-mini-window', showPlaylist), openLyric: () => ipcRenderer.send('open-lyric'), sendLyric: (data) => ipcRenderer.send('send-lyric', data), sendSong: (data) => ipcRenderer.send('update-current-song', data), diff --git a/src/renderer/App.vue b/src/renderer/App.vue index b8f272c..b50bba3 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -13,8 +13,9 @@ diff --git a/src/renderer/assets/css/base.css b/src/renderer/assets/css/base.css index c52edbe..cfead38 100644 --- a/src/renderer/assets/css/base.css +++ b/src/renderer/assets/css/base.css @@ -1,5 +1,6 @@ body { /* background-color: #000; */ + overflow: hidden; } .n-popover:has(.music-play) { diff --git a/src/renderer/components/lyric/LyricSettings.vue b/src/renderer/components/lyric/LyricSettings.vue index 8b75ecc..f3c1991 100644 --- a/src/renderer/components/lyric/LyricSettings.vue +++ b/src/renderer/components/lyric/LyricSettings.vue @@ -27,6 +27,16 @@ +
+ {{ t('settings.lyricSettings.hideMiniPlayBar') }} + +
+ +
+ {{ t('settings.lyricSettings.hideLyrics') }} + +
+
{{ t('settings.lyricSettings.fontSize') }} ({ @@ -111,7 +123,9 @@ const config = ref({ showTranslation: true, theme: 'default', hidePlayBar: false, - pureModeEnabled: false + hideMiniPlayBar: false, + pureModeEnabled: false, + hideLyrics: false }); const emit = defineEmits(['themeChange']); diff --git a/src/renderer/components/player/MiniPlayBar.vue b/src/renderer/components/player/MiniPlayBar.vue new file mode 100644 index 0000000..73747b4 --- /dev/null +++ b/src/renderer/components/player/MiniPlayBar.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/src/renderer/layout/components/MobilePlayBar.vue b/src/renderer/components/player/MobilePlayBar.vue similarity index 100% rename from src/renderer/layout/components/MobilePlayBar.vue rename to src/renderer/components/player/MobilePlayBar.vue diff --git a/src/renderer/layout/components/PlayBar.vue b/src/renderer/components/player/PlayBar.vue similarity index 90% rename from src/renderer/layout/components/PlayBar.vue rename to src/renderer/components/player/PlayBar.vue index a26f28f..faa8782 100644 --- a/src/renderer/layout/components/PlayBar.vue +++ b/src/renderer/components/player/PlayBar.vue @@ -204,14 +204,12 @@ import { textColors } from '@/hooks/MusicHook'; import { useArtist } from '@/hooks/useArtist'; +import MusicFull from '@/layout/components/MusicFull.vue'; import { audioService } from '@/services/audioService'; import { usePlayerStore } from '@/store/modules/player'; import { useSettingsStore } from '@/store/modules/settings'; import type { SongResult } from '@/type/music'; import { getImgUrl, isElectron, isMobile, secondToMinute, setAnimationClass } from '@/utils'; -import { showShortcutToast } from '@/utils/shortcutToast'; - -import MusicFull from './MusicFull.vue'; const playerStore = usePlayerStore(); const settingsStore = useSettingsStore(); @@ -449,60 +447,6 @@ const handleArtistClick = (id: number) => { navigateToArtist(id); }; -// 添加全局快捷键处理 -if (isElectron) { - window.electron.ipcRenderer.on('global-shortcut', (_, action: string) => { - console.log('action', action); - switch (action) { - case 'togglePlay': - playMusicEvent(); - showShortcutToast( - play.value ? t('player.playBar.play') : t('player.playBar.pause'), - play.value ? 'ri-pause-circle-line' : 'ri-play-circle-line' - ); - break; - case 'prevPlay': - handlePrev(); - showShortcutToast(t('player.playBar.prev'), 'ri-skip-back-line'); - break; - case 'nextPlay': - handleNext(); - showShortcutToast(t('player.playBar.next'), 'ri-skip-forward-line'); - break; - case 'volumeUp': - if (volumeSlider.value < 100) { - volumeSlider.value = Math.min(volumeSlider.value + 10, 100); - showShortcutToast( - `${t('player.playBar.volume')}${volumeSlider.value}%`, - 'ri-volume-up-line' - ); - } - break; - case 'volumeDown': - if (volumeSlider.value > 0) { - volumeSlider.value = Math.max(volumeSlider.value - 10, 0); - showShortcutToast( - `${t('player.playBar.volume')}${volumeSlider.value}%`, - 'ri-volume-down-line' - ); - } - break; - case 'toggleFavorite': - toggleFavorite(new Event('click')); - showShortcutToast( - isFavorite.value - ? t('player.playBar.favorite', { name: playMusic.value.name }) - : t('player.playBar.unFavorite', { name: playMusic.value.name }), - isFavorite.value ? 'ri-heart-fill' : 'ri-heart-line' - ); - break; - default: - console.log('未知的快捷键动作:', action); - break; - } - }); -} - // 监听播放栏显示状态 watch( () => MusicFullRef.value?.config?.hidePlayBar, diff --git a/src/renderer/hooks/MusicHook.ts b/src/renderer/hooks/MusicHook.ts index 460e66b..5180025 100644 --- a/src/renderer/hooks/MusicHook.ts +++ b/src/renderer/hooks/MusicHook.ts @@ -535,7 +535,7 @@ export const pause = () => { ); } - currentSound.pause(); + audioService.pause(); } catch (error) { console.error('暂停播放出错:', error); } diff --git a/src/renderer/layout/AppLayout.vue b/src/renderer/layout/AppLayout.vue index cb3727c..38edc7e 100644 --- a/src/renderer/layout/AppLayout.vue +++ b/src/renderer/layout/AppLayout.vue @@ -25,16 +25,18 @@
- - + + + + + + + + diff --git a/src/renderer/layout/components/MusicFull.vue b/src/renderer/layout/components/MusicFull.vue index b4ff89a..0ac8da4 100644 --- a/src/renderer/layout/components/MusicFull.vue +++ b/src/renderer/layout/components/MusicFull.vue @@ -29,8 +29,8 @@
-
+
{{ playMusic.name }}
+
-
+ +
({ showTranslation: true, theme: 'default', hidePlayBar: false, - pureModeEnabled: false + pureModeEnabled: false, + hideMiniPlayBar: false, + hideLyrics: false }); // 监听设置组件的配置变化 @@ -545,17 +562,58 @@ defineExpose({ animation-duration: 300ms; .music-img { - @apply flex-1 flex justify-center mr-16 flex-col; + @apply flex-1 flex justify-center mr-16 flex-col items-center; max-width: 360px; max-height: 360px; + transition: all 0.3s ease; + + &.only-cover { + @apply mr-0 flex-initial; + max-width: none; + max-height: none; + + .img { + @apply w-[50vh] h-[50vh] mb-8; + } + + .music-info { + @apply text-center w-[600px]; + + .music-content-name { + @apply text-4xl mb-4; + color: var(--text-color-active); + } + + .music-content-singer { + @apply text-xl mb-8 opacity-80; + color: var(--text-color-primary); + } + } + } + .img { - @apply rounded-xl w-full h-full shadow-2xl; + @apply rounded-xl w-full h-full shadow-2xl transition-all duration-300; + } + + .music-info { + @apply w-full mt-4; + + .music-content-name { + @apply text-2xl font-bold; + color: var(--text-color-active); + } + + .music-content-singer { + @apply text-base mt-2 opacity-80; + color: var(--text-color-primary); + } } } .music-content { @apply flex flex-col justify-center items-center relative; width: 500px; + transition: all 0.3s ease; &.center { @apply w-full; @@ -567,12 +625,8 @@ defineExpose({ } } - &-name { - @apply font-bold text-2xl pb-1 pt-4; - } - - &-singer { - @apply text-base; + &.hide { + @apply hidden; } } diff --git a/src/renderer/layout/components/TitleBar.vue b/src/renderer/layout/components/TitleBar.vue index 0316bba..7ca64b0 100644 --- a/src/renderer/layout/components/TitleBar.vue +++ b/src/renderer/layout/components/TitleBar.vue @@ -14,6 +14,9 @@ 下载桌面版