med-viewer-sdk 0.1.17 → 0.1.20

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.
Files changed (84) hide show
  1. package/dist/core/AnnoAnnotator.d.ts +5 -4
  2. package/dist/core/ColorAdjustPlugin.d.ts +2 -2
  3. package/dist/core/Engine.d.ts +12 -1
  4. package/dist/core/Magnification.d.ts +17 -1
  5. package/dist/core/SelectionPlugin.d.ts +4 -0
  6. package/dist/core/Toolbar.d.ts +16 -0
  7. package/dist/med-viewer-sdk.mjs +118 -33
  8. package/dist/med-viewer-sdk.umd.js +1 -1
  9. package/package.json +2 -3
  10. package/src/adapters/vue/MedViewer.ts +0 -38
  11. package/src/adapters/vue/index.ts +0 -4
  12. package/src/assets/icons/button_grouphover.png +0 -0
  13. package/src/assets/icons/button_hover.png +0 -0
  14. package/src/assets/icons/button_pressed.png +0 -0
  15. package/src/assets/icons/button_rest.png +0 -0
  16. package/src/assets/icons/flip_grouphover.png +0 -0
  17. package/src/assets/icons/flip_hover.png +0 -0
  18. package/src/assets/icons/flip_pressed.png +0 -0
  19. package/src/assets/icons/flip_rest.png +0 -0
  20. package/src/assets/icons/fullpage_grouphover.png +0 -0
  21. package/src/assets/icons/fullpage_hover.png +0 -0
  22. package/src/assets/icons/fullpage_pressed.png +0 -0
  23. package/src/assets/icons/fullpage_rest.png +0 -0
  24. package/src/assets/icons/home_grouphover.png +0 -0
  25. package/src/assets/icons/home_hover.png +0 -0
  26. package/src/assets/icons/home_pressed.png +0 -0
  27. package/src/assets/icons/home_rest.png +0 -0
  28. package/src/assets/icons/next_grouphover.png +0 -0
  29. package/src/assets/icons/next_hover.png +0 -0
  30. package/src/assets/icons/next_pressed.png +0 -0
  31. package/src/assets/icons/next_rest.png +0 -0
  32. package/src/assets/icons/previous_grouphover.png +0 -0
  33. package/src/assets/icons/previous_hover.png +0 -0
  34. package/src/assets/icons/previous_pressed.png +0 -0
  35. package/src/assets/icons/previous_rest.png +0 -0
  36. package/src/assets/icons/rotateleft_grouphover.png +0 -0
  37. package/src/assets/icons/rotateleft_hover.png +0 -0
  38. package/src/assets/icons/rotateleft_pressed.png +0 -0
  39. package/src/assets/icons/rotateleft_rest.png +0 -0
  40. package/src/assets/icons/rotateright_grouphover.png +0 -0
  41. package/src/assets/icons/rotateright_hover.png +0 -0
  42. package/src/assets/icons/rotateright_pressed.png +0 -0
  43. package/src/assets/icons/rotateright_rest.png +0 -0
  44. package/src/assets/icons/selection_cancel_grouphover.png +0 -0
  45. package/src/assets/icons/selection_cancel_hover.png +0 -0
  46. package/src/assets/icons/selection_cancel_pressed.png +0 -0
  47. package/src/assets/icons/selection_cancel_rest.png +0 -0
  48. package/src/assets/icons/selection_confirm_grouphover.png +0 -0
  49. package/src/assets/icons/selection_confirm_hover.png +0 -0
  50. package/src/assets/icons/selection_confirm_pressed.png +0 -0
  51. package/src/assets/icons/selection_confirm_rest.png +0 -0
  52. package/src/assets/icons/selection_grouphover.png +0 -0
  53. package/src/assets/icons/selection_hover.png +0 -0
  54. package/src/assets/icons/selection_pressed.png +0 -0
  55. package/src/assets/icons/selection_rest.png +0 -0
  56. package/src/assets/icons/tool_anno.png +0 -0
  57. package/src/assets/icons/tool_color.png +0 -0
  58. package/src/assets/icons/tool_reset.png +0 -0
  59. package/src/assets/icons/tool_selection.png +0 -0
  60. package/src/assets/icons/zoomin_grouphover.png +0 -0
  61. package/src/assets/icons/zoomin_hover.png +0 -0
  62. package/src/assets/icons/zoomin_pressed.png +0 -0
  63. package/src/assets/icons/zoomin_rest.png +0 -0
  64. package/src/assets/icons/zoomout_grouphover.png +0 -0
  65. package/src/assets/icons/zoomout_hover.png +0 -0
  66. package/src/assets/icons/zoomout_pressed.png +0 -0
  67. package/src/assets/icons/zoomout_rest.png +0 -0
  68. package/src/core/AnnoAnnotator.ts +0 -94
  69. package/src/core/BaseAnnotator.ts +0 -43
  70. package/src/core/ColorAdjustPlugin.ts +0 -183
  71. package/src/core/Coords.ts +0 -9
  72. package/src/core/Engine.ts +0 -405
  73. package/src/core/Magnification.ts +0 -301
  74. package/src/core/Scalebar.ts +0 -88
  75. package/src/core/SelectionPlugin.ts +0 -251
  76. package/src/core/Toolbar.ts +0 -854
  77. package/src/i18n/i18n.ts +0 -104
  78. package/src/index.ts +0 -45
  79. package/src/plugins/ShapeLabelsFormatter.js +0 -512
  80. package/src/plugins/openseadragon-filtering.js +0 -211
  81. package/src/plugins/openseadragon-scalebar.js +0 -592
  82. package/src/plugins/openseadragon-selection.js +0 -657
  83. package/src/types/ShapeLabelsFormatter.d.ts +0 -12
  84. package/src/types/type.d.ts +0 -7
