From f11e98e912023334a17c16a21944673fe416c310 Mon Sep 17 00:00:00 2001 From: luoyifan Date: Tue, 20 May 2025 22:01:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewWidgets/modeltree/ModeltreeMeta.ts | 1 + src/designer/viewWidgets/property/PropertyMeta.ts | 1 + src/runtime/DefineWidget.ts | 5 +++ src/utils/webutils.ts | 14 ++++++++ src/views/ModelMain.vue | 37 +++++++++++++++++++--- src/views/ModelMainInit.ts | 14 ++++---- 6 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/designer/viewWidgets/modeltree/ModeltreeMeta.ts b/src/designer/viewWidgets/modeltree/ModeltreeMeta.ts index 09b1363..5a24afd 100644 --- a/src/designer/viewWidgets/modeltree/ModeltreeMeta.ts +++ b/src/designer/viewWidgets/modeltree/ModeltreeMeta.ts @@ -7,6 +7,7 @@ export default defineWidget({ title: '模型', icon: renderIcon('antd ClusterOutlined'), side: 'left', + shortcut: 'key-F12', order: 1, component: ModeltreeView }) \ No newline at end of file diff --git a/src/designer/viewWidgets/property/PropertyMeta.ts b/src/designer/viewWidgets/property/PropertyMeta.ts index 27450a8..073c016 100644 --- a/src/designer/viewWidgets/property/PropertyMeta.ts +++ b/src/designer/viewWidgets/property/PropertyMeta.ts @@ -6,6 +6,7 @@ export default defineWidget({ name: 'property', title: '属性', icon: renderIcon('element Memo'), + shortcut: 'key-F4', side: 'right', order: 1, component: PropertyView diff --git a/src/runtime/DefineWidget.ts b/src/runtime/DefineWidget.ts index 7c460c8..b1d76d6 100644 --- a/src/runtime/DefineWidget.ts +++ b/src/runtime/DefineWidget.ts @@ -6,6 +6,7 @@ export interface WidgetOption { name: string title?: string icon: Component + shortcut?: string side: WidgetSide component: Component order?: number @@ -48,6 +49,10 @@ export function getWidgetByName(name: string): WidgetOption | undefined { return _widgetMap.get(name) } +export function getAllWidget(): WidgetOption[] { + return Array.from(_widgetMap.values()).sort((a, b) => (a.order || 0) - (b.order || 0)) +} + /** * 定义一个 Widget */ diff --git a/src/utils/webutils.ts b/src/utils/webutils.ts index 35353db..ef9f61b 100644 --- a/src/utils/webutils.ts +++ b/src/utils/webutils.ts @@ -1,9 +1,23 @@ +import _ from 'lodash' import { h } from 'vue' import * as AntdIcon from '@vicons/antd' import { ElIcon } from 'element-plus' import * as FaIcon from '@vicons/fa' import * as ElementPlusIconsVue from '@element-plus/icons-vue' +export function normalizeShortKey(key: string): string { + // 如果 menu.tip 中包含 ctrl/shift/alt/key- 等修饰键,并且 click 事件存在,则需要使用 hotkeys 绑定 + if (key && /ctrl|shift|alt|key-/i.test(_.toLower(key))) { + // 规格话 tip 描述,比如 ctrl变成^, shift变成⇧, space 变成 alt变成!, key-变成空格 + + // key- 可能是 key-r, key-s, 等要处理成 r, s + const v = _.toUpper(key.replace(/key-/, '')) + console.log(v) + debugger + return v + } +} + /** * 渲染图标 */ diff --git a/src/views/ModelMain.vue b/src/views/ModelMain.vue index e2f7027..975f8c3 100644 --- a/src/views/ModelMain.vue +++ b/src/views/ModelMain.vue @@ -20,7 +20,7 @@
@@ -28,7 +28,7 @@
@@ -119,7 +119,7 @@
@@ -137,9 +137,10 @@ import Logo from '@/assets/images/logo.png' import './ModelMain.less' import { ModelMainInit, ModelMainCreated, ModelMainMounted, ModelMainUnmounted } from '@/views/ModelMainInit.js' import { getRootMenu } from '@/runtime/DefineMenu.js' -import { getWidgetByName, getWidgetBySide } from '@/runtime/DefineWidget.js' +import { getWidgetByName, getWidgetBySide, getAllWidget } from '@/runtime/DefineWidget.js' import ModelEditor from '@/designer/ModelEditor.vue' import ModelView from '@/designer/ModelView.vue' +import { normalizeShortKey } from '@/utils/webutils.ts' ModelMainInit() @@ -150,6 +151,34 @@ export default { }, mounted() { ModelMainMounted() + + // 注册 widget 快捷键 + const allWidget = getAllWidget() + + allWidget.forEach((widget) => { + if (widget?.shortcut && widget?.name && widget?.side) { + const shortKey = normalizeShortKey(widget.shortcut) + widget.shortcut = shortKey + if (shortKey) { + system.hotkeys(shortKey, (event) => { + if (widget.side === 'left') { + this.sectionLeftName = widget.name + this.hideLeft = false + + } else if (widget.side === 'right') { + this.sectionRightName = widget.name + this.hideRight = false + + } else if (widget.side === 'bottom') { + this.sectionBottomName = widget.name + this.hideBottom = false + } + + event.preventDefault() + }) + } + } + }) }, unmounted() { ModelMainUnmounted() diff --git a/src/views/ModelMainInit.ts b/src/views/ModelMainInit.ts index dedecf9..e2a186b 100644 --- a/src/views/ModelMainInit.ts +++ b/src/views/ModelMainInit.ts @@ -12,6 +12,7 @@ import ToolboxMeta from '@/designer/viewWidgets/toolbox/ToolboxMeta' import FileMenu from '@/designer/menus/FileMenu.ts' import EditMenu from '@/designer/menus/EditMenu.ts' import { forEachMenu } from '@/runtime/DefineMenu.ts' +import { normalizeShortKey } from '@/utils/webutils.ts' /** * 初始化模型编辑器的基础控件 @@ -61,18 +62,15 @@ export function ModelMainCreated() { export function ModelMainMounted() { forEachMenu((menu) => { if (typeof menu.click === 'function') { - // 如果 menu.tip 中包含 ctrl/shift/alt/key- 等修饰键,并且 click 事件存在,则需要使用 hotkeys 绑定 - if (menu.tip && /ctrl|shift|alt|key-/i.test(_.toLower(menu.tip))) { - // 规格话 tip 描述,比如 ctrl变成^, shift变成⇧, space 变成 alt变成!, key-变成空格 - // key- 可能是 key-r, key-s, 等要处理成 r, s - const keyWithoutKey = _.upperCase(menu.tip.replace(/key-/, '')) - menu.tip = keyWithoutKey - hotkeys(keyWithoutKey, (event) => { + const shortKey = normalizeShortKey(menu.tip) + if (shortKey) { + menu.tip = shortKey + hotkeys(shortKey, (event) => { event.preventDefault() menu.click() }) - console.log('hotkeys', keyWithoutKey, menu.click) + // console.log('hotkeys', menu.tip, menu.click) } } })