Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions docs/examples/provider-example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@
```

```js
ztools.registerProvider('baidu', async (input) => { /* ... */ })
ztools.registerProvider('google', async (input) => { /* ... */ })
ztools.registerProvider('baidu', async (input) => {
/* ... */
})
ztools.registerProvider('google', async (input) => {
/* ... */
})
```

详见主程序 `docs/provider-development-guide.md`。
Expand Down
10 changes: 7 additions & 3 deletions docs/provider-development-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,20 @@ ZTools 把「翻译」「OCR」等能力抽象为 **Provider(提供商)**。
```json
{
"providers": {
"baidu": { "type": "translation", "label": "百度翻译" },
"baidu": { "type": "translation", "label": "百度翻译" },
"google": { "type": "translation", "label": "谷歌翻译" }
}
}
```

```js
// preload.js
ztools.registerProvider('baidu', async (input) => { /* 调用百度 */ })
ztools.registerProvider('google', async (input) => { /* 调用谷歌 */ })
ztools.registerProvider('baidu', async (input) => {
/* 调用百度 */
})
ztools.registerProvider('google', async (input) => {
/* 调用谷歌 */
})
```

两条都会出现在「设置 → 提供商 → 翻译」,用户可分别启用并选其中一个为默认。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,8 @@ const windowDefaultHeight = ref(541)

// 托盘图标显示设置
const showTrayIcon = ref(true)
// 静默启动(默认开启)
const silentStart = ref(true)

// 悬浮球设置
const floatingBallEnabled = ref(false)
Expand Down Expand Up @@ -975,6 +977,18 @@ async function handleTrayIconChange(): Promise<void> {
}
}

// 处理静默启动变化
async function handleSilentStartChange(): Promise<void> {
const ok = await saveSettings()
if (!ok) {
// v-model 已切换,保存失败时回滚 UI
silentStart.value = !silentStart.value
console.error('更新静默启动设置失败')
return
}
console.log('静默启动设置已更新:', silentStart.value)
}

// 处理悬浮球开关变化
async function handleFloatingBallChange(): Promise<void> {
try {
Expand Down Expand Up @@ -1192,6 +1206,7 @@ async function loadSettings(): Promise<void> {
windowDefaultHeight.value = data.windowDefaultHeight ?? 541
hotkey.value = data.hotkey ?? defaultHotkey.value
showTrayIcon.value = data.showTrayIcon ?? true
silentStart.value = data.silentStart ?? true
placeholder.value = data.placeholder ?? DEFAULT_PLACEHOLDER
avatar.value = data.avatar ?? DEFAULT_AVATAR
autoPaste.value = data.autoPaste ?? '3s'
Expand Down Expand Up @@ -1269,8 +1284,8 @@ async function loadSettings(): Promise<void> {
}
}

// 保存设置
async function saveSettings(): Promise<void> {
// 保存设置(返回是否成功,便于调用方在失败时回滚 UI)
async function saveSettings(): Promise<boolean> {
try {
// 只有自定义头像才保存到数据库,默认头像不保存
const avatarToSave = avatar.value === defaultAvatar ? undefined : avatar.value
Expand Down Expand Up @@ -1311,6 +1326,7 @@ async function saveSettings(): Promise<void> {
primaryColor: primaryColor.value,
customColor: customColor.value,
showTrayIcon: showTrayIcon.value,
silentStart: silentStart.value,
windowMaterial: windowMaterial.value,
acrylicLightOpacity: acrylicLightOpacity.value,
acrylicDarkOpacity: acrylicDarkOpacity.value,
Expand All @@ -1324,8 +1340,10 @@ async function saveSettings(): Promise<void> {
terminal: terminal.value,
terminalCustomCommand: terminalCustomCommand.value
})
return true
} catch (error) {
console.error('保存设置失败:', error)
return false
}
}

Expand Down Expand Up @@ -1432,6 +1450,19 @@ onUnmounted(() => {
</div>
</div>

<div class="setting-item">
<div class="setting-label">
<span>静默启动</span>
<span class="setting-desc">启动时不显示主窗口,仅托盘运行</span>
</div>
<div class="setting-control">
<label class="toggle">
<input v-model="silentStart" type="checkbox" @change="handleSilentStartChange" />
<span class="toggle-slider"></span>
</label>
</div>
</div>

<div class="setting-item blocked-apps-setting">
<div class="blocked-apps-content">
<div class="blocked-apps-header">
Expand Down
16 changes: 15 additions & 1 deletion src/main/appMain.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import './core/appData/configureAppDataRoot'
import { platform } from '@electron-toolkit/utils'
import { app, BrowserWindow, session, webContents } from 'electron'
import { app, BrowserWindow, ipcMain, session, webContents } from 'electron'
import log from 'electron-log'
import path from 'path'
import lmdbInstance from './core/lmdb/lmdbInstance'
Expand Down Expand Up @@ -125,6 +125,20 @@ export function getCurrentShortcut(): string {
}

app.whenReady().then(async () => {
// 启动时仅处理一次:关闭静默启动则在渲染就绪后显示主窗口(需在创建窗口前注册,避免竞态)
ipcMain.once('renderer-ready', () => {
try {
const settingsDoc = lmdbInstance.get('ZTOOLS/settings-general')
const silentStart = settingsDoc?.data?.silentStart ?? true
if (!silentStart) {
windowManager.showWindow()
console.log('[Main] 静默启动已关闭,渲染进程就绪后自动显示搜索窗口')
}
} catch {
console.log('[Main] 读取静默启动设置失败,按默认行为启动')
}
})

// macOS 辅助功能权限检查和请求(如果未授权则弹窗提示)
await ensureMacAccessibilityPermission()

Expand Down
2 changes: 2 additions & 0 deletions src/preload/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const api = {
launchAsAdmin: (appPath: string, name?: string) =>
ipcRenderer.invoke('launch-as-admin', appPath, name),
hideWindow: () => ipcRenderer.send('hide-window'),
rendererReady: () => ipcRenderer.send('renderer-ready'),
resizeWindow: (height: number) => ipcRenderer.send('resize-window', height),
updateLaunchContext: (context: {
searchQuery: string
Expand Down Expand Up @@ -475,6 +476,7 @@ declare global {
confirmDialog?: any
}) => Promise<void>
hideWindow: () => void
rendererReady: () => void
resizeWindow: (height: number) => void
updateLaunchContext: (context: {
searchQuery: string
Expand Down
3 changes: 3 additions & 0 deletions src/renderer/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,9 @@ onMounted(async () => {
// 初始调整窗口高度
updateWindowHeight()

// 通知主进程渲染进程已就绪(用于静默启动控制)
window.ztools.rendererReady()

console.log('监听聚焦事件')

// 监听窗口显示事件,聚焦搜索框,并接收窗口信息
Expand Down
1 change: 1 addition & 0 deletions src/renderer/src/env.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ declare global {
}) => Promise<any>
launchAsAdmin: (appPath: string, name?: string) => Promise<void>
hideWindow: () => void
rendererReady: () => void
resizeWindow: (height: number) => void
updateLaunchContext: (context: {
searchQuery: string
Expand Down