Procházet zdrojové kódy

fix: 修复 setToolPassive 后光标没有变回默认值的问题

- 添加全局工具模式变化监听器来自动重置光标
- 使用 ToolGroupManager.getAllToolGroups 获取所有工具组
- 当没有活动工具时,将所有视口的鼠标光标重置为默认状态
- 专门为当前项目的一对一工具组和视口映射设计

改动文件:
- src/pages/view/components/viewers/stack.image.viewer.tsx
- package.json (版本升级到 1.3.3)
dengdx před 1 měsícem
rodič
revize
05c2f3e6bd

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.3.2",
+  "version": "1.3.3",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",
@@ -146,4 +146,4 @@
       "public"
     ]
   }
-}
+}

+ 42 - 0
src/pages/view/components/viewers/stack.image.viewer.tsx

@@ -48,7 +48,12 @@ const {
   Enums: csToolsEnums,
   PlanarRotateTool,
 } = cornerstoneTools;
+
+// 导入 cursors 用于光标管理
+import { cursors } from '@cornerstonejs/tools';
 const { MouseBindings } = csToolsEnums;
+// 全局工具状态变化监听器注册标志
+let cursorResetListenerRegistered = false;
 // let toolGroup: cornerstoneTools.Types.IToolGroup;
 // let currentViewportId: string;
 
@@ -252,6 +257,43 @@ function registerTools(viewportId, renderingEngineId) {
   // 添加 viewport 到工具组
   toolGroup.addViewport(viewportId, renderingEngineId);
 
+  // 添加全局工具模式变化监听器,自动重置光标(当前项目中使用一对一映射)
+  if (!cursorResetListenerRegistered) {
+    eventTarget.addEventListener(
+      cornerstoneTools.Enums.Events.TOOL_MODE_CHANGED,
+      (event) => {
+        // 检查是否有活动工具,当前一对一映射设计只关注全局活动工具状态
+        const allToolGroups = ToolGroupManager.getAllToolGroups();
+
+        let hasActiveTool = false;
+        for (const toolGroup of allToolGroups) {
+          if (toolGroup.getActivePrimaryMouseButtonTool()) {
+            hasActiveTool = true;
+            break;
+          }
+        }
+
+        if (!hasActiveTool) {
+          // 没有活动工具时,重置所有视口光标为默认(适用于当前一对一设计)
+          for (const toolGroup of allToolGroups) {
+            const viewportIds = toolGroup.getViewportIds();
+            viewportIds.forEach(viewportId => {
+              try {
+                const enabledElement = cornerstone.getEnabledElementByViewportId(viewportId);
+                if (enabledElement?.viewport.element) {
+                  enabledElement.viewport.element.style.cursor = 'default';
+                }
+              } catch (error) {
+                // 忽略错误,可能视口已被销毁
+              }
+            });
+          }
+        }
+      }
+    );
+    cursorResetListenerRegistered = true; // 防止重复注册
+  }
+
   console.log(`[registerTools] Tools registered for viewport: ${viewportId}`);
 }