@univerjs/drawing-ui 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (93) hide show
  1. package/lib/cjs/index.js +2483 -1884
  2. package/lib/cjs/locale/ar-SA.js +45 -0
  3. package/lib/cjs/locale/ca-ES.js +45 -0
  4. package/lib/cjs/locale/de-DE.js +45 -0
  5. package/lib/cjs/locale/en-US.js +45 -0
  6. package/lib/cjs/locale/es-ES.js +45 -0
  7. package/lib/cjs/locale/fa-IR.js +45 -0
  8. package/lib/cjs/locale/fr-FR.js +45 -0
  9. package/lib/cjs/locale/id-ID.js +45 -0
  10. package/lib/cjs/locale/it-IT.js +45 -0
  11. package/lib/cjs/locale/ja-JP.js +45 -0
  12. package/lib/cjs/locale/ko-KR.js +45 -0
  13. package/lib/cjs/locale/pl-PL.js +45 -0
  14. package/lib/cjs/locale/pt-BR.js +45 -0
  15. package/lib/cjs/locale/ru-RU.js +45 -0
  16. package/lib/cjs/locale/sk-SK.js +45 -0
  17. package/lib/cjs/locale/vi-VN.js +45 -0
  18. package/lib/cjs/locale/zh-CN.js +45 -0
  19. package/lib/cjs/locale/zh-HK.js +45 -0
  20. package/lib/cjs/locale/zh-TW.js +45 -0
  21. package/lib/es/index.js +2477 -1888
  22. package/lib/es/locale/ar-SA.js +45 -0
  23. package/lib/es/locale/ca-ES.js +45 -0
  24. package/lib/es/locale/de-DE.js +45 -0
  25. package/lib/es/locale/en-US.js +45 -0
  26. package/lib/es/locale/es-ES.js +45 -0
  27. package/lib/es/locale/fa-IR.js +45 -0
  28. package/lib/es/locale/fr-FR.js +45 -0
  29. package/lib/es/locale/id-ID.js +45 -0
  30. package/lib/es/locale/it-IT.js +45 -0
  31. package/lib/es/locale/ja-JP.js +45 -0
  32. package/lib/es/locale/ko-KR.js +45 -0
  33. package/lib/es/locale/pl-PL.js +45 -0
  34. package/lib/es/locale/pt-BR.js +45 -0
  35. package/lib/es/locale/ru-RU.js +45 -0
  36. package/lib/es/locale/sk-SK.js +45 -0
  37. package/lib/es/locale/vi-VN.js +45 -0
  38. package/lib/es/locale/zh-CN.js +45 -0
  39. package/lib/es/locale/zh-HK.js +45 -0
  40. package/lib/es/locale/zh-TW.js +45 -0
  41. package/lib/index.css +299 -0
  42. package/lib/index.js +2477 -1888
  43. package/lib/locale/ar-SA.js +45 -0
  44. package/lib/locale/ca-ES.js +45 -0
  45. package/lib/locale/de-DE.js +45 -0
  46. package/lib/locale/en-US.js +45 -0
  47. package/lib/locale/es-ES.js +45 -0
  48. package/lib/locale/fa-IR.js +45 -0
  49. package/lib/locale/fr-FR.js +45 -0
  50. package/lib/locale/id-ID.js +45 -0
  51. package/lib/locale/it-IT.js +45 -0
  52. package/lib/locale/ja-JP.js +45 -0
  53. package/lib/locale/ko-KR.js +45 -0
  54. package/lib/locale/pl-PL.js +45 -0
  55. package/lib/locale/pt-BR.js +45 -0
  56. package/lib/locale/ru-RU.js +45 -0
  57. package/lib/locale/sk-SK.js +45 -0
  58. package/lib/locale/vi-VN.js +45 -0
  59. package/lib/locale/zh-CN.js +45 -0
  60. package/lib/locale/zh-HK.js +45 -0
  61. package/lib/locale/zh-TW.js +45 -0
  62. package/lib/types/commands/operations/drawing-group.operation.d.ts +5 -3
  63. package/lib/types/controllers/image-update.controller.d.ts +2 -2
  64. package/lib/types/controllers/utils.d.ts +5 -1
  65. package/lib/types/index.d.ts +6 -1
  66. package/lib/types/locale/en-US.d.ts +45 -0
  67. package/lib/types/services/drawing-render.service.d.ts +10 -4
  68. package/lib/types/utils/rotate-enabled.d.ts +19 -0
  69. package/lib/types/views/image-popup-menu/ImagePopupMenu.d.ts +10 -3
  70. package/lib/types/views/object-list-panel/ObjectListPanelBase.d.ts +101 -0
  71. package/lib/types/views/object-list-panel/object-list-panel-layer.d.ts +21 -0
  72. package/lib/types/views/panel/drawing-transform-rotation.d.ts +26 -0
  73. package/lib/umd/index.js +7 -1
  74. package/lib/umd/locale/ar-SA.js +1 -1
  75. package/lib/umd/locale/ca-ES.js +1 -1
  76. package/lib/umd/locale/de-DE.js +1 -1
  77. package/lib/umd/locale/en-US.js +1 -1
  78. package/lib/umd/locale/es-ES.js +1 -1
  79. package/lib/umd/locale/fa-IR.js +1 -1
  80. package/lib/umd/locale/fr-FR.js +1 -1
  81. package/lib/umd/locale/id-ID.js +1 -1
  82. package/lib/umd/locale/it-IT.js +1 -1
  83. package/lib/umd/locale/ja-JP.js +1 -1
  84. package/lib/umd/locale/ko-KR.js +1 -1
  85. package/lib/umd/locale/pl-PL.js +1 -1
  86. package/lib/umd/locale/pt-BR.js +1 -1
  87. package/lib/umd/locale/ru-RU.js +1 -1
  88. package/lib/umd/locale/sk-SK.js +1 -1
  89. package/lib/umd/locale/vi-VN.js +1 -1
  90. package/lib/umd/locale/zh-CN.js +1 -1
  91. package/lib/umd/locale/zh-HK.js +1 -1
  92. package/lib/umd/locale/zh-TW.js +1 -1
  93. package/package.json +10 -10
package/lib/cjs/index.js CHANGED
@@ -2,12 +2,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  let _univerjs_core = require("@univerjs/core");
3
3
  let _univerjs_drawing = require("@univerjs/drawing");
4
4
  let _univerjs_engine_render = require("@univerjs/engine-render");
5
- let _univerjs_icons = require("@univerjs/icons");
6
5
  let _univerjs_ui = require("@univerjs/ui");
6
+ let rxjs = require("rxjs");
7
+ let _univerjs_icons = require("@univerjs/icons");
7
8
  let _univerjs_design = require("@univerjs/design");
8
9
  let react = require("react");
9
10
  let react_jsx_runtime = require("react/jsx-runtime");
10
- let rxjs = require("rxjs");
11
11
 
12
12
  //#region src/commands/operations/drawing-align.operation.ts
13
13
  /**
@@ -132,15 +132,13 @@ const SetDrawingArrangeBackwardOperation = {
132
132
  //#endregion
133
133
  //#region src/commands/operations/drawing-group.operation.ts
134
134
  /**
135
- * Now only support grouping images, shapes, and groups.
135
+ * Now only support grouping images, shapes, charts, and groups.
136
136
  */
137
- const DRAWING_GROUP_TYPES = [
138
- _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE,
139
- _univerjs_core.DrawingTypeEnum.DRAWING_SHAPE,
140
- _univerjs_core.DrawingTypeEnum.DRAWING_GROUP
141
- ];
137
+ const DRAWING_GROUP_TYPES = _univerjs_drawing.DRAWING_GROUPABLE_TYPES;
142
138
  /**
143
- * Group the selected drawings into a new group. The selected drawings must be of type image, shape, or group, and there must be at least 2 drawings selected.
139
+ * Group the selected drawings into a new group. The selected drawings must be
140
+ * of type image, shape, chart, or group, and there must be at least 2 drawings
141
+ * selected.
144
142
  */
145
143
  const SetDrawingGroupOperation = {
146
144
  id: "drawing.operation.set-drawing-group",
@@ -149,7 +147,7 @@ const SetDrawingGroupOperation = {
149
147
  const drawingManagerService = accessor.get(_univerjs_drawing.IDrawingManagerService);
150
148
  const drawings = params.drawings || drawingManagerService.getFocusDrawings();
151
149
  if (drawings.length < 2) return false;
152
- if (!drawings.every((drawing) => DRAWING_GROUP_TYPES.includes(drawing.drawingType))) return false;
150
+ if (!drawings.every((drawing) => (0, _univerjs_drawing.isGroupableDrawingType)(drawing.drawingType))) return false;
153
151
  const { unitId, subUnitId } = drawings[0];
154
152
  const groupId = (0, _univerjs_core.generateRandomId)(10);
155
153
  const groupTransform = (0, _univerjs_engine_render.getGroupState)(0, 0, drawings.map((o) => o.transform || {}));
@@ -171,11 +169,12 @@ const SetDrawingGroupOperation = {
171
169
  left: 0,
172
170
  top: 0
173
171
  };
174
- const { unitId, subUnitId, drawingId } = drawing;
172
+ const { unitId, subUnitId, drawingId, drawingType } = drawing;
175
173
  return {
176
174
  unitId,
177
175
  subUnitId,
178
176
  drawingId,
177
+ drawingType,
179
178
  transform: { ...transform },
180
179
  groupId
181
180
  };
@@ -267,8 +266,48 @@ const ImageResetSizeOperation = {
267
266
  }
268
267
  };
269
268
 
269
+ //#endregion
270
+ //#region src/utils/rotate-enabled.ts
271
+ function isKnownDrawingUINonRotatableType(drawingType) {
272
+ return drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_CHART;
273
+ }
274
+ function resolveDrawingUIRotateEnabled(drawing, options = {}) {
275
+ var _options$isKnownNonRo;
276
+ return (0, _univerjs_drawing.resolveDrawingRotateEnabled)(drawing, {
277
+ ...options,
278
+ isKnownNonRotatableType: (_options$isKnownNonRo = options.isKnownNonRotatableType) !== null && _options$isKnownNonRo !== void 0 ? _options$isKnownNonRo : isKnownDrawingUINonRotatableType
279
+ });
280
+ }
281
+
270
282
  //#endregion
271
283
  //#region src/controllers/utils.ts
284
+ function getDrawingRenderObject(scene, drawingSearch) {
285
+ var _scene$getObjectInclu;
286
+ const key = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(drawingSearch);
287
+ return (_scene$getObjectInclu = scene.getObjectIncludeInGroup(key)) !== null && _scene$getObjectInclu !== void 0 ? _scene$getObjectInclu : null;
288
+ }
289
+ function disposeDrawingRenderObject(scene, drawingSearch) {
290
+ const object = getDrawingRenderObject(scene, drawingSearch);
291
+ if (object == null) return false;
292
+ object.dispose();
293
+ return true;
294
+ }
295
+ function getRenderObjectForDrawing(scene, drawing) {
296
+ return getDrawingRenderObject(scene, drawing);
297
+ }
298
+ function syncGroupRotateEnabled(group, groupParam, scene, drawingManagerService, children) {
299
+ const rotateEnabled = resolveDrawingUIRotateEnabled(groupParam, {
300
+ getChildren: (drawing) => {
301
+ if (children && drawing.drawingId === groupParam.drawingId && drawing.unitId === groupParam.unitId && drawing.subUnitId === groupParam.subUnitId) return children;
302
+ return drawingManagerService.getDrawingsByGroup(drawing);
303
+ },
304
+ getRenderObject: (drawing) => getRenderObjectForDrawing(scene, drawing)
305
+ });
306
+ group.transformerConfig = {
307
+ ...group.transformerConfig,
308
+ rotateEnabled
309
+ };
310
+ }
272
311
  function insertGroupObject(objectParam, object, scene, drawingManagerService) {
273
312
  const groupParam = drawingManagerService.getDrawingByParam(objectParam);
274
313
  if (groupParam == null) return;
@@ -279,11 +318,13 @@ function insertGroupObject(objectParam, object, scene, drawingManagerService) {
279
318
  const objects = groupObject.getObjects();
280
319
  for (const obj of objects) if (obj.oKey === object.oKey) return;
281
320
  groupObject.addObject(object);
321
+ syncGroupRotateEnabled(groupObject, groupParam, scene, drawingManagerService);
282
322
  return;
283
323
  }
284
324
  const group = new _univerjs_engine_render.DrawingGroupObject(groupKey);
285
325
  scene.addObject(group, _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX).attachTransformerTo(group);
286
326
  group.addObject(object);
327
+ syncGroupRotateEnabled(group, groupParam, scene, drawingManagerService);
287
328
  const { transform, groupBaseBound } = groupParam;
288
329
  if (groupBaseBound) group.setBaseBound(groupBaseBound);
289
330
  if (groupParam.groupId) {
@@ -320,269 +361,280 @@ function getCurrentUnitInfo(currentUniverService, propUnitId) {
320
361
  }
321
362
 
322
363
  //#endregion
323
- //#region package.json
324
- var name = "@univerjs/drawing-ui";
325
- var version = "1.0.0-alpha.1";
326
-
327
- //#endregion
328
- //#region src/config/config.ts
329
- const DRAWING_UI_PLUGIN_CONFIG_KEY = "drawing-ui.config";
330
- const configSymbol = Symbol(DRAWING_UI_PLUGIN_CONFIG_KEY);
331
- const defaultPluginConfig = {};
332
-
333
- //#endregion
334
- //#region src/views/image-popup-menu/component-name.ts
335
- /**
336
- * Copyright 2023-present DreamNum Co., Ltd.
337
- *
338
- * Licensed under the Apache License, Version 2.0 (the "License");
339
- * you may not use this file except in compliance with the License.
340
- * You may obtain a copy of the License at
341
- *
342
- * http://www.apache.org/licenses/LICENSE-2.0
343
- *
344
- * Unless required by applicable law or agreed to in writing, software
345
- * distributed under the License is distributed on an "AS IS" BASIS,
346
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
347
- * See the License for the specific language governing permissions and
348
- * limitations under the License.
349
- */
350
- const COMPONENT_IMAGE_POPUP_MENU = "COMPONENT_IMAGE_POPUP_MENU";
351
-
352
- //#endregion
353
- //#region src/views/image-popup-menu/ImagePopupMenu.tsx
354
- function ImagePopupMenu(props) {
355
- var _popup$extraProps, _popup$extraProps2;
356
- const { popup } = props;
357
- const menuItems = popup === null || popup === void 0 || (_popup$extraProps = popup.extraProps) === null || _popup$extraProps === void 0 ? void 0 : _popup$extraProps.menuItems;
358
- if (!menuItems) return null;
359
- if (((_popup$extraProps2 = popup.extraProps) === null || _popup$extraProps2 === void 0 ? void 0 : _popup$extraProps2.variant) === "doc-floating-toolbar" && popup.extraProps.unitId && popup.extraProps.subUnitId && popup.extraProps.drawingId) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DocImageFloatingToolbar, {
360
- menuItems,
361
- unitId: popup.extraProps.unitId,
362
- subUnitId: popup.extraProps.subUnitId,
363
- drawingId: popup.extraProps.drawingId
364
+ //#region src/menu/align.menu.ts
365
+ const getMenuStateByDrawingFocusChangedObservable$$1 = (accessor) => {
366
+ const drawingManagerService = accessor.get(_univerjs_drawing.IDrawingManagerService);
367
+ return new rxjs.Observable((subscriber) => {
368
+ const update = (drawings) => {
369
+ if (!drawings || drawings.length === 0) return subscriber.next(true);
370
+ if (drawings.length < 2) return subscriber.next(true);
371
+ subscriber.next(false);
372
+ };
373
+ const subscription = drawingManagerService.focus$.subscribe((drawings) => {
374
+ if (!drawings || drawings.length === 0) return subscriber.next(true);
375
+ update(drawings);
376
+ });
377
+ update(drawingManagerService.getFocusDrawings());
378
+ return () => subscription.unsubscribe();
364
379
  });
365
- const commandService = (0, _univerjs_ui.useDependency)(_univerjs_core.ICommandService);
366
- const localeService = (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService);
367
- const [visible, setVisible] = (0, react.useState)(false);
368
- const [isHovered, setHovered] = (0, react.useState)(false);
369
- const handleMouseEnter = () => {
370
- setHovered(true);
380
+ };
381
+ const DRAWING_ALIGN_CONTEXT_MENU_ID = "contextMenu.drawing-align";
382
+ function DrawingAlignContextMenuItemFactory(accessor) {
383
+ return {
384
+ id: DRAWING_ALIGN_CONTEXT_MENU_ID,
385
+ type: _univerjs_ui.MenuItemType.SUBITEMS,
386
+ icon: "HorizontallyIcon",
387
+ title: "drawing-ui.image-panel.align.title",
388
+ hidden$: getMenuStateByDrawingFocusChangedObservable$$1(accessor)
371
389
  };
372
- const handleMouseLeave = () => {
373
- setHovered(false);
390
+ }
391
+ function SetDrawingAlignLeftMenuItemFactory() {
392
+ return {
393
+ id: SetDrawingAlignLeftOperation.id,
394
+ type: _univerjs_ui.MenuItemType.BUTTON,
395
+ icon: "LeftJustifyingIcon",
396
+ title: "drawing-ui.image-panel.align.left"
374
397
  };
375
- const onVisibleChange = (visible) => {
376
- setVisible(visible);
398
+ }
399
+ function SetDrawingAlignCenterMenuItemFactory() {
400
+ return {
401
+ id: SetDrawingAlignCenterOperation.id,
402
+ type: _univerjs_ui.MenuItemType.BUTTON,
403
+ icon: "HorizontallyIcon",
404
+ title: "drawing-ui.image-panel.align.center"
377
405
  };
378
- const handleClick = (item) => {
379
- commandService.executeCommand(item.commandId, item.commandParams);
380
- setVisible(false);
406
+ }
407
+ function SetDrawingAlignRightMenuItemFactory() {
408
+ return {
409
+ id: SetDrawingAlignRightOperation.id,
410
+ type: _univerjs_ui.MenuItemType.BUTTON,
411
+ icon: "RightJustifyingIcon",
412
+ title: "drawing-ui.image-panel.align.right"
381
413
  };
382
- const showMore = visible || isHovered;
383
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
384
- onMouseEnter: handleMouseEnter,
385
- onMouseLeave: handleMouseLeave,
386
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.DropdownMenu, {
387
- align: "start",
388
- items: menuItems.map((item) => ({
389
- type: "item",
390
- children: localeService.t(item.label),
391
- disabled: item.disable,
392
- onSelect: () => handleClick(item)
393
- })),
394
- open: visible,
395
- onOpenChange: onVisibleChange,
396
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
397
- className: (0, _univerjs_design.clsx)("univer-flex univer-items-center univer-gap-2 univer-rounded univer-p-1 hover:univer-bg-gray-100 dark:hover:!univer-bg-gray-800", _univerjs_design.borderClassName, {
398
- "univer-bg-gray-100 dark:!univer-bg-gray-800": visible,
399
- "univer-bg-white dark:!univer-bg-gray-900": !visible
400
- }),
401
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.AutofillDoubleIcon, { className: "univer-fill-primary-600 univer-text-gray-900 dark:!univer-text-white" }), showMore && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, { className: "dark:!univer-text-white" })]
402
- })
403
- })
404
- });
405
414
  }
406
- const UPDATE_DOC_DRAWING_WRAPPING_STYLE_COMMAND_ID = "doc.command.update-doc-drawing-wrapping-style";
407
- function getWrappingStyle(documentDataModel, drawingId) {
408
- var _documentDataModel$ge;
409
- const drawing = documentDataModel === null || documentDataModel === void 0 || (_documentDataModel$ge = documentDataModel.getSnapshot().drawings) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge[drawingId];
410
- if (!drawing) return "inline";
411
- if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_NONE) return drawing.behindDoc === _univerjs_core.BooleanNumber.TRUE ? "behindText" : "inFrontOfText";
412
- if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_SQUARE) return "wrapSquare";
413
- if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_TOP_AND_BOTTOM) return "wrapTopAndBottom";
414
- return "inline";
415
+ function SetDrawingAlignTopMenuItemFactory() {
416
+ return {
417
+ id: SetDrawingAlignTopOperation.id,
418
+ type: _univerjs_ui.MenuItemType.BUTTON,
419
+ icon: "AlignTopIcon",
420
+ title: "drawing-ui.image-panel.align.top"
421
+ };
415
422
  }
416
- function ToolbarGroup(props) {
417
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
418
- className: "univer-flex univer-h-7 univer-items-center univer-gap-1 univer-px-1",
419
- children: props.children
420
- });
423
+ function SetDrawingAlignMiddleMenuItemFactory() {
424
+ return {
425
+ id: SetDrawingAlignMiddleOperation.id,
426
+ type: _univerjs_ui.MenuItemType.BUTTON,
427
+ icon: "VerticalCenterIcon",
428
+ title: "drawing-ui.image-panel.align.middle"
429
+ };
421
430
  }
422
- function ToolbarButton(props) {
423
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Tooltip, {
424
- title: props.title,
425
- placement: "bottom",
426
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
427
- type: "button",
428
- disabled: props.disabled,
429
- onClick: props.onClick,
430
- className: (0, _univerjs_design.clsx)("univer-flex univer-h-6 univer-w-6 univer-items-center univer-justify-center univer-rounded-md univer-border-none univer-bg-transparent univer-p-0 univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 disabled:univer-cursor-not-allowed disabled:univer-opacity-40 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-700", { "univer-bg-gray-100 univer-text-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-primary-300": props.active }),
431
- children: props.children
432
- })
433
- });
431
+ function SetDrawingAlignBottomMenuItemFactory() {
432
+ return {
433
+ id: SetDrawingAlignBottomOperation.id,
434
+ type: _univerjs_ui.MenuItemType.BUTTON,
435
+ icon: "AlignBottomIcon",
436
+ title: "drawing-ui.image-panel.align.bottom"
437
+ };
434
438
  }
435
- function ToolbarDropdownButton(props) {
436
- var _props$options$find;
437
- const [open, setOpen] = (0, react.useState)(false);
438
- const activeOption = (_props$options$find = props.options.find((option) => option.value === props.value)) !== null && _props$options$find !== void 0 ? _props$options$find : props.options[0];
439
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Dropdown, {
440
- open,
441
- onOpenChange: setOpen,
442
- overlay: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
443
- className: "univer-min-w-32 univer-rounded-lg univer-border univer-border-solid univer-border-gray-200 univer-bg-white univer-p-1 univer-shadow-lg dark:!univer-border-gray-700 dark:!univer-bg-gray-900",
444
- children: props.options.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
445
- type: "button",
446
- onClick: () => {
447
- props.onChange(option.value);
448
- setOpen(false);
449
- },
450
- className: (0, _univerjs_design.clsx)("univer-flex univer-h-8 univer-w-full univer-items-center univer-gap-2 univer-rounded-md univer-border-none univer-bg-transparent univer-px-2 univer-text-left univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-800", { "univer-bg-primary-50 univer-text-primary-600 dark:!univer-bg-gray-800 dark:!univer-text-primary-300": option.value === props.value }),
451
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
452
- className: "univer-flex univer-size-4 univer-items-center univer-justify-center",
453
- children: option.icon
454
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
455
- className: "univer-flex-1",
456
- children: option.label
457
- })]
458
- }, option.value))
459
- }),
460
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Tooltip, {
461
- title: props.title,
462
- placement: "bottom",
463
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
464
- type: "button",
465
- className: (0, _univerjs_design.clsx)("univer-flex univer-h-6 univer-min-w-9 univer-items-center univer-justify-center univer-gap-1 univer-rounded-md univer-border-none univer-bg-transparent univer-px-1.5 univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-700", { "univer-bg-gray-100 univer-text-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-primary-300": open }),
466
- children: [activeOption.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, { className: "univer-text-xs" })]
467
- })
468
- }) })
469
- });
439
+ function SetDrawingAlignHorizonMenuItemFactory() {
440
+ return {
441
+ id: SetDrawingAlignHorizonOperation.id,
442
+ type: _univerjs_ui.MenuItemType.BUTTON,
443
+ icon: "HorizontallyIcon",
444
+ title: "drawing-ui.image-panel.align.horizon"
445
+ };
470
446
  }
471
- function DocImageFloatingToolbar(props) {
472
- var _univerInstanceServic, _wrappingStyleOptions, _wrappingStyleOptions2;
473
- const commandService = (0, _univerjs_ui.useDependency)(_univerjs_core.ICommandService);
474
- const localeService = (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService);
475
- const documentDataModel = (_univerInstanceServic = (0, _univerjs_ui.useDependency)(_univerjs_core.IUniverInstanceService).getUnit(props.unitId, _univerjs_core.UniverInstanceType.UNIVER_DOC)) !== null && _univerInstanceServic !== void 0 ? _univerInstanceServic : void 0;
476
- const [wrappingStyle, setWrappingStyle] = (0, react.useState)(() => getWrappingStyle(documentDataModel, props.drawingId));
477
- const [hidden, setHidden] = (0, react.useState)(false);
478
- const getMenuItem = (label) => props.menuItems.find((item) => item.label === label);
479
- const editItem = getMenuItem("drawing-ui.image-popup.edit");
480
- const cropItem = getMenuItem("drawing-ui.image-popup.crop");
481
- const deleteItem = getMenuItem("drawing-ui.image-popup.delete");
482
- const wrappingStyleOptions = [
483
- {
484
- label: localeService.t("drawing-ui.image-text-wrap.inline"),
485
- value: "inline",
486
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
487
- },
488
- {
489
- label: localeService.t("drawing-ui.image-text-wrap.square"),
490
- value: "wrapSquare",
491
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
492
- },
493
- {
494
- label: localeService.t("drawing-ui.image-text-wrap.topAndBottom"),
495
- value: "wrapTopAndBottom",
496
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
497
- },
498
- {
499
- label: localeService.t("drawing-ui.image-text-wrap.behindText"),
500
- value: "behindText",
501
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
502
- },
503
- {
504
- label: localeService.t("drawing-ui.image-text-wrap.inFrontText"),
505
- value: "inFrontOfText",
506
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
507
- }
508
- ];
509
- const executeMenuItem = (item) => {
510
- if (!item || item.disable) return;
511
- commandService.executeCommand(item.commandId, item.commandParams);
512
- };
513
- const updateWrappingStyle = (value) => {
514
- setWrappingStyle(value);
515
- commandService.executeCommand(UPDATE_DOC_DRAWING_WRAPPING_STYLE_COMMAND_ID, {
516
- unitId: props.unitId,
517
- subUnitId: props.subUnitId,
518
- drawings: [{
519
- unitId: props.unitId,
520
- subUnitId: props.subUnitId,
521
- drawingId: props.drawingId
522
- }],
523
- wrappingStyle: value
524
- });
447
+ function SetDrawingAlignVerticalMenuItemFactory() {
448
+ return {
449
+ id: SetDrawingAlignVerticalOperation.id,
450
+ type: _univerjs_ui.MenuItemType.BUTTON,
451
+ icon: "VerticalCenterIcon",
452
+ title: "drawing-ui.image-panel.align.vertical"
525
453
  };
526
- if (hidden) return null;
527
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
528
- "data-u-comp": "doc-image-floating-toolbar",
529
- onMouseDown: (event) => {
530
- event.stopPropagation();
531
- event.preventDefault();
532
- },
533
- className: (0, _univerjs_design.clsx)("univer-box-border univer-flex univer-items-center univer-rounded univer-bg-white univer-px-1 univer-py-1 univer-shadow-sm dark:!univer-border-gray-700 dark:!univer-bg-gray-900", _univerjs_design.borderClassName),
534
- children: [
535
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarGroup, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarDropdownButton, {
536
- title: (_wrappingStyleOptions = (_wrappingStyleOptions2 = wrappingStyleOptions.find((option) => option.value === wrappingStyle)) === null || _wrappingStyleOptions2 === void 0 ? void 0 : _wrappingStyleOptions2.label) !== null && _wrappingStyleOptions !== void 0 ? _wrappingStyleOptions : localeService.t("drawing-ui.image-text-wrap.inline"),
537
- value: wrappingStyle,
538
- options: wrappingStyleOptions,
539
- onChange: updateWrappingStyle
540
- }) }),
541
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Separator, { orientation: "vertical" }),
542
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ToolbarGroup, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
543
- title: editItem ? localeService.t(editItem.label) : localeService.t("drawing-ui.image-popup.edit"),
544
- disabled: !editItem || editItem.disable,
545
- onClick: () => {
546
- setHidden(true);
547
- executeMenuItem(editItem);
548
- },
549
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DocSettingIcon, {})
550
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
551
- title: cropItem ? localeService.t(cropItem.label) : localeService.t("drawing-ui.image-popup.crop"),
552
- disabled: !cropItem || cropItem.disable,
553
- onClick: () => executeMenuItem(cropItem),
554
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.CropIcon, {})
555
- })] }),
556
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Separator, { orientation: "vertical" }),
557
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarGroup, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
558
- title: deleteItem ? localeService.t(deleteItem.label) : localeService.t("drawing-ui.image-popup.delete"),
559
- disabled: !deleteItem || deleteItem.disable,
560
- onClick: () => executeMenuItem(deleteItem),
561
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DeleteIcon, {})
562
- }) })
563
- ]
564
- });
565
454
  }
566
455
 
567
456
  //#endregion
