From 178a800ce81ac98ff1a53f7c71cdb64fcebb4d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E4=B8=AB=E8=AE=B2=E6=A2=B5?= Date: Mon, 8 Jun 2026 21:52:26 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(shortcuts):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=89=93=E5=BC=80=E8=AE=BE=E7=BD=AE=E7=9A=84=E9=94=AE?= =?UTF-8?q?=E7=9B=98=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 openSettings 快捷键,默认绑定 Mod+,,用于触发设置对话框。 包含所有语言包的翻译、键盘快捷键文档更新,以及测试用例。 --- apps/desktop/src/App.vue | 7 +++++++ apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/es.ts | 1 + apps/desktop/src/i18n/locales/it.ts | 1 + apps/desktop/src/i18n/locales/pt-BR.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/i18n/locales/zh-TW.ts | 1 + apps/desktop/src/lib/keyboardShortcuts.ts | 4 ++++ apps/desktop/src/lib/shortcutRegistry.ts | 7 +++++++ docs/content/docs/keyboard-shortcuts.cn.mdx | 1 + docs/content/docs/keyboard-shortcuts.mdx | 1 + packages/app-tests/keyboardShortcuts.test.ts | 17 +++++++++++++++++ packages/app-tests/settingsStore.test.ts | 3 +++ 13 files changed, 46 insertions(+) diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index 3b7322486..da8fbff67 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -47,6 +47,7 @@ import { isModRShortcut, isNewQueryShortcut, isObjectSourceSaveShortcutTarget, + isOpenSettingsShortcut, isResetZoomShortcut, isRefreshDataShortcut, isSaveShortcut, @@ -760,6 +761,12 @@ function handleKeydown(e: KeyboardEvent) { const shortcuts = settingsStore.editorSettings.shortcuts; + if (isOpenSettingsShortcut(e, shortcuts)) { + e.preventDefault(); + e.stopPropagation(); + showSettingsDialog.value = true; + return; + } if (isFocusSearchShortcut(e, shortcuts)) { const focused = contentAreaRef.value?.focusSearch() || appSidebarRef.value?.focusSearch(); if (focused) { diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts index 4f73946c5..103842624 100644 --- a/apps/desktop/src/i18n/locales/en.ts +++ b/apps/desktop/src/i18n/locales/en.ts @@ -1863,6 +1863,7 @@ export default { shortcutCopyCurrentRow: "Copy current data row", shortcutDeleteCurrentRow: "Delete current data row", shortcutNewQuery: "New query", + shortcutOpenSettings: "Open settings", shortcutCloseTab: "Close tab", shortcutFocusSearch: "Focus search", shortcutZoomInUi: "Zoom in UI", diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts index daff73c40..3a9cf925b 100644 --- a/apps/desktop/src/i18n/locales/es.ts +++ b/apps/desktop/src/i18n/locales/es.ts @@ -1653,6 +1653,7 @@ export default { shortcutCopyCurrentRow: "Copiar fila de datos actual", shortcutDeleteCurrentRow: "Eliminar fila de datos actual", shortcutNewQuery: "Nueva consulta", + shortcutOpenSettings: "Abrir configuración", shortcutCloseTab: "Cerrar pestaña", shortcutFocusSearch: "Enfocar búsqueda", shortcutZoomInUi: "Ampliar interfaz", diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts index aa8f54517..04a8af928 100644 --- a/apps/desktop/src/i18n/locales/it.ts +++ b/apps/desktop/src/i18n/locales/it.ts @@ -1799,6 +1799,7 @@ export default { shortcutCopyCurrentRow: "Copia riga dati corrente", shortcutDeleteCurrentRow: "Elimina riga dati corrente", shortcutNewQuery: "Nuova query", + shortcutOpenSettings: "Apri impostazioni", shortcutCloseTab: "Chiudi scheda", shortcutFocusSearch: "Focalizza ricerca", shortcutZoomInUi: "Ingrandisci UI", diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts index 6db9117d3..7523a3503 100644 --- a/apps/desktop/src/i18n/locales/pt-BR.ts +++ b/apps/desktop/src/i18n/locales/pt-BR.ts @@ -1788,6 +1788,7 @@ export default { shortcutCopyCurrentRow: "Copiar linha de dados atual", shortcutDeleteCurrentRow: "Excluir linha de dados atual", shortcutNewQuery: "Nova consulta", + shortcutOpenSettings: "Abrir configurações", shortcutCloseTab: "Fechar aba", shortcutFocusSearch: "Focar na pesquisa", shortcutZoomInUi: "Aumentar zoom da UI", diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts index dd702dde8..12c4ad40f 100644 --- a/apps/desktop/src/i18n/locales/zh-CN.ts +++ b/apps/desktop/src/i18n/locales/zh-CN.ts @@ -1816,6 +1816,7 @@ export default { shortcutCopyCurrentRow: "复制当前数据行", shortcutDeleteCurrentRow: "删除当前数据行", shortcutNewQuery: "新建查询", + shortcutOpenSettings: "打开设置", shortcutCloseTab: "关闭标签页", shortcutFocusSearch: "聚焦搜索", shortcutZoomInUi: "放大全局界面", diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts index 3d32396ae..535ba5d4f 100644 --- a/apps/desktop/src/i18n/locales/zh-TW.ts +++ b/apps/desktop/src/i18n/locales/zh-TW.ts @@ -1692,6 +1692,7 @@ export default { shortcutCopyCurrentRow: "複製目前資料列", shortcutDeleteCurrentRow: "刪除目前資料列", shortcutNewQuery: "建立查詢", + shortcutOpenSettings: "開啟設定", shortcutCloseTab: "關閉分頁", shortcutFocusSearch: "聚焦搜尋", shortcutZoomInUi: "放大全域介面", diff --git a/apps/desktop/src/lib/keyboardShortcuts.ts b/apps/desktop/src/lib/keyboardShortcuts.ts index 0b0651b55..f86aa37ab 100644 --- a/apps/desktop/src/lib/keyboardShortcuts.ts +++ b/apps/desktop/src/lib/keyboardShortcuts.ts @@ -80,6 +80,10 @@ export function isNewQueryShortcut(event: ShortcutLikeEvent, shortcuts?: Partial return matchesShortcut(event, actionShortcut("newQuery", shortcuts)); } +export function isOpenSettingsShortcut(event: ShortcutLikeEvent, shortcuts?: Partial): boolean { + return matchesShortcut(event, actionShortcut("openSettings", shortcuts)); +} + export function isFocusSearchShortcut(event: ShortcutLikeEvent, shortcuts?: Partial): boolean { return matchesShortcut(event, actionShortcut("focusSearch", shortcuts)); } diff --git a/apps/desktop/src/lib/shortcutRegistry.ts b/apps/desktop/src/lib/shortcutRegistry.ts index b0b4f372d..7c7220ea2 100644 --- a/apps/desktop/src/lib/shortcutRegistry.ts +++ b/apps/desktop/src/lib/shortcutRegistry.ts @@ -5,6 +5,7 @@ export type ShortcutActionId = | "copyCurrentRow" | "deleteCurrentRow" | "newQuery" + | "openSettings" | "closeTab" | "focusSearch" | "zoomInUi" @@ -64,6 +65,12 @@ export const SHORTCUT_DEFINITIONS: ShortcutDefinition[] = [ scope: "global", defaultShortcut: "Mod+T", }, + { + id: "openSettings", + labelKey: "settings.shortcutOpenSettings", + scope: "global", + defaultShortcut: "Mod+,", + }, { id: "closeTab", labelKey: "settings.shortcutCloseTab", diff --git a/docs/content/docs/keyboard-shortcuts.cn.mdx b/docs/content/docs/keyboard-shortcuts.cn.mdx index 993e3c5fb..604e4a063 100644 --- a/docs/content/docs/keyboard-shortcuts.cn.mdx +++ b/docs/content/docs/keyboard-shortcuts.cn.mdx @@ -34,6 +34,7 @@ DBX 为常用操作提供可配置的键盘快捷键。使用默认快捷键或 |---|---| | `Ctrl+N` / `Cmd+N` | 新建查询标签页 | | `Ctrl+Shift+F` / `Cmd+Shift+F` | 聚焦侧边栏搜索 | +| `Ctrl+,` / `Cmd+,` | 打开设置 | | `Ctrl+W` / `Cmd+W` | 关闭当前标签页 | | `鼠标中键`(点击标签页) | 关闭标签页 | diff --git a/docs/content/docs/keyboard-shortcuts.mdx b/docs/content/docs/keyboard-shortcuts.mdx index 22e85dcd3..b6d007e48 100644 --- a/docs/content/docs/keyboard-shortcuts.mdx +++ b/docs/content/docs/keyboard-shortcuts.mdx @@ -34,6 +34,7 @@ DBX provides configurable keyboard shortcuts for common actions. Use the default |---|---| | `Ctrl+N` / `Cmd+N` | New query tab | | `Ctrl+Shift+F` / `Cmd+Shift+F` | Focus sidebar search | +| `Ctrl+,` / `Cmd+,` | Open settings | | `Ctrl+W` / `Cmd+W` | Close current tab | | `Middle Click` (on tab) | Close tab | diff --git a/packages/app-tests/keyboardShortcuts.test.ts b/packages/app-tests/keyboardShortcuts.test.ts index db7a4077e..126d6552d 100644 --- a/packages/app-tests/keyboardShortcuts.test.ts +++ b/packages/app-tests/keyboardShortcuts.test.ts @@ -10,6 +10,7 @@ import { isModRShortcut, isNewQueryShortcut, isObjectSourceSaveShortcutTarget, + isOpenSettingsShortcut, isResetZoomShortcut, isRefreshDataShortcut, isSaveShortcut, @@ -65,6 +66,22 @@ test("matches custom shortcut settings for opening a new query", () => { ); }); +test("matches Mod+Comma for opening settings", () => { + assert.equal(isOpenSettingsShortcut({ key: ",", metaKey: true }), true); + assert.equal(isOpenSettingsShortcut({ key: ",", ctrlKey: true }), true); + assert.equal(isOpenSettingsShortcut({ key: ",", altKey: true }), false); +}); + +test("matches custom shortcut settings for opening settings", () => { + assert.equal(isOpenSettingsShortcut({ key: ",", metaKey: true }, { openSettings: "Shift+Mod+P" } as any), false); + assert.equal( + isOpenSettingsShortcut({ key: "p", ctrlKey: true, shiftKey: true } as any, { + openSettings: "Shift+Mod+P", + } as any), + true, + ); +}); + test("ignores Enter without modifier", () => { assert.equal(isExecuteSqlShortcut({ key: "Enter" }), false); }); diff --git a/packages/app-tests/settingsStore.test.ts b/packages/app-tests/settingsStore.test.ts index 9cd7a5f68..73b092257 100644 --- a/packages/app-tests/settingsStore.test.ts +++ b/packages/app-tests/settingsStore.test.ts @@ -57,6 +57,7 @@ test("defaults shortcut settings", () => { assert.equal(settings.shortcuts.copyCurrentRow, "Mod+D"); assert.equal(settings.shortcuts.deleteCurrentRow, "Delete"); assert.equal(settings.shortcuts.newQuery, "Mod+T"); + assert.equal(settings.shortcuts.openSettings, "Mod+,"); assert.equal(settings.shortcuts.focusSearch, "Mod+F"); assert.equal(settings.shortcuts.zoomInUi, "Mod+="); assert.equal(settings.shortcuts.zoomOutUi, "Mod+-"); @@ -72,6 +73,7 @@ test("keeps saved shortcut overrides", () => { copyCurrentRow: "Alt+Shift+D", deleteCurrentRow: "Backspace", newQuery: "Shift+Mod+N", + openSettings: "Shift+Mod+P", zoomInUi: "Alt+Mod+=", } as any, }); @@ -80,6 +82,7 @@ test("keeps saved shortcut overrides", () => { assert.equal(settings.shortcuts.copyCurrentRow, "Alt+Shift+D"); assert.equal(settings.shortcuts.deleteCurrentRow, "Backspace"); assert.equal(settings.shortcuts.newQuery, "Shift+Mod+N"); + assert.equal(settings.shortcuts.openSettings, "Shift+Mod+P"); assert.equal(settings.shortcuts.zoomInUi, "Alt+Mod+="); assert.equal(settings.shortcuts.saveSql, "Mod+S"); });