@@ -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,7 @@ 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
16
  }
17
17
  export declare class ColorAdjustPlugin {
18
18
  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
  }
@@ -1,4 +1,4 @@
1
- import OpenSeadragon from "openseadragon";
1
+ import OpenSeadragon from 'openseadragon';
2
2
  export declare enum MagnificationPosition {
3
3
  TOP_LEFT = "TOP_LEFT",
4
4
  TOP_CENTER = "TOP_CENTER",
@@ -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;
@@ -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";
@@ -14117,9 +14135,7 @@ class MagnificationPlugin {
14117
14135
  const tiledImage = this.viewer.world.getItemAt(0);
14118
14136
  if (!this.magnificationDisplay || !tiledImage)
14119
14137
  return;
14120
- const currentZoom = this.viewer.viewport.viewportToImageZoom(
14121
- this.viewer.viewport.getZoom()
14122
- );
14138
+ const currentZoom = this.viewer.viewport.viewportToImageZoom(this.viewer.viewport.getZoom());
14123
14139
  const baseMag = ((_b2 = this.viewer.source) == null ? void 0 : _b2.max_magnification) || 40;
14124
14140
  const magnification = currentZoom * baseMag;
14125
14141
  this.magnificationDisplay.innerHTML = `<span>${magnification.toFixed(2)}X</span>`;
@@ -14142,10 +14158,7 @@ class MagnificationPlugin {
14142
14158
  this.magnificationElement.appendChild(buttonsContainer);
14143
14159
  const magnifications = [40, 20, 10, 4];
14144
14160
  magnifications.forEach((mag) => {
14145
- const btn = this.createButton(
14146
- `${mag}X`,
14147
- () => this.setMagnification(mag)
14148
- );
14161
+ const btn = this.createButton(`${mag}X`, () => this.setMagnification(mag));
14149
14162
  buttonsContainer.appendChild(btn);
14150
14163
  });
14151
14164
  const fitBtn = this.createButton("Fit", () => this.fitToScreen());
@@ -14176,15 +14189,17 @@ class MagnificationPlugin {
14176
14189
  const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
14177
14190
  return conversionFactor * currentZoom2;
14178
14191
  }
14179
- const currentZoom = this.viewer.viewport.viewportToImageZoom(
14180
- this.viewer.viewport.getZoom()
14181
- );
14192
+ const currentZoom = this.viewer.viewport.viewportToImageZoom(this.viewer.viewport.getZoom());
14182
14193
  const baseMag = ((_b2 = this.viewer.source) == null ? void 0 : _b2.max_magnification) || 40;
14183
14194
  return currentZoom * baseMag;
14184
14195
  }
14185
14196
  // 修改 setMagnification 方法
14186
- setMagnification(mag) {
14197
+ async setMagnification(mag, target = null) {
14187
14198
  var _a2, _b2;
14199
+ let point = this.viewer.viewport.getCenter();
14200
+ if (target) {
14201
+ point = this.viewer.viewport.imageToViewportCoordinates(target.x, target.y);
14202
+ }
14188
14203
  if (this.options.type === "LD") {
14189
14204
  const tiledImage = this.viewer.world.getItemAt(0);
14190
14205
  if (!this.magnificationDisplay || !tiledImage)
@@ -14196,11 +14211,7 @@ class MagnificationPlugin {
14196
14211
  this.viewer.viewport.getZoom();
14197
14212
  const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
14198
14213
  const targetZoom = mag / conversionFactor;
14199
- this.viewer.viewport.zoomTo(
14200
- targetZoom,
14201
- this.viewer.viewport.getCenter(),
14202
- false
14203
- );
14214
+ await this.viewer.viewport.zoomTo(targetZoom, point, false);
14204
14215
  this.updateMagnificationDisplay();
14205
14216
  } else {
14206
14217
  const tiledImage = this.viewer.world.getItemAt(0);
@@ -14209,11 +14220,8 @@ class MagnificationPlugin {
14209
14220
  const baseMag = ((_b2 = this.viewer.source) == null ? void 0 : _b2.max_magnification) || 40;
14210
14221
  const targetImageZoom = mag / baseMag;
14211
14222
  const targetViewportZoom = this.viewer.viewport.imageToViewportZoom(targetImageZoom);
14212
- this.viewer.viewport.zoomTo(
14213
- targetViewportZoom,
14214
- this.viewer.viewport.getCenter(),
14215
- false
14216
- );
14223
+ await this.viewer.viewport.zoomTo(targetViewportZoom, point, false);
14224
+ this.updateMagnificationDisplay();
14217
14225
  }
14218
14226
  }
14219
14227
  fitToScreen() {
@@ -14221,6 +14229,36 @@ class MagnificationPlugin {
14221
14229
  this.viewer.viewport.fitHorizontally(true);
14222
14230
  this.viewer.viewport.goHome();
14223
14231
  }
14232
+ /**
14233
+ * 显示放大镜控件
14234
+ */
14235
+ show() {
14236
+ if (this.magnificationElement) {
14237
+ this.magnificationElement.style.display = "flex";
14238
+ }
14239
+ }
14240
+ /**
14241
+ * 隐藏放大镜控件
14242
+ */
14243
+ hide() {
14244
+ if (this.magnificationElement) {
14245
+ this.magnificationElement.style.display = "none";
14246
+ }
14247
+ }
14248
+ /**
14249
+ * 切换放大镜控件的可见性
14250
+ */
14251
+ toggle() {
14252
+ if (this.magnificationElement) {
14253
+ this.magnificationElement.style.display = this.magnificationElement.style.display === "none" ? "flex" : "none";
14254
+ }
14255
+ }
14256
+ /**
14257
+ * 检查放大镜控件是否可见
14258
+ */
14259
+ isVisible() {
14260
+ return this.magnificationElement ? this.magnificationElement.style.display !== "none" : false;
14261
+ }
14224
14262
  refresh() {
14225
14263
  this.updateMagnificationDisplay();
14226
14264
  }
@@ -14233,10 +14271,7 @@ class MagnificationPlugin {
14233
14271
  this.magnificationDisplay = null;
14234
14272
  }
14235
14273
  this.viewer.removeHandler("animation", this.updateMagnificationDisplay);
14236
- this.viewer.removeHandler(
14237
- "animation-finish",
14238
- this.updateMagnificationDisplay
14239
- );
14274
+ this.viewer.removeHandler("animation-finish", this.updateMagnificationDisplay);
14240
14275
  this.viewer.removeHandler("open", this.updateMagnificationDisplay);
14241
14276
  this.viewer = null;
14242
14277
  }
@@ -15249,9 +15284,11 @@ const selectionCancelRest = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAA
15249
15284
  const selectionCancelGroup = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDRjQ1MzBFODczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDRjQ1MzBFNzczRjMxMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDg4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15250
15285
  const selectionCancelHover = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCMUM1QzMyODczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCMUM1QzMyNzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15251
15286
  const selectionCancelDown = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAiCAYAAADVhWD8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzgwMTE3NDA3MjA2ODExODIyQUM5QkUyMDFBMkEwRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERkFFQjU3NzczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERkFFQjU3NjczRjExMUU1OEFDRDgxN0E3MzVCRjJGOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDY4MDExNzQwNzIwNjgxMTgyMkFGQkMyQkQyOEFDNzciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMTgyMkFDOUJFMjAxQTJBMEYiLz4gPC9yZGY6RGVzY3Jp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";
15252
- OpenSeadragon.setString("Tooltips.SelectionToggle", t("selection.toggle"));
15253
- OpenSeadragon.setString("Tooltips.SelectionConfirm", t("selection.confirm"));
15254
- OpenSeadragon.setString("Tooltips.SelectionCancel", t("selection.cancel"));
15287
+ function updateOsdTooltips() {
15288
+ OpenSeadragon.setString("Tooltips.SelectionToggle", t("selection.toggle"));
15289
+ OpenSeadragon.setString("Tooltips.SelectionConfirm", t("selection.confirm"));
15290
+ OpenSeadragon.setString("Tooltips.SelectionCancel", t("selection.cancel"));
15291
+ }
15255
15292
  class SelectionPlugin {
15256
15293
  constructor(viewer, options = {}) {
15257
15294
  __publicField(this, "viewer");
@@ -15317,6 +15354,13 @@ class SelectionPlugin {
15317
15354
  ...options
15318
15355
  };
15319
15356
  this.init();
15357
+ updateOsdTooltips();
15358
+ }
15359
+ /**
15360
+ * 更新语言环境,刷新工具提示
15361
+ */
15362
+ updateLocale() {
15363
+ updateOsdTooltips();
15320
15364
  }
15321
15365
  init() {
15322
15366
  this.viewer.addOnceHandler("open", () => {
@@ -15734,6 +15778,30 @@ class MedToolbar {
15734
15778
  this.render();
15735
15779
  this.mount();
15736
15780
  }
15781
+ /**
15782
+ * 显示工具栏
15783
+ */
15784
+ show() {
15785
+ this.element.style.display = "flex";
15786
+ }
15787
+ /**
15788
+ * 隐藏工具栏
15789
+ */
15790
+ hide() {
15791
+ this.element.style.display = "none";
15792
+ }
15793
+ /**
15794
+ * 切换工具栏的可见性
15795
+ */
15796
+ toggle() {
15797
+ this.element.style.display = this.element.style.display === "none" ? "flex" : "none";
15798
+ }
15799
+ /**
15800
+ * 检查工具栏是否可见
15801
+ */
15802
+ isVisible() {
15803
+ return this.element.style.display !== "none";
15804
+ }
15737
15805
  destroy() {
15738
15806
  this.closeDropdown(true);
15739
15807
  this.element.remove();
@@ -16399,6 +16467,23 @@ class MedViewerEngine {
16399
16467
  (_e2 = this.colorAdjust) == null ? void 0 : _e2.destroy();
16400
16468
  this.viewer.destroy();
16401
16469
  }
16470
+ /**
16471
+ * 动态设置语言
16472
+ * @param locale 语言标识,如 'en' 或 'zh-CN'
16473
+ */
16474
+ setLocale(locale) {
16475
+ setLocale(locale);
16476
+ this.options.locale = locale;
16477
+ if (this.anno) {
16478
+ this.anno.setLocale(locale);
16479
+ }
16480
+ if (this.selection) {
16481
+ this.selection.updateLocale();
16482
+ }
16483
+ if (this.toolbar)
16484
+ ;
16485
+ console.log(`[MedEngine] Locale changed to ${locale}`);
16486
+ }
16402
16487
  }
16403
16488
  if (typeof window !== "undefined") {
16404
16489
  window.MedViewerSDK = {