568
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorateParam.js
569
- function __decorateParam(paramIndex, decorator) {
570
- return function(target, key) {
571
- decorator(target, key, paramIndex);
457
+ //#region src/menu/arrange.menu.ts
458
+ const DRAWING_ARRANGE_CONTEXT_MENU_ID = "contextMenu.drawing-arrange";
459
+ function DrawingArrangeContextMenuItemFactory() {
460
+ return {
461
+ id: DRAWING_ARRANGE_CONTEXT_MENU_ID,
462
+ type: _univerjs_ui.MenuItemType.SUBITEMS,
463
+ icon: "TopmostIcon",
464
+ title: "drawing-ui.image-panel.arrange.title"
465
+ };
466
+ }
467
+ function SetDrawingArrangeFrontMenuItemFactory() {
468
+ return {
469
+ id: SetDrawingArrangeFrontOperation.id,
470
+ type: _univerjs_ui.MenuItemType.BUTTON,
471
+ icon: "TopmostIcon",
472
+ title: "drawing-ui.image-panel.arrange.front"
473
+ };
474
+ }
475
+ function SetDrawingArrangeForwardMenuItemFactory() {
476
+ return {
477
+ id: SetDrawingArrangeForwardOperation.id,
478
+ type: _univerjs_ui.MenuItemType.BUTTON,
479
+ icon: "MoveUpIcon",
480
+ title: "drawing-ui.image-panel.arrange.forward"
481
+ };
482
+ }
483
+ function SetDrawingArrangeBackMenuItemFactory() {
484
+ return {
485
+ id: SetDrawingArrangeBackOperation.id,
486
+ type: _univerjs_ui.MenuItemType.BUTTON,
487
+ icon: "BottomIcon",
488
+ title: "drawing-ui.image-panel.arrange.back"
489
+ };
490
+ }
491
+ function SetDrawingArrangeBackwardMenuItemFactory() {
492
+ return {
493
+ id: SetDrawingArrangeBackwardOperation.id,
494
+ type: _univerjs_ui.MenuItemType.BUTTON,
495
+ icon: "MoveDownIcon",
496
+ title: "drawing-ui.image-panel.arrange.backward"
572
497
  };
573
498
  }
574
499
 
575
500
  //#endregion
576
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorate.js
577
- function __decorate(decorators, target, key, desc) {
578
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
579
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
580
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
581
- return c > 3 && r && Object.defineProperty(target, key, r), r;
501
+ //#region src/menu/group.menu.ts
502
+ function getMenuStateByDrawingFocusChangedObservable$(accessor, type) {
503
+ const drawingManagerService = accessor.get(_univerjs_drawing.IDrawingManagerService);
504
+ return new rxjs.Observable((subscriber) => {
505
+ const update = (drawings) => {
506
+ if (!drawings || drawings.length === 0) return subscriber.next(true);
507
+ if (type === "group") {
508
+ if (drawings.length < 2) return subscriber.next(true);
509
+ if (!drawings.every((drawing) => (0, _univerjs_drawing.isGroupableDrawingType)(drawing.drawingType))) return subscriber.next(true);
510
+ } else if (type === "unGroup") {
511
+ if (drawings.filter((drawing) => drawing.drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_GROUP).length === 0) return subscriber.next(true);
512
+ } else if (!drawings.every((drawing) => (0, _univerjs_drawing.isGroupableDrawingType)(drawing.drawingType))) return subscriber.next(true);
513
+ subscriber.next(false);
514
+ };
515
+ const subscription = drawingManagerService.focus$.subscribe((drawings) => {
516
+ if (!drawings || drawings.length === 0) return subscriber.next(true);
517
+ update(drawings);
518
+ });
519
+ update(drawingManagerService.getFocusDrawings());
520
+ return () => subscription.unsubscribe();
521
+ });
522
+ }
523
+ const DRAWING_GROUP_CONTEXT_MENU_ID = "contextMenu.drawing-group";
524
+ function DrawingGroupContextMenuItemFactory(accessor) {
525
+ return {
526
+ id: DRAWING_GROUP_CONTEXT_MENU_ID,
527
+ type: _univerjs_ui.MenuItemType.SUBITEMS,
528
+ icon: "GroupIcon",
529
+ title: "drawing-ui.image-panel.group.title",
530
+ hidden$: getMenuStateByDrawingFocusChangedObservable$(accessor)
531
+ };
532
+ }
533
+ function SetDrawingGroupMenuItemFactory(accessor) {
534
+ return {
535
+ id: SetDrawingGroupOperation.id,
536
+ type: _univerjs_ui.MenuItemType.BUTTON,
537
+ icon: "GroupIcon",
538
+ title: "drawing-ui.image-panel.group.group",
539
+ disabled$: getMenuStateByDrawingFocusChangedObservable$(accessor, "group")
540
+ };
541
+ }
542
+ function CancelDrawingGroupMenuItemFactory(accessor) {
543
+ return {
544
+ id: CancelDrawingGroupOperation.id,
545
+ type: _univerjs_ui.MenuItemType.BUTTON,
546
+ icon: "UngroupIcon",
547
+ title: "drawing-ui.image-panel.group.unGroup",
548
+ disabled$: getMenuStateByDrawingFocusChangedObservable$(accessor, "unGroup")
549
+ };
582
550
  }
583
551
 
584
552
  //#endregion
585
- //#region src/controllers/components.controller.ts
553
+ //#region src/menu/schema.ts
554
+ const menuSchema = { [_univerjs_ui.ContextMenuPosition.DRAWING]: { [_univerjs_ui.ContextMenuGroup.OTHERS]: {
555
+ [DRAWING_GROUP_CONTEXT_MENU_ID]: {
556
+ order: 1,
557
+ menuItemFactory: DrawingGroupContextMenuItemFactory,
558
+ [SetDrawingGroupOperation.id]: {
559
+ order: 0,
560
+ menuItemFactory: SetDrawingGroupMenuItemFactory
561
+ },
562
+ [CancelDrawingGroupOperation.id]: {
563
+ order: 1,
564
+ menuItemFactory: CancelDrawingGroupMenuItemFactory
565
+ }
566
+ },
567
+ [DRAWING_ARRANGE_CONTEXT_MENU_ID]: {
568
+ order: 2,
569
+ menuItemFactory: DrawingArrangeContextMenuItemFactory,
570
+ [SetDrawingArrangeFrontOperation.id]: {
571
+ order: 0,
572
+ menuItemFactory: SetDrawingArrangeFrontMenuItemFactory
573
+ },
574
+ [SetDrawingArrangeForwardOperation.id]: {
575
+ order: 1,
576
+ menuItemFactory: SetDrawingArrangeForwardMenuItemFactory
577
+ },
578
+ [SetDrawingArrangeBackOperation.id]: {
579
+ order: 2,
580
+ menuItemFactory: SetDrawingArrangeBackMenuItemFactory
581
+ },
582
+ [SetDrawingArrangeBackwardOperation.id]: {
583
+ order: 3,
584
+ menuItemFactory: SetDrawingArrangeBackwardMenuItemFactory
585
+ }
586
+ },
587
+ [DRAWING_ALIGN_CONTEXT_MENU_ID]: {
588
+ order: 3,
589
+ menuItemFactory: DrawingAlignContextMenuItemFactory,
590
+ [SetDrawingAlignLeftOperation.id]: {
591
+ order: 0,
592
+ menuItemFactory: SetDrawingAlignLeftMenuItemFactory
593
+ },
594
+ [SetDrawingAlignCenterOperation.id]: {
595
+ order: 1,
596
+ menuItemFactory: SetDrawingAlignCenterMenuItemFactory
597
+ },
598
+ [SetDrawingAlignRightOperation.id]: {
599
+ order: 2,
600
+ menuItemFactory: SetDrawingAlignRightMenuItemFactory
601
+ },
602
+ [SetDrawingAlignTopOperation.id]: {
603
+ order: 3,
604
+ menuItemFactory: SetDrawingAlignTopMenuItemFactory
605
+ },
606
+ [SetDrawingAlignMiddleOperation.id]: {
607
+ order: 4,
608
+ menuItemFactory: SetDrawingAlignMiddleMenuItemFactory
609
+ },
610
+ [SetDrawingAlignBottomOperation.id]: {
611
+ order: 5,
612
+ menuItemFactory: SetDrawingAlignBottomMenuItemFactory
613
+ },
614
+ [SetDrawingAlignHorizonOperation.id]: {
615
+ order: 6,
616
+ menuItemFactory: SetDrawingAlignHorizonMenuItemFactory
617
+ },
618
+ [SetDrawingAlignVerticalOperation.id]: {
619
+ order: 7,
620
+ menuItemFactory: SetDrawingAlignVerticalMenuItemFactory
621
+ }
622
+ }
623
+ } } };
624
+
625
+ //#endregion
626
+ //#region package.json
627
+ var name = "@univerjs/drawing-ui";
628
+ var version = "1.0.0-alpha.3";
629
+
630
+ //#endregion
631
+ //#region src/config/config.ts
632
+ const DRAWING_UI_PLUGIN_CONFIG_KEY = "drawing-ui.config";
633
+ const configSymbol = Symbol(DRAWING_UI_PLUGIN_CONFIG_KEY);
634
+ const defaultPluginConfig = {};
635
+
636
+ //#endregion
637
+ //#region src/views/image-popup-menu/component-name.ts
586
638
  /**
587
639
  * Copyright 2023-present DreamNum Co., Ltd.
588
640
  *
@@ -598,714 +650,544 @@ function __decorate(decorators, target, key, desc) {
598
650
  * See the License for the specific language governing permissions and
599
651
  * limitations under the License.
600
652
  */
601
- let ComponentsController = class ComponentsController extends _univerjs_core.Disposable {
602
- constructor(_componentManager, _iconManager) {
603
- super();
604
- this._componentManager = _componentManager;
605
- this._iconManager = _iconManager;
606
- this._registerComponents();
607
- this._registerIcons();
608
- }
609
- _registerComponents() {
610
- [[COMPONENT_IMAGE_POPUP_MENU, ImagePopupMenu]].forEach(([key, component]) => {
611
- this.disposeWithMe(this._componentManager.register(key, component));
612
- });
613
- }
614
- _registerIcons() {
615
- this.disposeWithMe(this._iconManager.register({
616
- BottomIcon: _univerjs_icons.BottomIcon,
617
- GroupIcon: _univerjs_icons.GroupIcon,
618
- MoveDownIcon: _univerjs_icons.MoveDownIcon,
619
- MoveUpIcon: _univerjs_icons.MoveUpIcon,
620
- TopmostIcon: _univerjs_icons.TopmostIcon,
621
- UngroupIcon: _univerjs_icons.UngroupIcon
622
- }));
623
- }
624
- };
625
- ComponentsController = __decorate([__decorateParam(0, (0, _univerjs_core.Inject)(_univerjs_ui.ComponentManager)), __decorateParam(1, (0, _univerjs_core.Inject)(_univerjs_ui.IconManager))], ComponentsController);
626
-
627
- //#endregion
628
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
629
- function _typeof(o) {
630
- "@babel/helpers - typeof";
631
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
632
- return typeof o;
633
- } : function(o) {
634
- return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
635
- }, _typeof(o);
636
- }
637
-
638
- //#endregion
639
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
640
- function toPrimitive(t, r) {
641
- if ("object" != _typeof(t) || !t) return t;
642
- var e = t[Symbol.toPrimitive];
643
- if (void 0 !== e) {
644
- var i = e.call(t, r || "default");
645
- if ("object" != _typeof(i)) return i;
646
- throw new TypeError("@@toPrimitive must return a primitive value.");
647
- }
648
- return ("string" === r ? String : Number)(t);
649
- }
653
+ const COMPONENT_IMAGE_POPUP_MENU = "COMPONENT_IMAGE_POPUP_MENU";
650
654
 
651
655
  //#endregion
652
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
653
- function toPropertyKey(t) {
654
- var i = toPrimitive(t, "string");
655
- return "symbol" == _typeof(i) ? i : i + "";
656
+ //#region src/views/image-popup-menu/ImagePopupMenu.tsx
657
+ function ImagePopupMenu(props) {
658
+ var _popup$extraProps, _popup$extraProps2, _popup$extraProps3;
659
+ const { popup } = props;
660
+ const menuItems = popup === null || popup === void 0 || (_popup$extraProps = popup.extraProps) === null || _popup$extraProps === void 0 ? void 0 : _popup$extraProps.menuItems;
661
+ if (!menuItems) return null;
662
+ if (((_popup$extraProps2 = popup.extraProps) === null || _popup$extraProps2 === void 0 ? void 0 : _popup$extraProps2.variant) === "doc-floating-toolbar" && popup.extraProps.unitId && popup.extraProps.subUnitId && popup.extraProps.drawingId) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DocImageFloatingToolbar, {
663
+ menuItems,
664
+ unitId: popup.extraProps.unitId,
665
+ subUnitId: popup.extraProps.subUnitId,
666
+ drawingId: popup.extraProps.drawingId
667
+ });
668
+ if (((_popup$extraProps3 = popup.extraProps) === null || _popup$extraProps3 === void 0 ? void 0 : _popup$extraProps3.variant) === "doc-chart-floating-toolbar") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DocChartFloatingToolbar, { menuItems });
669
+ const commandService = (0, _univerjs_ui.useDependency)(_univerjs_core.ICommandService);
670
+ const localeService = (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService);
671
+ const [visible, setVisible] = (0, react.useState)(false);
672
+ const [isHovered, setHovered] = (0, react.useState)(false);
673
+ const handleMouseEnter = () => {
674
+ setHovered(true);
675
+ };
676
+ const handleMouseLeave = () => {
677
+ setHovered(false);
678
+ };
679
+ const onVisibleChange = (visible) => {
680
+ setVisible(visible);
681
+ };
682
+ const handleClick = (item) => {
683
+ commandService.executeCommand(item.commandId, item.commandParams);
684
+ setVisible(false);
685
+ };
686
+ const showMore = visible || isHovered;
687
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
688
+ onMouseEnter: handleMouseEnter,
689
+ onMouseLeave: handleMouseLeave,
690
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.DropdownMenu, {
691
+ align: "start",
692
+ items: menuItems.map((item) => ({
693
+ type: "item",
694
+ children: localeService.t(item.label),
695
+ disabled: item.disable,
696
+ onSelect: () => handleClick(item)
697
+ })),
698
+ open: visible,
699
+ onOpenChange: onVisibleChange,
700
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
701
+ className: (0, _univerjs_design.clsx)("univer-flex univer-items-center univer-gap-2 univer-rounded univer-p-1 hover:univer-bg-gray-100 dark:hover:!univer-bg-gray-800", _univerjs_design.borderClassName, {
702
+ "univer-bg-gray-100 dark:!univer-bg-gray-800": visible,
703
+ "univer-bg-white dark:!univer-bg-gray-900": !visible
704
+ }),
705
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.AutofillDoubleIcon, { className: "univer-fill-primary-600 univer-text-gray-900 dark:!univer-text-white" }), showMore && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, { className: "dark:!univer-text-white" })]
706
+ })
707
+ })
708
+ });
656
709
  }
657
-
658
- //#endregion
659
- //#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
660
- function _defineProperty(e, r, t) {
661
- return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
662
- value: t,
663
- enumerable: !0,
664
- configurable: !0,
665
- writable: !0
666
- }) : e[r] = t, e;
710
+ const UPDATE_DOC_DRAWING_WRAPPING_STYLE_COMMAND_ID = "doc.command.update-doc-drawing-wrapping-style";
711
+ function getWrappingStyle(documentDataModel, drawingId) {
712
+ var _documentDataModel$ge;
713
+ const drawing = documentDataModel === null || documentDataModel === void 0 || (_documentDataModel$ge = documentDataModel.getSnapshot().drawings) === null || _documentDataModel$ge === void 0 ? void 0 : _documentDataModel$ge[drawingId];
714
+ if (!drawing) return "inline";
715
+ if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_NONE) return drawing.behindDoc === _univerjs_core.BooleanNumber.TRUE ? "behindText" : "inFrontOfText";
716
+ if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_SQUARE) return "wrapSquare";
717
+ if (drawing.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_TOP_AND_BOTTOM) return "wrapTopAndBottom";
718
+ return "inline";
667
719
  }
668
-
669
- //#endregion
670
- //#region src/services/drawing-image-clip.service.ts
671
- const IMAGE_CLIP_SHAPE_PICKER_COMPONENT = "sheet.image-clip.shape.picker.component";
672
- /**
673
- * Bridge service that enables shape-based image clipping.
674
- * This service lives in the open-source drawing-ui package and delegates
675
- * to a registered clip implementation (provided by pro engine-shape package).
676
- *
677
- * When no delegate is registered, applyShapeClip returns false and images render normally without shape clipping.
678
- */
679
- var DrawingImageClipService = class extends _univerjs_core.Disposable {
680
- constructor() {
681
- super();
682
- _defineProperty(this, "_clipDelegate", null);
683
- _defineProperty(this, "_canUseShapeClip$", new rxjs.BehaviorSubject(false));
684
- _defineProperty(this, "canUseShapeClip$", this._canUseShapeClip$.asObservable());
685
- }
686
- setCanUseShapeClip(canUse) {
687
- this._canUseShapeClip$.next(canUse);
688
- }
689
- /**
690
- * Register a clip delegate that knows how to build shape clip paths.
691
- * Typically called by the pro-side plugin with a ShapeModel-based implementation.
692
- * @returns IDisposable to unregister the delegate
693
- */
694
- registerClipDelegate(delegate) {
695
- this._clipDelegate = delegate;
696
- return (0, _univerjs_core.toDisposable)(() => {
697
- if (this._clipDelegate === delegate) this._clipDelegate = null;
698
- });
699
- }
700
- applyShapeClip(ctx, prstGeom, width, height, adjustValues) {
701
- if (this._clipDelegate) return this._clipDelegate(ctx, prstGeom, width, height, adjustValues);
702
- return false;
703
- }
704
- dispose() {
705
- this._clipDelegate = null;
706
- this._canUseShapeClip$.complete();
707
- super.dispose();
708
- }
709
- };
710
-
711
- //#endregion
712
- //#region src/services/drawing-render.service.ts
713
- const DOC_DRAWING_BEHIND_TEXT_LAYER_INDEX = 1;
714
- function getDrawingRenderLayerIndex(param) {
715
- return param.behindText === true || param.behindText === _univerjs_core.BooleanNumber.TRUE ? 1 : _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX;
720
+ function ToolbarGroup(props) {
721
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
722
+ className: "univer-flex univer-h-7 univer-items-center univer-gap-1 univer-px-1",
723
+ children: props.children
724
+ });
716
725
  }
717
- function ensureDrawingRenderLayer(scene, object, param) {
718
- const layerIndex = getDrawingRenderLayerIndex(param);
719
- if (object.layer == null || object.layer.zIndex === layerIndex) return;
720
- scene.removeObject(object);
721
- scene.addObject(object, layerIndex);
726
+ function ToolbarButton(props) {
727
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Tooltip, {
728
+ title: (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService).t(props.titleKey),
729
+ placement: "bottom",
730
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
731
+ type: "button",
732
+ disabled: props.disabled,
733
+ onClick: props.onClick,
734
+ className: (0, _univerjs_design.clsx)("univer-flex univer-h-6 univer-w-6 univer-items-center univer-justify-center univer-rounded-md univer-border-none univer-bg-transparent univer-p-0 univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 disabled:univer-cursor-not-allowed disabled:univer-opacity-40 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-700", { "univer-bg-gray-100 univer-text-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-primary-300": props.active }),
735
+ children: props.children
736
+ })
737
+ });
722
738
  }
723
- function isRenderableImageCache(image) {
724
- return (image === null || image === void 0 ? void 0 : image.complete) === true && image.naturalWidth > 0 && image.naturalHeight > 0;
739
+ function ToolbarDropdownButton(props) {
740
+ var _props$options$find;
741
+ const [open, setOpen] = (0, react.useState)(false);
742
+ const activeOption = (_props$options$find = props.options.find((option) => option.value === props.value)) !== null && _props$options$find !== void 0 ? _props$options$find : props.options[0];
743
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Dropdown, {
744
+ open,
745
+ onOpenChange: setOpen,
746
+ overlay: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
747
+ className: "univer-min-w-32 univer-rounded-lg univer-border univer-border-solid univer-border-gray-200 univer-bg-white univer-p-1 univer-shadow-lg dark:!univer-border-gray-700 dark:!univer-bg-gray-900",
748
+ children: props.options.map((option) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
749
+ type: "button",
750
+ onClick: () => {
751
+ props.onChange(option.value);
752
+ setOpen(false);
753
+ },
754
+ className: (0, _univerjs_design.clsx)("univer-flex univer-h-8 univer-w-full univer-items-center univer-gap-2 univer-rounded-md univer-border-none univer-bg-transparent univer-px-2 univer-text-left univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-800", { "univer-bg-primary-50 univer-text-primary-600 dark:!univer-bg-gray-800 dark:!univer-text-primary-300": option.value === props.value }),
755
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
756
+ className: "univer-flex univer-size-4 univer-items-center univer-justify-center",
757
+ children: option.icon
758
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
759
+ className: "univer-flex-1",
760
+ children: option.label
761
+ })]
762
+ }, option.value))
763
+ }),
764
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Tooltip, {
765
+ title: props.title,
766
+ placement: "bottom",
767
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
768
+ type: "button",
769
+ className: (0, _univerjs_design.clsx)("univer-flex univer-h-6 univer-min-w-9 univer-items-center univer-justify-center univer-gap-1 univer-rounded-md univer-border-none univer-bg-transparent univer-px-1.5 univer-text-sm univer-text-gray-700 univer-transition-colors hover:univer-bg-gray-100 dark:!univer-text-gray-100 dark:hover:!univer-bg-gray-700", { "univer-bg-gray-100 univer-text-primary-600 dark:!univer-bg-gray-700 dark:!univer-text-primary-300": open }),
770
+ children: [activeOption.icon, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, { className: "univer-text-xs" })]
771
+ })
772
+ }) })
773
+ });
725
774
  }
726
- let DrawingRenderService = class DrawingRenderService {
727
- constructor(_drawingManagerService, _imageIoService, _galleryService, _urlImageService, _univerInstanceService, _drawingImageClipService) {
728
- this._drawingManagerService = _drawingManagerService;
729
- this._imageIoService = _imageIoService;
730
- this._galleryService = _galleryService;
731
- this._urlImageService = _urlImageService;
732
- this._univerInstanceService = _univerInstanceService;
733
- this._drawingImageClipService = _drawingImageClipService;
734
- }
735
- async renderImages(imageParam, scene) {
736
- const { transform: singleTransform, drawingType, source, imageSourceType, srcRect, prstGeom, groupId, unitId, subUnitId, drawingId, isMultiTransform, transforms: multiTransforms, adjustValues, hidden } = imageParam;
737
- const { docxHeaderFooterDrawing, layoutType } = imageParam;
738
- if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
739
- if (!this._drawingManagerService.getDrawingVisible()) return;
740
- if (this._univerInstanceService.getUnitType(unitId) === _univerjs_core.UniverInstanceType.UNIVER_SHEET && subUnitId !== this._getActiveSheetId()) return;
741
- if (singleTransform == null) return;
742
- const transforms = isMultiTransform && multiTransforms ? multiTransforms : [singleTransform];
743
- const images = [];
744
- for (const transform of transforms) {
745
- const { left, top, width, height, angle, flipX, flipY, skewX, skewY } = transform;
746
- const index = transforms.indexOf(transform);
747
- const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
748
- unitId,
749
- subUnitId,
750
- drawingId
751
- }, isMultiTransform ? index : void 0);
752
- const imageShape = scene.getObject(imageShapeKey);
753
- if (imageShape != null) {
754
- var _setClipBounds;
755
- imageShape.transformByState({
756
- left,
757
- top,
758
- width,
759
- height,
760
- angle,
761
- flipX,
762
- flipY,
763
- skewX,
764
- skewY
765
- });
766
- (_setClipBounds = imageShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(imageShape, transform.clipBounds);
767
- if ("hidden" in imageParam) hidden ? imageShape.hide() : imageShape.show();
768
- ensureDrawingRenderLayer(scene, imageShape, imageParam);
769
- continue;
770
- }
771
- const orders = this._drawingManagerService.getDrawingOrder(unitId, subUnitId);
772
- const zIndex = orders.indexOf(drawingId);
773
- const imageConfig = {
774
- ...transform,
775
- zIndex: zIndex === -1 ? orders.length - 1 : zIndex
776
- };
777
- const imageNativeCache = this._imageIoService.getImageSourceCache(source, imageSourceType);
778
- let shouldBeCache = false;
779
- if (isRenderableImageCache(imageNativeCache)) imageConfig.image = imageNativeCache;
780
- else if (imageSourceType === _univerjs_drawing.ImageSourceType.UUID) try {
781
- imageConfig.url = await this._imageIoService.getImage(source);
782
- } catch (error) {
783
- console.error(error);
784
- continue;
785
- }
786
- else if (imageSourceType === _univerjs_drawing.ImageSourceType.URL) {
787
- try {
788
- imageConfig.url = await this._urlImageService.getImage(source);
789
- } catch (error) {
790
- console.error(error);
791
- imageConfig.url = source;
792
- }
793
- shouldBeCache = true;
794
- } else {
795
- imageConfig.url = source;
796
- shouldBeCache = true;
797
- }
798
- const shouldWaitForInlineTransform = docxHeaderFooterDrawing === true && layoutType === _univerjs_core.PositionedObjectLayoutType.INLINE;
799
- if (hidden || shouldWaitForInlineTransform) imageConfig.visible = false;
800
- if (scene.getObject(imageShapeKey)) continue;
801
- imageConfig.printable = true;
802
- const image = new _univerjs_engine_render.Image(imageShapeKey, imageConfig);
803
- image.setClipService(this._drawingImageClipService);
804
- if (shouldBeCache) this._imageIoService.addImageSourceCache(source, imageSourceType, image.getNative());
805
- scene.addObject(image, getDrawingRenderLayerIndex(imageParam));
806
- if (this._drawingManagerService.getDrawingEditable()) scene.attachTransformerTo(image);
807
- groupId && insertGroupObject({
808
- drawingId: groupId,
809
- unitId,
810
- subUnitId
811
- }, image, scene, this._drawingManagerService);
812
- if (prstGeom != null) image.setPrstGeom(prstGeom);
813
- if (adjustValues != null) image.setPrstGeomAdjValues(adjustValues);
814
- if (srcRect != null) image.setSrcRect(srcRect);
815
- images.push(image);
816
- }
817
- return images;
818
- }
819
- _getActiveSheetId() {
820
- var _this$_univerInstance;
821
- return (_this$_univerInstance = this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_SHEET)) === null || _this$_univerInstance === void 0 || (_this$_univerInstance = _this$_univerInstance.getActiveSheet()) === null || _this$_univerInstance === void 0 ? void 0 : _this$_univerInstance.getSheetId();
822
- }
823
- renderFloatDom(param, scene) {
824
- const { transform: singleTransform, drawingType, groupId, unitId, subUnitId, drawingId, isMultiTransform, transforms: multiTransforms } = param;
825
- if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_DOM) return;
826
- if (!this._drawingManagerService.getDrawingVisible()) return;
827
- if (singleTransform == null) return;
828
- const transforms = isMultiTransform && multiTransforms ? multiTransforms : [singleTransform];
829
- const rects = [];
830
- for (const transform of transforms) {
831
- const { left, top, width, height, angle, flipX, flipY, skewX, skewY } = transform;
832
- const index = transforms.indexOf(transform);
833
- const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
834
- unitId,
835
- subUnitId,
836
- drawingId
837
- }, isMultiTransform ? index : void 0);
838
- const imageShape = scene.getObject(imageShapeKey);
839
- if (imageShape != null) {
840
- imageShape.transformByState({
841
- left,
842
- top,
843
- width,
844
- height,
845
- angle,
846
- flipX,
847
- flipY,
848
- skewX,
849
- skewY
850
- });
851
- continue;
852
- }
853
- const orders = this._drawingManagerService.getDrawingOrder(unitId, subUnitId);
854
- const zIndex = orders.indexOf(drawingId);
855
- const rectConfig = {
856
- ...transform,
857
- zIndex: zIndex === -1 ? orders.length - 1 : zIndex
858
- };
859
- if (scene.getObject(imageShapeKey)) continue;
860
- rectConfig.printable = false;
861
- const rect = new _univerjs_engine_render.Rect(imageShapeKey, rectConfig);
862
- if (!this._drawingManagerService.getDrawingVisible()) continue;
863
- scene.addObject(rect, _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX);
864
- if (this._drawingManagerService.getDrawingEditable() && param.allowTransform !== false) scene.attachTransformerTo(rect);
865
- groupId && insertGroupObject({
866
- drawingId: groupId,
867
- unitId,
868
- subUnitId
869
- }, rect, scene, this._drawingManagerService);
870
- rects.push(rect);
871
- }
872
- return rects;
873
- }
874
- renderDrawing(param, scene) {
875
- const drawingParam = this._drawingManagerService.getDrawingByParam(param);
876
- if (drawingParam == null) return;
877
- switch (drawingParam.drawingType) {
878
- case _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE: return this.renderImages(drawingParam, scene);
879
- default:
775
+ function DocImageFloatingToolbar(props) {
776
+ var _univerInstanceServic, _wrappingStyleOptions, _wrappingStyleOptions2, _editItem$label, _cropItem$label, _deleteItem$label;
777
+ const commandService = (0, _univerjs_ui.useDependency)(_univerjs_core.ICommandService);
778
+ const localeService = (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService);
779
+ const documentDataModel = (_univerInstanceServic = (0, _univerjs_ui.useDependency)(_univerjs_core.IUniverInstanceService).getUnit(props.unitId, _univerjs_core.UniverInstanceType.UNIVER_DOC)) !== null && _univerInstanceServic !== void 0 ? _univerInstanceServic : void 0;
780
+ const [wrappingStyle, setWrappingStyle] = (0, react.useState)(() => getWrappingStyle(documentDataModel, props.drawingId));
781
+ const [hidden, setHidden] = (0, react.useState)(false);
782
+ const getMenuItem = (label) => props.menuItems.find((item) => item.label === label);
783
+ const editItem = getMenuItem("drawing-ui.image-popup.edit");
784
+ const cropItem = getMenuItem("drawing-ui.image-popup.crop");
785
+ const deleteItem = getMenuItem("drawing-ui.image-popup.delete");
786
+ const wrappingStyleOptions = [
787
+ {
788
+ label: localeService.t("drawing-ui.image-text-wrap.inline"),
789
+ value: "inline",
790
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
791
+ },
792
+ {
793
+ label: localeService.t("drawing-ui.image-text-wrap.square"),
794
+ value: "wrapSquare",
795
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
796
+ },
797
+ {
798
+ label: localeService.t("drawing-ui.image-text-wrap.topAndBottom"),
799
+ value: "wrapTopAndBottom",
800
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
801
+ },
802
+ {
803
+ label: localeService.t("drawing-ui.image-text-wrap.behindText"),
804
+ value: "behindText",
805
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
806
+ },
807
+ {
808
+ label: localeService.t("drawing-ui.image-text-wrap.inFrontText"),
809
+ value: "inFrontOfText",
810
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.TextWrapShapeIcon, {})
880
811
  }
881
- }
882
- previewImage(key, src, width, height) {
883
- this._galleryService.open({
884
- images: [src],
885
- onOpenChange: (open) => {
886
- if (!open) this._galleryService.close();
887
- }
812
+ ];
813
+ const executeMenuItem = (item) => {
814
+ if (!item || item.disable) return;
815
+ commandService.executeCommand(item.commandId, item.commandParams);
816
+ };
817
+ const updateWrappingStyle = (value) => {
818
+ setWrappingStyle(value);
819
+ commandService.executeCommand(UPDATE_DOC_DRAWING_WRAPPING_STYLE_COMMAND_ID, {
820
+ unitId: props.unitId,
821
+ subUnitId: props.subUnitId,
822
+ drawings: [{
823
+ unitId: props.unitId,
824
+ subUnitId: props.subUnitId,
825
+ drawingId: props.drawingId
826
+ }],
827
+ wrappingStyle: value
888
828
  });
889
- }
890
- _adjustImageSize(nativeWidth, nativeHeight, screenWidth, screenHeight) {
891
- if (nativeWidth <= screenWidth && nativeHeight <= screenHeight) return {
892
- width: nativeWidth,
893
- height: nativeHeight
894
- };
895
- const widthRatio = screenWidth / nativeWidth;
896
- const heightRatio = screenHeight / nativeHeight;
897
- const scale = Math.min(widthRatio, heightRatio);
898
- return {
899
- width: Math.floor(nativeWidth * scale),
900
- height: Math.floor(nativeHeight * scale)
901
- };
902
- }
903
- };
904
- DrawingRenderService = __decorate([
905
- __decorateParam(0, _univerjs_drawing.IDrawingManagerService),
906
- __decorateParam(1, _univerjs_drawing.IImageIoService),
907
- __decorateParam(2, _univerjs_ui.IGalleryService),
908
- __decorateParam(3, _univerjs_core.IURLImageService),
909
- __decorateParam(4, _univerjs_core.IUniverInstanceService),
910
- __decorateParam(5, (0, _univerjs_core.Inject)(DrawingImageClipService))
911
- ], DrawingRenderService);
829
+ };
830
+ if (hidden) return null;
831
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
832
+ "data-u-comp": "doc-image-floating-toolbar",
833
+ onMouseDown: (event) => {
834
+ event.stopPropagation();
835
+ event.preventDefault();
836
+ },
837
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-flex univer-items-center univer-rounded univer-bg-white univer-px-1 univer-py-1 univer-shadow-sm dark:!univer-border-gray-700 dark:!univer-bg-gray-900", _univerjs_design.borderClassName),
838
+ children: [
839
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarGroup, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarDropdownButton, {
840
+ title: (_wrappingStyleOptions = (_wrappingStyleOptions2 = wrappingStyleOptions.find((option) => option.value === wrappingStyle)) === null || _wrappingStyleOptions2 === void 0 ? void 0 : _wrappingStyleOptions2.label) !== null && _wrappingStyleOptions !== void 0 ? _wrappingStyleOptions : localeService.t("drawing-ui.image-text-wrap.inline"),
841
+ value: wrappingStyle,
842
+ options: wrappingStyleOptions,
843
+ onChange: updateWrappingStyle
844
+ }) }),
845
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Separator, { orientation: "vertical" }),
846
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ToolbarGroup, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
847
+ titleKey: (_editItem$label = editItem === null || editItem === void 0 ? void 0 : editItem.label) !== null && _editItem$label !== void 0 ? _editItem$label : "drawing-ui.image-popup.edit",
848
+ disabled: !editItem || editItem.disable,
849
+ onClick: () => {
850
+ setHidden(true);
851
+ executeMenuItem(editItem);
852
+ },
853
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DocSettingIcon, {})
854
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
855
+ titleKey: (_cropItem$label = cropItem === null || cropItem === void 0 ? void 0 : cropItem.label) !== null && _cropItem$label !== void 0 ? _cropItem$label : "drawing-ui.image-popup.crop",
856
+ disabled: !cropItem || cropItem.disable,
857
+ onClick: () => executeMenuItem(cropItem),
858
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.CropIcon, {})
859
+ })] }),
860
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Separator, { orientation: "vertical" }),
861
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarGroup, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
862
+ titleKey: (_deleteItem$label = deleteItem === null || deleteItem === void 0 ? void 0 : deleteItem.label) !== null && _deleteItem$label !== void 0 ? _deleteItem$label : "drawing-ui.image-popup.delete",
863
+ disabled: !deleteItem || deleteItem.disable,
864
+ onClick: () => executeMenuItem(deleteItem),
865
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DeleteIcon, {})
866
+ }) })
867
+ ]
868
+ });
869
+ }
870
+ function DocChartFloatingToolbar(props) {
871
+ var _chartTypeItem$option, _ref, _chartTypeItem$value, _chartTypeOptions$;
872
+ const commandService = (0, _univerjs_ui.useDependency)(_univerjs_core.ICommandService);
873
+ const localeService = (0, _univerjs_ui.useDependency)(_univerjs_core.LocaleService);
874
+ const chartTypeItem = props.menuItems.find((item) => item.type === "select");
875
+ const editItem = props.menuItems.find((item) => item.icon === "edit");
876
+ const deleteItem = props.menuItems.find((item) => item.icon === "delete");
877
+ const chartTypeOptions = ((_chartTypeItem$option = chartTypeItem === null || chartTypeItem === void 0 ? void 0 : chartTypeItem.options) !== null && _chartTypeItem$option !== void 0 ? _chartTypeItem$option : []).map((option) => ({
878
+ label: String(option.label),
879
+ value: option.value,
880
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.ChartIcon, {})
881
+ }));
882
+ const executeMenuItem = (item) => {
883
+ if (!item || item.disable) return;
884
+ commandService.executeCommand(item.commandId, item.commandParams);
885
+ };
886
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
887
+ "data-u-comp": "doc-chart-floating-toolbar",
888
+ onMouseDown: (event) => {
889
+ event.stopPropagation();
890
+ event.preventDefault();
891
+ },
892
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-flex univer-items-center univer-rounded univer-bg-white univer-px-1 univer-py-1 univer-shadow-sm dark:!univer-border-gray-700 dark:!univer-bg-gray-900", _univerjs_design.borderClassName),
893
+ children: [chartTypeItem && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarGroup, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarDropdownButton, {
894
+ title: localeService.t(chartTypeItem.label),
895
+ value: (_ref = (_chartTypeItem$value = chartTypeItem.value) !== null && _chartTypeItem$value !== void 0 ? _chartTypeItem$value : (_chartTypeOptions$ = chartTypeOptions[0]) === null || _chartTypeOptions$ === void 0 ? void 0 : _chartTypeOptions$.value) !== null && _ref !== void 0 ? _ref : "",
896
+ options: chartTypeOptions,
897
+ onChange: (value) => {
898
+ if (!chartTypeItem.disable) {
899
+ var _chartTypeItem$comman;
900
+ commandService.executeCommand(chartTypeItem.commandId, (_chartTypeItem$comman = chartTypeItem.commandParamsFactory) === null || _chartTypeItem$comman === void 0 ? void 0 : _chartTypeItem$comman.call(chartTypeItem, value));
901
+ }
902
+ }
903
+ }) }), (editItem || deleteItem) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Separator, { orientation: "vertical" })] }), (editItem || deleteItem) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ToolbarGroup, { children: [editItem && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
904
+ titleKey: editItem.label,
905
+ disabled: editItem.disable,
906
+ onClick: () => executeMenuItem(editItem),
907
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DocSettingIcon, {})
908
+ }), deleteItem && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarButton, {
909
+ titleKey: deleteItem.label,
910
+ disabled: deleteItem.disable,
911
+ onClick: () => executeMenuItem(deleteItem),
912
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.DeleteIcon, {})
913
+ })] })]
914
+ });
915
+ }
912
916
 
