med-viewer-sdk 0.1.19 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,12 @@
1
- import "annotorious-openseadragon-ld/dist/annotorious.min.css";
2
- import { MedViewerEngine } from "./Engine";
3
- import { BaseAnnotator } from "./BaseAnnotator";
1
+ import 'annotorious-openseadragon-ld/dist/annotorious.min.css';
2
+ import { MedViewerEngine } from './Engine';
3
+ import { BaseAnnotator } from './BaseAnnotator';
4
4
  export declare class AnnoAnnotator extends BaseAnnotator {
5
5
  anno: any;
6
6
  constructor(engine: MedViewerEngine, config?: any);
7
7
  setEnabled(enabled: boolean): void;
8
- setTool(tool: "rect" | "polygon" | "line" | "point" | "circle" | "ellipse" | "freehand" | null, color?: string): void;
8
+ setTool(tool: 'rect' | 'polygon' | 'line' | 'point' | 'circle' | 'ellipse' | 'freehand' | null, color?: string): void;
9
+ setLocale(locale: string): void;
9
10
  getAnnotations(): any[];
10
11
  setAnnotations(data: any[]): void;
11
12
  clear(): void;
@@ -1,4 +1,4 @@
1
- import "openseadragon-filtering";
1
+ import 'openseadragon-filtering';
2
2
  export interface ColorAdjustments {
3
3
  brightness?: number;
4
4
  contrast?: number;
@@ -12,7 +12,8 @@ export interface ColorAdjustments {
12
12
  export interface ColorAdjustOptions {
13
13
  adjustments?: ColorAdjustments;
14
14
  debounceMs?: number;
15
- loadMode?: "async" | "sync";
15
+ loadMode?: 'async' | 'sync';
16
+ onAdjustmentsChange?: (adjustments: ColorAdjustments) => void;
16
17
  }
17
18
  export declare class ColorAdjustPlugin {
18
19
  private viewer;
@@ -7,6 +7,12 @@ import { ScalebarPlugin, type ScalebarOptions } from './Scalebar';
7
7
  import { SelectionPlugin, type SelectionOptions } from './SelectionPlugin';
8
8
  import { MedToolbar, type ToolbarOptions } from './Toolbar';
9
9
  import { Locale } from '../i18n/i18n';
10
+ export interface AnnotoriousOptions {
11
+ onCreateAnnotation?: (annotation: any) => void;
12
+ onUpdateAnnotation?: (annotation: any, previous: any) => void;
13
+ onDeleteAnnotation?: (annotation: any) => void;
14
+ [key: string]: any;
15
+ }
10
16
  /**
11
17
  * 引擎配置接口
12
18
  */
@@ -14,7 +20,7 @@ export interface MedEngineOptions {
14
20
  osdOptions: OpenSeadragonType.Options;
15
21
  locale?: Locale;
16
22
  plugins?: {
17
- annotorious?: boolean | any;
23
+ annotorious?: boolean | AnnotoriousOptions;
18
24
  toolbar?: boolean | ToolbarOptions;
19
25
  colorAdjust?: boolean | ColorAdjustOptions;
20
26
  selection?: boolean | SelectionOptions;
@@ -90,4 +96,9 @@ export declare class MedViewerEngine {
90
96
  * 销毁引擎与所有插件
91
97
  */
92
98
  destroy(): void;
99
+ /**
100
+ * 动态设置语言
101
+ * @param locale 语言标识,如 'en' 或 'zh-CN'
102
+ */
103
+ setLocale(locale: Locale): void;
93
104
  }
@@ -32,6 +32,22 @@ export declare class MagnificationPlugin {
32
32
  getMagnification(): number;
33
33
  private setMagnification;
34
34
  private fitToScreen;
35
+ /**
36
+ * 显示放大镜控件
37
+ */
38
+ show(): void;
39
+ /**
40
+ * 隐藏放大镜控件
41
+ */
42
+ hide(): void;
43
+ /**
44
+ * 切换放大镜控件的可见性
45
+ */
46
+ toggle(): void;
47
+ /**
48
+ * 检查放大镜控件是否可见
49
+ */
50
+ isVisible(): boolean;
35
51
  refresh(): void;
36
52
  destroy(): void;
37
53
  private injectStyles;
@@ -13,7 +13,7 @@ export interface SelectionOptions {
13
13
  startRotated?: boolean;
14
14
  startRotatedHeight?: number;
15
15
  restrictToImage?: boolean;
16
- onSelection?: (rect: OpenSeadragon.Rect) => void;
16
+ onSelection?: (rect: OpenSeadragon.Rect, blob: Blob | null) => void;
17
17
  onSelectionCanceled?: () => void;
18
18
  onSelectionChange?: (rect: OpenSeadragon.Rect) => void;
19
19
  onSelectionToggled?: (state: {
@@ -65,6 +65,10 @@ export declare class SelectionPlugin {
65
65
  private selection;
66
66
  private options;
67
67
  constructor(viewer: OpenSeadragon.Viewer, options?: SelectionOptions);
68
+ /**
69
+ * 更新语言环境,刷新工具提示
70
+ */
71
+ updateLocale(): void;
68
72
  private init;
69
73
  private setupSelection;
70
74
  /**
@@ -30,6 +30,22 @@ export declare class MedToolbar {
30
30
  private dropdownElement;
31
31
  private outsideClickHandler;
32
32
  constructor(engine: MedViewerEngine, options?: ToolbarOptions);
33
+ /**
34
+ * 显示工具栏
35
+ */
36
+ show(): void;
37
+ /**
38
+ * 隐藏工具栏
39
+ */
40
+ hide(): void;
41
+ /**
42
+ * 切换工具栏的可见性
43
+ */
44
+ toggle(): void;
45
+ /**
46
+ * 检查工具栏是否可见
47
+ */
48
+ isVisible(): boolean;
33
49
  destroy(): void;
34
50
  private render;
35
51
  private showDropdown;
@@ -12552,7 +12552,7 @@ class AnnoAnnotator extends BaseAnnotator {
12552
12552
  // 可以在此配置样式、偏好等
12553
12553
  });
12554
12554
  this.injectStyles();
12555
- this.initEvents();
12555
+ this.initEvents(config);
12556
12556
  }
12557
12557
  setEnabled(enabled) {
12558
12558
  this.anno.setDrawingEnabled(enabled);
@@ -12565,6 +12565,12 @@ class AnnoAnnotator extends BaseAnnotator {
12565
12565
  this.setEnabled(true);
12566
12566
  }
12567
12567
  }
12568
+ setLocale(locale) {
12569
+ var _a2;
12570
+ if ((_a2 = this.anno) == null ? void 0 : _a2.setLocale) {
12571
+ this.anno.setLocale(locale);
12572
+ }
12573
+ }
12568
12574
  getAnnotations() {
12569
12575
  return this.anno.getAnnotations();
12570
12576
  }
@@ -12577,10 +12583,22 @@ class AnnoAnnotator extends BaseAnnotator {
12577
12583
  destroy() {
12578
12584
  this.anno.destroy();
12579
12585
  }
12580
- initEvents() {
12581
- this.anno.on("createAnnotation", (anno) => {
12582
- console.log("新标注已创建:", anno);
12583
- });
12586
+ initEvents(config) {
12587
+ if (config.onCreateAnnotation) {
12588
+ this.anno.on("createAnnotation", (annotation) => {
12589
+ config.onCreateAnnotation(annotation);
12590
+ });
12591
+ }
12592
+ if (config.onUpdateAnnotation) {
12593
+ this.anno.on("updateAnnotation", (annotation, previous) => {
12594
+ config.onUpdateAnnotation(annotation, previous);
12595
+ });
12596
+ }
12597
+ if (config.onDeleteAnnotation) {
12598
+ this.anno.on("deleteAnnotation", (annotation) => {
12599
+ config.onDeleteAnnotation(annotation);
12600
+ });
12601
+ }
12584
12602
  }
12585
12603
  injectStyles() {
12586
12604
  const styleId = "med-anno-v2-7-17-overrides";
@@ -13138,6 +13156,8 @@ class ColorAdjustPlugin {
13138
13156
  },
13139
13157
  debounceMs: 60,
13140
13158
  loadMode: "async",
13159
+ onAdjustmentsChange: () => {
13160
+ },
13141
13161
  ...options
13142
13162
  };
13143
13163
  this._adjustments = { ...this.options.adjustments };
@@ -13189,6 +13209,9 @@ class ColorAdjustPlugin {
13189
13209
  clearTimeout(this.debounceTimer);
13190
13210
  this.debounceTimer = setTimeout(() => {
13191
13211
  this.apply();
13212
+ if (this.options.onAdjustmentsChange) {
13213
+ this.options.onAdjustmentsChange(this._adjustments);
13214
+ }
13192
13215
  this.debounceTimer = null;
13193
13216
  }, this.options.debounceMs);
13194
13217
  }
@@ -13198,6 +13221,9 @@ class ColorAdjustPlugin {
13198
13221
  reset() {
13199
13222
  this._adjustments = { ...this.options.adjustments };
13200
13223
  this.apply();
13224
+ if (this.options.onAdjustmentsChange) {
13225
+ this.options.onAdjustmentsChange(this._adjustments);
13226
+ }
13201
13227
  }
13202
13228
  destroy() {
13203
13229
  var _a2;
@@ -14176,8 +14202,12 @@ class MagnificationPlugin {
14176
14202
  return currentZoom * baseMag;
14177
14203
  }
14178
14204
  // 修改 setMagnification 方法
14179
- async setMagnification(mag) {
14205
+ async setMagnification(mag, target = null) {
14180
14206
  var _a2, _b2;
14207
+ let point = this.viewer.viewport.getCenter();
14208
+ if (target) {
14209
+ point = this.viewer.viewport.imageToViewportCoordinates(target.x, target.y);
14210
+ }
14181
14211
  if (this.options.type === "LD") {
14182
14212
  const tiledImage = this.viewer.world.getItemAt(0);
14183
14213
  if (!this.magnificationDisplay || !tiledImage)
@@ -14189,7 +14219,7 @@ class MagnificationPlugin {
14189
14219
  this.viewer.viewport.getZoom();
14190
14220
  const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
14191
14221
  const targetZoom = mag / conversionFactor;
14192
- await this.viewer.viewport.zoomTo(targetZoom, this.viewer.viewport.getCenter(), false);
14222
+ await this.viewer.viewport.zoomTo(targetZoom, point, false);
14193
14223
  this.updateMagnificationDisplay();
14194
14224
  } else {
14195
14225
  const tiledImage = this.viewer.world.getItemAt(0);
@@ -14198,7 +14228,7 @@ class MagnificationPlugin {
14198
14228
  const baseMag = ((_b2 = this.viewer.source) == null ? void 0 : _b2.max_magnification) || 40;
14199
14229
  const targetImageZoom = mag / baseMag;
14200
14230
  const targetViewportZoom = this.viewer.viewport.imageToViewportZoom(targetImageZoom);
14201
- await this.viewer.viewport.zoomTo(targetViewportZoom, this.viewer.viewport.getCenter(), false);
14231
+ await this.viewer.viewport.zoomTo(targetViewportZoom, point, false);
14202
14232
  this.updateMagnificationDisplay();
14203
14233
  }
14204
14234
  }
@@ -14207,6 +14237,36 @@ class MagnificationPlugin {
14207
14237
  this.viewer.viewport.fitHorizontally(true);
14208
14238
  this.viewer.viewport.goHome();
14209
14239
  }
14240
+ /**
14241
+ * 显示放大镜控件
14242
+ */
14243
+ show() {
14244
+ if (this.magnificationElement) {
14245
+ this.magnificationElement.style.display = "flex";
14246
+ }
14247
+ }
14248
+ /**
14249
+ * 隐藏放大镜控件
14250
+ */
14251
+ hide() {
14252
+ if (this.magnificationElement) {
14253
+ this.magnificationElement.style.display = "none";
14254
+ }
14255
+ }
14256
+ /**
14257
+ * 切换放大镜控件的可见性
14258
+ */
14259
+ toggle() {
14260
+ if (this.magnificationElement) {
14261
+ this.magnificationElement.style.display = this.magnificationElement.style.display === "none" ? "flex" : "none";
14262
+ }
14263
+ }
14264
+ /**
14265
+ * 检查放大镜控件是否可见
14266
+ */
14267
+ isVisible() {
14268
+ return this.magnificationElement ? this.magnificationElement.style.display !== "none" : false;
14269
+ }
14210
14270
  refresh() {
14211
14271
  this.updateMagnificationDisplay();
14212
14272
  }
@@ -15232,9 +15292,11 @@ const selectionCancelRest = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAA
15232
15292
  const selectionCancelGroup = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDRjQ1MzBFODczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDRjQ1MzBFNzczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDg4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15233
15293
  const selectionCancelHover = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCMUM1QzMyODczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMUM1QzMyNzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15234
15294
  const selectionCancelDown = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERkFFQjU3NzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERkFFQjU3NjczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15235
- OpenSeadragon.setString("Tooltips.SelectionToggle", t("selection.toggle"));
15236
- OpenSeadragon.setString("Tooltips.SelectionConfirm", t("selection.confirm"));
15237
- OpenSeadragon.setString("Tooltips.SelectionCancel", t("selection.cancel"));
15295
+ function updateOsdTooltips() {
15296
+ OpenSeadragon.setString("Tooltips.SelectionToggle", t("selection.toggle"));
15297
+ OpenSeadragon.setString("Tooltips.SelectionConfirm", t("selection.confirm"));
15298
+ OpenSeadragon.setString("Tooltips.SelectionCancel", t("selection.cancel"));
15299
+ }
15238
15300
  class SelectionPlugin {
15239
15301
  constructor(viewer, options = {}) {
15240
15302
  __publicField(this, "viewer");
@@ -15242,6 +15304,10 @@ class SelectionPlugin {
15242
15304
  // OpenSeadragonSelection instance
15243
15305
  __publicField(this, "options");
15244
15306
  this.viewer = viewer;
15307
+ const userOnSelection = options.onSelection;
15308
+ if (options.onSelection) {
15309
+ delete options.onSelection;
15310
+ }
15245
15311
  this.options = {
15246
15312
  showSelectionControl: true,
15247
15313
  showConfirmDenyButtons: true,
@@ -15297,9 +15363,54 @@ class SelectionPlugin {
15297
15363
  background: "#4CAF50",
15298
15364
  border: "2px solid #4CAF50"
15299
15365
  },
15300
- ...options
15366
+ ...options,
15367
+ // Override onSelection to provide a blob
15368
+ onSelection: (rect) => {
15369
+ if (!userOnSelection) {
15370
+ return;
15371
+ }
15372
+ try {
15373
+ const viewportRect = this.viewer.viewport.imageToViewportRectangle(rect);
15374
+ const webRect = this.viewer.viewport.viewportToViewerElementRectangle(viewportRect);
15375
+ const pixelDensityRatio = OpenSeadragon.pixelDensityRatio || 1;
15376
+ const { x: x2, y: y2, width, height } = webRect || {};
15377
+ const { canvas } = this.viewer.drawer;
15378
+ const selectionCanvas = document.createElement("canvas");
15379
+ const ctx = selectionCanvas.getContext("2d");
15380
+ if (!ctx) {
15381
+ userOnSelection(rect, null);
15382
+ return;
15383
+ }
15384
+ selectionCanvas.width = width * pixelDensityRatio;
15385
+ selectionCanvas.height = height * pixelDensityRatio;
15386
+ ctx.drawImage(
15387
+ canvas,
15388
+ x2 * pixelDensityRatio,
15389
+ y2 * pixelDensityRatio,
15390
+ width * pixelDensityRatio,
15391
+ height * pixelDensityRatio,
15392
+ 0,
15393
+ 0,
15394
+ width * pixelDensityRatio,
15395
+ height * pixelDensityRatio
15396
+ );
15397
+ selectionCanvas.toBlob((blob) => {
15398
+ userOnSelection(rect, blob);
15399
+ });
15400
+ } catch (e2) {
15401
+ console.error("[SelectionPlugin] Error creating blob from selection:", e2);
15402
+ userOnSelection(rect, null);
15403
+ }
15404
+ }
15301
15405
  };
15302
15406
  this.init();
15407
+ updateOsdTooltips();
15408
+ }
15409
+ /**
15410
+ * 更新语言环境,刷新工具提示
15411
+ */
15412
+ updateLocale() {
15413
+ updateOsdTooltips();
15303
15414
  }
15304
15415
  init() {
15305
15416
  this.viewer.addOnceHandler("open", () => {
@@ -15440,6 +15551,9 @@ const createAnnoDropdownContent = (engine, hide) => {
15440
15551
  btn.className = "med-tool-item";
15441
15552
  btn.textContent = tItem.label;
15442
15553
  btn.onclick = () => {
15554
+ if (engine.selection) {
15555
+ engine.selection.disable();
15556
+ }
15443
15557
  if (engine.anno)
15444
15558
  engine.anno.setTool(tItem.id, selectedColor);
15445
15559
  hide();
@@ -15462,6 +15576,10 @@ const createColorAdjustDropdownContent = (engine, hide) => {
15462
15576
  var _a2;
15463
15577
  const container = document.createElement("div");
15464
15578
  container.className = "med-toolbar-dropdown-inner med-color-adjust-dropdown";
15579
+ if (engine.anno)
15580
+ engine.anno.setEnabled(false);
15581
+ if (engine.selection)
15582
+ engine.selection.disable();
15465
15583
  const createSlider = (labelText, id, min, max, step, initialValue, onChange) => {
15466
15584
  const section = document.createElement("div");
15467
15585
  section.className = "med-toolbar-section";
@@ -15675,6 +15793,12 @@ const DEFAULT_BUTTONS = [
15675
15793
  label: t("toolbar.reset"),
15676
15794
  onClick: (engine, hide) => {
15677
15795
  engine.viewer.viewport.goHome();
15796
+ if (engine.selection) {
15797
+ engine.selection.disable();
15798
+ }
15799
+ if (engine.anno) {
15800
+ engine.anno.setEnabled(false);
15801
+ }
15678
15802
  hide();
15679
15803
  }
15680
15804
  },
@@ -15697,6 +15821,9 @@ const DEFAULT_BUTTONS = [
15697
15821
  onClick: (engine, hide) => {
15698
15822
  var _a2;
15699
15823
  (_a2 = engine.selection) == null ? void 0 : _a2.toggleState();
15824
+ if (engine.anno) {
15825
+ engine.anno.setEnabled(false);
15826
+ }
15700
15827
  hide();
15701
15828
  }
15702
15829
  }
@@ -15717,6 +15844,30 @@ class MedToolbar {
15717
15844
  this.render();
15718
15845
  this.mount();
15719
15846
  }
15847
+ /**
15848
+ * 显示工具栏
15849
+ */
15850
+ show() {
15851
+ this.element.style.display = "flex";
15852
+ }
15853
+ /**
15854
+ * 隐藏工具栏
15855
+ */
15856
+ hide() {
15857
+ this.element.style.display = "none";
15858
+ }
15859
+ /**
15860
+ * 切换工具栏的可见性
15861
+ */
15862
+ toggle() {
15863
+ this.element.style.display = this.element.style.display === "none" ? "flex" : "none";
15864
+ }
15865
+ /**
15866
+ * 检查工具栏是否可见
15867
+ */
15868
+ isVisible() {
15869
+ return this.element.style.display !== "none";
15870
+ }
15720
15871
  destroy() {
15721
15872
  this.closeDropdown(true);
15722
15873
  this.element.remove();
@@ -16382,6 +16533,23 @@ class MedViewerEngine {
16382
16533
  (_e2 = this.colorAdjust) == null ? void 0 : _e2.destroy();
16383
16534
  this.viewer.destroy();
16384
16535
  }
16536
+ /**
16537
+ * 动态设置语言
16538
+ * @param locale 语言标识,如 'en' 或 'zh-CN'
16539
+ */
16540
+ setLocale(locale) {
16541
+ setLocale(locale);
16542
+ this.options.locale = locale;
16543
+ if (this.anno) {
16544
+ this.anno.setLocale(locale);
16545
+ }
16546
+ if (this.selection) {
16547
+ this.selection.updateLocale();
16548
+ }
16549
+ if (this.toolbar)
16550
+ ;
16551
+ console.log(`[MedEngine] Locale changed to ${locale}`);
16552
+ }
16385
16553
  }
16386
16554
  if (typeof window !== "undefined") {
16387
16555
  window.MedViewerSDK = {