From 003f150a742e18167b20460527ec924ff837239c Mon Sep 17 00:00:00 2001 From: AoXuan Date: Wed, 3 Sep 2025 22:44:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0TitleBar=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=BE=AE=E8=B0=83=E9=A1=B5=E9=9D=A2=E5=B8=83?= =?UTF-8?q?=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/electron/main.ts | 29 ++++ frontend/electron/preload.ts | 6 + frontend/src/App.vue | 13 +- frontend/src/components/AppLayout.vue | 50 +++---- frontend/src/components/TitleBar.vue | 193 ++++++++++++++++++++++++++ frontend/src/types/electron.d.ts | 6 + frontend/src/views/History.vue | 83 +++++------ frontend/src/views/Scheduler.vue | 1 - 8 files changed, 309 insertions(+), 72 deletions(-) create mode 100644 frontend/src/components/TitleBar.vue diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index 68e5557..c40ad65 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -69,6 +69,8 @@ function createWindow() { minWidth: 800, minHeight: 600, icon: path.join(__dirname, '../src/assets/AUTO_MAA.ico'), + frame: false, // 去掉系统标题栏 + titleBarStyle: 'hidden', // 隐藏标题栏 webPreferences: { preload: path.join(__dirname, 'preload.js'), nodeIntegration: false, @@ -109,6 +111,33 @@ ipcMain.handle('open-dev-tools', () => { } }) +// 窗口控制 +ipcMain.handle('window-minimize', () => { + if (mainWindow) { + mainWindow.minimize() + } +}) + +ipcMain.handle('window-maximize', () => { + if (mainWindow) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize() + } else { + mainWindow.maximize() + } + } +}) + +ipcMain.handle('window-close', () => { + if (mainWindow) { + mainWindow.close() + } +}) + +ipcMain.handle('window-is-maximized', () => { + return mainWindow ? mainWindow.isMaximized() : false +}) + ipcMain.handle('select-folder', async () => { if (!mainWindow) return null const result = await dialog.showOpenDialog(mainWindow, { diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts index 7e136fd..6aae513 100644 --- a/frontend/electron/preload.ts +++ b/frontend/electron/preload.ts @@ -11,6 +11,12 @@ contextBridge.exposeInMainWorld('electronAPI', { selectFile: (filters?: any[]) => ipcRenderer.invoke('select-file', filters), openUrl: (url: string) => ipcRenderer.invoke('open-url', url), + // 窗口控制 + windowMinimize: () => ipcRenderer.invoke('window-minimize'), + windowMaximize: () => ipcRenderer.invoke('window-maximize'), + windowClose: () => ipcRenderer.invoke('window-close'), + windowIsMaximized: () => ipcRenderer.invoke('window-is-maximized'), + // 初始化相关API checkEnvironment: () => ipcRenderer.invoke('check-environment'), downloadPython: (mirror?: string) => ipcRenderer.invoke('download-python', mirror), diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 36e57aa..4b0bcc2 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -4,6 +4,7 @@ import { useRoute } from 'vue-router' import { ConfigProvider } from 'ant-design-vue' import { useTheme } from './composables/useTheme.ts' import AppLayout from './components/AppLayout.vue' +import TitleBar from './components/TitleBar.vue' import zhCN from 'ant-design-vue/es/locale/zh_CN' import { logger } from '@/utils/logger' @@ -24,8 +25,11 @@ onMounted(() => { - - + +
+ + +
@@ -33,4 +37,9 @@ onMounted(() => { * { box-sizing: border-box; } + +.app-container { + height: 100vh; + overflow: hidden; +} diff --git a/frontend/src/components/AppLayout.vue b/frontend/src/components/AppLayout.vue index 76b28c0..f605f22 100644 --- a/frontend/src/components/AppLayout.vue +++ b/frontend/src/components/AppLayout.vue @@ -7,14 +7,14 @@ :width="180" :collapsed-width="60" :theme="isDark ? 'dark' : 'light'" - style="height: 100vh; position: fixed; left: 0; top: 0; z-index: 100" + style="height: calc(100vh - 32px); position: fixed; left: 0; top: 32px; z-index: 100" >
- - + + + + +