913
917
  //#endregion
914
- //#region src/utils/get-update-params.ts
915
- function getUpdateParams(objects, drawingManagerService) {
916
- const params = [];
917
- objects.forEach((object) => {
918
- const { oKey, left, top, height, width, angle } = object;
919
- const searchParam = drawingManagerService.getDrawingOKey(oKey);
920
- if (searchParam == null) {
921
- params.push(null);
922
- return true;
923
- }
924
- const { unitId, subUnitId, drawingId, drawingType } = searchParam;
925
- const param = {
926
- unitId,
927
- subUnitId,
928
- drawingId,
929
- drawingType,
930
- transform: {
931
- left,
932
- top,
933
- height,
934
- width,
935
- angle
936
- }
937
- };
938
- if (drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) param.srcRect = object.srcRect;
939
- params.push(param);
940
- });
941
- return params;
918
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorateParam.js
919
+ function __decorateParam(paramIndex, decorator) {
920
+ return function(target, key) {
921
+ decorator(target, key, paramIndex);
922
+ };
942
923
  }
943
924
 
944
925
  //#endregion
945
- //#region src/controllers/drawing-update.controller.ts
946
- function syncDrawingHiddenState(shape, drawingParam) {
947
- if (!("hidden" in drawingParam)) return;
948
- drawingParam.hidden === true ? shape.hide() : shape.show();
949
- }
950
- function mergeRefreshMetadata(drawingParam, refreshParam) {
951
- const metadata = refreshParam;
952
- if (!("hidden" in metadata) && !("behindText" in metadata)) return drawingParam;
953
- return {
954
- ...drawingParam,
955
- ...metadata
956
- };
926
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/decorate.js
927
+ function __decorate(decorators, target, key, desc) {
928
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
929
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
930
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
931
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
957
932
  }
958
- let DrawingUpdateController = class DrawingUpdateController extends _univerjs_core.Disposable {
959
- constructor(_currentUniverService, _commandService, _renderManagerService, _drawingManagerService) {
933
+
934
+ //#endregion
935
+ //#region src/controllers/components.controller.ts
936
+ /**
937
+ * Copyright 2023-present DreamNum Co., Ltd.
938
+ *
939
+ * Licensed under the Apache License, Version 2.0 (the "License");
940
+ * you may not use this file except in compliance with the License.
941
+ * You may obtain a copy of the License at
942
+ *
943
+ * http://www.apache.org/licenses/LICENSE-2.0
944
+ *
945
+ * Unless required by applicable law or agreed to in writing, software
946
+ * distributed under the License is distributed on an "AS IS" BASIS,
947
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
948
+ * See the License for the specific language governing permissions and
949
+ * limitations under the License.
950
+ */
951
+ let ComponentsController = class ComponentsController extends _univerjs_core.Disposable {
952
+ constructor(_componentManager, _iconManager) {
960
953
  super();
961
- this._currentUniverService = _currentUniverService;
962
- this._commandService = _commandService;
963
- this._renderManagerService = _renderManagerService;
964
- this._drawingManagerService = _drawingManagerService;
965
- _defineProperty(this, "_sceneListenerOnDrawingMap", /* @__PURE__ */ new WeakSet());
966
- this._initialize();
967
- }
968
- dispose() {
969
- super.dispose();
970
- }
971
- _initialize() {
972
- this._recoveryImages();
973
- this._drawingAddListener();
974
- this._drawingRemoveListener();
975
- this._drawingUpdateListener();
976
- this._commandExecutedListener();
977
- this._drawingArrangeListener();
978
- this._drawingGroupListener();
979
- this._drawingRefreshListener();
980
- this._drawingVisibleListener();
954
+ this._componentManager = _componentManager;
955
+ this._iconManager = _iconManager;
956
+ this._registerComponents();
957
+ this._registerIcons();
981
958
  }
982
- _recoveryImages() {
983
- const drawingList = this._drawingManagerService.drawingManagerData;
984
- const info = getCurrentUnitInfo(this._currentUniverService);
985
- if (info == null) return;
986
- const { unitId: currentUnitId, subUnitId: currentSubUnitId } = info;
987
- Object.keys(drawingList).forEach((unitId) => {
988
- Object.keys(drawingList[unitId]).forEach((subUnitId) => {
989
- const drawingMap = drawingList[unitId][subUnitId].data;
990
- if (drawingMap == null || unitId !== currentUnitId || subUnitId !== currentSubUnitId) return;
991
- Object.keys(drawingMap).forEach((drawingId) => {
992
- if (drawingMap[drawingId]) this._insertDrawing([{
993
- unitId,
994
- subUnitId,
995
- drawingId
996
- }]);
997
- });
998
- });
959
+ _registerComponents() {
960
+ [[COMPONENT_IMAGE_POPUP_MENU, ImagePopupMenu]].forEach(([key, component]) => {
961
+ this.disposeWithMe(this._componentManager.register(key, component));
999
962
  });
1000
963
  }
1001
- _commandExecutedListener() {
1002
- this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1003
- if (command.id === SetDrawingAlignOperation.id) {
1004
- const params = command.params;
1005
- if (params == null) return;
1006
- this._drawingAlign(params);
1007
- }
964
+ _registerIcons() {
965
+ this.disposeWithMe(this._iconManager.register({
966
+ BottomIcon: _univerjs_icons.BottomIcon,
967
+ GroupIcon: _univerjs_icons.GroupIcon,
968
+ MoveDownIcon: _univerjs_icons.MoveDownIcon,
969
+ MoveUpIcon: _univerjs_icons.MoveUpIcon,
970
+ TopmostIcon: _univerjs_icons.TopmostIcon,
971
+ UngroupIcon: _univerjs_icons.UngroupIcon
1008
972
  }));
1009
973
  }
1010
- _drawingGroupListener() {
1011
- this.disposeWithMe(this._drawingManagerService.group$.subscribe((params) => {
1012
- this._groupDrawings(params);
1013
- }));
1014
- this.disposeWithMe(this._drawingManagerService.ungroup$.subscribe((params) => {
1015
- this._ungroupDrawings(params);
1016
- }));
974
+ };
975
+ ComponentsController = __decorate([__decorateParam(0, (0, _univerjs_core.Inject)(_univerjs_ui.ComponentManager)), __decorateParam(1, (0, _univerjs_core.Inject)(_univerjs_ui.IconManager))], ComponentsController);
976
+
977
+ //#endregion
978
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/typeof.js
979
+ function _typeof(o) {
980
+ "@babel/helpers - typeof";
981
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
982
+ return typeof o;
983
+ } : function(o) {
984
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
985
+ }, _typeof(o);
986
+ }
987
+
988
+ //#endregion
989
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPrimitive.js
990
+ function toPrimitive(t, r) {
991
+ if ("object" != _typeof(t) || !t) return t;
992
+ var e = t[Symbol.toPrimitive];
993
+ if (void 0 !== e) {
994
+ var i = e.call(t, r || "default");
995
+ if ("object" != _typeof(i)) return i;
996
+ throw new TypeError("@@toPrimitive must return a primitive value.");
1017
997
  }
1018
- _getSceneAndTransformerByDrawingSearch(unitId) {
1019
- if (unitId == null) return;
1020
- const renderObject = this._renderManagerService.getRenderById(unitId);
1021
- const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1022
- if (scene == null) return null;
1023
- return {
1024
- scene,
1025
- transformer: scene.getTransformerByCreate()
1026
- };
998
+ return ("string" === r ? String : Number)(t);
999
+ }
1000
+
1001
+ //#endregion
1002
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/toPropertyKey.js
1003
+ function toPropertyKey(t) {
1004
+ var i = toPrimitive(t, "string");
1005
+ return "symbol" == _typeof(i) ? i : i + "";
1006
+ }
1007
+
1008
+ //#endregion
1009
+ //#region \0@oxc-project+runtime@0.137.0/helpers/esm/defineProperty.js
1010
+ function _defineProperty(e, r, t) {
1011
+ return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
1012
+ value: t,
1013
+ enumerable: !0,
1014
+ configurable: !0,
1015
+ writable: !0
1016
+ }) : e[r] = t, e;
1017
+ }
1018
+
1019
+ //#endregion
1020
+ //#region src/services/drawing-image-clip.service.ts
1021
+ const IMAGE_CLIP_SHAPE_PICKER_COMPONENT = "sheet.image-clip.shape.picker.component";
1022
+ /**
1023
+ * Bridge service that enables shape-based image clipping.
1024
+ * This service lives in the open-source drawing-ui package and delegates
1025
+ * to a registered clip implementation (provided by pro engine-shape package).
1026
+ *
1027
+ * When no delegate is registered, applyShapeClip returns false and images render normally without shape clipping.
1028
+ */
1029
+ var DrawingImageClipService = class extends _univerjs_core.Disposable {
1030
+ constructor() {
1031
+ super();
1032
+ _defineProperty(this, "_clipDelegate", null);
1033
+ _defineProperty(this, "_canUseShapeClip$", new rxjs.BehaviorSubject(false));
1034
+ _defineProperty(this, "canUseShapeClip$", this._canUseShapeClip$.asObservable());
1027
1035
  }
1028
- _groupDrawings(drawings) {
1029
- drawings.forEach((drawing) => {
1030
- this._groupDrawing(drawing);
1031
- });
1036
+ setCanUseShapeClip(canUse) {
1037
+ this._canUseShapeClip$.next(canUse);
1032
1038
  }
1033
- _groupDrawing(params) {
1034
- const { parent, children } = params;
1035
- const { unitId, subUnitId, drawingId } = parent;
1036
- const renderObject = this._getSceneAndTransformerByDrawingSearch(parent.unitId);
1037
- if (renderObject == null) return;
1038
- const { scene, transformer } = renderObject;
1039
- this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
1040
- const objects = [];
1041
- children.forEach((drawing) => {
1042
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(drawing);
1043
- const object = scene.getObjectIncludeInGroup(drawingShapeKey);
1044
- if (object == null || objects.includes(object)) return;
1045
- objects.push(object);
1046
- const { transform } = drawing;
1047
- if (transform == null) return;
1048
- if (object.classType === _univerjs_engine_render.RENDER_CLASS_TYPE.GROUP) object.transformByState({
1049
- left: transform.left,
1050
- top: transform.top
1051
- });
1052
- else object.transformByState(transform);
1053
- });
1054
- if (objects.length === 0) return;
1055
- const group = new _univerjs_engine_render.DrawingGroupObject((0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1056
- unitId,
1057
- subUnitId,
1058
- drawingId
1059
- }));
1060
- scene.addObject(group, _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX).attachTransformerTo(group);
1061
- group.addObjects(...objects);
1062
- if (parent.groupBaseBound) group.setBaseBound(parent.groupBaseBound);
1063
- if (parent.groupId) {
1064
- group.isInGroup = true;
1065
- insertGroupObject({
1066
- drawingId: parent.groupId,
1067
- unitId,
1068
- subUnitId
1069
- }, group, scene, this._drawingManagerService);
1070
- }
1071
- parent.transform && group.transformByState({
1072
- left: parent.transform.left,
1073
- top: parent.transform.top,
1074
- width: parent.transform.width,
1075
- height: parent.transform.height,
1076
- angle: parent.transform.angle
1039
+ /**
1040
+ * Register a clip delegate that knows how to build shape clip paths.
1041
+ * Typically called by the pro-side plugin with a ShapeModel-based implementation.
1042
+ * @returns IDisposable to unregister the delegate
1043
+ */
1044
+ registerClipDelegate(delegate) {
1045
+ this._clipDelegate = delegate;
1046
+ return (0, _univerjs_core.toDisposable)(() => {
1047
+ if (this._clipDelegate === delegate) this._clipDelegate = null;
1077
1048
  });
1078
- transformer.clearSelectedObjects();
1079
- transformer.setSelectedControl(group);
1080
1049
  }
1081
- _ungroupDrawings(drawings) {
1082
- drawings.forEach((drawing) => {
1083
- this._ungroupDrawing(drawing);
1084
- });
1050
+ applyShapeClip(ctx, prstGeom, width, height, adjustValues) {
1051
+ if (this._clipDelegate) return this._clipDelegate(ctx, prstGeom, width, height, adjustValues);
1052
+ return false;
1085
1053
  }
1086
- _ungroupDrawing(drawing) {
1087
- const { parent, children } = drawing;
1088
- const renderObject = this._getSceneAndTransformerByDrawingSearch(parent.unitId);
1089
- if (renderObject == null) return;
1090
- const { scene, transformer } = renderObject;
1091
- children.forEach((drawing) => {
1092
- const drawingKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(drawing);
1093
- const object = scene.getObjectIncludeInGroup(drawingKey);
1094
- if (object == null) return true;
1095
- if (object == null) return;
1096
- const { transform } = drawing;
1097
- if (transform == null) return;
1098
- if (object.classType === _univerjs_engine_render.RENDER_CLASS_TYPE.GROUP) object.transformByState({
1099
- left: transform.left,
1100
- top: transform.top
1101
- });
1102
- else object.transformByState(transform);
1103
- });
1104
- const groupKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(parent);
1105
- const group = scene.getObject(groupKey);
1106
- const { width, height } = group;
1107
- group.getObjects().forEach((object) => {
1108
- group.removeSelfObjectAndTransform(object.oKey, width, height);
1109
- });
1110
- group.dispose();
1111
- transformer.clearSelectedObjects();
1054
+ dispose() {
1055
+ this._clipDelegate = null;
1056
+ this._canUseShapeClip$.complete();
1057
+ super.dispose();
1112
1058
  }
1113
- _drawingAlign(params) {
1114
- const { alignType } = params;
1115
- const drawings = params.drawings || this._drawingManagerService.getFocusDrawings();
1116
- if (alignType === "0") return;
1117
- const drawingTransformCaches = [];
1118
- let minLeft = Number.POSITIVE_INFINITY;
1119
- let minTop = Number.POSITIVE_INFINITY;
1120
- let maxRight = Number.NEGATIVE_INFINITY;
1121
- let maxBottom = Number.NEGATIVE_INFINITY;
1122
- let drawingCount = 0;
1123
- drawings.forEach((drawing) => {
1124
- const { unitId, subUnitId, drawingId, drawingType } = drawing;
1125
- const drawingParam = this._drawingManagerService.getDrawingByParam({
1059
+ };
1060
+
1061
+ //#endregion
1062
+ //#region src/services/drawing-render.service.ts
1063
+ const DOC_DRAWING_BEHIND_TEXT_LAYER_INDEX = 1;
1064
+ function getDrawingRenderLayerIndex(param) {
1065
+ return param.behindText === true || param.behindText === _univerjs_core.BooleanNumber.TRUE || param.layoutType === _univerjs_core.PositionedObjectLayoutType.WRAP_NONE && param.behindDoc === _univerjs_core.BooleanNumber.TRUE ? 1 : _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX;
1066
+ }
1067
+ function ensureDrawingRenderLayer(scene, object, param) {
1068
+ const layerIndex = getDrawingRenderLayerIndex(param);
1069
+ if (object.layer == null || object.layer.zIndex === layerIndex) return;
1070
+ scene.removeObject(object);
1071
+ scene.addObject(object, layerIndex);
1072
+ }
1073
+ function isRenderableImageCache(image) {
1074
+ return (image === null || image === void 0 ? void 0 : image.complete) === true && image.naturalWidth > 0 && image.naturalHeight > 0;
1075
+ }
1076
+ let DrawingRenderService = class DrawingRenderService {
1077
+ constructor(_drawingManagerService, _imageIoService, _galleryService, _urlImageService, _univerInstanceService, _drawingImageClipService) {
1078
+ this._drawingManagerService = _drawingManagerService;
1079
+ this._imageIoService = _imageIoService;
1080
+ this._galleryService = _galleryService;
1081
+ this._urlImageService = _urlImageService;
1082
+ this._univerInstanceService = _univerInstanceService;
1083
+ this._drawingImageClipService = _drawingImageClipService;
1084
+ }
1085
+ async renderImages(imageParam, scene, options) {
1086
+ const { transform: singleTransform, drawingType, source, imageSourceType, srcRect, prstGeom, groupId, unitId, subUnitId, drawingId, isMultiTransform, transforms: multiTransforms, adjustValues, hidden } = imageParam;
1087
+ const { docxHeaderFooterDrawing, layoutType } = imageParam;
1088
+ if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
1089
+ if (!this._drawingManagerService.getDrawingVisible()) return;
1090
+ if (!(options === null || options === void 0 ? void 0 : options.allowInactiveSheet) && this._univerInstanceService.getUnitType(unitId) === _univerjs_core.UniverInstanceType.UNIVER_SHEET && subUnitId !== this._getActiveSheetId()) return;
1091
+ if (singleTransform == null) return;
1092
+ const transforms = isMultiTransform && multiTransforms ? multiTransforms : [singleTransform];
1093
+ const images = [];
1094
+ for (const transform of transforms) {
1095
+ const { left, top, width, height, angle, flipX, flipY, skewX, skewY } = transform;
1096
+ const index = transforms.indexOf(transform);
1097
+ const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1126
1098
  unitId,
1127
1099
  subUnitId,
1128
1100
  drawingId
1129
- });
1130
- if (drawingParam == null || drawingParam.transform == null) return;
1131
- drawingTransformCaches.push({
1132
- unitId,
1133
- subUnitId,
1134
- drawingId,
1135
- drawingType,
1136
- transform: drawingParam.transform
1137
- });
1138
- const { left = 0, top = 0, width = 0, height = 0 } = drawingParam.transform;
1139
- minLeft = Math.min(minLeft, left);
1140
- minTop = Math.min(minTop, top);
1141
- maxRight = Math.max(maxRight, left + width);
1142
- maxBottom = Math.max(maxBottom, top + height);
1143
- drawingCount++;
1144
- });
1145
- if (drawingCount === 0) return;
1146
- this._sortDrawingTransform(drawingTransformCaches, alignType);
1147
- this._applyAlignType(drawingTransformCaches, alignType, minLeft, minTop, maxRight, maxBottom, drawingCount);
1148
- }
1149
- _applyAlignType(drawingTransformCaches, alignType, minLeft, minTop, maxRight, maxBottom, drawingCount) {
1150
- const averageHorizon = Math.round((maxRight - minLeft) / drawingCount * 10) / 10;
1151
- const averageVertical = Math.round((maxBottom - minTop) / drawingCount * 10) / 10;
1152
- const updateParams = [];
1153
- const renderObject = this._getSceneAndTransformerByDrawingSearch(drawingTransformCaches[0].unitId);
1154
- if (renderObject == null) return;
1155
- const { scene, transformer } = renderObject;
1156
- drawingTransformCaches.forEach((drawingTransformCache, index) => {
1157
- const { unitId, subUnitId, drawingId, transform, drawingType } = drawingTransformCache;
1158
- const { left = 0, top = 0, width = 0, height = 0 } = transform;
1159
- let newLeft = left;
1160
- let newTop = top;
1161
- switch (alignType) {
1162
- case "1":
1163
- newLeft = minLeft;
1164
- break;
1165
- case "2":
1166
- newLeft = minLeft + (maxRight - minLeft) / 2 - width / 2;
1167
- break;
1168
- case "3":
1169
- newLeft = maxRight - width;
1170
- break;
1171
- case "4":
1172
- newTop = minTop;
1173
- break;
1174
- case "5":
1175
- newTop = minTop + (maxBottom - minTop) / 2 - height / 2;
1176
- break;
1177
- case "6":
1178
- newTop = maxBottom - height;
1179
- break;
1180
- case "7":
1181
- newLeft = minLeft + averageHorizon * index;
1182
- break;
1183
- case "8":
1184
- newTop = minTop + averageVertical * index;
1185
- break;
1186
- default: break;
1101
+ }, isMultiTransform ? index : void 0);
1102
+ const imageShape = scene.getObject(imageShapeKey);
1103
+ if (imageShape != null) {
1104
+ var _setClipBounds;
1105
+ imageShape.transformByState({
1106
+ left,
1107
+ top,
1108
+ width,
1109
+ height,
1110
+ angle,
1111
+ flipX,
1112
+ flipY,
1113
+ skewX,
1114
+ skewY
1115
+ });
1116
+ (_setClipBounds = imageShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(imageShape, transform.clipBounds);
1117
+ if ("hidden" in imageParam) hidden ? imageShape.hide() : imageShape.show();
1118
+ ensureDrawingRenderLayer(scene, imageShape, imageParam);
1119
+ continue;
1187
1120
  }
1188
- if (newLeft !== left || newTop !== top) updateParams.push({
1189
- unitId,
1190
- subUnitId,
1191
- drawingId,
1192
- drawingType,
1193
- transform: {
1194
- left: newLeft,
1195
- top: newTop
1121
+ const orders = this._drawingManagerService.getDrawingOrder(unitId, subUnitId);
1122
+ const zIndex = orders.indexOf(drawingId);
1123
+ const imageConfig = {
1124
+ ...transform,
1125
+ zIndex: zIndex === -1 ? orders.length - 1 : zIndex
1126
+ };
1127
+ const imageNativeCache = this._imageIoService.getImageSourceCache(source, imageSourceType);
1128
+ let shouldBeCache = false;
1129
+ if (isRenderableImageCache(imageNativeCache)) imageConfig.image = imageNativeCache;
1130
+ else if (imageSourceType === _univerjs_core.ImageSourceType.UUID) try {
1131
+ imageConfig.url = await this._imageIoService.getImage(source);
1132
+ } catch (error) {
1133
+ console.error(error);
1134
+ continue;
1135
+ }
1136
+ else if (imageSourceType === _univerjs_core.ImageSourceType.URL) {
1137
+ try {
1138
+ imageConfig.url = await this._urlImageService.getImage(source);
1139
+ } catch (error) {
1140
+ console.error(error);
1141
+ imageConfig.url = source;
1196
1142
  }
1197
- });
1198
- });
1199
- this._drawingManagerService.featurePluginUpdateNotification(updateParams);
1200
- transformer.refreshControls().changeNotification();
1201
- }
1202
- _sortDrawingTransform(drawingTransformCaches, alignType) {
1203
- drawingTransformCaches.sort((a, b) => {
1204
- const aTransform = a.transform;
1205
- const bTransform = b.transform;
1206
- const { left: aLeft = 0, top: aTop = 0, width: aWidth = 0, height: aHeight = 0 } = aTransform;
1207
- const { left: bLeft = 0, top: bTop = 0, width: bWidth = 0, height: bHeight = 0 } = bTransform;
1208
- switch (alignType) {
1209
- case "1": return aLeft - bLeft;
1210
- case "2": return aLeft + aWidth / 2 - (bLeft + bWidth / 2);
1211
- case "3": return aLeft + aWidth - (bLeft + bWidth);
1212
- case "4": return aTop - bTop;
1213
- case "5": return aTop + aHeight / 2 - (bTop + bHeight / 2);
1214
- case "6": return aTop + aHeight - (bTop + bHeight);
1215
- case "7": return aLeft + aWidth / 2 - (bLeft + bWidth / 2);
1216
- case "8": return aTop + aHeight / 2 - (bTop + bHeight / 2);
1217
- default: return 0;
1143
+ shouldBeCache = true;
1144
+ } else {
1145
+ imageConfig.url = source;
1146
+ shouldBeCache = true;
1218
1147
  }
1219
- });
1148
+ const shouldWaitForInlineTransform = docxHeaderFooterDrawing === true && layoutType === _univerjs_core.PositionedObjectLayoutType.INLINE;
1149
+ if (hidden || shouldWaitForInlineTransform) imageConfig.visible = false;
1150
+ if (scene.getObject(imageShapeKey)) continue;
1151
+ imageConfig.printable = true;
1152
+ const image = new _univerjs_engine_render.Image(imageShapeKey, imageConfig);
1153
+ image.setClipService(this._drawingImageClipService);
1154
+ if (shouldBeCache) this._imageIoService.addImageSourceCache(source, imageSourceType, image.getNative());
1155
+ scene.addObject(image, getDrawingRenderLayerIndex(imageParam));
1156
+ if (this._drawingManagerService.getDrawingEditable()) scene.attachTransformerTo(image);
1157
+ groupId && insertGroupObject({
1158
+ drawingId: groupId,
1159
+ unitId,
1160
+ subUnitId
1161
+ }, image, scene, this._drawingManagerService);
1162
+ if (prstGeom != null) image.setPrstGeom(prstGeom);
1163
+ if (adjustValues != null) image.setPrstGeomAdjValues(adjustValues);
1164
+ if (srcRect != null) image.setSrcRect(srcRect);
1165
+ images.push(image);
1166
+ }
1167
+ return images;
1220
1168
  }
1221
- _drawingArrangeListener() {
1222
- this.disposeWithMe(this._drawingManagerService.order$.subscribe((params) => {
1223
- this._drawingArrange(params);
1224
- }));
1169
+ _getActiveSheetId() {
1170
+ var _this$_univerInstance;
1171
+ return (_this$_univerInstance = this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_SHEET)) === null || _this$_univerInstance === void 0 || (_this$_univerInstance = _this$_univerInstance.getActiveSheet()) === null || _this$_univerInstance === void 0 ? void 0 : _this$_univerInstance.getSheetId();
1225
1172
  }
1226
- _drawingArrange(params) {
1227
- const { unitId, subUnitId, drawingIds } = params;
1228
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1229
- if (renderObject == null) return;
1230
- const { scene } = renderObject;
1231
- drawingIds.forEach((drawingId) => {
1232
- const oKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1233
- unitId,
1234
- subUnitId,
1235
- drawingId
1236
- });
1237
- const drawingShapes = scene.fuzzyMathObjects(oKey, true);
1238
- if (drawingShapes == null || drawingShapes.length === 0) return;
1239
- const index = this._drawingManagerService.getDrawingOrder(unitId, subUnitId).indexOf(drawingId);
1240
- for (const shape of drawingShapes) {
1241
- shape.setProps({ zIndex: index });
1242
- shape.makeDirty();
1243
- }
1244
- });
1245
- }
1246
- _drawingAddListener() {
1247
- this.disposeWithMe(this._drawingManagerService.add$.subscribe((params) => {
1248
- this._insertDrawing(params);
1249
- }));
1250
- }
1251
- _insertDrawing(params) {
1252
- const sceneList = [];
1253
- params.forEach((param) => {
1254
- const { unitId } = param;
1255
- if (this._drawingManagerService.getDrawingByParam(param) == null) return;
1256
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1257
- if (renderObject == null) return;
1258
- const { scene } = renderObject;
1259
- if (!sceneList.includes(scene)) sceneList.push(scene);
1260
- });
1261
- sceneList.forEach((scene) => {
1262
- if (this._sceneListenerOnDrawingMap.has(scene)) return;
1263
- this._addListenerOnDrawing(scene);
1264
- this._sceneListenerOnDrawingMap.add(scene);
1265
- });
1266
- }
1267
- _drawingRemoveListener() {
1268
- this.disposeWithMe(this._drawingManagerService.remove$.subscribe((params) => {
1269
- params.forEach((param) => {
1270
- const { unitId, subUnitId, drawingId } = param;
1271
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1272
- if (renderObject == null) return;
1273
- const { scene } = renderObject;
1274
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1275
- unitId,
1276
- subUnitId,
1277
- drawingId
1278
- });
1279
- const drawingShapes = scene.fuzzyMathObjects(drawingShapeKey, true);
1280
- if (drawingShapes.length > 0) {
1281
- var _scene$getTransformer;
1282
- for (const drawingShape of drawingShapes) drawingShape.dispose();
1283
- (_scene$getTransformer = scene.getTransformer()) === null || _scene$getTransformer === void 0 || _scene$getTransformer.clearSelectedObjects();
1284
- }
1285
- });
1286
- }));
1287
- }
1288
- _drawingUpdateListener() {
1289
- this.disposeWithMe(this._drawingManagerService.update$.subscribe((params) => {
1290
- params.forEach((param) => {
1291
- var _setClipBounds, _scene$getTransformer2;
1292
- const { unitId, subUnitId, drawingId } = param;
1293
- const drawingParam = this._drawingManagerService.getDrawingByParam(param);
1294
- if (drawingParam == null) return;
1295
- const { transform, drawingType } = drawingParam;
1296
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1297
- if (renderObject == null) return;
1298
- const { scene, transformer } = renderObject;
1299
- if (transform == null) return true;
1300
- const { left = 0, top = 0, width = 0, height = 0, angle = 0, flipX = false, flipY = false, skewX = 0, skewY = 0 } = transform;
1301
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1302
- unitId,
1303
- subUnitId,
1304
- drawingId
1305
- });
1306
- const drawingShape = scene.getObject(drawingShapeKey);
1307
- if (drawingShape == null) return true;
1308
- drawingShape.transformByState({
1173
+ renderFloatDom(param, scene) {
1174
+ const { transform: singleTransform, drawingType, groupId, unitId, subUnitId, drawingId, isMultiTransform, transforms: multiTransforms } = param;
1175
+ if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_DOM) return;
1176
+ if (!this._drawingManagerService.getDrawingVisible()) return;
1177
+ if (singleTransform == null) return;
1178
+ const transforms = isMultiTransform && multiTransforms ? multiTransforms : [singleTransform];
1179
+ const rects = [];
1180
+ for (const transform of transforms) {
1181
+ const { left, top, width, height, angle, flipX, flipY, skewX, skewY } = transform;
1182
+ const index = transforms.indexOf(transform);
1183
+ const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1184
+ unitId,
1185
+ subUnitId,
1186
+ drawingId
1187
+ }, isMultiTransform ? index : void 0);
1188
+ const imageShape = scene.getObject(imageShapeKey);
1189
+ if (imageShape != null) {
1190
+ imageShape.transformByState({
1309
1191
  left,
1310
1192
  top,
1311
1193
  width,
@@ -1316,1026 +1198,1232 @@ let DrawingUpdateController = class DrawingUpdateController extends _univerjs_co
1316
1198
  skewX,
1317
1199
  skewY
1318
1200
  });
1319
- (_setClipBounds = drawingShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(drawingShape, transform.clipBounds);
1320
- syncDrawingHiddenState(drawingShape, drawingParam);
1321
- ensureDrawingRenderLayer(scene, drawingShape, drawingParam);
1322
- (_scene$getTransformer2 = scene.getTransformer()) === null || _scene$getTransformer2 === void 0 || _scene$getTransformer2.debounceRefreshControls();
1323
- });
1324
- }));
1201
+ continue;
1202
+ }
1203
+ const orders = this._drawingManagerService.getDrawingOrder(unitId, subUnitId);
1204
+ const zIndex = orders.indexOf(drawingId);
1205
+ const rectConfig = {
1206
+ ...transform,
1207
+ zIndex: zIndex === -1 ? orders.length - 1 : zIndex
1208
+ };
1209
+ if (scene.getObject(imageShapeKey)) continue;
1210
+ rectConfig.printable = false;
1211
+ const rect = new _univerjs_engine_render.Rect(imageShapeKey, rectConfig);
1212
+ if (!this._drawingManagerService.getDrawingVisible()) continue;
1213
+ scene.addObject(rect, _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX);
1214
+ if (this._drawingManagerService.getDrawingEditable() && param.allowTransform !== false) scene.attachTransformerTo(rect);
1215
+ groupId && insertGroupObject({
1216
+ drawingId: groupId,
1217
+ unitId,
1218
+ subUnitId
1219
+ }, rect, scene, this._drawingManagerService);
1220
+ rects.push(rect);
1221
+ }
1222
+ return rects;
1325
1223
  }
1326
- _drawingRefreshListener() {
1327
- this.disposeWithMe(this._drawingManagerService.refreshTransform$.subscribe((params) => {
1328
- params.forEach((param) => {
1329
- var _setClipBounds2;
1330
- const { unitId, subUnitId, drawingId } = param;
1331
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1332
- if (renderObject == null) return;
1333
- const drawingParam = this._drawingManagerService.getDrawingByParam(param);
1334
- if (drawingParam == null) return;
1335
- const { transform } = drawingParam;
1336
- const { scene } = renderObject;
1337
- if (transform == null) return true;
1338
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1339
- unitId,
1340
- subUnitId,
1341
- drawingId
1342
- });
1343
- const drawingShape = scene.getObject(drawingShapeKey);
1344
- const drawingParamWithRefreshMetadata = mergeRefreshMetadata(drawingParam, param);
1345
- if (drawingShape == null) {
1346
- if (drawingParamWithRefreshMetadata.hidden === true) return true;
1347
- this._drawingManagerService.addNotification([{
1224
+ renderDrawing(param, scene, options) {
1225
+ const drawingParam = this._drawingManagerService.getDrawingByParam(param);
1226
+ if (drawingParam == null) return;
1227
+ switch (drawingParam.drawingType) {
1228
+ case _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE: return this.renderImages(drawingParam, scene, options);
1229
+ default:
1230
+ }
1231
+ }
1232
+ previewImage(key, src, width, height) {
1233
+ this._galleryService.open({
1234
+ images: [src],
1235
+ onOpenChange: (open) => {
1236
+ if (!open) this._galleryService.close();
1237
+ }
1238
+ });
1239
+ }
1240
+ _adjustImageSize(nativeWidth, nativeHeight, screenWidth, screenHeight) {
1241
+ if (nativeWidth <= screenWidth && nativeHeight <= screenHeight) return {
1242
+ width: nativeWidth,
1243
+ height: nativeHeight
1244
+ };
1245
+ const widthRatio = screenWidth / nativeWidth;
1246
+ const heightRatio = screenHeight / nativeHeight;
1247
+ const scale = Math.min(widthRatio, heightRatio);
1248
+ return {
1249
+ width: Math.floor(nativeWidth * scale),
1250
+ height: Math.floor(nativeHeight * scale)
1251
+ };
1252
+ }
1253
+ };
1254
+ DrawingRenderService = __decorate([
1255
+ __decorateParam(0, _univerjs_drawing.IDrawingManagerService),
1256
+ __decorateParam(1, _univerjs_core.IImageIoService),
1257
+ __decorateParam(2, _univerjs_ui.IGalleryService),
1258
+ __decorateParam(3, _univerjs_core.IURLImageService),
1259
+ __decorateParam(4, _univerjs_core.IUniverInstanceService),
1260
+ __decorateParam(5, (0, _univerjs_core.Inject)(DrawingImageClipService))
1261
+ ], DrawingRenderService);
1262
+
1263
+ //#endregion
1264
+ //#region src/utils/get-update-params.ts
1265
+ function getUpdateParams(objects, drawingManagerService) {
1266
+ const params = [];
1267
+ objects.forEach((object) => {
1268
+ const { oKey, left, top, height, width, angle } = object;
1269
+ const searchParam = drawingManagerService.getDrawingOKey(oKey);
1270
+ if (searchParam == null) {
1271
+ params.push(null);
1272
+ return true;
1273
+ }
1274
+ const { unitId, subUnitId, drawingId, drawingType } = searchParam;
1275
+ const param = {
1276
+ unitId,
1277
+ subUnitId,
1278
+ drawingId,
1279
+ drawingType,
1280
+ transform: {
1281
+ left,
1282
+ top,
1283
+ height,
1284
+ width,
1285
+ angle
1286
+ }
1287
+ };
1288
+ if (drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) param.srcRect = object.srcRect;
1289
+ params.push(param);
1290
+ });
1291
+ return params;
1292
+ }
1293
+
1294
+ //#endregion
1295
+ //#region src/controllers/drawing-update.controller.ts
1296
+ function hasRefreshMetadata(refreshParam) {
1297
+ return "hidden" in refreshParam || "behindText" in refreshParam;
1298
+ }
1299
+ function syncDrawingHiddenState(shape, drawingParam) {
1300
+ if (!("hidden" in drawingParam)) return;
1301
+ drawingParam.hidden === true ? shape.hide() : shape.show();
1302
+ }
1303
+ function mergeRefreshMetadata(drawingParam, refreshParam) {
1304
+ if (!hasRefreshMetadata(refreshParam)) return drawingParam;
1305
+ return {
1306
+ ...drawingParam,
1307
+ ...refreshParam
1308
+ };
1309
+ }
1310
+ let DrawingUpdateController = class DrawingUpdateController extends _univerjs_core.Disposable {
1311
+ constructor(_currentUniverService, _commandService, _renderManagerService, _drawingManagerService) {
1312
+ super();
1313
+ this._currentUniverService = _currentUniverService;
1314
+ this._commandService = _commandService;
1315
+ this._renderManagerService = _renderManagerService;
1316
+ this._drawingManagerService = _drawingManagerService;
1317
+ _defineProperty(this, "_sceneListenerOnDrawingMap", /* @__PURE__ */ new WeakSet());
1318
+ this._initialize();
1319
+ }
1320
+ dispose() {
1321
+ super.dispose();
1322
+ }
1323
+ _initialize() {
1324
+ this._recoveryImages();
1325
+ this._drawingAddListener();
1326
+ this._drawingRemoveListener();
1327
+ this._drawingUpdateListener();
1328
+ this._commandExecutedListener();
1329
+ this._drawingArrangeListener();
1330
+ this._drawingGroupListener();
1331
+ this._drawingRefreshListener();
1332
+ this._drawingVisibleListener();
1333
+ }
1334
+ _recoveryImages() {
1335
+ const drawingList = this._drawingManagerService.drawingManagerData;
1336
+ const info = getCurrentUnitInfo(this._currentUniverService);
1337
+ if (info == null) return;
1338
+ const { unitId: currentUnitId, subUnitId: currentSubUnitId } = info;
1339
+ Object.keys(drawingList).forEach((unitId) => {
1340
+ Object.keys(drawingList[unitId]).forEach((subUnitId) => {
1341
+ const drawingMap = drawingList[unitId][subUnitId].data;
1342
+ if (drawingMap == null || unitId !== currentUnitId || subUnitId !== currentSubUnitId) return;
1343
+ Object.keys(drawingMap).forEach((drawingId) => {
1344
+ if (drawingMap[drawingId]) this._insertDrawing([{
1348
1345
  unitId,
1349
1346
  subUnitId,
1350
1347
  drawingId
1351
1348
  }]);
1352
- return true;
1353
- }
1354
- const { left = 0, top = 0, width = 0, height = 0, angle = 0, flipX = false, flipY = false, skewX = 0, skewY = 0 } = transform;
1355
- drawingShape.transformByState({
1356
- left,
1357
- top,
1358
- width,
1359
- height,
1360
- angle,
1361
- flipX,
1362
- flipY,
1363
- skewX,
1364
- skewY
1365
1349
  });
1366
- (_setClipBounds2 = drawingShape.setClipBounds) === null || _setClipBounds2 === void 0 || _setClipBounds2.call(drawingShape, transform.clipBounds);
1367
- syncDrawingHiddenState(drawingShape, drawingParamWithRefreshMetadata);
1368
- ensureDrawingRenderLayer(scene, drawingShape, drawingParamWithRefreshMetadata);
1369
1350
  });
1370
- }));
1351
+ });
1371
1352
  }
1372
- _drawingVisibleListener() {
1373
- this.disposeWithMe(this._drawingManagerService.visible$.subscribe((params) => {
1374
- params.forEach((param) => {
1375
- const { unitId, subUnitId, drawingId, visible } = param;
1376
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1377
- if (renderObject == null) return;
1378
- const { scene } = renderObject;
1379
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1380
- unitId,
1381
- subUnitId,
1382
- drawingId
1383
- });
1384
- const drawingShape = scene.getObject(drawingShapeKey);
1385
- if (drawingShape == null) return true;
1386
- if (visible) drawingShape.show();
1387
- else drawingShape.hide();
1388
- });
1353
+ _commandExecutedListener() {
1354
+ this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1355
+ if (command.id === SetDrawingAlignOperation.id) {
1356
+ const params = command.params;
1357
+ if (params == null) return;
1358
+ this._drawingAlign(params);
1359
+ }
1389
1360
  }));
1390
1361
  }
1391
- _filterUpdateParams(params, startTransforms) {
1392
- return params.filter((param, index) => {
1393
- if (param == null) return false;
1394
- const { transform } = param;
1395
- return (0, _univerjs_core.checkIfMove)(transform, startTransforms === null || startTransforms === void 0 ? void 0 : startTransforms[index]);
1396
- });
1397
- }
1398
- _addListenerOnDrawing(scene) {
1399
- const transformer = scene.getTransformerByCreate();
1400
- let startTransforms = null;
1401
- this.disposeWithMe((0, _univerjs_core.toDisposable)(transformer.changeStart$.subscribe((state) => {
1402
- const { objects } = state;
1403
- const objectArray = Array.from(objects.values());
1404
- const drawings = [];
1405
- startTransforms = objectArray.map((object) => {
1406
- const { left, top, height, width, angle, oKey, isInGroup } = object;
1407
- const drawing = this._drawingManagerService.getDrawingOKey(oKey);
1408
- if (isInGroup || object instanceof _univerjs_engine_render.Group) {
1409
- let group = object.ancestorGroup;
1410
- if (group == null && object instanceof _univerjs_engine_render.Group) group = object;
1411
- if (group == null) return null;
1412
- const groupDrawing = this._drawingManagerService.getDrawingOKey(group.oKey);
1413
- if (groupDrawing) {
1414
- const { unitId, subUnitId, drawingId } = groupDrawing;
1415
- drawings.push({
1416
- unitId,
1417
- subUnitId,
1418
- drawingId
1419
- });
1420
- const { left, top, height, width, angle } = group;
1421
- return {
1422
- left,
1423
- top,
1424
- height,
1425
- width,
1426
- angle
1427
- };
1428
- }
1429
- } else if (drawing != null) {
1430
- const { unitId, subUnitId, drawingId } = drawing;
1431
- drawings.push({
1432
- unitId,
1433
- subUnitId,
1434
- drawingId
1435
- });
1436
- return {
1437
- left,
1438
- top,
1439
- height,
1440
- width,
1441
- angle
1442
- };
1443
- }
1444
- return null;
1445
- }).filter((transform) => transform != null);
1446
- if (drawings.length > 0) this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, drawings);
1447
- else this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, []);
1448
- })));
1449
- this.disposeWithMe((0, _univerjs_core.toDisposable)(transformer.changeEnd$.subscribe((state) => {
1450
- const { objects } = state;
1451
- const params = this._filterUpdateParams(getUpdateParams(objects, this._drawingManagerService), startTransforms);
1452
- if (params.length > 0) this._drawingManagerService.featurePluginUpdateNotification(params);
1453
- })));
1362
+ _drawingGroupListener() {
1363
+ this.disposeWithMe(this._drawingManagerService.group$.subscribe((params) => {
1364
+ this._groupDrawings(params);
1365
+ }));
1366
+ this.disposeWithMe(this._drawingManagerService.ungroup$.subscribe((params) => {
1367
+ this._ungroupDrawings(params);
1368
+ }));
1454
1369
  }
1455
- };
1456
- DrawingUpdateController = __decorate([
1457
- __decorateParam(0, _univerjs_core.IUniverInstanceService),
1458
- __decorateParam(1, _univerjs_core.ICommandService),
1459
- __decorateParam(2, _univerjs_engine_render.IRenderManagerService),
1460
- __decorateParam(3, _univerjs_drawing.IDrawingManagerService)
1461
- ], DrawingUpdateController);
1462
-
1463
- //#endregion
1464
- //#region src/views/crop/image-cropper-object.ts
1465
- var ImageCropperObject = class extends _univerjs_engine_render.Shape {
1466
- constructor(key, props) {
1467
- if (props == null) props = {};
1468
- props.transformerConfig = {
1469
- keepRatio: false,
1470
- isCropper: true,
1471
- anchorFill: "rgb(0, 0, 0)",
1472
- anchorStroke: "rgb(255, 255, 255)",
1473
- anchorSize: 24
1370
+ _getSceneAndTransformerByDrawingSearch(unitId) {
1371
+ if (unitId == null) return;
1372
+ const renderObject = this._renderManagerService.getRenderById(unitId);
1373
+ const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1374
+ if (scene == null) return null;
1375
+ return {
1376
+ scene,
1377
+ transformer: scene.getTransformerByCreate()
1474
1378
  };
1475
- super(key, props);
1476
- _defineProperty(this, "_srcRect", void 0);
1477
- _defineProperty(this, "_prstGeom", void 0);
1478
- _defineProperty(this, "_applyTransform", void 0);
1479
- _defineProperty(this, "_dragPadding", 8);
1480
- _defineProperty(this, "_cacheCanvas", void 0);
1481
- if (props === null || props === void 0 ? void 0 : props.srcRect) this._srcRect = props.srcRect;
1482
- if (props === null || props === void 0 ? void 0 : props.prstGeom) this._prstGeom = props.prstGeom;
1483
- if (props === null || props === void 0 ? void 0 : props.applyTransform) this._applyTransform = props.applyTransform;
1484
- if (props === null || props === void 0 ? void 0 : props.dragPadding) this._dragPadding = props.dragPadding;
1485
- this._applyProps();
1486
- }
1487
- refreshSrcRect(value, transform) {
1488
- this._srcRect = value;
1489
- this._applyTransform = transform;
1490
- this._applyProps();
1491
- }
1492
- get srcRect() {
1493
- return this._srcRect;
1494
- }
1495
- dispose() {
1496
- var _this$_cacheCanvas;
1497
- super.dispose();
1498
- (_this$_cacheCanvas = this._cacheCanvas) === null || _this$_cacheCanvas === void 0 || _this$_cacheCanvas.dispose();
1499
- this._srcRect = null;
1500
- }
1501
- isHit(coord) {
1502
- const oCoord = this.getInverseCoord(coord);
1503
- if (oCoord.x >= -this.strokeWidth / 2 && oCoord.x <= this.width + this.strokeWidth / 2 && oCoord.y >= -this.strokeWidth / 2 && oCoord.y <= this.height + this.strokeWidth / 2 && !this._inSurround(oCoord)) return true;
1504
- return false;
1505
1379
  }
1506
- _inSurround(oCoord) {
1507
- const padding = this._dragPadding;
1508
- if (oCoord.x >= padding - this.strokeWidth / 2 && oCoord.x <= this.width + this.strokeWidth / 2 - padding && oCoord.y >= padding - this.strokeWidth / 2 && oCoord.y <= this.height + this.strokeWidth / 2 - padding) return true;
1509
- return false;
1380
+ _groupDrawings(drawings) {
1381
+ drawings.forEach((drawing) => {
1382
+ this._groupDrawing(drawing);
1383
+ });
1510
1384
  }
1511
- render(mainCtx, bounds) {
1512
- if (!this.visible) {
1513
- this.makeDirty(false);
1514
- return this;
1385
+ _groupDrawing(params) {
1386
+ const { parent, children } = params;
1387
+ const { unitId, subUnitId, drawingId } = parent;
1388
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(parent.unitId);
1389
+ if (renderObject == null) return;
1390
+ const { scene, transformer } = renderObject;
1391
+ this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
1392
+ const objects = [];
1393
+ children.forEach((drawing) => {
1394
+ const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(drawing);
1395
+ const object = scene.getObjectIncludeInGroup(drawingShapeKey);
1396
+ if (object == null || objects.includes(object)) return;
1397
+ objects.push(object);
1398
+ const { transform } = drawing;
1399
+ if (transform == null) return;
1400
+ if (object.classType === _univerjs_engine_render.RENDER_CLASS_TYPE.GROUP) object.transformByState({
1401
+ left: transform.left,
1402
+ top: transform.top
1403
+ });
1404
+ else object.transformByState(transform);
1405
+ });
1406
+ if (objects.length === 0) return;
1407
+ const group = new _univerjs_engine_render.DrawingGroupObject((0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1408
+ unitId,
1409
+ subUnitId,
1410
+ drawingId
1411
+ }));
1412
+ scene.addObject(group, _univerjs_engine_render.DRAWING_OBJECT_LAYER_INDEX).attachTransformerTo(group);
1413
+ group.addObjects(...objects);
1414
+ syncGroupRotateEnabled(group, parent, scene, this._drawingManagerService, children);
1415
+ if (parent.groupBaseBound) group.setBaseBound(parent.groupBaseBound);
1416
+ if (parent.groupId) {
1417
+ group.isInGroup = true;
1418
+ insertGroupObject({
1419
+ drawingId: parent.groupId,
1420
+ unitId,
1421
+ subUnitId
1422
+ }, group, scene, this._drawingManagerService);
1515
1423
  }
1516
- mainCtx.save();
1517
- this._draw(mainCtx);
1518
- mainCtx.restore();
1519
- this.makeDirty(false);
1520
- return this;
1424
+ parent.transform && group.transformByState({
1425
+ left: parent.transform.left,
1426
+ top: parent.transform.top,
1427
+ width: parent.transform.width,
1428
+ height: parent.transform.height,
1429
+ angle: parent.transform.angle
1430
+ });
1431
+ transformer.clearSelectedObjects();
1432
+ transformer.setSelectedControl(group);
1521
1433
  }
1522
- _draw(ctx) {
1523
- var _this$_cacheCanvas2, _this$_cacheCanvas3;
1524
- const { width: engineWidth, height: engineHeight } = this.getScene().getEngine();
1525
- this._initialCacheCanvas();
1526
- (_this$_cacheCanvas2 = this._cacheCanvas) === null || _this$_cacheCanvas2 === void 0 || _this$_cacheCanvas2.clear();
1527
- const cacheCtx = (_this$_cacheCanvas3 = this._cacheCanvas) === null || _this$_cacheCanvas3 === void 0 ? void 0 : _this$_cacheCanvas3.getContext();
1528
- if (cacheCtx == null) return;
1529
- cacheCtx.save();
1530
- _univerjs_engine_render.Rect.drawWith(cacheCtx, {
1531
- left: 0,
1532
- top: 0,
1533
- width: engineWidth,
1534
- height: engineHeight,
1535
- fill: "rgba(0, 0, 0, 0.5)"
1434
+ _ungroupDrawings(drawings) {
1435
+ drawings.forEach((drawing) => {
1436
+ this._ungroupDrawing(drawing);
1536
1437
  });
1537
- cacheCtx.setTransform(ctx.getTransform());
1538
- this._clipForApplyObject(cacheCtx);
1539
- this._applyCache(ctx);
1540
- cacheCtx.restore();
1541
1438
  }
1542
- _clipForApplyObject(cacheCtx) {
1543
- let objectType = 0;
1544
- if (this._prstGeom != null) objectType = 1;
1545
- cacheCtx.globalCompositeOperation = "destination-out";
1546
- cacheCtx.beginPath();
1547
- if (objectType === 0) {
1548
- const m = this.transform.getMatrix();
1549
- cacheCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
1550
- cacheCtx.rect(0, 0, this.width, this.height);
1551
- cacheCtx.fill();
1552
- }
1553
- }
1554
- _applyProps() {
1555
- if (this._applyTransform == null) return;
1556
- let cropLeft = 0;
1557
- let cropTop = 0;
1558
- let cropRight = 0;
1559
- let cropBottom = 0;
1560
- const { left: applyLeft = 0, top: applyTop = 0, width: applyWidth = 0, height: applyHeight = 0, angle } = this._applyTransform;
1561
- if (this._srcRect != null) {
1562
- const { left = 0, top = 0, right = 0, bottom = 0 } = this._srcRect;
1563
- cropLeft = left;
1564
- cropTop = top;
1565
- cropRight = right;
1566
- cropBottom = bottom;
1567
- }
1568
- const left = applyLeft + cropLeft;
1569
- const top = applyTop + cropTop;
1570
- this.transformByState({
1571
- left,
1572
- top,
1573
- width: applyLeft + applyWidth - cropRight - left,
1574
- height: applyTop + applyHeight - cropBottom - top,
1575
- angle
1439
+ _ungroupDrawing(drawing) {
1440
+ const { parent, children } = drawing;
1441
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(parent.unitId);
1442
+ if (renderObject == null) return;
1443
+ const { scene, transformer } = renderObject;
1444
+ children.forEach((drawing) => {
1445
+ const drawingKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(drawing);
1446
+ const object = scene.getObjectIncludeInGroup(drawingKey);
1447
+ if (object == null) return true;
1448
+ if (object == null) return;
1449
+ const { transform } = drawing;
1450
+ if (transform == null) return;
1451
+ if (object.classType === _univerjs_engine_render.RENDER_CLASS_TYPE.GROUP) object.transformByState({
1452
+ left: transform.left,
1453
+ top: transform.top
1454
+ });
1455
+ else object.transformByState(transform);
1576
1456
  });
1577
- }
1578
- _applyCache(ctx) {
1579
- if (!ctx || this._cacheCanvas == null) return;
1580
- const cacheCtx = this._cacheCanvas.getContext();
1581
- cacheCtx.save();
1582
- ctx.save();
1583
- ctx.setTransform(1, 0, 0, 1, 0, 0);
1584
- cacheCtx.setTransform(1, 0, 0, 1, 0, 0);
1585
- ctx.drawImage(this._cacheCanvas.getCanvasEle(), 0, 0);
1586
- ctx.restore();
1587
- cacheCtx.restore();
1588
- }
1589
- _initialCacheCanvas() {
1590
- if (this._cacheCanvas != null) return;
1591
- const scene = this.getScene();
1592
- if (scene == null) return;
1593
- this._cacheCanvas = new _univerjs_engine_render.Canvas();
1594
- const engine = scene.getEngine();
1595
- this._cacheCanvas.setSize(engine.width, engine.height);
1596
- engine.onTransformChange$.subscribeEvent(() => {
1597
- var _this$_cacheCanvas4;
1598
- (_this$_cacheCanvas4 = this._cacheCanvas) === null || _this$_cacheCanvas4 === void 0 || _this$_cacheCanvas4.setSize(engine.width, engine.height);
1599
- this.makeDirty(true);
1457
+ const groupKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)(parent);
1458
+ const group = scene.getObject(groupKey);
1459
+ const { width, height } = group;
1460
+ group.getObjects().forEach((object) => {
1461
+ group.removeSelfObjectAndTransform(object.oKey, width, height);
1600
1462
  });
1463
+ group.dispose();
1464
+ transformer.clearSelectedObjects();
1601
1465
  }
1602
- };
1603
-
1604
- //#endregion
1605
- //#region src/controllers/image-cropper.controller.ts
1606
- let ImageCropperController = class ImageCropperController extends _univerjs_core.Disposable {
1607
- constructor(_commandService, _drawingManagerService, _renderManagerService, _univerInstanceService, _messageService, _localeService) {
1608
- super();
1609
- this._commandService = _commandService;
1610
- this._drawingManagerService = _drawingManagerService;
1611
- this._renderManagerService = _renderManagerService;
1612
- this._univerInstanceService = _univerInstanceService;
1613
- this._messageService = _messageService;
1614
- this._localeService = _localeService;
1615
- _defineProperty(this, "_sceneListenerOnImageMap", /* @__PURE__ */ new WeakSet());
1616
- this._init();
1617
- }
1618
- _init() {
1619
- this._initOpenCrop();
1620
- this._initCloseCrop();
1621
- this._initAutoCrop();
1622
- }
1623
- _initAutoCrop() {
1624
- this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1625
- if (command.id !== AutoImageCropOperation.id) return;
1626
- const params = command.params;
1627
- if (params == null) return;
1628
- const { cropType } = params;
1629
- const drawingParams = this._drawingManagerService.getFocusDrawings();
1630
- if (drawingParams.length !== 1) return;
1631
- const { unitId, subUnitId, drawingId } = drawingParams[0];
1632
- const renderObject = this._renderManagerService.getRenderById(unitId);
1633
- const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1634
- if (scene == null) return true;
1635
- if (this._searchCropObject(scene) != null) this._commandService.syncExecuteCommand(CloseImageCropOperation.id, { isAuto: true });
1636
- const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1466
+ _drawingAlign(params) {
1467
+ const { alignType } = params;
1468
+ const drawings = params.drawings || this._drawingManagerService.getFocusDrawings();
1469
+ if (alignType === "0") return;
1470
+ const drawingTransformCaches = [];
1471
+ let minLeft = Number.POSITIVE_INFINITY;
1472
+ let minTop = Number.POSITIVE_INFINITY;
1473
+ let maxRight = Number.NEGATIVE_INFINITY;
1474
+ let maxBottom = Number.NEGATIVE_INFINITY;
1475
+ let drawingCount = 0;
1476
+ drawings.forEach((drawing) => {
1477
+ const { unitId, subUnitId, drawingId, drawingType } = drawing;
1478
+ const drawingParam = this._drawingManagerService.getDrawingByParam({
1637
1479
  unitId,
1638
1480
  subUnitId,
1639
1481
  drawingId
1640
1482
  });
1641
- const imageShape = scene.getObject(imageShapeKey);
1642
- if (!(imageShape instanceof _univerjs_engine_render.Image)) {
1643
- this._messageService.show({
1644
- type: _univerjs_design.MessageType.Error,
1645
- content: this._localeService.t("drawing-ui.image-cropper.error")
1646
- });
1647
- return;
1483
+ if (drawingParam == null || drawingParam.transform == null) return;
1484
+ drawingTransformCaches.push({
1485
+ unitId,
1486
+ subUnitId,
1487
+ drawingId,
1488
+ drawingType,
1489
+ transform: drawingParam.transform
1490
+ });
1491
+ const { left = 0, top = 0, width = 0, height = 0 } = drawingParam.transform;
1492
+ minLeft = Math.min(minLeft, left);
1493
+ minTop = Math.min(minTop, top);
1494
+ maxRight = Math.max(maxRight, left + width);
1495
+ maxBottom = Math.max(maxBottom, top + height);
1496
+ drawingCount++;
1497
+ });
1498
+ if (drawingCount === 0) return;
1499
+ this._sortDrawingTransform(drawingTransformCaches, alignType);
1500
+ this._applyAlignType(drawingTransformCaches, alignType, minLeft, minTop, maxRight, maxBottom, drawingCount);
1501
+ }
1502
+ _applyAlignType(drawingTransformCaches, alignType, minLeft, minTop, maxRight, maxBottom, drawingCount) {
1503
+ const averageHorizon = Math.round((maxRight - minLeft) / drawingCount * 10) / 10;
1504
+ const averageVertical = Math.round((maxBottom - minTop) / drawingCount * 10) / 10;
1505
+ const updateParams = [];
1506
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(drawingTransformCaches[0].unitId);
1507
+ if (renderObject == null) return;
1508
+ const { scene, transformer } = renderObject;
1509
+ drawingTransformCaches.forEach((drawingTransformCache, index) => {
1510
+ const { unitId, subUnitId, drawingId, transform, drawingType } = drawingTransformCache;
1511
+ const { left = 0, top = 0, width = 0, height = 0 } = transform;
1512
+ let newLeft = left;
1513
+ let newTop = top;
1514
+ switch (alignType) {
1515
+ case "1":
1516
+ newLeft = minLeft;
1517
+ break;
1518
+ case "2":
1519
+ newLeft = minLeft + (maxRight - minLeft) / 2 - width / 2;
1520
+ break;
1521
+ case "3":
1522
+ newLeft = maxRight - width;
1523
+ break;
1524
+ case "4":
1525
+ newTop = minTop;
1526
+ break;
1527
+ case "5":
1528
+ newTop = minTop + (maxBottom - minTop) / 2 - height / 2;
1529
+ break;
1530
+ case "6":
1531
+ newTop = maxBottom - height;
1532
+ break;
1533
+ case "7":
1534
+ newLeft = minLeft + averageHorizon * index;
1535
+ break;
1536
+ case "8":
1537
+ newTop = minTop + averageVertical * index;
1538
+ break;
1539
+ default: break;
1648
1540
  }
1649
- if (imageShape == null) return;
1650
- this._updateCropperObject(cropType, imageShape);
1651
- this._commandService.executeCommand(OpenImageCropOperation.id, {
1541
+ if (newLeft !== left || newTop !== top) updateParams.push({
1652
1542
  unitId,
1653
1543
  subUnitId,
1654
- drawingId
1544
+ drawingId,
1545
+ drawingType,
1546
+ transform: {
1547
+ left: newLeft,
1548
+ top: newTop
1549
+ }
1655
1550
  });
1551
+ });
1552
+ this._drawingManagerService.featurePluginUpdateNotification(updateParams);
1553
+ transformer.refreshControls().changeNotification();
1554
+ }
1555
+ _sortDrawingTransform(drawingTransformCaches, alignType) {
1556
+ drawingTransformCaches.sort((a, b) => {
1557
+ const aTransform = a.transform;
1558
+ const bTransform = b.transform;
1559
+ const { left: aLeft = 0, top: aTop = 0, width: aWidth = 0, height: aHeight = 0 } = aTransform;
1560
+ const { left: bLeft = 0, top: bTop = 0, width: bWidth = 0, height: bHeight = 0 } = bTransform;
1561
+ switch (alignType) {
1562
+ case "1": return aLeft - bLeft;
1563
+ case "2": return aLeft + aWidth / 2 - (bLeft + bWidth / 2);
1564
+ case "3": return aLeft + aWidth - (bLeft + bWidth);
1565
+ case "4": return aTop - bTop;
1566
+ case "5": return aTop + aHeight / 2 - (bTop + bHeight / 2);
1567
+ case "6": return aTop + aHeight - (bTop + bHeight);
1568
+ case "7": return aLeft + aWidth / 2 - (bLeft + bWidth / 2);
1569
+ case "8": return aTop + aHeight / 2 - (bTop + bHeight / 2);
1570
+ default: return 0;
1571
+ }
1572
+ });
1573
+ }
1574
+ _drawingArrangeListener() {
1575
+ this.disposeWithMe(this._drawingManagerService.order$.subscribe((params) => {
1576
+ this._drawingArrange(params);
1656
1577
  }));
1657
1578
  }
1658
- _calculateSrcRectByRatio(left, top, width, height, numerator, denominator) {
1659
- const srcRatio = width / height;
1660
- const ratio = numerator / denominator;
1661
- let newWidth = width;
1662
- let newHeight = height;
1663
- if (srcRatio > ratio) newWidth = height * ratio;
1664
- else newHeight = width / ratio;
1665
- const newLeft = (width - newWidth) / 2;
1666
- const newTop = (height - newHeight) / 2;
1667
- return {
1668
- left: (0, _univerjs_engine_render.precisionTo)(newLeft, 1),
1669
- top: (0, _univerjs_engine_render.precisionTo)(newTop, 1),
1670
- right: (0, _univerjs_engine_render.precisionTo)(width - (newLeft + newWidth), 1),
1671
- bottom: (0, _univerjs_engine_render.precisionTo)(height - (newTop + newHeight), 1)
1672
- };
1579
+ _drawingArrange(params) {
1580
+ const { unitId, subUnitId, drawingIds } = params;
1581
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1582
+ if (renderObject == null) return;
1583
+ const { scene } = renderObject;
1584
+ drawingIds.forEach((drawingId) => {
1585
+ const oKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1586
+ unitId,
1587
+ subUnitId,
1588
+ drawingId
1589
+ });
1590
+ const drawingShapes = scene.fuzzyMathObjects(oKey, true);
1591
+ if (drawingShapes == null || drawingShapes.length === 0) return;
1592
+ const index = this._drawingManagerService.getDrawingOrder(unitId, subUnitId).indexOf(drawingId);
1593
+ for (const shape of drawingShapes) {
1594
+ shape.setProps({ zIndex: index });
1595
+ shape.makeDirty();
1596
+ }
1597
+ });
1673
1598
  }
1674
- _updateCropperObject(cropType, imageShape) {
1675
- const { left, top, width, height } = imageShape.calculateTransformWithSrcRect();
1676
- let newSrcRect;
1677
- switch (cropType) {
1678
- case "1":
1679
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 1, 1);
1680
- break;
1681
- case "2":
1682
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 16, 9);
1683
- break;
1684
- case "3":
1685
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 9, 16);
1686
- break;
1687
- case "4":
1688
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 5, 4);
1689
- break;
1690
- case "5":
1691
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 4, 5);
1692
- break;
1693
- case "6":
1694
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 4, 3);
1695
- break;
1696
- case "7":
1697
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 3, 4);
1698
- break;
1699
- case "8":
1700
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 3, 2);
1701
- break;
1702
- case "9":
1703
- newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 2, 3);
1704
- break;
1705
- case "0":
1706
- default: break;
1707
- }
1708
- if (newSrcRect == null) return;
1709
- imageShape.setSrcRect(newSrcRect);
1710
- const { left: newLeft = 0, top: newTop = 0, bottom: newBottom = 0, right: newRight = 0 } = newSrcRect;
1711
- imageShape.transformByStateCloseCropper({
1712
- left: left + newLeft,
1713
- top: top + newTop,
1714
- width: width - newRight - newLeft,
1715
- height: height - newBottom - newTop
1599
+ _drawingAddListener() {
1600
+ this.disposeWithMe(this._drawingManagerService.add$.subscribe((params) => {
1601
+ this._insertDrawing(params);
1602
+ }));
1603
+ }
1604
+ _insertDrawing(params) {
1605
+ const sceneList = [];
1606
+ params.forEach((param) => {
1607
+ const { unitId } = param;
1608
+ if (this._drawingManagerService.getDrawingByParam(param) == null) return;
1609
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1610
+ if (renderObject == null) return;
1611
+ const { scene } = renderObject;
1612
+ if (!sceneList.includes(scene)) sceneList.push(scene);
1613
+ });
1614
+ sceneList.forEach((scene) => {
1615
+ if (this._sceneListenerOnDrawingMap.has(scene)) return;
1616
+ this._addListenerOnDrawing(scene);
1617
+ this._sceneListenerOnDrawingMap.add(scene);
1716
1618
  });
1717
1619
  }
1718
- _initOpenCrop() {
1719
- this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1720
- if (command.id !== OpenImageCropOperation.id) return;
1721
- const params = command.params;
1722
- if (params == null) return;
1723
- const { unitId, subUnitId, drawingId } = params;
1724
- const renderObject = this._renderManagerService.getRenderById(unitId);
1725
- const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1726
- if (scene == null) return true;
1727
- if (!this._sceneListenerOnImageMap.has(scene)) {
1728
- this._addListenerOnImage(scene);
1729
- this._sceneListenerOnImageMap.add(scene);
1730
- }
1731
- if (this._drawingManagerService.getDrawingByParam({
1732
- unitId,
1733
- subUnitId,
1734
- drawingId
1735
- }) == null) return;
1736
- const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1737
- unitId,
1738
- subUnitId,
1739
- drawingId
1620
+ _drawingRemoveListener() {
1621
+ this.disposeWithMe(this._drawingManagerService.remove$.subscribe((params) => {
1622
+ params.forEach((param) => {
1623
+ const { unitId, subUnitId, drawingId } = param;
1624
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1625
+ if (renderObject == null) return;
1626
+ const { scene } = renderObject;
1627
+ if (disposeDrawingRenderObject(scene, {
1628
+ unitId,
1629
+ subUnitId,
1630
+ drawingId
1631
+ })) {
1632
+ var _scene$getTransformer;
1633
+ (_scene$getTransformer = scene.getTransformer()) === null || _scene$getTransformer === void 0 || _scene$getTransformer.clearSelectedObjects();
1634
+ }
1740
1635
  });
1741
- const imageShape = scene.getObject(imageShapeKey);
1742
- if (imageShape == null) return;
1743
- if (!(imageShape instanceof _univerjs_engine_render.Image)) {
1744
- this._messageService.show({
1745
- type: _univerjs_design.MessageType.Error,
1746
- content: this._localeService.t("drawing-ui.image-cropper.error")
1636
+ }));
1637
+ }
1638
+ _drawingUpdateListener() {
1639
+ this.disposeWithMe(this._drawingManagerService.update$.subscribe((params) => {
1640
+ params.forEach((param) => {
1641
+ var _setClipBounds, _scene$getTransformer2;
1642
+ const { unitId, subUnitId, drawingId } = param;
1643
+ const drawingParam = this._drawingManagerService.getDrawingByParam(param);
1644
+ if (drawingParam == null) return;
1645
+ const { transform, drawingType } = drawingParam;
1646
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1647
+ if (renderObject == null) return;
1648
+ const { scene, transformer } = renderObject;
1649
+ if (transform == null) return true;
1650
+ const { left = 0, top = 0, width = 0, height = 0, angle = 0, flipX = false, flipY = false, skewX = 0, skewY = 0 } = transform;
1651
+ const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1652
+ unitId,
1653
+ subUnitId,
1654
+ drawingId
1747
1655
  });
1748
- return;
1749
- }
1750
- const transformer = scene.getTransformer();
1751
- transformer === null || transformer === void 0 || transformer.clearControls();
1752
- const imageCropperObject = new ImageCropperObject(`${imageShapeKey}-crop`, {
1753
- srcRect: imageShape.srcRect,
1754
- prstGeom: imageShape.prstGeom,
1755
- applyTransform: imageShape.calculateTransformWithSrcRect()
1656
+ const drawingShape = scene.getObject(drawingShapeKey);
1657
+ if (drawingShape == null) return true;
1658
+ drawingShape.transformByState({
1659
+ left,
1660
+ top,
1661
+ width,
1662
+ height,
1663
+ angle,
1664
+ flipX,
1665
+ flipY,
1666
+ skewX,
1667
+ skewY
1668
+ });
1669
+ (_setClipBounds = drawingShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(drawingShape, transform.clipBounds);
1670
+ syncDrawingHiddenState(drawingShape, drawingParam);
1671
+ ensureDrawingRenderLayer(scene, drawingShape, drawingParam);
1672
+ (_scene$getTransformer2 = scene.getTransformer()) === null || _scene$getTransformer2 === void 0 || _scene$getTransformer2.debounceRefreshControls();
1756
1673
  });
1757
- scene.addObject(imageCropperObject, imageShape.getLayerIndex() + 1).attachTransformerTo(imageCropperObject);
1758
- transformer === null || transformer === void 0 || transformer.createControlForCopper(imageCropperObject);
1759
- this._addHoverForImageCopper(imageCropperObject);
1760
- imageShape.openRenderByCropper();
1761
- transformer === null || transformer === void 0 || transformer.refreshControls();
1762
- imageCropperObject.makeDirty(true);
1763
- this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, [{
1764
- unitId,
1765
- subUnitId,
1766
- drawingId
1767
- }]);
1768
1674
  }));
1769
1675
  }
1770
- _searchCropObject(scene) {
1771
- const objects = scene.getAllObjectsByOrder();
1772
- for (const object of objects) if (object instanceof ImageCropperObject) return object;
1773
- }
1774
- _initCloseCrop() {
1775
- this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1776
- if (command.id !== CloseImageCropOperation.id) return;
1777
- const currentUnit = this._univerInstanceService.getFocusedUnit();
1778
- if (currentUnit == null) return;
1779
- const unitId = currentUnit.getUnitId();
1780
- const renderObject = this._renderManagerService.getRenderById(unitId);
1781
- const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1782
- if (scene == null) return true;
1783
- const imageCropperObject = this._searchCropObject(scene);
1784
- if (imageCropperObject == null) return;
1785
- const imageShape = this._getApplyObjectByCropObject(imageCropperObject);
1786
- if (imageShape == null) return;
1787
- const transformer = scene.getTransformerByCreate();
1788
- transformer.detachFrom(imageCropperObject);
1789
- transformer.clearCopperControl();
1790
- const srcRect = this._getSrcRectByTransformState(imageShape, imageCropperObject);
1791
- const drawingParam = this._drawingManagerService.getDrawingOKey(imageShape.oKey);
1792
- if (drawingParam != null) {
1793
- const { left, top, height, width } = imageCropperObject;
1794
- this._drawingManagerService.featurePluginUpdateNotification([{
1795
- ...drawingParam,
1796
- transform: {
1797
- ...drawingParam.transform,
1798
- left,
1799
- top,
1800
- height,
1801
- width
1802
- },
1803
- srcRect: srcRect.srcRectAngle
1804
- }]);
1805
- }
1806
- imageShape.setSrcRect({ ...srcRect.srcRectAngle });
1807
- imageShape.closeRenderByCropper();
1808
- imageShape.makeDirty(true);
1809
- imageCropperObject === null || imageCropperObject === void 0 || imageCropperObject.dispose();
1810
- }));
1811
- const sheetUnit$ = this._univerInstanceService.getCurrentTypeOfUnit$(_univerjs_core.UniverInstanceType.UNIVER_SHEET).pipe((0, rxjs.switchMap)((workbook) => workbook ? workbook.activeSheet$ : (0, rxjs.of)(null)));
1812
- this.disposeWithMe(sheetUnit$.subscribe(() => {
1813
- this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
1676
+ _drawingRefreshListener() {
1677
+ this.disposeWithMe(this._drawingManagerService.refreshTransform$.subscribe((params) => {
1678
+ params.forEach((param) => {
1679
+ var _setClipBounds2;
1680
+ const { unitId, subUnitId, drawingId } = param;
1681
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1682
+ if (renderObject == null) return;
1683
+ const drawingParam = this._drawingManagerService.getDrawingByParam(param);
1684
+ if (drawingParam == null) return;
1685
+ const { transform } = drawingParam;
1686
+ const { scene } = renderObject;
1687
+ if (transform == null) return true;
1688
+ const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1689
+ unitId,
1690
+ subUnitId,
1691
+ drawingId
1692
+ });
1693
+ const drawingShape = scene.getObjectIncludeInGroup(drawingShapeKey);
1694
+ const drawingParamWithRefreshMetadata = mergeRefreshMetadata(drawingParam, param);
1695
+ if (drawingShape == null) {
1696
+ if (drawingParamWithRefreshMetadata.hidden === true) return true;
1697
+ this._drawingManagerService.addNotification([{
1698
+ unitId,
1699
+ subUnitId,
1700
+ drawingId
1701
+ }]);
1702
+ return true;
1703
+ }
1704
+ const { left = 0, top = 0, width = 0, height = 0, angle = 0, flipX = false, flipY = false, skewX = 0, skewY = 0 } = transform;
1705
+ drawingShape.transformByState({
1706
+ left,
1707
+ top,
1708
+ width,
1709
+ height,
1710
+ angle,
1711
+ flipX,
1712
+ flipY,
1713
+ skewX,
1714
+ skewY
1715
+ });
1716
+ (_setClipBounds2 = drawingShape.setClipBounds) === null || _setClipBounds2 === void 0 || _setClipBounds2.call(drawingShape, transform.clipBounds);
1717
+ syncDrawingHiddenState(drawingShape, drawingParamWithRefreshMetadata);
1718
+ ensureDrawingRenderLayer(scene, drawingShape, drawingParamWithRefreshMetadata);
1719
+ });
1814
1720
  }));
1815
1721
  }
1816
- _getApplyObjectByCropObject(cropObject) {
1817
- const cropOKey = cropObject.oKey;
1818
- const applyOKey = cropOKey.slice(0, cropOKey.length - 5);
1819
- const scene = cropObject.getScene();
1820
- if (!scene) return null;
1821
- const applyObject = scene.getObject(applyOKey);
1822
- if (applyObject == null) return null;
1823
- return applyObject;
1824
- }
1825
- _addListenerOnImage(scene) {
1826
- const transformer = scene.getTransformerByCreate();
1827
- let startTransform = null;
1828
- this.disposeWithMe(transformer.changeStart$.subscribe((state) => {
1829
- const { objects } = state;
1830
- const cropObject = objects.values().next().value;
1831
- if (cropObject == null || !(cropObject instanceof ImageCropperObject)) return;
1832
- const { left, top, height, width, angle } = cropObject;
1833
- startTransform = {
1834
- left,
1835
- top,
1836
- height,
1837
- width,
1838
- angle
1839
- };
1840
- transformer.clearCopperControl();
1841
- }));
1842
- this.disposeWithMe(transformer.changeEnd$.subscribe((state) => {
1843
- const { objects } = state;
1844
- const cropObject = objects.values().next().value;
1845
- if (cropObject == null || !(cropObject instanceof ImageCropperObject)) return;
1846
- const { left, top, height, width, angle } = cropObject;
1847
- if (!(0, _univerjs_core.checkIfMove)({
1848
- left,
1849
- top,
1850
- height,
1851
- width,
1852
- angle
1853
- }, startTransform)) return;
1854
- const applyObject = this._getApplyObjectByCropObject(cropObject);
1855
- if (applyObject == null) return;
1856
- const srcRect = this._getSrcRectByTransformState(applyObject, cropObject);
1857
- cropObject.refreshSrcRect(srcRect.srcRect, applyObject.getState());
1858
- transformer.createControlForCopper(cropObject);
1722
+ _drawingVisibleListener() {
1723
+ this.disposeWithMe(this._drawingManagerService.visible$.subscribe((params) => {
1724
+ params.forEach((param) => {
1725
+ const { unitId, subUnitId, drawingId, visible } = param;
1726
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1727
+ if (renderObject == null) return;
1728
+ const { scene } = renderObject;
1729
+ const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1730
+ unitId,
1731
+ subUnitId,
1732
+ drawingId
1733
+ });
1734
+ const drawingShape = scene.getObject(drawingShapeKey);
1735
+ if (drawingShape == null) return true;
1736
+ if (visible) drawingShape.show();
1737
+ else drawingShape.hide();
1738
+ });
1859
1739
  }));
1860
- this._endCropListener(scene);
1861
1740
  }
1862
- _addHoverForImageCopper(o) {
1863
- this.disposeWithMe(o.onPointerEnter$.subscribeEvent(() => {
1864
- o.cursor = _univerjs_engine_render.CURSOR_TYPE.MOVE;
1865
- }));
1866
- this.disposeWithMe(o.onPointerLeave$.subscribeEvent(() => {
1867
- o.cursor = _univerjs_engine_render.CURSOR_TYPE.DEFAULT;
1868
- }));
1741
+ _filterUpdateParams(params, startTransforms) {
1742
+ return params.filter((param, index) => {
1743
+ if (param == null) return false;
1744
+ const { transform } = param;
1745
+ return (0, _univerjs_core.checkIfMove)(transform, startTransforms === null || startTransforms === void 0 ? void 0 : startTransforms[index]);
1746
+ });
1869
1747
  }
1870
- _endCropListener(scene) {
1748
+ _addListenerOnDrawing(scene) {
1871
1749
  const transformer = scene.getTransformerByCreate();
1872
- this.disposeWithMe(transformer.clearControl$.subscribe((changeSelf) => {
1873
- if (changeSelf === true) this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
1874
- }));
1875
- }
1876
- _getSrcRectByTransformState(applyObject, imageCropperObject) {
1877
- const { left, top, height, width, strokeWidth, angle: copperAngle } = imageCropperObject;
1878
- const { left: applyLeft, top: applyTop, width: applyWidth, height: applyHeight, angle: applyAngle, strokeWidth: applyStrokeWidth } = applyObject;
1879
- const newLeft = left - applyLeft;
1880
- const newTop = top - applyTop;
1881
- const srcRect = {
1882
- left: newLeft,
1883
- top: newTop,
1884
- right: applyWidth - newLeft - width,
1885
- bottom: applyHeight - newTop - height
1886
- };
1887
- const srcRectAngle = { ...srcRect };
1888
- if (applyAngle !== 0) {
1889
- const centerPoint = new _univerjs_engine_render.Vector2(left + width / 2, top + height / 2);
1890
- const newCenterPoint = new _univerjs_engine_render.Vector2(applyWidth / 2 + applyLeft, applyHeight / 2 + applyTop);
1891
- const vertexPoint = new _univerjs_engine_render.Vector2(applyLeft, applyTop);
1892
- vertexPoint.rotateByPoint((0, _univerjs_engine_render.degToRad)(applyAngle), newCenterPoint);
1893
- const applyFinalPoint = vertexPoint.clone();
1894
- applyFinalPoint.rotateByPoint((0, _univerjs_engine_render.degToRad)(-applyAngle), centerPoint);
1895
- const newAngleLeft = left - applyFinalPoint.x;
1896
- const newAngleTop = top - applyFinalPoint.y;
1897
- srcRectAngle.left = newAngleLeft;
1898
- srcRectAngle.top = newAngleTop;
1899
- srcRectAngle.right = applyWidth - newAngleLeft - width;
1900
- srcRectAngle.bottom = applyHeight - newAngleTop - height;
1901
- }
1902
- return {
1903
- srcRect,
1904
- srcRectAngle
1905
- };
1750
+ let startTransforms = null;
1751
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(transformer.changeStart$.subscribe((state) => {
1752
+ const { objects } = state;
1753
+ const objectArray = Array.from(objects.values());
1754
+ const drawings = [];
1755
+ startTransforms = objectArray.map((object) => {
1756
+ const { left, top, height, width, angle, oKey, isInGroup } = object;
1757
+ const drawing = this._drawingManagerService.getDrawingOKey(oKey);
1758
+ if (isInGroup || object instanceof _univerjs_engine_render.Group) {
1759
+ let group = object.ancestorGroup;
1760
+ if (group == null && object instanceof _univerjs_engine_render.Group) group = object;
1761
+ if (group == null) return null;
1762
+ const groupDrawing = this._drawingManagerService.getDrawingOKey(group.oKey);
1763
+ if (groupDrawing) {
1764
+ const { unitId, subUnitId, drawingId } = groupDrawing;
1765
+ drawings.push({
1766
+ unitId,
1767
+ subUnitId,
1768
+ drawingId
1769
+ });
1770
+ const { left, top, height, width, angle } = group;
1771
+ return {
1772
+ left,
1773
+ top,
1774
+ height,
1775
+ width,
1776
+ angle
1777
+ };
1778
+ }
1779
+ } else if (drawing != null) {
1780
+ const { unitId, subUnitId, drawingId } = drawing;
1781
+ drawings.push({
1782
+ unitId,
1783
+ subUnitId,
1784
+ drawingId
1785
+ });
1786
+ return {
1787
+ left,
1788
+ top,
1789
+ height,
1790
+ width,
1791
+ angle
1792
+ };
1793
+ }
1794
+ return null;
1795
+ }).filter((transform) => transform != null);
1796
+ if (drawings.length > 0) this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, drawings);
1797
+ else this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, []);
1798
+ })));
1799
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(transformer.changeEnd$.subscribe((state) => {
1800
+ const { objects } = state;
1801
+ const params = this._filterUpdateParams(getUpdateParams(objects, this._drawingManagerService), startTransforms);
1802
+ if (params.length > 0) this._drawingManagerService.featurePluginUpdateNotification(params);
1803
+ })));
1906
1804
  }
1907
1805
  };
1908
- ImageCropperController = __decorate([
1909
- __decorateParam(0, _univerjs_core.ICommandService),
1910
- __decorateParam(1, _univerjs_drawing.IDrawingManagerService),
1806
+ DrawingUpdateController = __decorate([
1807
+ __decorateParam(0, _univerjs_core.IUniverInstanceService),
1808
+ __decorateParam(1, _univerjs_core.ICommandService),
1911
1809
  __decorateParam(2, _univerjs_engine_render.IRenderManagerService),
1912
- __decorateParam(3, _univerjs_core.IUniverInstanceService),
1913
- __decorateParam(4, _univerjs_ui.IMessageService),
1914
- __decorateParam(5, (0, _univerjs_core.Inject)(_univerjs_core.LocaleService))
1915
- ], ImageCropperController);
1810
+ __decorateParam(3, _univerjs_drawing.IDrawingManagerService)
1811
+ ], DrawingUpdateController);
1916
1812
 
1917
1813
  //#endregion
1918
- //#region src/controllers/image-update.controller.ts
1919
- let ImageUpdateController = class ImageUpdateController extends _univerjs_core.Disposable {
1920
- constructor(_commandService, _renderManagerService, _drawingManagerService, _dialogService, _imageIoService, _currentUniverService, _drawingRenderService) {
1921
- super();
1922
- this._commandService = _commandService;
1923
- this._renderManagerService = _renderManagerService;
1924
- this._drawingManagerService = _drawingManagerService;
1925
- this._dialogService = _dialogService;
1926
- this._imageIoService = _imageIoService;
1927
- this._currentUniverService = _currentUniverService;
1928
- this._drawingRenderService = _drawingRenderService;
1929
- this._initialize();
1814
+ //#region src/views/crop/image-cropper-object.ts
1815
+ var ImageCropperObject = class extends _univerjs_engine_render.Shape {
1816
+ constructor(key, props) {
1817
+ if (props == null) props = {};
1818
+ props.transformerConfig = {
1819
+ keepRatio: false,
1820
+ isCropper: true,
1821
+ anchorFill: "rgb(0, 0, 0)",
1822
+ anchorStroke: "rgb(255, 255, 255)",
1823
+ anchorSize: 24
1824
+ };
1825
+ super(key, props);
1826
+ _defineProperty(this, "_srcRect", void 0);
1827
+ _defineProperty(this, "_prstGeom", void 0);
1828
+ _defineProperty(this, "_applyTransform", void 0);
1829
+ _defineProperty(this, "_dragPadding", 8);
1830
+ _defineProperty(this, "_cacheCanvas", void 0);
1831
+ if (props === null || props === void 0 ? void 0 : props.srcRect) this._srcRect = props.srcRect;
1832
+ if (props === null || props === void 0 ? void 0 : props.prstGeom) this._prstGeom = props.prstGeom;
1833
+ if (props === null || props === void 0 ? void 0 : props.applyTransform) this._applyTransform = props.applyTransform;
1834
+ if (props === null || props === void 0 ? void 0 : props.dragPadding) this._dragPadding = props.dragPadding;
1835
+ this._applyProps();
1836
+ }
1837
+ refreshSrcRect(value, transform) {
1838
+ this._srcRect = value;
1839
+ this._applyTransform = transform;
1840
+ this._applyProps();
1841
+ }
1842
+ get srcRect() {
1843
+ return this._srcRect;
1930
1844
  }
1931
1845
  dispose() {
1846
+ var _this$_cacheCanvas;
1932
1847
  super.dispose();
1848
+ (_this$_cacheCanvas = this._cacheCanvas) === null || _this$_cacheCanvas === void 0 || _this$_cacheCanvas.dispose();
1849
+ this._srcRect = null;
1933
1850
  }
1934
- _initialize() {
1935
- this._drawingAddListener();
1936
- this._commandExecutedListener();
1937
- this._imageUpdateListener();
1851
+ isHit(coord) {
1852
+ const oCoord = this.getInverseCoord(coord);
1853
+ if (oCoord.x >= -this.strokeWidth / 2 && oCoord.x <= this.width + this.strokeWidth / 2 && oCoord.y >= -this.strokeWidth / 2 && oCoord.y <= this.height + this.strokeWidth / 2 && !this._inSurround(oCoord)) return true;
1854
+ return false;
1938
1855
  }
1939
- _commandExecutedListener() {
1940
- this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1941
- if (command.id === ImageResetSizeOperation.id) {
1942
- const params = command.params;
1943
- if (params == null) return;
1944
- this._resetImageSize(params);
1945
- }
1946
- }));
1856
+ _inSurround(oCoord) {
1857
+ const padding = this._dragPadding;
1858
+ if (oCoord.x >= padding - this.strokeWidth / 2 && oCoord.x <= this.width + this.strokeWidth / 2 - padding && oCoord.y >= padding - this.strokeWidth / 2 && oCoord.y <= this.height + this.strokeWidth / 2 - padding) return true;
1859
+ return false;
1947
1860
  }
1948
- _getSceneAndTransformerByDrawingSearch(unitId) {
1949
- if (unitId == null) return;
1950
- const renderObject = this._renderManagerService.getRenderById(unitId);
1951
- const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1952
- if (scene == null) return null;
1953
- return {
1954
- scene,
1955
- transformer: scene.getTransformerByCreate()
1956
- };
1861
+ render(mainCtx, bounds) {
1862
+ if (!this.visible) {
1863
+ this.makeDirty(false);
1864
+ return this;
1865
+ }
1866
+ mainCtx.save();
1867
+ this._draw(mainCtx);
1868
+ mainCtx.restore();
1869
+ this.makeDirty(false);
1870
+ return this;
1957
1871
  }
1958
- _resetImageSize(params) {
1959
- const updateParams = [];
1960
- const sceneList = [];
1961
- params.forEach((param) => {
1962
- const { unitId, subUnitId, drawingId } = param;
1963
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
1964
- if (renderObject == null) return;
1965
- const { scene } = renderObject;
1966
- const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1967
- unitId,
1968
- subUnitId,
1969
- drawingId
1970
- });
1971
- const imageShape = scene.getObject(imageShapeKey);
1972
- if (imageShape == null) return true;
1973
- const imageData = this._drawingManagerService.getDrawingByParam(param);
1974
- if (imageData == null) return true;
1975
- if (imageData.drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
1976
- imageShape.resetSize();
1977
- const { width, height } = imageShape.getNativeSize();
1978
- if (sceneList.includes(scene) === false) sceneList.push(scene);
1979
- updateParams.push({
1980
- ...imageData,
1981
- transform: {
1982
- ...imageData.transform,
1983
- height,
1984
- width,
1985
- angle: 0
1986
- },
1987
- srcRect: null,
1988
- prstGeom: null
1989
- });
1990
- });
1991
- this._drawingManagerService.featurePluginUpdateNotification(updateParams);
1992
- sceneList.forEach((scene) => {
1993
- scene.getTransformerByCreate().refreshControls().changeNotification();
1872
+ _draw(ctx) {
1873
+ var _this$_cacheCanvas2, _this$_cacheCanvas3;
1874
+ const { width: engineWidth, height: engineHeight } = this.getScene().getEngine();
1875
+ this._initialCacheCanvas();
1876
+ (_this$_cacheCanvas2 = this._cacheCanvas) === null || _this$_cacheCanvas2 === void 0 || _this$_cacheCanvas2.clear();
1877
+ const cacheCtx = (_this$_cacheCanvas3 = this._cacheCanvas) === null || _this$_cacheCanvas3 === void 0 ? void 0 : _this$_cacheCanvas3.getContext();
1878
+ if (cacheCtx == null) return;
1879
+ cacheCtx.save();
1880
+ _univerjs_engine_render.Rect.drawWith(cacheCtx, {
1881
+ left: 0,
1882
+ top: 0,
1883
+ width: engineWidth,
1884
+ height: engineHeight,
1885
+ fill: "rgba(0, 0, 0, 0.5)"
1994
1886
  });
1995
- this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, params);
1887
+ cacheCtx.setTransform(ctx.getTransform());
1888
+ this._clipForApplyObject(cacheCtx);
1889
+ this._applyCache(ctx);
1890
+ cacheCtx.restore();
1996
1891
  }
1997
- _drawingAddListener() {
1998
- this.disposeWithMe(this._drawingManagerService.add$.pipe((0, rxjs.bufferTime)(33), (0, rxjs.filter)((batches) => batches.length > 0), (0, rxjs.map)((batches) => batches.flat()), (0, rxjs.map)((items) => {
1999
- const map = /* @__PURE__ */ new Map();
2000
- for (const it of items) map.set(`${it.unitId}|${it.subUnitId}|${it.drawingId}`, it);
2001
- return [...map.values()];
2002
- }), (0, rxjs.filter)((items) => items.length > 0)).subscribe((uniqueParams) => {
2003
- this._insertImages(uniqueParams);
2004
- }));
1892
+ _clipForApplyObject(cacheCtx) {
1893
+ let objectType = 0;
1894
+ if (this._prstGeom != null) objectType = 1;
1895
+ cacheCtx.globalCompositeOperation = "destination-out";
1896
+ cacheCtx.beginPath();
1897
+ if (objectType === 0) {
1898
+ const m = this.transform.getMatrix();
1899
+ cacheCtx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);
1900
+ cacheCtx.rect(0, 0, this.width, this.height);
1901
+ cacheCtx.fill();
1902
+ }
2005
1903
  }
2006
- _insertImages(params) {
2007
- params.forEach(async (param) => {
2008
- var _getCurrentUnitInfo;
2009
- const { unitId, subUnitId } = param;
2010
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
2011
- const currentSubUnitId = (_getCurrentUnitInfo = getCurrentUnitInfo(this._currentUniverService, unitId)) === null || _getCurrentUnitInfo === void 0 ? void 0 : _getCurrentUnitInfo.subUnitId;
2012
- if (renderObject == null || currentSubUnitId !== subUnitId) return;
2013
- const imageParam = this._drawingManagerService.getDrawingByParam(param);
2014
- if (imageParam == null) return;
2015
- const images = await this._drawingRenderService.renderImages(imageParam, renderObject.scene);
2016
- this._drawingManagerService.refreshTransform([imageParam]);
2017
- if (images == null || images.length === 0) return;
2018
- for (const image of images) {
2019
- this._addHoverForImage(image);
2020
- this._addDialogForImage(image);
2021
- }
1904
+ _applyProps() {
1905
+ if (this._applyTransform == null) return;
1906
+ let cropLeft = 0;
1907
+ let cropTop = 0;
1908
+ let cropRight = 0;
1909
+ let cropBottom = 0;
1910
+ const { left: applyLeft = 0, top: applyTop = 0, width: applyWidth = 0, height: applyHeight = 0, angle } = this._applyTransform;
1911
+ if (this._srcRect != null) {
1912
+ const { left = 0, top = 0, right = 0, bottom = 0 } = this._srcRect;
1913
+ cropLeft = left;
1914
+ cropTop = top;
1915
+ cropRight = right;
1916
+ cropBottom = bottom;
1917
+ }
1918
+ const left = applyLeft + cropLeft;
1919
+ const top = applyTop + cropTop;
1920
+ this.transformByState({
1921
+ left,
1922
+ top,
1923
+ width: applyLeft + applyWidth - cropRight - left,
1924
+ height: applyTop + applyHeight - cropBottom - top,
1925
+ angle
2022
1926
  });
2023
1927
  }
2024
- _imageUpdateListener() {
2025
- this.disposeWithMe(this._drawingManagerService.update$.subscribe((params) => {
2026
- params.forEach((param) => {
2027
- var _setClipBounds;
2028
- const { unitId, subUnitId, drawingId } = param;
2029
- const drawingParam = this._drawingManagerService.getDrawingByParam(param);
2030
- if (drawingParam == null) return;
2031
- const { transform, drawingType, srcRect, prstGeom, source, imageSourceType } = drawingParam;
2032
- if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
2033
- const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
2034
- if (renderObject == null) return;
2035
- const { scene, transformer } = renderObject;
2036
- if (transform == null) return true;
2037
- const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
2038
- unitId,
2039
- subUnitId,
2040
- drawingId
2041
- });
2042
- const imageShape = scene.getObject(drawingShapeKey);
2043
- if (imageShape == null) return true;
2044
- imageShape.transformByState(transform);
2045
- (_setClipBounds = imageShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(imageShape, transform.clipBounds);
2046
- ensureDrawingRenderLayer(scene, imageShape, drawingParam);
2047
- imageShape.setSrcRect(srcRect);
2048
- imageShape.setPrstGeom(prstGeom);
2049
- if (source != null && source.length > 0 && (imageSourceType === _univerjs_core.ImageSourceType.BASE64 || imageSourceType === _univerjs_core.ImageSourceType.URL)) imageShape.changeSource(source);
2050
- });
2051
- }));
2052
- }
2053
- _addHoverForImage(o) {
2054
- this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onPointerEnter$.subscribeEvent(() => {
2055
- o.cursor = _univerjs_engine_render.CURSOR_TYPE.GRAB;
2056
- })));
2057
- this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onPointerLeave$.subscribeEvent(() => {
2058
- o.cursor = _univerjs_engine_render.CURSOR_TYPE.DEFAULT;
2059
- })));
1928
+ _applyCache(ctx) {
1929
+ if (!ctx || this._cacheCanvas == null) return;
1930
+ const cacheCtx = this._cacheCanvas.getContext();
1931
+ cacheCtx.save();
1932
+ ctx.save();
1933
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
1934
+ cacheCtx.setTransform(1, 0, 0, 1, 0, 0);
1935
+ ctx.drawImage(this._cacheCanvas.getCanvasEle(), 0, 0);
1936
+ ctx.restore();
1937
+ cacheCtx.restore();
2060
1938
  }
2061
- _addDialogForImage(o) {
2062
- this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onDblclick$.subscribeEvent(() => {
2063
- const dialogId = `${o.oKey}-viewer-dialog`;
2064
- this._drawingRenderService.previewImage(dialogId, o.getNative().src, o.getNativeSize().width, o.getNativeSize().height);
2065
- })));
1939
+ _initialCacheCanvas() {
1940
+ if (this._cacheCanvas != null) return;
1941
+ const scene = this.getScene();
1942
+ if (scene == null) return;
1943
+ this._cacheCanvas = new _univerjs_engine_render.Canvas();
1944
+ const engine = scene.getEngine();
1945
+ this._cacheCanvas.setSize(engine.width, engine.height);
1946
+ engine.onTransformChange$.subscribeEvent(() => {
1947
+ var _this$_cacheCanvas4;
1948
+ (_this$_cacheCanvas4 = this._cacheCanvas) === null || _this$_cacheCanvas4 === void 0 || _this$_cacheCanvas4.setSize(engine.width, engine.height);
1949
+ this.makeDirty(true);
1950
+ });
2066
1951
  }
2067
1952
  };
2068
- ImageUpdateController = __decorate([
2069
- __decorateParam(0, _univerjs_core.ICommandService),
2070
- __decorateParam(1, _univerjs_engine_render.IRenderManagerService),
2071
- __decorateParam(2, _univerjs_drawing.IDrawingManagerService),
2072
- __decorateParam(3, _univerjs_ui.IDialogService),
2073
- __decorateParam(4, _univerjs_drawing.IImageIoService),
2074
- __decorateParam(5, _univerjs_core.IUniverInstanceService),
2075
- __decorateParam(6, (0, _univerjs_core.Inject)(DrawingRenderService))
2076
- ], ImageUpdateController);
2077
1953
 
2078
1954
  //#endregion
2079
- //#region src/menu/align.menu.ts
2080
- const getMenuStateByDrawingFocusChangedObservable$$1 = (accessor) => {
2081
- const drawingManagerService = accessor.get(_univerjs_drawing.IDrawingManagerService);
2082
- return new rxjs.Observable((subscriber) => {
2083
- const update = (drawings) => {
2084
- if (!drawings || drawings.length === 0) return subscriber.next(true);
2085
- if (drawings.length < 2) return subscriber.next(true);
2086
- subscriber.next(false);
1955
+ //#region src/controllers/image-cropper.controller.ts
1956
+ let ImageCropperController = class ImageCropperController extends _univerjs_core.Disposable {
1957
+ constructor(_commandService, _drawingManagerService, _renderManagerService, _univerInstanceService, _messageService, _localeService) {
1958
+ super();
1959
+ this._commandService = _commandService;
1960
+ this._drawingManagerService = _drawingManagerService;
1961
+ this._renderManagerService = _renderManagerService;
1962
+ this._univerInstanceService = _univerInstanceService;
1963
+ this._messageService = _messageService;
1964
+ this._localeService = _localeService;
1965
+ _defineProperty(this, "_sceneListenerOnImageMap", /* @__PURE__ */ new WeakSet());
1966
+ this._init();
1967
+ }
1968
+ _init() {
1969
+ this._initOpenCrop();
1970
+ this._initCloseCrop();
1971
+ this._initAutoCrop();
1972
+ }
1973
+ _initAutoCrop() {
1974
+ this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
1975
+ if (command.id !== AutoImageCropOperation.id) return;
1976
+ const params = command.params;
1977
+ if (params == null) return;
1978
+ const { cropType } = params;
1979
+ const drawingParams = this._drawingManagerService.getFocusDrawings();
1980
+ if (drawingParams.length !== 1) return;
1981
+ const { unitId, subUnitId, drawingId } = drawingParams[0];
1982
+ const renderObject = this._renderManagerService.getRenderById(unitId);
1983
+ const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
1984
+ if (scene == null) return true;
1985
+ if (this._searchCropObject(scene) != null) this._commandService.syncExecuteCommand(CloseImageCropOperation.id, { isAuto: true });
1986
+ const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
1987
+ unitId,
1988
+ subUnitId,
1989
+ drawingId
1990
+ });
1991
+ const imageShape = scene.getObject(imageShapeKey);
1992
+ if (!(imageShape instanceof _univerjs_engine_render.Image)) {
1993
+ this._messageService.show({
1994
+ type: _univerjs_design.MessageType.Error,
1995
+ content: this._localeService.t("drawing-ui.image-cropper.error")
1996
+ });
1997
+ return;
1998
+ }
1999
+ if (imageShape == null) return;
2000
+ this._updateCropperObject(cropType, imageShape);
2001
+ this._commandService.executeCommand(OpenImageCropOperation.id, {
2002
+ unitId,
2003
+ subUnitId,
2004
+ drawingId
2005
+ });
2006
+ }));
2007
+ }
2008
+ _calculateSrcRectByRatio(left, top, width, height, numerator, denominator) {
2009
+ const srcRatio = width / height;
2010
+ const ratio = numerator / denominator;
2011
+ let newWidth = width;
2012
+ let newHeight = height;
2013
+ if (srcRatio > ratio) newWidth = height * ratio;
2014
+ else newHeight = width / ratio;
2015
+ const newLeft = (width - newWidth) / 2;
2016
+ const newTop = (height - newHeight) / 2;
2017
+ return {
2018
+ left: (0, _univerjs_engine_render.precisionTo)(newLeft, 1),
2019
+ top: (0, _univerjs_engine_render.precisionTo)(newTop, 1),
2020
+ right: (0, _univerjs_engine_render.precisionTo)(width - (newLeft + newWidth), 1),
2021
+ bottom: (0, _univerjs_engine_render.precisionTo)(height - (newTop + newHeight), 1)
2087
2022
  };
2088
- const subscription = drawingManagerService.focus$.subscribe((drawings) => {
2089
- if (!drawings || drawings.length === 0) return subscriber.next(true);
2090
- update(drawings);
2091
- });
2092
- update(drawingManagerService.getFocusDrawings());
2093
- return () => subscription.unsubscribe();
2094
- });
2095
- };
2096
- const DRAWING_ALIGN_CONTEXT_MENU_ID = "contextMenu.drawing-align";
2097
- function DrawingAlignContextMenuItemFactory(accessor) {
2098
- return {
2099
- id: DRAWING_ALIGN_CONTEXT_MENU_ID,
2100
- type: _univerjs_ui.MenuItemType.SUBITEMS,
2101
- icon: "HorizontallyIcon",
2102
- title: "drawing-ui.image-panel.align.title",
2103
- hidden$: getMenuStateByDrawingFocusChangedObservable$$1(accessor)
2104
- };
2105
- }
2106
- function SetDrawingAlignLeftMenuItemFactory() {
2107
- return {
2108
- id: SetDrawingAlignLeftOperation.id,
2109
- type: _univerjs_ui.MenuItemType.BUTTON,
2110
- icon: "LeftJustifyingIcon",
2111
- title: "drawing-ui.image-panel.align.left"
2112
- };
2113
- }
2114
- function SetDrawingAlignCenterMenuItemFactory() {
2115
- return {
2116
- id: SetDrawingAlignCenterOperation.id,
2117
- type: _univerjs_ui.MenuItemType.BUTTON,
2118
- icon: "HorizontallyIcon",
2119
- title: "drawing-ui.image-panel.align.center"
2120
- };
2121
- }
2122
- function SetDrawingAlignRightMenuItemFactory() {
2123
- return {
2124
- id: SetDrawingAlignRightOperation.id,
2125
- type: _univerjs_ui.MenuItemType.BUTTON,
2126
- icon: "RightJustifyingIcon",
2127
- title: "drawing-ui.image-panel.align.right"
2128
- };
2129
- }
2130
- function SetDrawingAlignTopMenuItemFactory() {
2131
- return {
2132
- id: SetDrawingAlignTopOperation.id,
2133
- type: _univerjs_ui.MenuItemType.BUTTON,
2134
- icon: "AlignTopIcon",
2135
- title: "drawing-ui.image-panel.align.top"
2136
- };
2137
- }
2138
- function SetDrawingAlignMiddleMenuItemFactory() {
2139
- return {
2140
- id: SetDrawingAlignMiddleOperation.id,
2141
- type: _univerjs_ui.MenuItemType.BUTTON,
2142
- icon: "VerticalCenterIcon",
2143
- title: "drawing-ui.image-panel.align.middle"
2144
- };
2145
- }
2146
- function SetDrawingAlignBottomMenuItemFactory() {
2147
- return {
2148
- id: SetDrawingAlignBottomOperation.id,
2149
- type: _univerjs_ui.MenuItemType.BUTTON,
2150
- icon: "AlignBottomIcon",
2151
- title: "drawing-ui.image-panel.align.bottom"
2152
- };
2153
- }
2154
- function SetDrawingAlignHorizonMenuItemFactory() {
2155
- return {
2156
- id: SetDrawingAlignHorizonOperation.id,
2157
- type: _univerjs_ui.MenuItemType.BUTTON,
2158
- icon: "HorizontallyIcon",
2159
- title: "drawing-ui.image-panel.align.horizon"
2160
- };
2161
- }
2162
- function SetDrawingAlignVerticalMenuItemFactory() {
2163
- return {
2164
- id: SetDrawingAlignVerticalOperation.id,
2165
- type: _univerjs_ui.MenuItemType.BUTTON,
2166
- icon: "VerticalCenterIcon",
2167
- title: "drawing-ui.image-panel.align.vertical"
2168
- };
2169
- }
2170
-
2171
- //#endregion
2172
- //#region src/menu/arrange.menu.ts
2173
- const DRAWING_ARRANGE_CONTEXT_MENU_ID = "contextMenu.drawing-arrange";
2174
- function DrawingArrangeContextMenuItemFactory() {
2175
- return {
2176
- id: DRAWING_ARRANGE_CONTEXT_MENU_ID,
2177
- type: _univerjs_ui.MenuItemType.SUBITEMS,
2178
- icon: "TopmostIcon",
2179
- title: "drawing-ui.image-panel.arrange.title"
2180
- };
2181
- }
2182
- function SetDrawingArrangeFrontMenuItemFactory() {
2183
- return {
2184
- id: SetDrawingArrangeFrontOperation.id,
2185
- type: _univerjs_ui.MenuItemType.BUTTON,
2186
- icon: "TopmostIcon",
2187
- title: "drawing-ui.image-panel.arrange.front"
2188
- };
2189
- }
2190
- function SetDrawingArrangeForwardMenuItemFactory() {
2191
- return {
2192
- id: SetDrawingArrangeForwardOperation.id,
2193
- type: _univerjs_ui.MenuItemType.BUTTON,
2194
- icon: "MoveUpIcon",
2195
- title: "drawing-ui.image-panel.arrange.forward"
2196
- };
2197
- }
2198
- function SetDrawingArrangeBackMenuItemFactory() {
2199
- return {
2200
- id: SetDrawingArrangeBackOperation.id,
2201
- type: _univerjs_ui.MenuItemType.BUTTON,
2202
- icon: "BottomIcon",
2203
- title: "drawing-ui.image-panel.arrange.back"
2204
- };
2205
- }
2206
- function SetDrawingArrangeBackwardMenuItemFactory() {
2207
- return {
2208
- id: SetDrawingArrangeBackwardOperation.id,
2209
- type: _univerjs_ui.MenuItemType.BUTTON,
2210
- icon: "MoveDownIcon",
2211
- title: "drawing-ui.image-panel.arrange.backward"
2212
- };
2213
- }
2214
-
2215
- //#endregion
2216
- //#region src/menu/group.menu.ts
2217
- function getMenuStateByDrawingFocusChangedObservable$(accessor, type) {
2218
- const drawingManagerService = accessor.get(_univerjs_drawing.IDrawingManagerService);
2219
- return new rxjs.Observable((subscriber) => {
2220
- const update = (drawings) => {
2221
- if (!drawings || drawings.length === 0) return subscriber.next(true);
2222
- if (type === "group") {
2223
- if (drawings.length < 2) return subscriber.next(true);
2224
- if (!drawings.every((drawing) => DRAWING_GROUP_TYPES.includes(drawing.drawingType))) return subscriber.next(true);
2225
- } else if (type === "unGroup") {
2226
- if (drawings.filter((drawing) => drawing.drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_GROUP).length === 0) return subscriber.next(true);
2227
- } else if (!drawings.every((drawing) => DRAWING_GROUP_TYPES.includes(drawing.drawingType))) return subscriber.next(true);
2228
- subscriber.next(false);
2229
- };
2230
- const subscription = drawingManagerService.focus$.subscribe((drawings) => {
2231
- if (!drawings || drawings.length === 0) return subscriber.next(true);
2232
- update(drawings);
2023
+ }
2024
+ _updateCropperObject(cropType, imageShape) {
2025
+ const { left, top, width, height } = imageShape.calculateTransformWithSrcRect();
2026
+ let newSrcRect;
2027
+ switch (cropType) {
2028
+ case "1":
2029
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 1, 1);
2030
+ break;
2031
+ case "2":
2032
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 16, 9);
2033
+ break;
2034
+ case "3":
2035
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 9, 16);
2036
+ break;
2037
+ case "4":
2038
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 5, 4);
2039
+ break;
2040
+ case "5":
2041
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 4, 5);
2042
+ break;
2043
+ case "6":
2044
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 4, 3);
2045
+ break;
2046
+ case "7":
2047
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 3, 4);
2048
+ break;
2049
+ case "8":
2050
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 3, 2);
2051
+ break;
2052
+ case "9":
2053
+ newSrcRect = this._calculateSrcRectByRatio(left, top, width, height, 2, 3);
2054
+ break;
2055
+ case "0":
2056
+ default: break;
2057
+ }
2058
+ if (newSrcRect == null) return;
2059
+ imageShape.setSrcRect(newSrcRect);
2060
+ const { left: newLeft = 0, top: newTop = 0, bottom: newBottom = 0, right: newRight = 0 } = newSrcRect;
2061
+ imageShape.transformByStateCloseCropper({
2062
+ left: left + newLeft,
2063
+ top: top + newTop,
2064
+ width: width - newRight - newLeft,
2065
+ height: height - newBottom - newTop
2233
2066
  });
2234
- update(drawingManagerService.getFocusDrawings());
2235
- return () => subscription.unsubscribe();
2236
- });
2237
- }
2238
- const DRAWING_GROUP_CONTEXT_MENU_ID = "contextMenu.drawing-group";
2239
- function DrawingGroupContextMenuItemFactory(accessor) {
2240
- return {
2241
- id: DRAWING_GROUP_CONTEXT_MENU_ID,
2242
- type: _univerjs_ui.MenuItemType.SUBITEMS,
2243
- icon: "GroupIcon",
2244
- title: "drawing-ui.image-panel.group.title",
2245
- hidden$: getMenuStateByDrawingFocusChangedObservable$(accessor)
2246
- };
2247
- }
2248
- function SetDrawingGroupMenuItemFactory(accessor) {
2249
- return {
2250
- id: SetDrawingGroupOperation.id,
2251
- type: _univerjs_ui.MenuItemType.BUTTON,
2252
- icon: "GroupIcon",
2253
- title: "drawing-ui.image-panel.group.group",
2254
- disabled$: getMenuStateByDrawingFocusChangedObservable$(accessor, "group")
2255
- };
2256
- }
2257
- function CancelDrawingGroupMenuItemFactory(accessor) {
2258
- return {
2259
- id: CancelDrawingGroupOperation.id,
2260
- type: _univerjs_ui.MenuItemType.BUTTON,
2261
- icon: "UngroupIcon",
2262
- title: "drawing-ui.image-panel.group.unGroup",
2263
- disabled$: getMenuStateByDrawingFocusChangedObservable$(accessor, "unGroup")
2264
- };
2265
- }
2067
+ }
2068
+ _initOpenCrop() {
2069
+ this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
2070
+ if (command.id !== OpenImageCropOperation.id) return;
2071
+ const params = command.params;
2072
+ if (params == null) return;
2073
+ const { unitId, subUnitId, drawingId } = params;
2074
+ const renderObject = this._renderManagerService.getRenderById(unitId);
2075
+ const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
2076
+ if (scene == null) return true;
2077
+ if (!this._sceneListenerOnImageMap.has(scene)) {
2078
+ this._addListenerOnImage(scene);
2079
+ this._sceneListenerOnImageMap.add(scene);
2080
+ }
2081
+ if (this._drawingManagerService.getDrawingByParam({
2082
+ unitId,
2083
+ subUnitId,
2084
+ drawingId
2085
+ }) == null) return;
2086
+ const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
2087
+ unitId,
2088
+ subUnitId,
2089
+ drawingId
2090
+ });
2091
+ const imageShape = scene.getObject(imageShapeKey);
2092
+ if (imageShape == null) return;
2093
+ if (!(imageShape instanceof _univerjs_engine_render.Image)) {
2094
+ this._messageService.show({
2095
+ type: _univerjs_design.MessageType.Error,
2096
+ content: this._localeService.t("drawing-ui.image-cropper.error")
2097
+ });
2098
+ return;
2099
+ }
2100
+ const transformer = scene.getTransformer();
2101
+ transformer === null || transformer === void 0 || transformer.clearControls();
2102
+ const imageCropperObject = new ImageCropperObject(`${imageShapeKey}-crop`, {
2103
+ srcRect: imageShape.srcRect,
2104
+ prstGeom: imageShape.prstGeom,
2105
+ applyTransform: imageShape.calculateTransformWithSrcRect()
2106
+ });
2107
+ scene.addObject(imageCropperObject, imageShape.getLayerIndex() + 1).attachTransformerTo(imageCropperObject);
2108
+ transformer === null || transformer === void 0 || transformer.createControlForCopper(imageCropperObject);
2109
+ this._addHoverForImageCopper(imageCropperObject);
2110
+ imageShape.openRenderByCropper();
2111
+ transformer === null || transformer === void 0 || transformer.refreshControls();
2112
+ imageCropperObject.makeDirty(true);
2113
+ this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, [{
2114
+ unitId,
2115
+ subUnitId,
2116
+ drawingId
2117
+ }]);
2118
+ }));
2119
+ }
2120
+ _searchCropObject(scene) {
2121
+ const objects = scene.getAllObjectsByOrder();
2122
+ for (const object of objects) if (object instanceof ImageCropperObject) return object;
2123
+ }
2124
+ _initCloseCrop() {
2125
+ this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
2126
+ if (command.id !== CloseImageCropOperation.id) return;
2127
+ const currentUnit = this._univerInstanceService.getFocusedUnit();
2128
+ if (currentUnit == null) return;
2129
+ const unitId = currentUnit.getUnitId();
2130
+ const renderObject = this._renderManagerService.getRenderById(unitId);
2131
+ const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
2132
+ if (scene == null) return true;
2133
+ const imageCropperObject = this._searchCropObject(scene);
2134
+ if (imageCropperObject == null) return;
2135
+ const imageShape = this._getApplyObjectByCropObject(imageCropperObject);
2136
+ if (imageShape == null) return;
2137
+ const transformer = scene.getTransformerByCreate();
2138
+ transformer.detachFrom(imageCropperObject);
2139
+ transformer.clearCopperControl();
2140
+ const srcRect = this._getSrcRectByTransformState(imageShape, imageCropperObject);
2141
+ const drawingParam = this._drawingManagerService.getDrawingOKey(imageShape.oKey);
2142
+ if (drawingParam != null) {
2143
+ const { left, top, height, width } = imageCropperObject;
2144
+ this._drawingManagerService.featurePluginUpdateNotification([{
2145
+ ...drawingParam,
2146
+ transform: {
2147
+ ...drawingParam.transform,
2148
+ left,
2149
+ top,
2150
+ height,
2151
+ width
2152
+ },
2153
+ srcRect: srcRect.srcRectAngle
2154
+ }]);
2155
+ }
2156
+ imageShape.setSrcRect({ ...srcRect.srcRectAngle });
2157
+ imageShape.closeRenderByCropper();
2158
+ imageShape.makeDirty(true);
2159
+ imageCropperObject === null || imageCropperObject === void 0 || imageCropperObject.dispose();
2160
+ }));
2161
+ const sheetUnit$ = this._univerInstanceService.getCurrentTypeOfUnit$(_univerjs_core.UniverInstanceType.UNIVER_SHEET).pipe((0, rxjs.switchMap)((workbook) => workbook ? workbook.activeSheet$ : (0, rxjs.of)(null)));
2162
+ this.disposeWithMe(sheetUnit$.subscribe(() => {
2163
+ this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
2164
+ }));
2165
+ }
2166
+ _getApplyObjectByCropObject(cropObject) {
2167
+ const cropOKey = cropObject.oKey;
2168
+ const applyOKey = cropOKey.slice(0, cropOKey.length - 5);
2169
+ const scene = cropObject.getScene();
2170
+ if (!scene) return null;
2171
+ const applyObject = scene.getObject(applyOKey);
2172
+ if (applyObject == null) return null;
2173
+ return applyObject;
2174
+ }
2175
+ _addListenerOnImage(scene) {
2176
+ const transformer = scene.getTransformerByCreate();
2177
+ let startTransform = null;
2178
+ this.disposeWithMe(transformer.changeStart$.subscribe((state) => {
2179
+ const { objects } = state;
2180
+ const cropObject = objects.values().next().value;
2181
+ if (cropObject == null || !(cropObject instanceof ImageCropperObject)) return;
2182
+ const { left, top, height, width, angle } = cropObject;
2183
+ startTransform = {
2184
+ left,
2185
+ top,
2186
+ height,
2187
+ width,
2188
+ angle
2189
+ };
2190
+ transformer.clearCopperControl();
2191
+ }));
2192
+ this.disposeWithMe(transformer.changeEnd$.subscribe((state) => {
2193
+ const { objects } = state;
2194
+ const cropObject = objects.values().next().value;
2195
+ if (cropObject == null || !(cropObject instanceof ImageCropperObject)) return;
2196
+ const { left, top, height, width, angle } = cropObject;
2197
+ if (!(0, _univerjs_core.checkIfMove)({
2198
+ left,
2199
+ top,
2200
+ height,
2201
+ width,
2202
+ angle
2203
+ }, startTransform)) return;
2204
+ const applyObject = this._getApplyObjectByCropObject(cropObject);
2205
+ if (applyObject == null) return;
2206
+ const srcRect = this._getSrcRectByTransformState(applyObject, cropObject);
2207
+ cropObject.refreshSrcRect(srcRect.srcRect, applyObject.getState());
2208
+ transformer.createControlForCopper(cropObject);
2209
+ }));
2210
+ this._endCropListener(scene);
2211
+ }
2212
+ _addHoverForImageCopper(o) {
2213
+ this.disposeWithMe(o.onPointerEnter$.subscribeEvent(() => {
2214
+ o.cursor = _univerjs_engine_render.CURSOR_TYPE.MOVE;
2215
+ }));
2216
+ this.disposeWithMe(o.onPointerLeave$.subscribeEvent(() => {
2217
+ o.cursor = _univerjs_engine_render.CURSOR_TYPE.DEFAULT;
2218
+ }));
2219
+ }
2220
+ _endCropListener(scene) {
2221
+ const transformer = scene.getTransformerByCreate();
2222
+ this.disposeWithMe(transformer.clearControl$.subscribe((changeSelf) => {
2223
+ if (changeSelf === true) this._commandService.syncExecuteCommand(CloseImageCropOperation.id);
2224
+ }));
2225
+ }
2226
+ _getSrcRectByTransformState(applyObject, imageCropperObject) {
2227
+ const { left, top, height, width, strokeWidth, angle: copperAngle } = imageCropperObject;
2228
+ const { left: applyLeft, top: applyTop, width: applyWidth, height: applyHeight, angle: applyAngle, strokeWidth: applyStrokeWidth } = applyObject;
2229
+ const newLeft = left - applyLeft;
2230
+ const newTop = top - applyTop;
2231
+ const srcRect = {
2232
+ left: newLeft,
2233
+ top: newTop,
2234
+ right: applyWidth - newLeft - width,
2235
+ bottom: applyHeight - newTop - height
2236
+ };
2237
+ const srcRectAngle = { ...srcRect };
2238
+ if (applyAngle !== 0) {
2239
+ const centerPoint = new _univerjs_engine_render.Vector2(left + width / 2, top + height / 2);
2240
+ const newCenterPoint = new _univerjs_engine_render.Vector2(applyWidth / 2 + applyLeft, applyHeight / 2 + applyTop);
2241
+ const vertexPoint = new _univerjs_engine_render.Vector2(applyLeft, applyTop);
2242
+ vertexPoint.rotateByPoint((0, _univerjs_engine_render.degToRad)(applyAngle), newCenterPoint);
2243
+ const applyFinalPoint = vertexPoint.clone();
2244
+ applyFinalPoint.rotateByPoint((0, _univerjs_engine_render.degToRad)(-applyAngle), centerPoint);
2245
+ const newAngleLeft = left - applyFinalPoint.x;
2246
+ const newAngleTop = top - applyFinalPoint.y;
2247
+ srcRectAngle.left = newAngleLeft;
2248
+ srcRectAngle.top = newAngleTop;
2249
+ srcRectAngle.right = applyWidth - newAngleLeft - width;
2250
+ srcRectAngle.bottom = applyHeight - newAngleTop - height;
2251
+ }
2252
+ return {
2253
+ srcRect,
2254
+ srcRectAngle
2255
+ };
2256
+ }
2257
+ };
2258
+ ImageCropperController = __decorate([
2259
+ __decorateParam(0, _univerjs_core.ICommandService),
2260
+ __decorateParam(1, _univerjs_drawing.IDrawingManagerService),
2261
+ __decorateParam(2, _univerjs_engine_render.IRenderManagerService),
2262
+ __decorateParam(3, _univerjs_core.IUniverInstanceService),
2263
+ __decorateParam(4, _univerjs_ui.IMessageService),
2264
+ __decorateParam(5, (0, _univerjs_core.Inject)(_univerjs_core.LocaleService))
2265
+ ], ImageCropperController);
2266
2266
 
2267
2267
  //#endregion
2268
- //#region src/menu/schema.ts
2269
- const menuSchema = { [_univerjs_ui.ContextMenuPosition.DRAWING]: { [_univerjs_ui.ContextMenuGroup.OTHERS]: {
2270
- [DRAWING_GROUP_CONTEXT_MENU_ID]: {
2271
- order: 1,
2272
- menuItemFactory: DrawingGroupContextMenuItemFactory,
2273
- [SetDrawingGroupOperation.id]: {
2274
- order: 0,
2275
- menuItemFactory: SetDrawingGroupMenuItemFactory
2276
- },
2277
- [CancelDrawingGroupOperation.id]: {
2278
- order: 1,
2279
- menuItemFactory: CancelDrawingGroupMenuItemFactory
2280
- }
2281
- },
2282
- [DRAWING_ARRANGE_CONTEXT_MENU_ID]: {
2283
- order: 2,
2284
- menuItemFactory: DrawingArrangeContextMenuItemFactory,
2285
- [SetDrawingArrangeFrontOperation.id]: {
2286
- order: 0,
2287
- menuItemFactory: SetDrawingArrangeFrontMenuItemFactory
2288
- },
2289
- [SetDrawingArrangeForwardOperation.id]: {
2290
- order: 1,
2291
- menuItemFactory: SetDrawingArrangeForwardMenuItemFactory
2292
- },
2293
- [SetDrawingArrangeBackOperation.id]: {
2294
- order: 2,
2295
- menuItemFactory: SetDrawingArrangeBackMenuItemFactory
2296
- },
2297
- [SetDrawingArrangeBackwardOperation.id]: {
2298
- order: 3,
2299
- menuItemFactory: SetDrawingArrangeBackwardMenuItemFactory
2300
- }
2301
- },
2302
- [DRAWING_ALIGN_CONTEXT_MENU_ID]: {
2303
- order: 3,
2304
- menuItemFactory: DrawingAlignContextMenuItemFactory,
2305
- [SetDrawingAlignLeftOperation.id]: {
2306
- order: 0,
2307
- menuItemFactory: SetDrawingAlignLeftMenuItemFactory
2308
- },
2309
- [SetDrawingAlignCenterOperation.id]: {
2310
- order: 1,
2311
- menuItemFactory: SetDrawingAlignCenterMenuItemFactory
2312
- },
2313
- [SetDrawingAlignRightOperation.id]: {
2314
- order: 2,
2315
- menuItemFactory: SetDrawingAlignRightMenuItemFactory
2316
- },
2317
- [SetDrawingAlignTopOperation.id]: {
2318
- order: 3,
2319
- menuItemFactory: SetDrawingAlignTopMenuItemFactory
2320
- },
2321
- [SetDrawingAlignMiddleOperation.id]: {
2322
- order: 4,
2323
- menuItemFactory: SetDrawingAlignMiddleMenuItemFactory
2324
- },
2325
- [SetDrawingAlignBottomOperation.id]: {
2326
- order: 5,
2327
- menuItemFactory: SetDrawingAlignBottomMenuItemFactory
2328
- },
2329
- [SetDrawingAlignHorizonOperation.id]: {
2330
- order: 6,
2331
- menuItemFactory: SetDrawingAlignHorizonMenuItemFactory
2332
- },
2333
- [SetDrawingAlignVerticalOperation.id]: {
2334
- order: 7,
2335
- menuItemFactory: SetDrawingAlignVerticalMenuItemFactory
2336
- }
2268
+ //#region src/controllers/image-update.controller.ts
2269
+ let ImageUpdateController = class ImageUpdateController extends _univerjs_core.Disposable {
2270
+ constructor(_commandService, _renderManagerService, _drawingManagerService, _dialogService, _imageIoService, _currentUniverService, _drawingRenderService) {
2271
+ super();
2272
+ this._commandService = _commandService;
2273
+ this._renderManagerService = _renderManagerService;
2274
+ this._drawingManagerService = _drawingManagerService;
2275
+ this._dialogService = _dialogService;
2276
+ this._imageIoService = _imageIoService;
2277
+ this._currentUniverService = _currentUniverService;
2278
+ this._drawingRenderService = _drawingRenderService;
2279
+ this._initialize();
2337
2280
  }
2338
- } } };
2281
+ dispose() {
2282
+ super.dispose();
2283
+ }
2284
+ _initialize() {
2285
+ this._drawingAddListener();
2286
+ this._commandExecutedListener();
2287
+ this._imageUpdateListener();
2288
+ }
2289
+ _commandExecutedListener() {
2290
+ this.disposeWithMe(this._commandService.onCommandExecuted((command) => {
2291
+ if (command.id === ImageResetSizeOperation.id) {
2292
+ const params = command.params;
2293
+ if (params == null) return;
2294
+ this._resetImageSize(params);
2295
+ }
2296
+ }));
2297
+ }
2298
+ _getSceneAndTransformerByDrawingSearch(unitId) {
2299
+ if (unitId == null) return;
2300
+ const renderObject = this._renderManagerService.getRenderById(unitId);
2301
+ const scene = renderObject === null || renderObject === void 0 ? void 0 : renderObject.scene;
2302
+ if (scene == null) return null;
2303
+ return {
2304
+ scene,
2305
+ transformer: scene.getTransformerByCreate()
2306
+ };
2307
+ }
2308
+ _resetImageSize(params) {
2309
+ const updateParams = [];
2310
+ const sceneList = [];
2311
+ params.forEach((param) => {
2312
+ const { unitId, subUnitId, drawingId } = param;
2313
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
2314
+ if (renderObject == null) return;
2315
+ const { scene } = renderObject;
2316
+ const imageShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
2317
+ unitId,
2318
+ subUnitId,
2319
+ drawingId
2320
+ });
2321
+ const imageShape = scene.getObject(imageShapeKey);
2322
+ if (imageShape == null) return true;
2323
+ const imageData = this._drawingManagerService.getDrawingByParam(param);
2324
+ if (imageData == null) return true;
2325
+ if (imageData.drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
2326
+ imageShape.resetSize();
2327
+ const { width, height } = imageShape.getNativeSize();
2328
+ if (sceneList.includes(scene) === false) sceneList.push(scene);
2329
+ updateParams.push({
2330
+ ...imageData,
2331
+ transform: {
2332
+ ...imageData.transform,
2333
+ height,
2334
+ width,
2335
+ angle: 0
2336
+ },
2337
+ srcRect: null,
2338
+ prstGeom: null
2339
+ });
2340
+ });
2341
+ this._drawingManagerService.featurePluginUpdateNotification(updateParams);
2342
+ sceneList.forEach((scene) => {
2343
+ scene.getTransformerByCreate().refreshControls().changeNotification();
2344
+ });
2345
+ this._commandService.syncExecuteCommand(_univerjs_drawing.SetDrawingSelectedOperation.id, params);
2346
+ }
2347
+ _drawingAddListener() {
2348
+ this.disposeWithMe(this._drawingManagerService.add$.pipe((0, rxjs.bufferTime)(33), (0, rxjs.filter)((batches) => batches.length > 0), (0, rxjs.map)((batches) => batches.flat()), (0, rxjs.map)((items) => {
2349
+ const map = /* @__PURE__ */ new Map();
2350
+ for (const it of items) map.set(`${it.unitId}|${it.subUnitId}|${it.drawingId}`, it);
2351
+ return [...map.values()];
2352
+ }), (0, rxjs.filter)((items) => items.length > 0)).subscribe((uniqueParams) => {
2353
+ this._insertImages(uniqueParams);
2354
+ }));
2355
+ }
2356
+ _insertImages(params) {
2357
+ params.forEach(async (param) => {
2358
+ var _getCurrentUnitInfo;
2359
+ const { unitId, subUnitId } = param;
2360
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
2361
+ const currentSubUnitId = (_getCurrentUnitInfo = getCurrentUnitInfo(this._currentUniverService, unitId)) === null || _getCurrentUnitInfo === void 0 ? void 0 : _getCurrentUnitInfo.subUnitId;
2362
+ if (renderObject == null || currentSubUnitId !== subUnitId) return;
2363
+ const imageParam = this._drawingManagerService.getDrawingByParam(param);
2364
+ if (imageParam == null) return;
2365
+ const images = await this._drawingRenderService.renderImages(imageParam, renderObject.scene);
2366
+ this._drawingManagerService.refreshTransform([imageParam]);
2367
+ if (images == null || images.length === 0) return;
2368
+ for (const image of images) {
2369
+ this._addHoverForImage(image);
2370
+ this._addDialogForImage(image);
2371
+ }
2372
+ });
2373
+ }
2374
+ _imageUpdateListener() {
2375
+ this.disposeWithMe(this._drawingManagerService.update$.subscribe((params) => {
2376
+ params.forEach((param) => {
2377
+ var _setClipBounds;
2378
+ const { unitId, subUnitId, drawingId } = param;
2379
+ const drawingParam = this._drawingManagerService.getDrawingByParam(param);
2380
+ if (drawingParam == null) return;
2381
+ const { transform, drawingType, srcRect, prstGeom, source, imageSourceType } = drawingParam;
2382
+ if (drawingType !== _univerjs_core.DrawingTypeEnum.DRAWING_IMAGE) return;
2383
+ const renderObject = this._getSceneAndTransformerByDrawingSearch(unitId);
2384
+ if (renderObject == null) return;
2385
+ const { scene, transformer } = renderObject;
2386
+ if (transform == null) return true;
2387
+ const drawingShapeKey = (0, _univerjs_drawing.getDrawingShapeKeyByDrawingSearch)({
2388
+ unitId,
2389
+ subUnitId,
2390
+ drawingId
2391
+ });
2392
+ const imageShape = scene.getObject(drawingShapeKey);
2393
+ if (imageShape == null) return true;
2394
+ imageShape.transformByState(transform);
2395
+ (_setClipBounds = imageShape.setClipBounds) === null || _setClipBounds === void 0 || _setClipBounds.call(imageShape, transform.clipBounds);
2396
+ ensureDrawingRenderLayer(scene, imageShape, drawingParam);
2397
+ imageShape.setSrcRect(srcRect);
2398
+ imageShape.setPrstGeom(prstGeom);
2399
+ if (source != null && source.length > 0 && (imageSourceType === _univerjs_core.ImageSourceType.BASE64 || imageSourceType === _univerjs_core.ImageSourceType.URL)) imageShape.changeSource(source);
2400
+ });
2401
+ }));
2402
+ }
2403
+ _addHoverForImage(o) {
2404
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onPointerEnter$.subscribeEvent(() => {
2405
+ o.cursor = _univerjs_engine_render.CURSOR_TYPE.GRAB;
2406
+ })));
2407
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onPointerLeave$.subscribeEvent(() => {
2408
+ o.cursor = _univerjs_engine_render.CURSOR_TYPE.DEFAULT;
2409
+ })));
2410
+ }
2411
+ _addDialogForImage(o) {
2412
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(o.onDblclick$.subscribeEvent(() => {
2413
+ const dialogId = `${o.oKey}-viewer-dialog`;
2414
+ this._drawingRenderService.previewImage(dialogId, o.getNative().src, o.getNativeSize().width, o.getNativeSize().height);
2415
+ })));
2416
+ }
2417
+ };
2418
+ ImageUpdateController = __decorate([
2419
+ __decorateParam(0, _univerjs_core.ICommandService),
2420
+ __decorateParam(1, _univerjs_engine_render.IRenderManagerService),
2421
+ __decorateParam(2, _univerjs_drawing.IDrawingManagerService),
2422
+ __decorateParam(3, _univerjs_ui.IDialogService),
2423
+ __decorateParam(4, _univerjs_core.IImageIoService),
2424
+ __decorateParam(5, _univerjs_core.IUniverInstanceService),
2425
+ __decorateParam(6, (0, _univerjs_core.Inject)(DrawingRenderService))
2426
+ ], ImageUpdateController);
2339
2427
 
2340
2428
  //#endregion
2341
2429
  //#region src/controllers/ui.controller.ts
@@ -2434,6 +2522,482 @@ _defineProperty(UniverDrawingUIPlugin, "packageName", name);
2434
2522
  _defineProperty(UniverDrawingUIPlugin, "version", version);
2435
2523
  UniverDrawingUIPlugin = __decorate([__decorateParam(1, (0, _univerjs_core.Inject)(_univerjs_core.Injector)), __decorateParam(2, _univerjs_core.IConfigService)], UniverDrawingUIPlugin);
2436
2524
 
2525
+ //#endregion
2526
+ //#region src/views/object-list-panel/object-list-panel-layer.ts
2527
+ const OBJECT_LIST_FLOATING_SECTION_ID = "floating";
2528
+ const OBJECT_LIST_CANVAS_SECTION_ID = "canvas";
2529
+ function isFloatingObjectListDrawingType(drawingType) {
2530
+ return drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_CHART || drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_DOM || drawingType === _univerjs_core.DrawingTypeEnum.DRAWING_UNIT;
2531
+ }
2532
+ function getObjectListPanelSectionIdForDrawingType(drawingType) {
2533
+ return isFloatingObjectListDrawingType(drawingType) ? OBJECT_LIST_FLOATING_SECTION_ID : OBJECT_LIST_CANVAS_SECTION_ID;
2534
+ }
2535
+
2536
+ //#endregion
2537
+ //#region src/views/object-list-panel/ObjectListPanelBase.tsx
2538
+ const objectListPanelLabelKeys = {
2539
+ title: "drawing-ui.objectListPanel.title",
2540
+ empty: "drawing-ui.objectListPanel.empty",
2541
+ showAll: "drawing-ui.objectListPanel.showAll",
2542
+ hideAll: "drawing-ui.objectListPanel.hideAll",
2543
+ moveForward: "drawing-ui.objectListPanel.moveForward",
2544
+ moveBackward: "drawing-ui.objectListPanel.moveBackward",
2545
+ close: "drawing-ui.objectListPanel.close",
2546
+ show: "drawing-ui.objectListPanel.show",
2547
+ hide: "drawing-ui.objectListPanel.hide",
2548
+ lock: "drawing-ui.objectListPanel.lock",
2549
+ unlock: "drawing-ui.objectListPanel.unlock",
2550
+ name: "drawing-ui.objectListPanel.name",
2551
+ nameInput: "drawing-ui.objectListPanel.nameInput",
2552
+ description: "drawing-ui.objectListPanel.description",
2553
+ descriptionPlaceholder: "drawing-ui.objectListPanel.descriptionPlaceholder",
2554
+ details: "drawing-ui.objectListPanel.details",
2555
+ noSelection: "drawing-ui.objectListPanel.noSelection",
2556
+ locate: "drawing-ui.objectListPanel.locate",
2557
+ expand: "drawing-ui.objectListPanel.expand",
2558
+ collapse: "drawing-ui.objectListPanel.collapse",
2559
+ dragToReorder: "drawing-ui.objectListPanel.dragToReorder",
2560
+ search: "drawing-ui.objectListPanel.search",
2561
+ filterAll: "drawing-ui.objectListPanel.filterAll",
2562
+ filterHidden: "drawing-ui.objectListPanel.filterHidden",
2563
+ filterLocked: "drawing-ui.objectListPanel.filterLocked",
2564
+ sectionCanvas: "drawing-ui.objectListPanel.sectionCanvas",
2565
+ sectionFloating: "drawing-ui.objectListPanel.sectionFloating"
2566
+ };
2567
+ function getObjectListPanelLabels(localeService) {
2568
+ return Object.fromEntries(Object.entries(objectListPanelLabelKeys).map(([labelKey, localeKey]) => [labelKey, localeService.t(localeKey)]));
2569
+ }
2570
+ function getObjectListPanelTypeName(localeService, typeName) {
2571
+ return localeService.t(`drawing-ui.objectListPanel.typeNames.${typeName}`);
2572
+ }
2573
+ const iconButtonClassName = `
2574
+ univer-flex univer-size-7 univer-shrink-0 univer-items-center univer-justify-center univer-rounded-md
2575
+ univer-border-0 univer-bg-transparent univer-p-0 univer-text-gray-500 univer-outline-none univer-transition-colors
2576
+ hover:univer-bg-gray-100 hover:univer-text-gray-900
2577
+ disabled:univer-cursor-not-allowed disabled:univer-opacity-40
2578
+ dark:!univer-text-gray-300 dark:hover:!univer-bg-gray-800 dark:hover:!univer-text-gray-100
2579
+ `;
2580
+ const sectionOrder = /* @__PURE__ */ new Map([
2581
+ [OBJECT_LIST_FLOATING_SECTION_ID, 0],
2582
+ [OBJECT_LIST_CANVAS_SECTION_ID, 1],
2583
+ ["", 2]
2584
+ ]);
2585
+ function normalizeText(value) {
2586
+ return value.trim();
2587
+ }
2588
+ function hasCapability(panelCapabilities, item, key, fallback = true) {
2589
+ var _ref, _item$capabilities$ke, _item$capabilities;
2590
+ return (_ref = (_item$capabilities$ke = item === null || item === void 0 || (_item$capabilities = item.capabilities) === null || _item$capabilities === void 0 ? void 0 : _item$capabilities[key]) !== null && _item$capabilities$ke !== void 0 ? _item$capabilities$ke : panelCapabilities === null || panelCapabilities === void 0 ? void 0 : panelCapabilities[key]) !== null && _ref !== void 0 ? _ref : fallback;
2591
+ }
2592
+ function ObjectListPanelBase(props) {
2593
+ var _selectedItem$canMove, _selectedItem$canMove2, _capabilities$reorder;
2594
+ const { items, selectedIds, allObjectIds, focusedId, labels, showHeader = true, capabilities, onSelect, onSetVisible, onCommitName, onCommitDescription, onMoveForward, onMoveBackward, onToggleExpanded, onToggleSelectable, onLocate, onReorder } = props;
2595
+ const selectedIdSet = (0, react.useMemo)(() => new Set(selectedIds), [selectedIds]);
2596
+ const [draggingId, setDraggingId] = (0, react.useState)(null);
2597
+ const [searchQuery, setSearchQuery] = (0, react.useState)("");
2598
+ const [filterMode, setFilterMode] = (0, react.useState)("all");
2599
+ const [collapsedSectionIds, setCollapsedSectionIds] = (0, react.useState)(() => /* @__PURE__ */ new Set());
2600
+ const selectedItem = (0, react.useMemo)(() => {
2601
+ var _ref2, _items$find;
2602
+ return (_ref2 = (_items$find = items.find((item) => item.id === focusedId)) !== null && _items$find !== void 0 ? _items$find : items.find((item) => selectedIdSet.has(item.id))) !== null && _ref2 !== void 0 ? _ref2 : null;
2603
+ }, [
2604
+ focusedId,
2605
+ items,
2606
+ selectedIdSet
2607
+ ]);
2608
+ const visibleItems = (0, react.useMemo)(() => {
2609
+ const normalizedQuery = normalizeText(searchQuery).toLocaleLowerCase();
2610
+ return items.filter((item) => {
2611
+ var _item$description;
2612
+ if (filterMode === "hidden" && item.visible !== false) return false;
2613
+ if (filterMode === "locked" && item.selectable !== false) return false;
2614
+ if (!normalizedQuery) return true;
2615
+ return item.name.toLocaleLowerCase().includes(normalizedQuery) || ((_item$description = item.description) !== null && _item$description !== void 0 ? _item$description : "").toLocaleLowerCase().includes(normalizedQuery);
2616
+ });
2617
+ }, [
2618
+ filterMode,
2619
+ items,
2620
+ searchQuery
2621
+ ]);
2622
+ const visibleItemSections = (0, react.useMemo)(() => {
2623
+ const sectionMap = /* @__PURE__ */ new Map();
2624
+ visibleItems.forEach((item) => {
2625
+ var _item$sectionId, _item$sectionTitle;
2626
+ const sectionId = (_item$sectionId = item.sectionId) !== null && _item$sectionId !== void 0 ? _item$sectionId : "";
2627
+ const existingSection = sectionMap.get(sectionId);
2628
+ if (existingSection) {
2629
+ existingSection.items.push(item);
2630
+ return;
2631
+ }
2632
+ sectionMap.set(sectionId, {
2633
+ id: sectionId,
2634
+ title: (_item$sectionTitle = item.sectionTitle) !== null && _item$sectionTitle !== void 0 ? _item$sectionTitle : "",
2635
+ items: [item]
2636
+ });
2637
+ });
2638
+ return [...sectionMap.values()].sort((a, b) => {
2639
+ var _sectionOrder$get, _sectionOrder$get2;
2640
+ return ((_sectionOrder$get = sectionOrder.get(a.id)) !== null && _sectionOrder$get !== void 0 ? _sectionOrder$get : 3) - ((_sectionOrder$get2 = sectionOrder.get(b.id)) !== null && _sectionOrder$get2 !== void 0 ? _sectionOrder$get2 : 3);
2641
+ });
2642
+ }, [visibleItems]);
2643
+ const showSectionHeaders = visibleItemSections.length > 1 || visibleItemSections.some((section) => section.id === "floating");
2644
+ const allIds = (0, react.useMemo)(() => allObjectIds !== null && allObjectIds !== void 0 ? allObjectIds : items.map((item) => item.id), [allObjectIds, items]);
2645
+ const selectedIndex = selectedItem ? items.findIndex((item) => item.id === selectedItem.id) : -1;
2646
+ const canMoveForward = !!selectedItem && !!onMoveForward && !selectedItem.disabled && ((_selectedItem$canMove = selectedItem.canMoveForward) !== null && _selectedItem$canMove !== void 0 ? _selectedItem$canMove : selectedIndex > 0) && hasCapability(capabilities, selectedItem, "arrange");
2647
+ const canMoveBackward = !!selectedItem && !!onMoveBackward && !selectedItem.disabled && ((_selectedItem$canMove2 = selectedItem.canMoveBackward) !== null && _selectedItem$canMove2 !== void 0 ? _selectedItem$canMove2 : selectedIndex >= 0 && selectedIndex < items.length - 1) && hasCapability(capabilities, selectedItem, "arrange");
2648
+ const showArrangeControls = hasCapability(capabilities, selectedItem, "arrange") && (!!onMoveForward || !!onMoveBackward);
2649
+ const showLocateControl = !!onLocate && hasCapability(capabilities, selectedItem, "locate");
2650
+ const canReorder = !!onReorder && ((_capabilities$reorder = capabilities === null || capabilities === void 0 ? void 0 : capabilities.reorder) !== null && _capabilities$reorder !== void 0 ? _capabilities$reorder : true);
2651
+ const findItem = (objectId) => {
2652
+ var _items$find2;
2653
+ return objectId ? (_items$find2 = items.find((item) => item.id === objectId)) !== null && _items$find2 !== void 0 ? _items$find2 : null : null;
2654
+ };
2655
+ const handleDrop = (targetId) => {
2656
+ var _source$parentId, _target$parentId, _source$sectionId, _target$sectionId;
2657
+ const source = findItem(draggingId);
2658
+ const target = findItem(targetId);
2659
+ setDraggingId(null);
2660
+ if (!source || !target || source.id === target.id || source.disabled || target.disabled) return;
2661
+ if (((_source$parentId = source.parentId) !== null && _source$parentId !== void 0 ? _source$parentId : "") !== ((_target$parentId = target.parentId) !== null && _target$parentId !== void 0 ? _target$parentId : "")) return;
2662
+ if (((_source$sectionId = source.sectionId) !== null && _source$sectionId !== void 0 ? _source$sectionId : "") !== ((_target$sectionId = target.sectionId) !== null && _target$sectionId !== void 0 ? _target$sectionId : "")) return;
2663
+ if (source.canReorder === false || target.canReorder === false) return;
2664
+ onReorder === null || onReorder === void 0 || onReorder(source.id, target.id);
2665
+ };
2666
+ const toggleSectionCollapsed = (sectionId) => {
2667
+ if (!sectionId) return;
2668
+ setCollapsedSectionIds((current) => {
2669
+ const next = new Set(current);
2670
+ if (next.has(sectionId)) next.delete(sectionId);
2671
+ else next.add(sectionId);
2672
+ return next;
2673
+ });
2674
+ };
2675
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2676
+ className: "univer-box-border univer-flex univer-size-full univer-min-w-0 univer-max-w-full univer-flex-col univer-gap-3 univer-overflow-hidden univer-text-gray-700 dark:!univer-text-gray-200",
2677
+ "data-drawing-object-list-panel": "true",
2678
+ children: [
2679
+ showHeader && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2680
+ className: "univer-flex univer-h-8 univer-shrink-0 univer-items-center univer-gap-2",
2681
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2682
+ className: "univer-min-w-0 univer-flex-1 univer-truncate univer-text-sm univer-font-semibold univer-text-gray-900 dark:!univer-text-gray-100",
2683
+ children: labels.title
2684
+ })
2685
+ }),
2686
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2687
+ className: "univer-flex univer-min-w-0 univer-items-center univer-justify-between univer-gap-2",
2688
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2689
+ className: "univer-flex univer-min-w-0 univer-gap-2",
2690
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Button, {
2691
+ size: "small",
2692
+ disabled: items.length === 0,
2693
+ onClick: () => onSetVisible(allIds, true),
2694
+ children: labels.showAll
2695
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Button, {
2696
+ size: "small",
2697
+ disabled: items.length === 0,
2698
+ onClick: () => onSetVisible(allIds, false),
2699
+ children: labels.hideAll
2700
+ })]
2701
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2702
+ className: "univer-flex univer-shrink-0 univer-gap-1",
2703
+ children: [showLocateControl && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2704
+ type: "button",
2705
+ className: iconButtonClassName,
2706
+ title: labels.locate,
2707
+ "aria-label": labels.locate,
2708
+ disabled: !(selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.id),
2709
+ onClick: () => selectedItem && (onLocate === null || onLocate === void 0 ? void 0 : onLocate(selectedItem.id)),
2710
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.LocateFixedIcon, {})
2711
+ }), showArrangeControls && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2712
+ type: "button",
2713
+ className: iconButtonClassName,
2714
+ title: labels.moveForward,
2715
+ "aria-label": labels.moveForward,
2716
+ disabled: !canMoveForward,
2717
+ onClick: () => selectedItem && (onMoveForward === null || onMoveForward === void 0 ? void 0 : onMoveForward(selectedItem.id)),
2718
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.ArrowUpIcon, {})
2719
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2720
+ type: "button",
2721
+ className: iconButtonClassName,
2722
+ title: labels.moveBackward,
2723
+ "aria-label": labels.moveBackward,
2724
+ disabled: !canMoveBackward,
2725
+ onClick: () => selectedItem && (onMoveBackward === null || onMoveBackward === void 0 ? void 0 : onMoveBackward(selectedItem.id)),
2726
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.ArrowDownIcon, {})
2727
+ })] })]
2728
+ })]
2729
+ }),
2730
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2731
+ className: "univer-flex univer-shrink-0 univer-flex-col univer-gap-2",
2732
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Input, {
2733
+ value: searchQuery,
2734
+ "aria-label": labels.search,
2735
+ placeholder: labels.search,
2736
+ onChange: setSearchQuery
2737
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2738
+ className: "univer-flex univer-min-w-0 univer-gap-1",
2739
+ children: [
2740
+ ["all", labels.filterAll],
2741
+ ["hidden", labels.filterHidden],
2742
+ ["locked", labels.filterLocked]
2743
+ ].map(([mode, label]) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2744
+ type: "button",
2745
+ className: (0, _univerjs_design.clsx)("univer-h-7 univer-min-w-0 univer-flex-1 univer-rounded-md univer-border univer-border-solid univer-px-2 univer-text-xs univer-outline-none univer-transition-colors dark:!univer-border-gray-700", filterMode === mode ? "dark:!univer-bg-primary-900/30 univer-border-primary-500 univer-bg-primary-50 univer-text-primary-600 dark:!univer-text-primary-200" : "univer-border-gray-200 univer-bg-white univer-text-gray-600 hover:univer-bg-gray-50 dark:!univer-bg-gray-900 dark:!univer-text-gray-300 dark:hover:!univer-bg-gray-800"),
2746
+ "aria-pressed": filterMode === mode,
2747
+ onClick: () => setFilterMode(mode),
2748
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2749
+ className: "univer-block univer-truncate",
2750
+ children: label
2751
+ })
2752
+ }, mode))
2753
+ })]
2754
+ }),
2755
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2756
+ className: "univer-min-h-0 univer-flex-1 univer-overflow-y-auto univer-overflow-x-hidden",
2757
+ children: visibleItems.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2758
+ className: "univer-py-6 univer-text-center univer-text-sm univer-text-gray-500",
2759
+ children: labels.empty
2760
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2761
+ className: "univer-flex univer-min-w-0 univer-flex-col univer-gap-0.5",
2762
+ children: visibleItemSections.map((section) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2763
+ className: "univer-flex univer-min-w-0 univer-flex-col univer-gap-0.5",
2764
+ children: [showSectionHeaders && section.title && (() => {
2765
+ const sectionCollapsed = !!section.id && collapsedSectionIds.has(section.id);
2766
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
2767
+ type: "button",
2768
+ className: "univer-box-border univer-flex univer-h-7 univer-w-full univer-items-center univer-gap-1 univer-rounded-md univer-border-0 univer-bg-transparent univer-px-2 univer-pt-1 univer-text-xs univer-font-semibold univer-uppercase univer-text-gray-400 univer-outline-none hover:univer-bg-gray-50 hover:univer-text-gray-600 disabled:univer-cursor-default disabled:hover:univer-bg-transparent dark:!univer-text-gray-500 dark:hover:!univer-bg-gray-800 dark:hover:!univer-text-gray-300",
2769
+ "aria-label": sectionCollapsed ? labels.expand : labels.collapse,
2770
+ disabled: !section.id,
2771
+ onClick: () => toggleSectionCollapsed(section.id),
2772
+ children: [
2773
+ section.id ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2774
+ className: "univer-flex univer-size-4 univer-shrink-0 univer-items-center univer-justify-center",
2775
+ children: sectionCollapsed ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreRightIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, {})
2776
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "univer-size-4 univer-shrink-0" }),
2777
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2778
+ className: "univer-min-w-0 univer-flex-1 univer-truncate univer-text-left",
2779
+ children: section.title
2780
+ }),
2781
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2782
+ className: "univer-shrink-0 univer-text-[10px] univer-font-medium univer-text-gray-400 dark:!univer-text-gray-500",
2783
+ children: section.items.length
2784
+ })
2785
+ ]
2786
+ });
2787
+ })(), (!section.id || !collapsedSectionIds.has(section.id)) && section.items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ObjectListRow, {
2788
+ item,
2789
+ selected: selectedIdSet.has(item.id),
2790
+ labels,
2791
+ showLock: !!onToggleSelectable && hasCapability(capabilities, item, "selectable"),
2792
+ showName: hasCapability(capabilities, item, "name"),
2793
+ showVisible: hasCapability(capabilities, item, "visible"),
2794
+ draggable: canReorder && hasCapability(capabilities, item, "reorder") && !item.disabled && item.canReorder !== false,
2795
+ dragging: draggingId === item.id,
2796
+ onSelect: (multiSelect) => onSelect(item.id, multiSelect),
2797
+ onToggleExpanded: () => onToggleExpanded === null || onToggleExpanded === void 0 ? void 0 : onToggleExpanded(item.id),
2798
+ onToggleVisible: () => onSetVisible([item.id], !item.visible),
2799
+ onToggleSelectable: () => onToggleSelectable === null || onToggleSelectable === void 0 ? void 0 : onToggleSelectable(item.id),
2800
+ onCommitName: (value) => onCommitName(item.id, value),
2801
+ onDragStart: () => setDraggingId(item.id),
2802
+ onDragEnd: () => setDraggingId(null),
2803
+ onDrop: () => handleDrop(item.id)
2804
+ }, item.id))]
2805
+ }, section.id || "default"))
2806
+ })
2807
+ }),
2808
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ObjectDetailsEditor, {
2809
+ item: selectedItem,
2810
+ labels,
2811
+ showName: hasCapability(capabilities, selectedItem, "name"),
2812
+ showDescription: hasCapability(capabilities, selectedItem, "description"),
2813
+ onCommitName: (value) => selectedItem && onCommitName(selectedItem.id, value),
2814
+ onCommitDescription: (value) => selectedItem && onCommitDescription(selectedItem.id, value)
2815
+ })
2816
+ ]
2817
+ });
2818
+ }
2819
+ function ObjectListRow(props) {
2820
+ var _item$level;
2821
+ const { item, selected, labels, showLock, showName, showVisible, draggable, dragging, onSelect, onToggleExpanded, onToggleVisible, onToggleSelectable, onCommitName, onDragStart, onDragEnd, onDrop } = props;
2822
+ const [draftName, setDraftName] = (0, react.useState)(item.name);
2823
+ const skipCommitOnBlurRef = (0, react.useRef)(false);
2824
+ const disabled = item.disabled === true;
2825
+ const level = (_item$level = item.level) !== null && _item$level !== void 0 ? _item$level : 0;
2826
+ const locked = item.selectable === false;
2827
+ (0, react.useEffect)(() => {
2828
+ setDraftName(item.name);
2829
+ }, [item.name]);
2830
+ const handleBlur = (event) => {
2831
+ if (disabled) return;
2832
+ if (skipCommitOnBlurRef.current) {
2833
+ skipCommitOnBlurRef.current = false;
2834
+ return;
2835
+ }
2836
+ if (event.currentTarget.value !== item.name) onCommitName(event.currentTarget.value);
2837
+ };
2838
+ const handleKeyDown = (event) => {
2839
+ if (event.key === "Enter") {
2840
+ event.currentTarget.blur();
2841
+ return;
2842
+ }
2843
+ if (event.key === "Escape") {
2844
+ skipCommitOnBlurRef.current = true;
2845
+ setDraftName(item.name);
2846
+ event.currentTarget.blur();
2847
+ }
2848
+ };
2849
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2850
+ className: (0, _univerjs_design.clsx)("univer-box-border univer-flex univer-h-8 univer-w-full univer-min-w-0 univer-max-w-full univer-items-center univer-gap-1.5 univer-overflow-hidden univer-rounded-md univer-pr-1.5 univer-transition-colors", !disabled && "hover:univer-bg-gray-100 dark:hover:!univer-bg-gray-800", selected && "univer-bg-gray-100 dark:!univer-bg-gray-800", disabled && "univer-text-gray-400 dark:!univer-text-gray-500", dragging && "univer-opacity-50"),
2851
+ style: { paddingLeft: level * 14 + 4 },
2852
+ draggable,
2853
+ title: draggable ? labels.dragToReorder : void 0,
2854
+ onClick: disabled ? void 0 : (event) => onSelect(event.ctrlKey || event.metaKey),
2855
+ onDragStart: (event) => {
2856
+ if (!draggable) {
2857
+ event.preventDefault();
2858
+ return;
2859
+ }
2860
+ event.dataTransfer.effectAllowed = "move";
2861
+ event.dataTransfer.setData("text/plain", item.id);
2862
+ onDragStart();
2863
+ },
2864
+ onDragEnd,
2865
+ onDragOver: (event) => {
2866
+ if (draggable) {
2867
+ event.preventDefault();
2868
+ event.dataTransfer.dropEffect = "move";
2869
+ }
2870
+ },
2871
+ onDrop: (event) => {
2872
+ event.preventDefault();
2873
+ onDrop();
2874
+ },
2875
+ children: [
2876
+ item.isGroup ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2877
+ type: "button",
2878
+ className: "univer-flex univer-size-5 univer-shrink-0 univer-items-center univer-justify-center univer-rounded univer-border-0 univer-bg-transparent univer-p-0 univer-text-gray-500 univer-outline-none univer-transition-transform hover:univer-bg-gray-100 hover:univer-text-gray-900 dark:!univer-text-gray-300 dark:hover:!univer-bg-gray-800 dark:hover:!univer-text-gray-100",
2879
+ title: item.expanded ? labels.collapse : labels.expand,
2880
+ "aria-label": item.expanded ? labels.collapse : labels.expand,
2881
+ onClick: (event) => {
2882
+ event.stopPropagation();
2883
+ onToggleExpanded();
2884
+ },
2885
+ children: item.expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreDownIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.MoreRightIcon, {})
2886
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: "univer-size-5 univer-shrink-0" }),
2887
+ showName ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Input, {
2888
+ className: (0, _univerjs_design.clsx)("univer-h-7 univer-w-0 univer-min-w-0 univer-flex-1", disabled && "univer-cursor-not-allowed"),
2889
+ inputClass: (0, _univerjs_design.clsx)("!univer-h-7 univer-min-w-0 univer-overflow-hidden univer-text-ellipsis univer-whitespace-nowrap !univer-rounded !univer-border-transparent !univer-bg-transparent !univer-px-1 univer-text-sm univer-text-gray-900 !univer-shadow-none focus:!univer-border-primary-500 focus:!univer-bg-white focus:!univer-ring-1 focus:!univer-ring-primary-100 disabled:!univer-bg-transparent disabled:univer-opacity-100 dark:!univer-text-gray-100 dark:focus:!univer-bg-gray-900 dark:focus:!univer-ring-primary-900", disabled && "univer-text-gray-400 dark:!univer-text-gray-500"),
2890
+ inputStyle: {
2891
+ maxWidth: "100%",
2892
+ boxSizing: "border-box"
2893
+ },
2894
+ value: draftName,
2895
+ disabled,
2896
+ "aria-label": labels.nameInput,
2897
+ onChange: setDraftName,
2898
+ onBlur: handleBlur,
2899
+ onKeyDown: handleKeyDown,
2900
+ onClick: (event) => {
2901
+ event.stopPropagation();
2902
+ if (!disabled) onSelect(event.ctrlKey || event.metaKey);
2903
+ }
2904
+ }, item.name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2905
+ className: "univer-min-w-0 univer-flex-1 univer-truncate univer-px-1 univer-text-sm",
2906
+ children: item.name
2907
+ }),
2908
+ showLock && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2909
+ type: "button",
2910
+ className: (0, _univerjs_design.clsx)(iconButtonClassName, !locked && "univer-opacity-70"),
2911
+ disabled,
2912
+ title: locked ? labels.unlock : labels.lock,
2913
+ "aria-label": locked ? labels.unlock : labels.lock,
2914
+ onClick: (event) => {
2915
+ event.stopPropagation();
2916
+ onToggleSelectable();
2917
+ },
2918
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.LockIcon, {})
2919
+ }),
2920
+ showVisible && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2921
+ type: "button",
2922
+ className: iconButtonClassName,
2923
+ disabled,
2924
+ title: item.visible ? labels.hide : labels.show,
2925
+ "aria-label": item.visible ? labels.hide : labels.show,
2926
+ onClick: (event) => {
2927
+ event.stopPropagation();
2928
+ onToggleVisible();
2929
+ },
2930
+ children: item.visible ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.EyeIcon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_icons.EyelashIcon, {})
2931
+ })
2932
+ ]
2933
+ });
2934
+ }
2935
+ function ObjectDetailsEditor(props) {
2936
+ var _item$name, _item$description2;
2937
+ const { item, labels, showName, showDescription, onCommitName, onCommitDescription } = props;
2938
+ const [draftName, setDraftName] = (0, react.useState)((_item$name = item === null || item === void 0 ? void 0 : item.name) !== null && _item$name !== void 0 ? _item$name : "");
2939
+ const [draftDescription, setDraftDescription] = (0, react.useState)((_item$description2 = item === null || item === void 0 ? void 0 : item.description) !== null && _item$description2 !== void 0 ? _item$description2 : "");
2940
+ const disabled = (item === null || item === void 0 ? void 0 : item.disabled) === true;
2941
+ (0, react.useEffect)(() => {
2942
+ var _item$name2, _item$description3;
2943
+ setDraftName((_item$name2 = item === null || item === void 0 ? void 0 : item.name) !== null && _item$name2 !== void 0 ? _item$name2 : "");
2944
+ setDraftDescription((_item$description3 = item === null || item === void 0 ? void 0 : item.description) !== null && _item$description3 !== void 0 ? _item$description3 : "");
2945
+ }, [
2946
+ item === null || item === void 0 ? void 0 : item.description,
2947
+ item === null || item === void 0 ? void 0 : item.id,
2948
+ item === null || item === void 0 ? void 0 : item.name
2949
+ ]);
2950
+ if (!item) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2951
+ className: "univer-rounded-md univer-border univer-border-solid univer-border-gray-200 univer-p-3 univer-text-sm univer-text-gray-500 dark:!univer-border-gray-700 dark:!univer-text-gray-400",
2952
+ children: labels.noSelection
2953
+ });
2954
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2955
+ className: "univer-flex univer-shrink-0 univer-flex-col univer-gap-2 univer-border-0 univer-border-t univer-border-solid univer-border-gray-200 univer-pt-3 dark:!univer-border-gray-700",
2956
+ children: [
2957
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2958
+ className: "univer-text-xs univer-font-semibold univer-uppercase univer-text-gray-500 dark:!univer-text-gray-400",
2959
+ children: labels.details
2960
+ }),
2961
+ showName && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
2962
+ className: "univer-flex univer-flex-col univer-gap-1",
2963
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2964
+ className: "univer-text-xs univer-text-gray-500 dark:!univer-text-gray-400",
2965
+ children: labels.name
2966
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_univerjs_design.Input, {
2967
+ value: draftName,
2968
+ "aria-label": labels.nameInput,
2969
+ disabled,
2970
+ onChange: setDraftName,
2971
+ onBlur: () => {
2972
+ if (!disabled && normalizeText(draftName) !== item.name) onCommitName(draftName);
2973
+ },
2974
+ onKeyDown: (event) => {
2975
+ if (event.key === "Enter") event.currentTarget.blur();
2976
+ }
2977
+ })]
2978
+ }),
2979
+ showDescription && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
2980
+ className: "univer-flex univer-flex-col univer-gap-1",
2981
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2982
+ className: "univer-text-xs univer-text-gray-500 dark:!univer-text-gray-400",
2983
+ children: labels.description
2984
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("textarea", {
2985
+ className: "univer-box-border univer-min-h-16 univer-w-full univer-resize-none univer-rounded-md univer-border univer-border-solid univer-border-gray-200 univer-bg-white univer-p-2 univer-text-sm univer-text-gray-900 univer-outline-none focus:univer-border-primary-500 focus:univer-ring-1 focus:univer-ring-primary-100 disabled:univer-cursor-not-allowed disabled:univer-opacity-70 dark:!univer-border-gray-700 dark:!univer-bg-gray-900 dark:!univer-text-gray-100 dark:focus:!univer-ring-primary-900",
2986
+ value: draftDescription,
2987
+ disabled,
2988
+ placeholder: labels.descriptionPlaceholder,
2989
+ "aria-label": labels.description,
2990
+ onChange: (event) => setDraftDescription(event.currentTarget.value),
2991
+ onBlur: () => {
2992
+ var _item$description4;
2993
+ if (!disabled && normalizeText(draftDescription) !== ((_item$description4 = item.description) !== null && _item$description4 !== void 0 ? _item$description4 : "")) onCommitDescription(draftDescription);
2994
+ }
2995
+ })]
2996
+ })
2997
+ ]
2998
+ });
2999
+ }
3000
+
2437
3001
  //#endregion
2438
3002
  //#region src/views/panel/DrawingAlign.tsx
2439
3003
  const DrawingAlign = (props) => {
@@ -2644,6 +3208,29 @@ const DrawingGroup = (props) => {
2644
3208
  //#region src/utils/config.ts
2645
3209
  const RANGE_DRAWING_ROTATION_LIMIT = [-360, 360];
2646
3210
 
3211
+ //#endregion
3212
+ //#region src/views/panel/drawing-transform-rotation.ts
3213
+ function isDrawingTransformRotationDisabled(rotateEnabled) {
3214
+ return !rotateEnabled;
3215
+ }
3216
+ function createDrawingTransformRotationChangeHandler(options) {
3217
+ return (val) => {
3218
+ if (isDrawingTransformRotationDisabled(options.rotateEnabled)) return;
3219
+ if (val == null) return;
3220
+ const { unitId, subUnitId, drawingId, drawingType } = options.drawingParam;
3221
+ const updateParam = {
3222
+ unitId,
3223
+ subUnitId,
3224
+ drawingId,
3225
+ drawingType,
3226
+ transform: { angle: val }
3227
+ };
3228
+ options.setRotation(val);
3229
+ options.emitUpdate([updateParam]);
3230
+ options.notifyChange();
3231
+ };
3232
+ }
3233
+
2647
3234
  //#endregion
2648
3235
  //#region src/views/panel/DrawingTransform.tsx
2649
3236
  const INPUT_DEBOUNCE_TIME = 300;
@@ -2671,6 +3258,8 @@ const DrawingTransform = (props) => {
2671
3258
  const [yPosition, setYPosition] = (0, react.useState)(originY);
2672
3259
  const [rotation, setRotation] = (0, react.useState)(originRotation);
2673
3260
  const [lockRatio, setLockRatio] = (0, react.useState)(transformer.keepRatio);
3261
+ const rotateEnabled = resolveDrawingUIRotateEnabled(drawingParam, { getChildren: (drawing) => drawingManagerService.getDrawingsByGroup(drawing) });
3262
+ const rotationDisabled = isDrawingTransformRotationDisabled(rotateEnabled);
2674
3263
  const checkMoveBoundary = (left, top, width, height) => {
2675
3264
  const { width: topSceneWidth, height: topSceneHeight } = topScene;
2676
3265
  const { ancestorLeft, ancestorTop } = scene;
@@ -2811,19 +3400,18 @@ const DrawingTransform = (props) => {
2811
3400
  drawingManagerService.featurePluginUpdateNotification([updateParam]);
2812
3401
  transformer.refreshControls().changeNotification();
2813
3402
  }, INPUT_DEBOUNCE_TIME);
2814
- const handleRotationChange = (val) => {
2815
- if (val == null) return;
2816
- const updateParam = {
3403
+ const handleRotationChange = createDrawingTransformRotationChangeHandler({
3404
+ rotateEnabled,
3405
+ drawingParam: {
2817
3406
  unitId,
2818
3407
  subUnitId,
2819
3408
  drawingId,
2820
- drawingType,
2821
- transform: { angle: val }
2822
- };
2823
- setRotation(val);
2824
- drawingManagerService.featurePluginUpdateNotification([updateParam]);
2825
- transformer.refreshControls().changeNotification();
2826
- };
3409
+ drawingType
3410
+ },
3411
+ setRotation,
3412
+ emitUpdate: (updateParams) => drawingManagerService.featurePluginUpdateNotification(updateParams),
3413
+ notifyChange: () => transformer.refreshControls().changeNotification()
3414
+ });
2827
3415
  const handleLockRatioChange = (val) => {
2828
3416
  setLockRatio(val);
2829
3417
  transformer.keepRatio = val;
@@ -2885,6 +3473,7 @@ const DrawingTransform = (props) => {
2885
3473
  value: rotation,
2886
3474
  min: RANGE_DRAWING_ROTATION_LIMIT[0],
2887
3475
  max: RANGE_DRAWING_ROTATION_LIMIT[1],
3476
+ disabled: rotationDisabled,
2888
3477
  onChange: handleRotationChange
2889
3478
  })] })
2890
3479
  ]
@@ -3142,9 +3731,13 @@ Object.defineProperty(exports, 'DrawingRenderService', {
3142
3731
  return DrawingRenderService;
3143
3732
  }
3144
3733
  });
3734
+ exports.DrawingUIMenuSchema = menuSchema;
3145
3735
  exports.IMAGE_CLIP_SHAPE_PICKER_COMPONENT = IMAGE_CLIP_SHAPE_PICKER_COMPONENT;
3146
3736
  exports.ImageCropperObject = ImageCropperObject;
3147
3737
  exports.ImageResetSizeOperation = ImageResetSizeOperation;
3738
+ exports.OBJECT_LIST_CANVAS_SECTION_ID = OBJECT_LIST_CANVAS_SECTION_ID;
3739
+ exports.OBJECT_LIST_FLOATING_SECTION_ID = OBJECT_LIST_FLOATING_SECTION_ID;
3740
+ exports.ObjectListPanelBase = ObjectListPanelBase;
3148
3741
  exports.OpenImageCropOperation = OpenImageCropOperation;
3149
3742
  exports.SetDrawingAlignOperation = SetDrawingAlignOperation;
3150
3743
  exports.SetDrawingArrangeOperation = SetDrawingArrangeOperation;
@@ -3155,6 +3748,12 @@ Object.defineProperty(exports, 'UniverDrawingUIPlugin', {
3155
3748
  return UniverDrawingUIPlugin;
3156
3749
  }
3157
3750
  });
3751
+ exports.disposeDrawingRenderObject = disposeDrawingRenderObject;
3158
3752
  exports.getCurrentUnitInfo = getCurrentUnitInfo;
3753
+ exports.getDrawingRenderObject = getDrawingRenderObject;
3754
+ exports.getObjectListPanelLabels = getObjectListPanelLabels;
3755
+ exports.getObjectListPanelSectionIdForDrawingType = getObjectListPanelSectionIdForDrawingType;
3756
+ exports.getObjectListPanelTypeName = getObjectListPanelTypeName;
3159
3757
  exports.getUpdateParams = getUpdateParams;
3160
- exports.insertGroupObject = insertGroupObject;
3758
+ exports.insertGroupObject = insertGroupObject;
3759
+ exports.isFloatingObjectListDrawingType = isFloatingObjectListDrawingType;