@univerjs/engine-render 0.2.11 → 0.2.12

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.
package/lib/es/index.js CHANGED
@@ -2,7 +2,7 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: !0, configurable: !0, writable: !0, value }) : obj[key] = value;
3
3
  var __name = (target, value) => __defProp(target, "name", { value, configurable: !0 });
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key != "symbol" ? key + "" : key, value);
5
- import { Tools, DEFAULT_STYLES, FontStyleType, BaselineOffset, getCellInfoInMergeData, Rectangle, ColorKit, Disposable, EventSubject, checkParagraphHasIndentByStyle, DataStreamTreeTokenType, BorderStyleTypes, BooleanNumber, DisposableCollection, toDisposable, sortRules, Registry, numberToABC, CustomDecorationType, CustomRangeType, PositionedObjectLayoutType, WrapTextType, TableAlignmentType, GridType, BulletAlignment, ColumnSeparatorType, GlyphType as GlyphType$1, numberToListABC, HorizontalAlign, DataStreamTreeNodeType, PageOrientType, ObjectRelativeFromV, TableTextWrapType, SpacingRule, ObjectMatrix, SectionType, NumberUnitType, VerticalAlign, WrapStrategy, AlignTypeH, ObjectRelativeFromH, AlignTypeV, Inject, LocaleService, insertTextToContent, horizontalLineSegmentsSubtraction, deleteContent, DocumentDataModel, PRESET_LIST_TYPE, searchArray, extractPureTextFromCell, CellValueType, isCellCoverable, isNullCell, getColorStyle, isWhiteColor, IContextService, DEFAULT_EMPTY_DOCUMENT_VALUE, Range, TextDecoration, COLORS, requestImmediateMacroTask, MOVE_BUFFER_VALUE, sortRulesByDesc, Injector, isClassDependencyItem, createIdentifier, remove, UniverInstanceType, IUniverInstanceService, Plugin, RxDisposable, ILogService, DocumentFlavor } from "@univerjs/core";
5
+ import { Tools, DEFAULT_STYLES, FontStyleType, BaselineOffset, getCellInfoInMergeData, Rectangle, ColorKit, Disposable, EventSubject, checkParagraphHasIndentByStyle, DataStreamTreeTokenType, BorderStyleTypes, BooleanNumber, DisposableCollection, toDisposable, sortRules, Registry, numberToABC, CustomDecorationType, CustomRangeType, PositionedObjectLayoutType, WrapTextType, TableAlignmentType, GridType, BulletAlignment, ColumnSeparatorType, GlyphType as GlyphType$1, numberToListABC, HorizontalAlign, DataStreamTreeNodeType, PageOrientType, ObjectRelativeFromV, TableTextWrapType, SpacingRule, ObjectMatrix, SectionType, NumberUnitType, VerticalAlign, WrapStrategy, AlignTypeH, ObjectRelativeFromH, AlignTypeV, Inject, LocaleService, insertTextToContent, horizontalLineSegmentsSubtraction, deleteContent, DocumentDataModel, PRESET_LIST_TYPE, searchArray, extractPureTextFromCell, CellValueType, isCellCoverable, isNullCell, getColorStyle, isWhiteColor, IContextService, DEFAULT_EMPTY_DOCUMENT_VALUE, Range, TextDecoration, COLORS, requestImmediateMacroTask, MOVE_BUFFER_VALUE, sortRulesByDesc, Injector, isClassDependencyItem, createIdentifier, remove, UniverInstanceType, IUniverInstanceService, Plugin, IConfigService, RxDisposable, ILogService, DocumentFlavor } from "@univerjs/core";
6
6
  import { BehaviorSubject, Subject, startWith, distinctUntilChanged, Subscription, Observable, shareReplay, fromEvent } from "rxjs";
7
7
  var SHAPE_TYPE = /* @__PURE__ */ ((SHAPE_TYPE2) => (SHAPE_TYPE2.RECT = "rect", SHAPE_TYPE2.CIRCLE = "circle", SHAPE_TYPE2.PATH = "path", SHAPE_TYPE2))(SHAPE_TYPE || {}), LINK_VIEW_PORT_TYPE = /* @__PURE__ */ ((LINK_VIEW_PORT_TYPE2) => (LINK_VIEW_PORT_TYPE2[LINK_VIEW_PORT_TYPE2.XY = 0] = "XY", LINK_VIEW_PORT_TYPE2[LINK_VIEW_PORT_TYPE2.X = 1] = "X", LINK_VIEW_PORT_TYPE2[LINK_VIEW_PORT_TYPE2.Y = 2] = "Y", LINK_VIEW_PORT_TYPE2))(LINK_VIEW_PORT_TYPE || {});
8
8
  const MIDDLE_CELL_POS_MAGIC_NUMBER = 1, DEFAULT_FONTFACE_PLANE = '"Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif', DEFAULT_SKELETON_HEADER_FOOTER = {
@@ -1684,13 +1684,14 @@ function inRowViewRanges(ranges, rowIndex) {
1684
1684
  return flag;
1685
1685
  }
1686
1686
  __name(inRowViewRanges, "inRowViewRanges");
1687
- function mergeRangeIfIntersects(mainRanges, ranges) {
1687
+ function expandRangeIfIntersects(mainRanges, ranges) {
1688
+ const intersects = [];
1688
1689
  for (const mainRange of mainRanges)
1689
1690
  for (const range of ranges)
1690
- Rectangle.intersects(mainRange, range) && (mainRange.startRow = Math.min(mainRange.startRow, range.startRow), mainRange.endRow = Math.max(mainRange.endRow, range.endRow), mainRange.startColumn = Math.min(mainRange.startColumn, range.startColumn), mainRange.endColumn = Math.max(mainRange.endColumn, range.endColumn));
1691
- return mainRanges;
1691
+ Rectangle.intersects(mainRange, range) && intersects.push(range);
1692
+ return [...mainRanges, ...intersects];
1692
1693
  }
1693
- __name(mergeRangeIfIntersects, "mergeRangeIfIntersects");
1694
+ __name(expandRangeIfIntersects, "expandRangeIfIntersects");
1694
1695
  function clampRanges(range) {
1695
1696
  return {
1696
1697
  startRow: Math.max(0, range.startRow),
@@ -3268,22 +3269,38 @@ const INITIAL_Path2 = [new Vector2(0, 0), new Vector2(1, 1)], _Path2 = class _Pa
3268
3269
  };
3269
3270
  __name(_Path2, "Path2");
3270
3271
  let Path2 = _Path2;
3271
- const _PerformanceMonitor = class _PerformanceMonitor {
3272
+ const DEFAULT_FRAME_SAMPLE_SIZE = 60, DEFAULT_FRAME_LIST_SIZE = 60 * 60, DEFAULT_ONE_SEC_MS = 1e3, DEFAULT_FRAME_TIME = 16.67, _PerformanceMonitor = class _PerformanceMonitor extends Disposable {
3273
+ // private _frameCount: number = 0; // number of all frames in whole life time.
3272
3274
  /**
3273
- * constructor
3274
- * @param frameSampleSize The number of samples required to saturate the sliding window
3275
+ * @param {number} frameSampleSize The number of samples required to saturate the sliding window
3275
3276
  */
3276
- constructor(frameSampleSize = 30) {
3277
+ constructor(frameSampleSize = DEFAULT_FRAME_SAMPLE_SIZE) {
3278
+ super();
3277
3279
  __publicField(this, "_enabled", !0);
3278
3280
  __publicField(this, "_rollingFrameTime");
3279
3281
  __publicField(this, "_lastFrameTimeMs");
3282
+ /**
3283
+ * Counting frame in a second.
3284
+ */
3285
+ __publicField(this, "_frameCountInLastSecond", 0);
3286
+ /**
3287
+ * The millisecond value of the last second. For counting frame in a second.
3288
+ */
3289
+ __publicField(this, "_lastSecondTimeMs");
3290
+ /**
3291
+ * The FPS values recorded in the past 1 second.
3292
+ */
3293
+ __publicField(this, "_recFPSValueLastSecond", 60);
3280
3294
  this._rollingFrameTime = new RollingAverage(frameSampleSize);
3281
3295
  }
3296
+ dispose() {
3297
+ super.dispose();
3298
+ }
3282
3299
  /**
3283
- * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)
3300
+ * Returns the average frame time in milliseconds of the sliding window (or the subset of frames sampled so far)
3284
3301
  */
3285
3302
  get averageFrameTime() {
3286
- return this._rollingFrameTime.average;
3303
+ return this._rollingFrameTime.averageFrameTime;
3287
3304
  }
3288
3305
  /**
3289
3306
  * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)
@@ -3292,7 +3309,7 @@ const _PerformanceMonitor = class _PerformanceMonitor {
3292
3309
  return this._rollingFrameTime.variance;
3293
3310
  }
3294
3311
  /**
3295
- * Returns the frame time of the most recent frame
3312
+ * Returns the frame time of the last recent frame.
3296
3313
  */
3297
3314
  get instantaneousFrameTime() {
3298
3315
  return this._rollingFrameTime.history(0);
@@ -3301,14 +3318,14 @@ const _PerformanceMonitor = class _PerformanceMonitor {
3301
3318
  * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)
3302
3319
  */
3303
3320
  get averageFPS() {
3304
- return 1e3 / this._rollingFrameTime.average;
3321
+ return this._recFPSValueLastSecond;
3305
3322
  }
3306
3323
  /**
3307
3324
  * Returns the average framerate in frames per second using the most recent frame time
3308
3325
  */
3309
3326
  get instantaneousFPS() {
3310
3327
  const history = this._rollingFrameTime.history(0);
3311
- return history === 0 ? 0 : 1e3 / history;
3328
+ return history === 0 ? 0 : DEFAULT_ONE_SEC_MS / history;
3312
3329
  }
3313
3330
  /**
3314
3331
  * Returns true if enough samples have been taken to completely fill the sliding window
@@ -3323,19 +3340,29 @@ const _PerformanceMonitor = class _PerformanceMonitor {
3323
3340
  return this._enabled;
3324
3341
  }
3325
3342
  /**
3326
- * Samples current frame
3327
- * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames
3343
+ * Samples current frame, set averageFPS instantaneousFrameTime
3344
+ * this method is called each frame by engine renderLoop --> endFrame.
3345
+ * @param timestamp A timestamp in milliseconds of the current frame to compare with other frames
3328
3346
  */
3329
- sampleFrame(timeMs = this.Now()) {
3347
+ sampleFrame(timestamp = this.now()) {
3330
3348
  if (this._enabled) {
3349
+ if (this._frameCountInLastSecond++, this._lastSecondTimeMs != null) {
3350
+ if (this._lastSecondTimeMs <= timestamp - DEFAULT_ONE_SEC_MS) {
3351
+ const passedTime = timestamp - this._lastSecondTimeMs;
3352
+ this._recFPSValueLastSecond = Math.round(this._frameCountInLastSecond / passedTime * DEFAULT_ONE_SEC_MS), this._lastSecondTimeMs = timestamp, this._frameCountInLastSecond = 0;
3353
+ }
3354
+ } else
3355
+ this._lastSecondTimeMs = timestamp;
3331
3356
  if (this._lastFrameTimeMs != null) {
3332
- const dt = timeMs - this._lastFrameTimeMs;
3333
- this._rollingFrameTime.add(dt);
3357
+ const dt = timestamp - this._lastFrameTimeMs;
3358
+ this._rollingFrameTime.addFrameTime(dt), this._rollingFrameTime.calcAverageFrameTime();
3334
3359
  }
3335
- this._lastFrameTimeMs = timeMs;
3336
3360
  }
3337
3361
  }
3338
- Now() {
3362
+ endFrame(timestamp) {
3363
+ this.sampleFrame(timestamp), this._lastFrameTimeMs = timestamp;
3364
+ }
3365
+ now() {
3339
3366
  return performance && performance.now ? performance.now() : Date.now();
3340
3367
  }
3341
3368
  /**
@@ -3370,29 +3397,41 @@ const _RollingAverage = class _RollingAverage {
3370
3397
  /**
3371
3398
  * Current average
3372
3399
  */
3373
- __publicField(this, "average", 0);
3400
+ __publicField(this, "averageFrameTime", DEFAULT_FRAME_TIME);
3374
3401
  /**
3375
3402
  * Current variance
3376
3403
  */
3377
3404
  __publicField(this, "variance", 0);
3378
3405
  __publicField(this, "_samples", []);
3406
+ /**
3407
+ * for isStaturated
3408
+ * max value of _sampleCount is length of _samples
3409
+ */
3379
3410
  __publicField(this, "_sampleCount", 0);
3380
3411
  __publicField(this, "_pos", 0);
3381
3412
  __publicField(this, "_m2", 0);
3382
3413
  this._samples = new Array(length), this.reset();
3383
3414
  }
3384
3415
  /**
3385
- * Adds a sample to the sample set
3386
- * @param v The sample value
3416
+ * Calc average frameTime and variance.
3387
3417
  */
3388
- add(v) {
3418
+ calcAverageFrameTime() {
3419
+ const frameDuration = this.history(0);
3389
3420
  let delta;
3390
3421
  if (this.isSaturated()) {
3391
3422
  const bottomValue = this._samples[this._pos];
3392
- delta = bottomValue - this.average, this.average -= delta / (this._sampleCount - 1), this._m2 -= delta * (bottomValue - this.average);
3423
+ delta = bottomValue - this.averageFrameTime, this._m2 -= delta * (bottomValue - this.averageFrameTime);
3393
3424
  } else
3394
3425
  this._sampleCount++;
3395
- delta = v - this.average, this.average += delta / this._sampleCount, this._m2 += delta * (v - this.average), this.variance = this._m2 / (this._sampleCount - 1), this._samples[this._pos] = v, this._pos++, this._pos %= this._samples.length;
3426
+ const min2 = Math.min(...this._samples), max2 = Math.min(...this._samples), filteredData = this._samples.filter((v) => v !== max2 && v !== min2);
3427
+ this.averageFrameTime = filteredData.reduce((sum, value) => sum + value, 0) / filteredData.length, delta = frameDuration - this.averageFrameTime, this._m2 += delta * (frameDuration - this.averageFrameTime), this.variance = this._m2 / (this._sampleCount - 1);
3428
+ }
3429
+ /**
3430
+ * Adds a sample to the sample set
3431
+ * @param frameTime The sample value
3432
+ */
3433
+ addFrameTime(frameTime) {
3434
+ this._samples[this._pos] = frameTime, this._pos = ++this._pos % this._samples.length;
3396
3435
  }
3397
3436
  /**
3398
3437
  * Returns previously added values or null if outside of history or outside the sliding window domain
@@ -3416,7 +3455,7 @@ const _RollingAverage = class _RollingAverage {
3416
3455
  * Resets the rolling average (equivalent to 0 samples taken so far)
3417
3456
  */
3418
3457
  reset() {
3419
- this.average = 0, this.variance = 0, this._sampleCount = 0, this._pos = 0, this._m2 = 0;
3458
+ this.averageFrameTime = DEFAULT_FRAME_TIME, this.variance = 0, this._sampleCount = 0, this._pos = 0, this._m2 = 0;
3420
3459
  }
3421
3460
  /**
3422
3461
  * Wraps a value around the sample range boundaries
@@ -4355,7 +4394,7 @@ const _SpreadsheetColumnHeader = class _SpreadsheetColumnHeader extends Spreadsh
4355
4394
  __name(_SpreadsheetColumnHeader, "SpreadsheetColumnHeader");
4356
4395
  let SpreadsheetColumnHeader = _SpreadsheetColumnHeader;
4357
4396
  var SHEET_EXTENSION_TYPE = /* @__PURE__ */ ((SHEET_EXTENSION_TYPE2) => (SHEET_EXTENSION_TYPE2[SHEET_EXTENSION_TYPE2.GRID = 0] = "GRID", SHEET_EXTENSION_TYPE2))(SHEET_EXTENSION_TYPE || {});
4358
- const _SheetExtension = class _SheetExtension extends ComponentExtension {
4397
+ const SHEET_EXTENSION_PREFIX = "sheet-ext-", _SheetExtension = class _SheetExtension extends ComponentExtension {
4359
4398
  constructor() {
4360
4399
  super(...arguments);
4361
4400
  __publicField(this, "type", 0);
@@ -4491,20 +4530,12 @@ let Background$1 = (_a = class extends SheetExtension {
4491
4530
  var _a11;
4492
4531
  return (_a11 = this.parent) != null && _a11.isPrinting ? this.PRINTING_Z_INDEX : this.Z_INDEX;
4493
4532
  }
4494
- // eslint-disable-next-line max-lines-per-function
4495
- draw(ctx, parentScale, spreadsheetSkeleton, diffRanges, { viewRanges, checkOutOfViewBound }) {
4496
- const { stylesCache } = spreadsheetSkeleton, { background, backgroundPositions } = stylesCache;
4497
- if (!spreadsheetSkeleton)
4498
- return;
4499
- const { worksheet } = spreadsheetSkeleton;
4500
- if (!worksheet)
4501
- return;
4502
- const { rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton;
4503
- if (!rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0)
4533
+ draw(ctx, _parentScale, spreadsheetSkeleton, diffRanges, { viewRanges, checkOutOfViewBound }) {
4534
+ const { stylesCache, worksheet, rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton, { background, backgroundPositions } = stylesCache;
4535
+ if (!worksheet || !background || !rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0)
4504
4536
  return;
4505
4537
  ctx.save();
4506
- const { scaleX, scaleY } = ctx.getScale();
4507
- background && Object.keys(background).forEach((rgb) => {
4538
+ const { scaleX, scaleY } = ctx.getScale(), renderBGByCell = /* @__PURE__ */ __name((rgb) => {
4508
4539
  const backgroundCache = background[rgb];
4509
4540
  ctx.fillStyle = rgb || getColor([255, 255, 255]);
4510
4541
  const backgroundPaths = new Path2D();
@@ -4515,7 +4546,7 @@ let Background$1 = (_a = class extends SheetExtension {
4515
4546
  if (cellInfo == null)
4516
4547
  return !0;
4517
4548
  let { startY, endY, startX, endX } = cellInfo;
4518
- const { isMerged, isMergedMainCell, mergeInfo } = cellInfo, mergeTo = diffRanges && diffRanges.length > 0 ? diffRanges : viewRanges, combineWithMergeRanges = mergeRangeIfIntersects(mergeTo, [mergeInfo]);
4549
+ const { isMerged, isMergedMainCell, mergeInfo } = cellInfo, mergeTo = diffRanges && diffRanges.length > 0 ? diffRanges : viewRanges, combineWithMergeRanges = expandRangeIfIntersects([...mergeTo], [mergeInfo]);
4519
4550
  if (!inViewRanges(combineWithMergeRanges, rowIndex, columnIndex) || isMerged)
4520
4551
  return !0;
4521
4552
  {
@@ -4526,7 +4557,8 @@ let Background$1 = (_a = class extends SheetExtension {
4526
4557
  const startXPrecise = fixLineWidthByScale(startX, scaleX), startYPrecise = fixLineWidthByScale(startY, scaleY), endXPrecise = fixLineWidthByScale(endX, scaleX), endYPrecise = fixLineWidthByScale(endY, scaleY);
4527
4558
  backgroundPaths.rect(startXPrecise, startYPrecise, endXPrecise - startXPrecise, endYPrecise - startYPrecise);
4528
4559
  }), ctx.fill(backgroundPaths);
4529
- }), ctx.restore();
4560
+ }, "renderBGByCell");
4561
+ Object.keys(background).forEach(renderBGByCell), ctx.restore();
4530
4562
  }
4531
4563
  }, __name(_a, "Background"), _a);
4532
4564
  SpreadsheetExtensionRegistry.add(Background$1);
@@ -4539,20 +4571,14 @@ let Border$1 = (_a2 = class extends SheetExtension {
4539
4571
  __publicField(this, "Z_INDEX", BORDER_Z_INDEX);
4540
4572
  }
4541
4573
  // eslint-disable-next-line max-lines-per-function
4542
- draw(ctx, parentScale, spreadsheetSkeleton, diffRanges) {
4543
- const { dataMergeCache, stylesCache, overflowCache } = spreadsheetSkeleton, { border } = stylesCache;
4544
- if (!spreadsheetSkeleton)
4545
- return;
4546
- const { worksheet } = spreadsheetSkeleton;
4547
- if (!worksheet)
4548
- return;
4549
- const { rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton;
4550
- if (!rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0)
4574
+ draw(ctx, _parentScale, spreadsheetSkeleton, diffRanges) {
4575
+ const { dataMergeCache, stylesCache, overflowCache, worksheet, rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton;
4576
+ if (!worksheet || !rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0)
4551
4577
  return;
4552
4578
  ctx.save();
4553
4579
  let preStyle, preColor;
4554
4580
  ctx.translateWithPrecisionRatio(FIX_ONE_PIXEL_BLUR_OFFSET, FIX_ONE_PIXEL_BLUR_OFFSET);
4555
- const precisionScale = this._getScale(ctx.getScale());
4581
+ const precisionScale = this._getScale(ctx.getScale()), { border } = stylesCache;
4556
4582
  border == null || border.forValue((rowIndex, columnIndex, borderCaches) => {
4557
4583
  if (!borderCaches)
4558
4584
  return !0;
@@ -5109,7 +5135,7 @@ function getTableIdAndSliceIndex(tableSliceId) {
5109
5135
  };
5110
5136
  }
5111
5137
  __name(getTableIdAndSliceIndex, "getTableIdAndSliceIndex");
5112
- var BreakPointType = /* @__PURE__ */ ((BreakPointType2) => (BreakPointType2.Normal = "Normal", BreakPointType2.Mandatory = "Mandatory", BreakPointType2.Hyphen = "Hyphen", BreakPointType2))(BreakPointType || {});
5138
+ var BreakPointType = /* @__PURE__ */ ((BreakPointType2) => (BreakPointType2.Normal = "Normal", BreakPointType2.Mandatory = "Mandatory", BreakPointType2.Hyphen = "Hyphen", BreakPointType2.Link = "Link", BreakPointType2))(BreakPointType || {});
5113
5139
  const _Break = class _Break {
5114
5140
  constructor(position, type = "Normal") {
5115
5141
  this.position = position, this.type = type;
@@ -20104,13 +20130,13 @@ function getWord(str) {
20104
20130
  return word;
20105
20131
  }
20106
20132
  __name(getWord, "getWord");
20107
- function getHyphenPosition(lastPos, hyphenSlice, index2) {
20108
- let hyphenPos = lastPos;
20133
+ function getSlicePosition(lastPos, hyphenSlice, index2) {
20134
+ let position = lastPos;
20109
20135
  for (let i = 0; i <= index2; i++)
20110
- hyphenPos += hyphenSlice[i].length;
20111
- return hyphenPos;
20136
+ position += hyphenSlice[i].length;
20137
+ return position;
20112
20138
  }
20113
- __name(getHyphenPosition, "getHyphenPosition");
20139
+ __name(getSlicePosition, "getSlicePosition");
20114
20140
  function isUpperCase(word) {
20115
20141
  return word.length > 0 && word === word.toUpperCase();
20116
20142
  }
@@ -20123,21 +20149,21 @@ const _LineBreakerHyphenEnhancer = class _LineBreakerHyphenEnhancer {
20123
20149
  __publicField(this, "_word", "");
20124
20150
  __publicField(this, "_hyphenIndex", -1);
20125
20151
  __publicField(this, "_hyphenSlice", []);
20126
- __publicField(this, "_content", "");
20127
- this._lineBreaker = _lineBreaker, this._hyphen = _hyphen, this._lang = _lang, this._doNotHyphenateCaps = _doNotHyphenateCaps, this._content = _lineBreaker.content;
20152
+ __publicField(this, "content", "");
20153
+ this._lineBreaker = _lineBreaker, this._hyphen = _hyphen, this._lang = _lang, this._doNotHyphenateCaps = _doNotHyphenateCaps, this.content = _lineBreaker.content;
20128
20154
  }
20129
20155
  nextBreakPoint() {
20130
20156
  if (this._isInWord)
20131
20157
  if (this._hyphenIndex < this._hyphenSlice.length - 1) {
20132
- const position = getHyphenPosition(this._curBreak.position, this._hyphenSlice, this._hyphenIndex);
20158
+ const position = getSlicePosition(this._curBreak.position, this._hyphenSlice, this._hyphenIndex);
20133
20159
  return this._hyphenIndex++, new Break(position, BreakPointType.Hyphen);
20134
20160
  } else
20135
20161
  return this._isInWord = !1, this._word = "", this._hyphenSlice = [], this._hyphenIndex = -1, this._nextBreak;
20136
20162
  else {
20137
20163
  if (this._curBreak = this._nextBreak, this._nextBreak = this._lineBreaker.nextBreakPoint(), this._nextBreak == null || this._curBreak == null)
20138
20164
  return null;
20139
- const word = getWord(this._content.slice(this._curBreak.position, this._nextBreak.position));
20140
- return word.length && !(isUpperCase(word) && this._doNotHyphenateCaps) ? (this._isInWord = !0, this._word = word, this._hyphenSlice = this._hyphen.hyphenate(this._word, this._lang), this._hyphenIndex = 0, this.nextBreakPoint()) : this._nextBreak;
20165
+ const word = getWord(this.content.slice(this._curBreak.position, this._nextBreak.position));
20166
+ return word.length && !(isUpperCase(word) && this._doNotHyphenateCaps) && this._nextBreak.type !== BreakPointType.Link ? (this._isInWord = !0, this._word = word, this._hyphenSlice = this._hyphen.hyphenate(this._word, this._lang), this._hyphenIndex = 0, this.nextBreakPoint()) : this._nextBreak;
20141
20167
  }
20142
20168
  }
20143
20169
  };
@@ -20149,6 +20175,74 @@ function customBlockLineBreakExtension(breaker) {
20149
20175
  breaker.addRule("break_before_and_after_slash_b", (codePoint, lastCodePoint) => codePoint === SLASH_B_CODE_POINT || lastCodePoint === SLASH_B_CODE_POINT);
20150
20176
  }
20151
20177
  __name(customBlockLineBreakExtension, "customBlockLineBreakExtension");
20178
+ function ofLinkCharType(char) {
20179
+ return /[a-z]/i.test(char) ? "Alphabetic" : /[0-9]/.test(char) ? "Digit" : char === "(" || char === "[" ? "Open" : "Other";
20180
+ }
20181
+ __name(ofLinkCharType, "ofLinkCharType");
20182
+ function linebreakLink(link) {
20183
+ const pieces = [];
20184
+ let offset = 0, prevCharType = "Other";
20185
+ for (let i = 0; i < link.length; i++) {
20186
+ const char = link[i], charType = ofLinkCharType(char);
20187
+ if (i > 0 && prevCharType !== "Open" && (charType === "Other" ? charType === "Other" : charType !== prevCharType)) {
20188
+ const piece = link.slice(offset, i);
20189
+ if (piece.length < 16)
20190
+ pieces.push(piece);
20191
+ else
20192
+ for (let j = 0; j < piece.length; j++)
20193
+ pieces.push(piece[j]);
20194
+ offset = i, prevCharType = charType;
20195
+ }
20196
+ }
20197
+ return pieces;
20198
+ }
20199
+ __name(linebreakLink, "linebreakLink");
20200
+ const LINK_CHAR_REG_EXP = /[a-z\d!#$%&*+,-./:;=?@_~\\]/i, LINK_CHAR_NO_TRAILING_REG_EXP = /[!,.;:?']$/g;
20201
+ function extractLink(content, offset) {
20202
+ let link = "";
20203
+ for (let i = offset; i < content.length; i++) {
20204
+ const char = content[i];
20205
+ if (LINK_CHAR_REG_EXP.test(char))
20206
+ link += char;
20207
+ else
20208
+ break;
20209
+ }
20210
+ return link.replace(LINK_CHAR_NO_TRAILING_REG_EXP, ""), link;
20211
+ }
20212
+ __name(extractLink, "extractLink");
20213
+ const _LineBreakerLinkEnhancer = class _LineBreakerLinkEnhancer {
20214
+ constructor(_lineBreaker) {
20215
+ __publicField(this, "_curBreak", null);
20216
+ __publicField(this, "_nextBreak", new Break(0));
20217
+ __publicField(this, "_isInLink", !1);
20218
+ __publicField(this, "_link", "");
20219
+ __publicField(this, "_index", -1);
20220
+ __publicField(this, "_linkSlice", []);
20221
+ __publicField(this, "content", "");
20222
+ this._lineBreaker = _lineBreaker, this.content = _lineBreaker.content;
20223
+ }
20224
+ nextBreakPoint() {
20225
+ if (this._isInLink)
20226
+ if (this._index < this._linkSlice.length - 1) {
20227
+ const position = getSlicePosition(this._curBreak.position, this._linkSlice, this._index);
20228
+ return this._index++, new Break(position, BreakPointType.Link);
20229
+ } else
20230
+ return this._isInLink = !1, this._link = "", this._linkSlice = [], this._index = -1, this._nextBreak;
20231
+ else {
20232
+ if (this._curBreak = this._nextBreak, this._nextBreak = this._lineBreaker.nextBreakPoint(), this._nextBreak == null || this._curBreak == null)
20233
+ return null;
20234
+ const word = this.content.slice(this._curBreak.position, this._nextBreak.position);
20235
+ if (word.length && (word.endsWith("://") || word.startsWith("www."))) {
20236
+ for (this._isInLink = !0, this._link = extractLink(this.content, this._curBreak.position), this._linkSlice = linebreakLink(this._link), this._index = 0; this._nextBreak && this._nextBreak.position < this._curBreak.position + this._link.length; )
20237
+ this._nextBreak = this._lineBreaker.nextBreakPoint();
20238
+ return this.nextBreakPoint();
20239
+ } else
20240
+ return this._nextBreak;
20241
+ }
20242
+ }
20243
+ };
20244
+ __name(_LineBreakerLinkEnhancer, "LineBreakerLinkEnhancer");
20245
+ let LineBreakerLinkEnhancer = _LineBreakerLinkEnhancer;
20152
20246
  function otherHandler(index2, charArray, viewModel, paragraphNode, sectionBreakConfig, paragraph) {
20153
20247
  const glyphGroup = [];
20154
20248
  let step = 0;
@@ -20244,7 +20338,7 @@ function shaping(ctx, content, viewModel, paragraphNode, sectionBreakConfig, use
20244
20338
  let last = 0, bk, lastGlyphIndex = 0;
20245
20339
  const { hyphen, languageDetector } = ctx, paragraphBody = prepareParagraphBody(viewModel.getBody(), endIndex);
20246
20340
  let glyphInfos = [];
20247
- useOpenType && (glyphInfos = textShape(paragraphBody)), tabLineBreakExtension(breaker), customBlockLineBreakExtension(breaker);
20341
+ useOpenType && (glyphInfos = textShape(paragraphBody)), tabLineBreakExtension(breaker), customBlockLineBreakExtension(breaker), breaker = new LineBreakerLinkEnhancer(breaker);
20248
20342
  const lang = languageDetector.detect(content), needHyphen = hyphenConfig(paragraphStyle, sectionBreakConfig), doNotHyphenateCaps = sectionBreakConfig.doNotHyphenateCaps === BooleanNumber.TRUE;
20249
20343
  for (lang !== Lang.UNKNOWN && needHyphen && (hyphen.hasPattern(lang) ? breaker = new LineBreakerHyphenEnhancer(breaker, hyphen, lang, doNotHyphenateCaps) : hyphen.loadPattern(lang)); bk = breaker.nextBreakPoint(); ) {
20250
20344
  const word = content.slice(last, bk.position), shapedGlyphs = [];
@@ -25382,15 +25476,16 @@ let SpreadsheetSkeleton = (_a6 = class extends Skeleton {
25382
25476
  this._setCellStylesCache(mergeRange.startRow, mergeRange.startColumn, {
25383
25477
  mergeRange
25384
25478
  });
25385
- for (let r = startRow; r <= endRow; r++) {
25386
- for (let c = startColumn; c <= endColumn; c++)
25387
- this._setCellStylesCache(r, c);
25388
- for (let c = 0; c < startColumn; c++)
25389
- this._setCellStylesCache(r, c, { cacheItem: { bg: !1, border: !1 } });
25390
- if (endColumn !== 0)
25391
- for (let c = endColumn + 1; c < columnWidthAccumulation.length; c++)
25479
+ for (let r = startRow; r <= endRow; r++)
25480
+ if (this.worksheet.getRowVisible(r) !== !1) {
25481
+ for (let c = startColumn; c <= endColumn; c++)
25482
+ this._setCellStylesCache(r, c);
25483
+ for (let c = 0; c < startColumn; c++)
25392
25484
  this._setCellStylesCache(r, c, { cacheItem: { bg: !1, border: !1 } });
25393
- }
25485
+ if (endColumn !== 0)
25486
+ for (let c = endColumn + 1; c < columnWidthAccumulation.length; c++)
25487
+ this._setCellStylesCache(r, c, { cacheItem: { bg: !1, border: !1 } });
25488
+ }
25394
25489
  }
25395
25490
  }
25396
25491
  _resetCache() {
@@ -25694,15 +25789,13 @@ const UNIQUE_KEY$7 = "DefaultFontExtension", EXTENSION_Z_INDEX = 45, _Font = cla
25694
25789
  return parent == null ? void 0 : parent.getDocuments();
25695
25790
  }
25696
25791
  draw(ctx, parentScale, spreadsheetSkeleton, diffRanges, moreBoundsInfo) {
25697
- const { viewRanges = [], checkOutOfViewBound } = moreBoundsInfo, { stylesCache, dataMergeCache, overflowCache, worksheet } = spreadsheetSkeleton, { font: fontList } = stylesCache;
25698
- if (!spreadsheetSkeleton || !worksheet || !fontList)
25699
- return;
25700
- const { rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton;
25701
- if (!rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0 || !worksheet)
25792
+ const { stylesCache, dataMergeCache, overflowCache, worksheet, rowHeightAccumulation, columnTotalWidth, columnWidthAccumulation, rowTotalHeight } = spreadsheetSkeleton, { font: fontList } = stylesCache;
25793
+ if (!worksheet || !fontList || !rowHeightAccumulation || !columnWidthAccumulation || columnTotalWidth === void 0 || rowTotalHeight === void 0 || !worksheet)
25702
25794
  return;
25703
25795
  ctx.save();
25704
25796
  const scale = this._getScale(parentScale), renderFontByCell = /* @__PURE__ */ __name((fontFormat) => {
25705
- fontList[fontFormat].forValue((rowIndex, columnIndex, docsConfig) => {
25797
+ const fontObjectArray = fontList[fontFormat], { viewRanges = [], checkOutOfViewBound } = moreBoundsInfo;
25798
+ fontObjectArray.forValue((rowIndex, columnIndex, docsConfig) => {
25706
25799
  var _a11, _b, _c, _d, _e;
25707
25800
  if (!checkOutOfViewBound && !inViewRanges(viewRanges, rowIndex, columnIndex))
25708
25801
  return !0;
@@ -25721,7 +25814,7 @@ const UNIQUE_KEY$7 = "DefaultFontExtension", EXTENSION_Z_INDEX = 45, _Font = cla
25721
25814
  const visibleRow = spreadsheetSkeleton.worksheet.getRowVisible(rowIndex), visibleCol = spreadsheetSkeleton.worksheet.getColVisible(columnIndex);
25722
25815
  if (!visibleRow || !visibleCol) return !0;
25723
25816
  }
25724
- const mergeTo = diffRanges && diffRanges.length > 0 ? diffRanges : viewRanges, combineWithMergeRanges = mergeRangeIfIntersects(mergeTo, [mergeInfo]);
25817
+ const mergeTo = diffRanges && diffRanges.length > 0 ? diffRanges : viewRanges, combineWithMergeRanges = expandRangeIfIntersects([...mergeTo], [mergeInfo]);
25725
25818
  if (!inRowViewRanges(combineWithMergeRanges, rowIndex) || (isMergedMainCell && (startY = mergeInfo.startY, endY = mergeInfo.endY, startX = mergeInfo.startX, endX = mergeInfo.endX), diffRanges && !this.isRowInRanges(mergeInfo.startRow, mergeInfo.endRow, diffRanges)))
25726
25819
  return !0;
25727
25820
  const overflowRectangle = overflowCache.getValue(rowIndex, columnIndex), { horizontalAlign, vertexAngle = 0, centerAngle = 0 } = docsConfig;
@@ -25969,7 +26062,7 @@ const UNIQUE_KEY$4 = "DefaultCustomExtension", Z_INDEX = 55, stringifyRange = /*
25969
26062
  __publicField(this, "Z_INDEX", Z_INDEX);
25970
26063
  __publicField(this, "uKey", UNIQUE_KEY$4);
25971
26064
  }
25972
- draw(ctx, parentScale, skeleton, diffRanges) {
26065
+ draw(ctx, _parentScale, skeleton, diffRanges) {
25973
26066
  const { rowHeightAccumulation, columnWidthAccumulation, worksheet, dataMergeCache, rowColumnSegment } = skeleton;
25974
26067
  if (!worksheet)
25975
26068
  return;
@@ -27686,7 +27779,7 @@ const MINI_THUMB_SIZE = 17, _ScrollBar = class _ScrollBar extends BaseScrollBar
27686
27779
  const e = evt, srcElement = this.verticalThumbRect;
27687
27780
  this._isVerticalMove = !0, this._lastX = e.offsetX, this._lastY = e.offsetY, srcElement == null || srcElement.setProps({
27688
27781
  fill: this.thumbActiveBackgroundColor
27689
- }), mainScene.disableEvent(), this.makeViewDirty(!0), state.stopPropagation();
27782
+ }), mainScene.disableObjectsEvent(), this.makeViewDirty(!0), state.stopPropagation();
27690
27783
  })), this._verticalPointerMoveSub = mainScene.onPointerMove$.subscribeEvent((evt, _state) => {
27691
27784
  var _a11;
27692
27785
  const e = evt;
@@ -27695,7 +27788,7 @@ const MINI_THUMB_SIZE = 17, _ScrollBar = class _ScrollBar extends BaseScrollBar
27695
27788
  }), this._lastY = e.offsetY, (_a11 = mainScene.getEngine()) == null || _a11.setRemainCapture());
27696
27789
  }), this._verticalPointerUpSub = mainScene.onPointerUp$.subscribeEvent((_evt, _state) => {
27697
27790
  const srcElement = this.verticalThumbRect;
27698
- this._isVerticalMove = !1, mainScene.enableEvent(), srcElement == null || srcElement.setProps({
27791
+ this._isVerticalMove = !1, mainScene.enableObjectsEvent(), srcElement == null || srcElement.setProps({
27699
27792
  fill: this.thumbBackgroundColor
27700
27793
  }), this.makeViewDirty(!0);
27701
27794
  });
@@ -27727,7 +27820,7 @@ const MINI_THUMB_SIZE = 17, _ScrollBar = class _ScrollBar extends BaseScrollBar
27727
27820
  const e = evt;
27728
27821
  this._isHorizonMove = !0, this._lastX = e.offsetX, this._lastY = e.offsetY, (_a11 = this.horizonThumbRect) == null || _a11.setProps({
27729
27822
  fill: this.thumbActiveBackgroundColor
27730
- }), this.makeViewDirty(!0), mainScene.disableEvent(), state.stopPropagation();
27823
+ }), this.makeViewDirty(!0), mainScene.disableObjectsEvent(), state.stopPropagation();
27731
27824
  })), this._horizonPointerMoveSub = mainScene.onPointerMove$.subscribeEvent((evt, _state) => {
27732
27825
  var _a11;
27733
27826
  const e = evt;
@@ -27736,7 +27829,7 @@ const MINI_THUMB_SIZE = 17, _ScrollBar = class _ScrollBar extends BaseScrollBar
27736
27829
  }), this._lastX = e.offsetX, (_a11 = mainScene.getEngine()) == null || _a11.setRemainCapture());
27737
27830
  }), this._horizonPointerUpSub = mainScene.onPointerUp$.subscribeEvent((evt, state) => {
27738
27831
  const srcElement = this.horizonThumbRect;
27739
- this._isHorizonMove = !1, mainScene.enableEvent(), srcElement == null || srcElement.setProps({
27832
+ this._isHorizonMove = !1, mainScene.enableObjectsEvent(), srcElement == null || srcElement.setProps({
27740
27833
  fill: this.thumbBackgroundColor
27741
27834
  }), this.makeViewDirty(!0);
27742
27835
  });
@@ -28529,13 +28622,28 @@ const OBJECT_KEY = "__SHEET_EXTENSION_FONT_DOCUMENT_INSTANCE__", _Spreadsheet =
28529
28622
  if (!spreadsheetSkeleton)
28530
28623
  return;
28531
28624
  this._drawAuxiliary(ctx);
28532
- const parentScale = this.getParentScale(), diffRanges = this._refreshIncrementalState && (viewportInfo != null && viewportInfo.diffBounds) ? (_a11 = viewportInfo == null ? void 0 : viewportInfo.diffBounds) == null ? void 0 : _a11.map((bound) => spreadsheetSkeleton.getRowColumnSegmentByViewBound(bound)) : void 0, viewRanges = [spreadsheetSkeleton.getRowColumnSegmentByViewBound(viewportInfo == null ? void 0 : viewportInfo.cacheBound)], extensions = this.getExtensionsByOrder();
28533
- for (const extension of extensions)
28534
- `${viewportInfo.viewportKey}${extension.constructor.name}`, extension.draw(ctx, parentScale, spreadsheetSkeleton, diffRanges, {
28625
+ const parentScale = this.getParentScale(), diffRanges = this._refreshIncrementalState && (viewportInfo != null && viewportInfo.diffBounds) ? (_a11 = viewportInfo == null ? void 0 : viewportInfo.diffBounds) == null ? void 0 : _a11.map((bound) => spreadsheetSkeleton.getRowColumnSegmentByViewBound(bound)) : [], viewRanges = [spreadsheetSkeleton.getRowColumnSegmentByViewBound(viewportInfo == null ? void 0 : viewportInfo.cacheBound)], extensions = this.getExtensionsByOrder(), scene = this.getScene();
28626
+ for (const extension of extensions) {
28627
+ const timeKey = `${SHEET_EXTENSION_PREFIX}${extension.uKey}`, st = Tools.now();
28628
+ extension.draw(ctx, parentScale, spreadsheetSkeleton, diffRanges, {
28535
28629
  viewRanges,
28536
28630
  checkOutOfViewBound: !0,
28537
28631
  viewportKey: viewportInfo.viewportKey
28538
- });
28632
+ }), this.addRenderFrameTimeMetricToScene(timeKey, Tools.now() - st, scene);
28633
+ }
28634
+ }
28635
+ addRenderFrameTimeMetricToScene(timeKey, val, scene) {
28636
+ scene = scene != null ? scene : this.getScene(), scene.getEngine().renderFrameTimeMetric$.next([timeKey, val]);
28637
+ }
28638
+ addRenderTagToScene(renderKey, val, scene) {
28639
+ scene = scene != null ? scene : this.getScene(), scene.getEngine().renderFrameTags$.next([renderKey, val]);
28640
+ }
28641
+ /**
28642
+ * override for return type as Scene.
28643
+ * @returns Scene
28644
+ */
28645
+ getScene() {
28646
+ return super.getScene();
28539
28647
  }
28540
28648
  isHit(coord) {
28541
28649
  const oCoord = this.getInverseCoord(coord), skeleton = this.getSkeleton();
@@ -28607,7 +28715,7 @@ const OBJECT_KEY = "__SHEET_EXTENSION_FONT_DOCUMENT_INSTANCE__", _Spreadsheet =
28607
28715
  const { diffBounds, diffX, diffY, viewPortPosition, cacheCanvas, leftOrigin, topOrigin, bufferEdgeX, bufferEdgeY, isDirty: isViewportDirty, isForceDirty: isViewportForceDirty } = viewportInfo, { rowHeaderWidth, columnHeaderHeight } = spreadsheetSkeleton, { a: scaleX = 1, d: scaleY = 1 } = mainCtx.getTransform(), bufferEdgeSizeX = bufferEdgeX * scaleX / window.devicePixelRatio, bufferEdgeSizeY = bufferEdgeY * scaleY / window.devicePixelRatio, cacheCtx = cacheCanvas.getContext();
28608
28716
  cacheCtx.save();
28609
28717
  const { left, top, right, bottom } = viewPortPosition, dw = right - left + rowHeaderWidth, dh = bottom - top + columnHeaderHeight, isForceDirty = isViewportForceDirty || this.isForceDirty(), isDirty = isViewportDirty || this.isDirty();
28610
- diffBounds.length === 0 || diffX === 0 && diffY === 0 || isForceDirty || isDirty ? (isDirty || isForceDirty) && this.refreshCacheCanvas(viewportInfo, { cacheCanvas, cacheCtx, mainCtx, topOrigin, leftOrigin, bufferEdgeX, bufferEdgeY }) : (diffBounds.length !== 0 || diffX !== 0 || diffY !== 0) && this.paintNewAreaForScrolling(viewportInfo, {
28718
+ diffBounds.length === 0 || diffX === 0 && diffY === 0 || isForceDirty || isDirty ? (isDirty || isForceDirty) && (this.addRenderTagToScene("scrolling", !1), this.refreshCacheCanvas(viewportInfo, { cacheCanvas, cacheCtx, mainCtx, topOrigin, leftOrigin, bufferEdgeX, bufferEdgeY })) : (diffBounds.length !== 0 || diffX !== 0 || diffY !== 0) && (this.addRenderTagToScene("scrolling", !0), this.paintNewAreaForScrolling(viewportInfo, {
28611
28719
  cacheCanvas,
28612
28720
  cacheCtx,
28613
28721
  mainCtx,
@@ -28619,7 +28727,7 @@ const OBJECT_KEY = "__SHEET_EXTENSION_FONT_DOCUMENT_INSTANCE__", _Spreadsheet =
28619
28727
  scaleY,
28620
28728
  columnHeaderHeight,
28621
28729
  rowHeaderWidth
28622
- });
28730
+ }));
28623
28731
  const sourceLeft = bufferEdgeSizeX * Math.min(1, window.devicePixelRatio), sourceTop = bufferEdgeSizeY * Math.min(1, window.devicePixelRatio);
28624
28732
  this._applyCache(cacheCanvas, mainCtx, sourceLeft, sourceTop, dw, dh, left, top, dw, dh), cacheCtx.restore();
28625
28733
  }
@@ -29276,21 +29384,30 @@ const _Engine = class _Engine extends ThinEngine {
29276
29384
  __publicField(this, "beginFrame$", this._beginFrame$.asObservable());
29277
29385
  __publicField(this, "_endFrame$", new Subject());
29278
29386
  __publicField(this, "endFrame$", this._endFrame$.asObservable());
29387
+ __publicField(this, "renderFrameTimeMetric$", new Subject());
29388
+ __publicField(this, "renderFrameTags$", new Subject());
29389
+ /**
29390
+ * time when render start, for elapsedTime
29391
+ */
29392
+ __publicField(this, "_renderStartTime", 0);
29279
29393
  __publicField(this, "_rect$", null);
29280
29394
  __publicField(this, "_container");
29281
29395
  __publicField(this, "_canvas");
29282
29396
  __publicField(this, "_renderingQueueLaunched", !1);
29283
- __publicField(this, "_activeRenderLoops", new Array());
29284
- __publicField(this, "_renderFunction", /* @__PURE__ */ __name(() => {
29397
+ __publicField(this, "_renderFrameTasks", new Array());
29398
+ __publicField(this, "_renderFunction", /* @__PURE__ */ __name((_timestamp) => {
29285
29399
  }, "_renderFunction"));
29286
29400
  __publicField(this, "_requestNewFrameHandler", -1);
29401
+ /**
29402
+ * frameCount
29403
+ */
29287
29404
  __publicField(this, "_frameId", -1);
29288
29405
  __publicField(this, "_usingSafari", IsSafari());
29289
29406
  __publicField(this, "_resizeObserver");
29290
29407
  // FPS
29291
29408
  __publicField(this, "_fps", 60);
29292
29409
  __publicField(this, "_deltaTime", 0);
29293
- __publicField(this, "_performanceMonitor", new PerformanceMonitor());
29410
+ __publicField(this, "_performanceMonitor");
29294
29411
  __publicField(this, "_pointerMoveEvent");
29295
29412
  __publicField(this, "_pointerDownEvent");
29296
29413
  __publicField(this, "_pointerUpEvent");
@@ -29316,7 +29433,7 @@ const _Engine = class _Engine extends ThinEngine {
29316
29433
  width: elemWidth,
29317
29434
  height: elemHeight,
29318
29435
  pixelRatio
29319
- }), this._handleKeyboardAction(), this._handlePointerAction(), this._handleDragAction(), mode !== CanvasRenderMode.Printing && this._matchMediaHandler();
29436
+ }), this._init(), this._handleKeyboardAction(), this._handlePointerAction(), this._handleDragAction(), mode !== CanvasRenderMode.Printing && this._matchMediaHandler();
29320
29437
  }
29321
29438
  get clientRect$() {
29322
29439
  return this._rect$ || (this._rect$ = new Observable((subscriber) => {
@@ -29328,6 +29445,12 @@ const _Engine = class _Engine extends ThinEngine {
29328
29445
  };
29329
29446
  })).pipe(shareReplay(1));
29330
29447
  }
29448
+ _init() {
29449
+ this._performanceMonitor = new PerformanceMonitor();
29450
+ }
29451
+ get elapsedTime() {
29452
+ return Tools.now() - this._renderStartTime;
29453
+ }
29331
29454
  get width() {
29332
29455
  return this.getCanvas().getWidth();
29333
29456
  }
@@ -29414,14 +29537,20 @@ const _Engine = class _Engine extends ThinEngine {
29414
29537
  var _a11;
29415
29538
  super.dispose();
29416
29539
  const eventPrefix = getPointerPrefix(), canvasEle = this.getCanvasElement();
29417
- canvasEle.removeEventListener(`${eventPrefix}leave`, this._pointerLeaveEvent), canvasEle.removeEventListener(`${eventPrefix}enter`, this._pointerEnterEvent), canvasEle.removeEventListener(`${eventPrefix}move`, this._pointerMoveEvent), canvasEle.removeEventListener(`${eventPrefix}down`, this._pointerDownEvent), canvasEle.removeEventListener(`${eventPrefix}up`, this._pointerUpEvent), canvasEle.removeEventListener(`${eventPrefix}out`, this._pointerOutEvent), canvasEle.removeEventListener(`${eventPrefix}cancel`, this._pointerCancelEvent), canvasEle.removeEventListener("blur", this._pointerBlurEvent), canvasEle.removeEventListener("dragenter", this._dragEnterEvent), canvasEle.removeEventListener("dragleave", this._dragLeaveEvent), canvasEle.removeEventListener("dragover", this._dragOverEvent), canvasEle.removeEventListener("drop", this._dropEvent), canvasEle.removeEventListener(this._getWheelEventName(), this._pointerWheelEvent), this._activeRenderLoops = [], this.getCanvas().dispose(), this.onTransformChange$.complete(), this._beginFrame$.complete(), this._endFrame$.complete(), (_a11 = this._resizeObserver) == null || _a11.disconnect(), this._container = null;
29540
+ canvasEle.removeEventListener(`${eventPrefix}leave`, this._pointerLeaveEvent), canvasEle.removeEventListener(`${eventPrefix}enter`, this._pointerEnterEvent), canvasEle.removeEventListener(`${eventPrefix}move`, this._pointerMoveEvent), canvasEle.removeEventListener(`${eventPrefix}down`, this._pointerDownEvent), canvasEle.removeEventListener(`${eventPrefix}up`, this._pointerUpEvent), canvasEle.removeEventListener(`${eventPrefix}out`, this._pointerOutEvent), canvasEle.removeEventListener(`${eventPrefix}cancel`, this._pointerCancelEvent), canvasEle.removeEventListener("blur", this._pointerBlurEvent), canvasEle.removeEventListener("dragenter", this._dragEnterEvent), canvasEle.removeEventListener("dragleave", this._dragLeaveEvent), canvasEle.removeEventListener("dragover", this._dragOverEvent), canvasEle.removeEventListener("drop", this._dropEvent), canvasEle.removeEventListener(this._getWheelEventName(), this._pointerWheelEvent), this._renderFrameTasks = [], this._performanceMonitor.dispose(), this.getCanvas().dispose(), this.onTransformChange$.complete(), this.onTransformChange$.complete(), this._beginFrame$.complete(), this._endFrame$.complete(), (_a11 = this._resizeObserver) == null || _a11.disconnect(), this._container = null;
29541
+ }
29542
+ addFunction2RenderLoop(renderFunction) {
29543
+ this._renderFrameTasks.indexOf(renderFunction) === -1 && this._renderFrameTasks.push(renderFunction);
29544
+ }
29545
+ startRenderLoop() {
29546
+ this._renderingQueueLaunched || (this._renderStartTime = performance.now(), this._renderingQueueLaunched = !0, this._renderFunction = this._renderFunctionCore.bind(this), this._requestNewFrameHandler = requestNewFrame(this._renderFunction));
29418
29547
  }
29419
29548
  /**
29420
- * Register and execute a render loop. The engine can have more than one render function
29549
+ * Register and execute a render loop. The engine could manage more than one render function
29421
29550
  * @param renderFunction defines the function to continuously execute
29422
29551
  */
29423
29552
  runRenderLoop(renderFunction) {
29424
- this._activeRenderLoops.indexOf(renderFunction) === -1 && (this._activeRenderLoops.push(renderFunction), this._renderingQueueLaunched || (this._renderingQueueLaunched = !0, this._renderFunction = this._renderLoop.bind(this), this._requestNewFrameHandler = requestNewFrame(this._renderFunction)));
29553
+ this.addFunction2RenderLoop(renderFunction), this.startRenderLoop();
29425
29554
  }
29426
29555
  /**
29427
29556
  * stop executing a render loop function and remove it from the execution array
@@ -29429,25 +29558,28 @@ const _Engine = class _Engine extends ThinEngine {
29429
29558
  */
29430
29559
  stopRenderLoop(renderFunction) {
29431
29560
  if (!renderFunction) {
29432
- this._activeRenderLoops.length = 0, this._cancelFrame();
29561
+ this._renderFrameTasks.length = 0, this._cancelFrame();
29433
29562
  return;
29434
29563
  }
29435
- const index2 = this._activeRenderLoops.indexOf(renderFunction);
29436
- index2 >= 0 && (this._activeRenderLoops.splice(index2, 1), this._activeRenderLoops.length === 0 && this._cancelFrame());
29564
+ const index2 = this._renderFrameTasks.indexOf(renderFunction);
29565
+ index2 >= 0 && (this._renderFrameTasks.splice(index2, 1), this._renderFrameTasks.length === 0 && this._cancelFrame());
29437
29566
  }
29438
29567
  /**
29439
29568
  * Begin a new frame
29440
29569
  */
29441
- beginFrame() {
29442
- this._measureFps(), this._beginFrame$.next();
29570
+ _beginFrame(_timestamp) {
29571
+ this._frameId++, this._beginFrame$.next(this._frameId);
29443
29572
  }
29444
29573
  /**
29445
29574
  * End the current frame
29446
29575
  */
29447
- endFrame() {
29448
- this._frameId++, this._endFrame$.next();
29576
+ _endFrame(timestamp) {
29577
+ this._performanceMonitor.endFrame(timestamp), this._fps = this._performanceMonitor.averageFPS, this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0, this._endFrame$.next({
29578
+ FPS: this.getFps(),
29579
+ frameTime: this.getDeltaTime(),
29580
+ elapsedTime: this.elapsedTime
29581
+ });
29449
29582
  }
29450
- // FPS
29451
29583
  /**
29452
29584
  * Gets the current framerate
29453
29585
  * @returns a number representing the framerate
@@ -29462,9 +29594,12 @@ const _Engine = class _Engine extends ThinEngine {
29462
29594
  getDeltaTime() {
29463
29595
  return this._deltaTime;
29464
29596
  }
29465
- _renderFrame() {
29466
- for (let index2 = 0; index2 < this._activeRenderLoops.length; index2++) {
29467
- const renderFunction = this._activeRenderLoops[index2];
29597
+ /**
29598
+ * Exec all function in _renderFrameTasks
29599
+ */
29600
+ _renderFrame(_timestamp) {
29601
+ for (let index2 = 0; index2 < this._renderFrameTasks.length; index2++) {
29602
+ const renderFunction = this._renderFrameTasks[index2];
29468
29603
  renderFunction();
29469
29604
  }
29470
29605
  }
@@ -29485,12 +29620,13 @@ const _Engine = class _Engine extends ThinEngine {
29485
29620
  var _a11;
29486
29621
  return typeof window > "u" ? null : (_a11 = this.getCanvasElement().ownerDocument) != null && _a11.defaultView ? this.getCanvasElement().ownerDocument.defaultView : window;
29487
29622
  }
29488
- _renderLoop() {
29623
+ /**
29624
+ * call itself by raf
29625
+ * Exec all function in _renderFrameTasks in _renderFrame()
29626
+ */
29627
+ _renderFunctionCore(timestamp) {
29489
29628
  let shouldRender = !0;
29490
- this.renderEvenInBackground || (shouldRender = !1), shouldRender && (this.beginFrame(), this._renderFrame(), this.endFrame()), this._activeRenderLoops.length > 0 ? this._requestNewFrameHandler = requestNewFrame(this._renderFunction) : this._renderingQueueLaunched = !1;
29491
- }
29492
- _measureFps() {
29493
- this._performanceMonitor.sampleFrame(), this._fps = this._performanceMonitor.averageFPS, this._deltaTime = this._performanceMonitor.instantaneousFrameTime || 0;
29629
+ this.renderEvenInBackground || (shouldRender = !1), shouldRender && (this._beginFrame(timestamp), this._renderFrame(timestamp), this._endFrame(timestamp)), this._renderFrameTasks.length > 0 ? this._requestNewFrameHandler = requestNewFrame(this._renderFunction) : this._renderingQueueLaunched = !1;
29494
29630
  }
29495
29631
  _handleKeyboardAction() {
29496
29632
  const keyboardDownEvent = /* @__PURE__ */ __name((evt) => {
@@ -29955,6 +30091,194 @@ const _Layer = class _Layer extends Disposable {
29955
30091
  };
29956
30092
  __name(_Layer, "Layer");
29957
30093
  let Layer = _Layer;
30094
+ const _InputManager = class _InputManager extends Disposable {
30095
+ constructor(scene) {
30096
+ super();
30097
+ __publicField(this, "_scene");
30098
+ /** This is a defensive check to not allow control attachment prior to an already active one. If already attached, previous control is unattached before attaching the new one. */
30099
+ __publicField(this, "_alreadyAttached", !1);
30100
+ // private _alreadyAttachedTo: HTMLElement;
30101
+ // WorkBookObserver
30102
+ __publicField(this, "_onInput$");
30103
+ // Pointers
30104
+ __publicField(this, "_onPointerMove");
30105
+ __publicField(this, "_onPointerDown");
30106
+ __publicField(this, "_onPointerUp");
30107
+ __publicField(this, "_onPointerOut");
30108
+ __publicField(this, "_onPointerCancel");
30109
+ __publicField(this, "_onPointerEnter");
30110
+ __publicField(this, "_onPointerLeave");
30111
+ __publicField(this, "_onMouseWheel");
30112
+ // Keyboard
30113
+ __publicField(this, "_onKeyDown");
30114
+ __publicField(this, "_onKeyUp");
30115
+ // Drag
30116
+ __publicField(this, "_onDragEnter");
30117
+ __publicField(this, "_onDragLeave");
30118
+ __publicField(this, "_onDragOver");
30119
+ __publicField(this, "_onDrop");
30120
+ __publicField(this, "_currentMouseEnterPicked");
30121
+ __publicField(this, "_startingPosition", new Vector2(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY));
30122
+ __publicField(this, "_delayedTimeout", -1);
30123
+ __publicField(this, "_delayedTripeTimeout", -1);
30124
+ __publicField(this, "_doubleClickOccurred", 0);
30125
+ __publicField(this, "_tripleClickState", !1);
30126
+ __publicField(this, "_currentObject");
30127
+ this._scene = scene;
30128
+ }
30129
+ /**
30130
+ * TODO: DR-Univer, fix as unknown as
30131
+ */
30132
+ dispose() {
30133
+ super.dispose(), this.detachControl(), this._scene = null, this._currentMouseEnterPicked = null, this._currentObject = null, this._startingPosition = null, clearTimeout(this._delayedTimeout), clearTimeout(this._delayedTripeTimeout), this._onPointerMove = null, this._onPointerDown = null, this._onPointerUp = null, this._onPointerEnter = null, this._onPointerLeave = null, this._onMouseWheel = null, this._onKeyDown = null, this._onKeyUp = null, this._onDragEnter = null, this._onDragLeave = null, this._onDragOver = null, this._onDrop = null;
30134
+ }
30135
+ // Handle events such as triggering mouseleave and mouseenter.
30136
+ mouseLeaveEnterHandler(evt) {
30137
+ var _a11;
30138
+ const o = this._currentObject;
30139
+ if (o == null)
30140
+ (_a11 = this._currentMouseEnterPicked) == null || _a11.triggerPointerLeave(evt), this._currentMouseEnterPicked = null;
30141
+ else if (o !== this._currentMouseEnterPicked) {
30142
+ const previousPicked = this._currentMouseEnterPicked;
30143
+ this._currentMouseEnterPicked = o, previousPicked == null || previousPicked.triggerPointerLeave(evt), o == null || o.triggerPointerEnter(evt);
30144
+ }
30145
+ }
30146
+ // Handle events such as triggering dragleave and dragenter.
30147
+ dragLeaveEnterHandler(evt) {
30148
+ var _a11;
30149
+ const o = this._currentObject;
30150
+ if (o == null)
30151
+ (_a11 = this._currentMouseEnterPicked) == null || _a11.triggerDragLeave(evt), this._currentMouseEnterPicked = null;
30152
+ else if (o !== this._currentMouseEnterPicked) {
30153
+ const previousPicked = this._currentMouseEnterPicked;
30154
+ this._currentMouseEnterPicked = o, previousPicked == null || previousPicked.triggerDragLeave(evt), o == null || o.triggerDragEnter(evt);
30155
+ }
30156
+ }
30157
+ // eslint-disable-next-line max-lines-per-function
30158
+ attachControl(hasDown = !0, hasUp = !0, enableMove = !0, hasWheel = !0, hasEnter = !0, hasLeave = !0) {
30159
+ const engine = this._scene.getEngine();
30160
+ engine && (this._onPointerEnter = (evt) => {
30161
+ var _a11;
30162
+ evt.pointerId === void 0 && (evt.pointerId = 0), this._currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), (_a11 = this._currentObject) == null || _a11.triggerPointerMove(evt), this.mouseLeaveEnterHandler(evt);
30163
+ }, this._onPointerLeave = (evt) => {
30164
+ evt.pointerId === void 0 && (evt.pointerId = 0), this._currentObject = null, this.mouseLeaveEnterHandler(evt);
30165
+ }, this._onPointerMove = (evt) => {
30166
+ var _a11;
30167
+ evt.pointerId === void 0 && (evt.pointerId = 0);
30168
+ const currentObject = this._currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerMove(evt);
30169
+ this.mouseLeaveEnterHandler(evt), this._checkDirectSceneEventTrigger(!isStop, this._currentObject) && (this._scene.onPointerMove$.emitEvent(evt), (_a11 = this._scene.getEngine()) == null || _a11.setRemainCapture());
30170
+ }, this._onPointerDown = (evt) => {
30171
+ evt.pointerId === void 0 && (evt.pointerId = 0);
30172
+ const currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerDown(evt);
30173
+ this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onPointerDown$.emitEvent(evt);
30174
+ }, this._onPointerUp = (evt) => {
30175
+ evt.pointerId === void 0 && (evt.pointerId = 0);
30176
+ const currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerUp(evt);
30177
+ this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onPointerUp$.emitEvent(evt), this._prePointerDoubleOrTripleClick(evt);
30178
+ }, this._onPointerCancel = (evt) => {
30179
+ this._scene.onPointerCancel$.emitEvent(evt);
30180
+ }, this._onPointerOut = (evt) => {
30181
+ this._scene.onPointerOut$.emitEvent(evt);
30182
+ }, this._onMouseWheel = (evt) => {
30183
+ const currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerMouseWheel(evt);
30184
+ this._scene.getViewports().forEach((vp) => {
30185
+ vp.onMouseWheel$.emitEvent(evt);
30186
+ }), this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onMouseWheel$.emitEvent(evt);
30187
+ }, this._onKeyDown = (evt) => {
30188
+ this._scene.onKeyDown$.emitEvent(evt);
30189
+ }, this._onKeyUp = (evt) => {
30190
+ this._scene.onKeyUp$.emitEvent(evt);
30191
+ }, this._onDragEnter = (evt) => {
30192
+ var _a11;
30193
+ this._currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), (_a11 = this._currentObject) == null || _a11.triggerDragOver(evt), this.dragLeaveEnterHandler(evt);
30194
+ }, this._onDragLeave = (evt) => {
30195
+ this._currentObject = null, this.dragLeaveEnterHandler(evt);
30196
+ }, this._onDragOver = (evt) => {
30197
+ var _a11, _b;
30198
+ this._currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY);
30199
+ const isStop = (_a11 = this._currentObject) == null ? void 0 : _a11.triggerDragOver(evt);
30200
+ this.dragLeaveEnterHandler(evt), this._checkDirectSceneEventTrigger(!isStop, this._currentObject) && (this._scene.onDragOver$.emitEvent(evt), (_b = this._scene.getEngine()) == null || _b.setRemainCapture());
30201
+ }, this._onDrop = (evt) => {
30202
+ const currentObject = this._getObjectAtPos(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerDrop(evt);
30203
+ this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onDrop$.emitEvent(evt);
30204
+ }, this._onInput$ = engine.onInputChanged$.subscribeEvent((eventData) => {
30205
+ const evt = eventData;
30206
+ if (eventData.deviceType === DeviceType.Keyboard && (eventData.currentState === 1 && this._onKeyDown(evt), eventData.currentState === 0 && this._onKeyUp(evt)), eventData.dataTransfer) {
30207
+ enableMove && (eventData.inputIndex === PointerInput.Horizontal || eventData.inputIndex === PointerInput.Vertical || eventData.inputIndex === PointerInput.DeltaHorizontal || eventData.inputIndex === PointerInput.DeltaVertical) ? this._onDragOver(evt) : hasEnter && eventData.currentState === 4 ? this._onDragEnter(evt) : hasLeave && eventData.currentState === 5 ? this._onDragLeave(evt) : hasUp && eventData.currentState === 6 && this._onDrop(evt);
30208
+ return;
30209
+ }
30210
+ if (eventData.deviceType === DeviceType.Mouse || eventData.deviceType === DeviceType.Touch)
30211
+ switch (hasDown && eventData.inputIndex >= PointerInput.LeftClick && eventData.inputIndex <= PointerInput.RightClick && eventData.currentState === 1 && this._onPointerDown(evt), hasUp && eventData.inputIndex >= PointerInput.LeftClick && eventData.inputIndex <= PointerInput.RightClick && eventData.currentState === 0 && this._onPointerUp(evt), enableMove && eventData.type === "pointermove" ? this._onPointerMove(evt) : hasWheel && (eventData.inputIndex === PointerInput.MouseWheelX || eventData.inputIndex === PointerInput.MouseWheelY || eventData.inputIndex === PointerInput.MouseWheelZ) ? this._onMouseWheel(evt) : hasEnter && eventData.currentState === 2 ? this._onPointerEnter(evt) : hasLeave && eventData.currentState === 3 && this._onPointerLeave(evt), evt.type) {
30212
+ case "pointerout":
30213
+ this._onPointerOut(evt);
30214
+ break;
30215
+ case "pointercancel":
30216
+ this._onPointerCancel(evt);
30217
+ break;
30218
+ }
30219
+ }), this.disposeWithMe(
30220
+ toDisposable(
30221
+ this._onInput$
30222
+ )
30223
+ ), this._alreadyAttached = !0);
30224
+ }
30225
+ /**
30226
+ * Detaches all event handlers
30227
+ */
30228
+ detachControl() {
30229
+ var _a11;
30230
+ !this._alreadyAttached || !this._scene.getEngine() || ((_a11 = this._onInput$) == null || _a11.unsubscribe(), this._alreadyAttached = !1);
30231
+ }
30232
+ /**
30233
+ * Just call this._scene?.pick, nothing special.
30234
+ * @param offsetX
30235
+ * @param offsetY
30236
+ * @returns
30237
+ */
30238
+ _getObjectAtPos(offsetX, offsetY) {
30239
+ var _a11;
30240
+ return (_a11 = this._scene) == null ? void 0 : _a11.pick(Vector2.FromArray([offsetX, offsetY]));
30241
+ }
30242
+ _checkDirectSceneEventTrigger(isTrigger, currentObject) {
30243
+ let notObject = !1;
30244
+ currentObject == null && (notObject = !0);
30245
+ let isNotInSceneViewer = !0;
30246
+ if (currentObject && currentObject.classType === RENDER_CLASS_TYPE.BASE_OBJECT) {
30247
+ const scene = currentObject.getScene();
30248
+ scene && (isNotInSceneViewer = scene.getParent().classType !== RENDER_CLASS_TYPE.SCENE_VIEWER);
30249
+ }
30250
+ return !this._scene.objectsEvented && isTrigger && isNotInSceneViewer || notObject;
30251
+ }
30252
+ /**
30253
+ * @hidden
30254
+ * @returns Boolean if delta for pointer exceeds drag movement threshold
30255
+ */
30256
+ _isPointerSwiping(pointerX, pointerY) {
30257
+ return Math.abs(this._startingPosition.x - pointerX) > _InputManager.DragMovementThreshold || Math.abs(this._startingPosition.y - pointerY) > _InputManager.DragMovementThreshold;
30258
+ }
30259
+ _prePointerDoubleOrTripleClick(evt) {
30260
+ var _a11, _b, _c, _d;
30261
+ const { clientX, clientY } = evt;
30262
+ this._isPointerSwiping(clientX, clientY) && this._resetDoubleClickParam(), this._delayedTimeout = setTimeout(() => {
30263
+ this._resetDoubleClickParam();
30264
+ }, _InputManager.DoubleClickDelay), this._doubleClickOccurred += 1, this._tripleClickState && ((_b = (_a11 = this._scene) == null ? void 0 : _a11.pick(Vector2.FromArray([evt.offsetX, evt.offsetY]))) == null || _b.triggerTripleClick(evt), this._scene.onTripleClick$.emitEvent(evt)), this._doubleClickOccurred === 2 && ((_d = (_c = this._scene) == null ? void 0 : _c.pick(Vector2.FromArray([evt.offsetX, evt.offsetY]))) == null || _d.triggerDblclick(evt), this._scene.onDblclick$.emitEvent(evt), this._resetDoubleClickParam(), this._tripleClickState = !0, clearTimeout(this._delayedTripeTimeout), this._delayedTripeTimeout = setTimeout(() => {
30265
+ this._tripleClickState = !1;
30266
+ }, _InputManager.TripleClickDelay)), this._startingPosition.x = clientX, this._startingPosition.y = clientY;
30267
+ }
30268
+ _resetDoubleClickParam() {
30269
+ this._doubleClickOccurred = 0, clearTimeout(this._delayedTimeout);
30270
+ }
30271
+ };
30272
+ __name(_InputManager, "InputManager"), /** The distance in pixel that you have to move to prevent some events */
30273
+ __publicField(_InputManager, "DragMovementThreshold", 2), // in pixels
30274
+ /** Time in milliseconds to wait to raise long press events if button is still pressed */
30275
+ __publicField(_InputManager, "LongPressDelay", 500), // in milliseconds
30276
+ /** Time in milliseconds with two consecutive clicks will be considered as a double or triple click */
30277
+ __publicField(_InputManager, "DoubleClickDelay", 500), // in milliseconds
30278
+ __publicField(_InputManager, "TripleClickDelay", 300), // in milliseconds
30279
+ /** If you need to check double click without raising a single click at first click, enable this flag */
30280
+ __publicField(_InputManager, "ExclusiveDoubleClickMode", !1);
30281
+ let InputManager = _InputManager;
29958
30282
  var ScrollTimerType = /* @__PURE__ */ ((ScrollTimerType2) => (ScrollTimerType2[ScrollTimerType2.NONE = 0] = "NONE", ScrollTimerType2[ScrollTimerType2.X = 1] = "X", ScrollTimerType2[ScrollTimerType2.Y = 2] = "Y", ScrollTimerType2[ScrollTimerType2.ALL = 3] = "ALL", ScrollTimerType2))(ScrollTimerType || {});
29959
30283
  const _ScrollTimer = class _ScrollTimer {
29960
30284
  constructor(_scene, _scrollTimerType = 3, _padding) {
@@ -29966,6 +30290,9 @@ const _ScrollTimer = class _ScrollTimer {
29966
30290
  __publicField(this, "_moveY", 0);
29967
30291
  __publicField(this, "_scrollX", 0);
29968
30292
  __publicField(this, "_scrollY", 0);
30293
+ /**
30294
+ * Custmize scroll function.
30295
+ */
29969
30296
  __publicField(this, "_scrollFunction");
29970
30297
  this._scene = _scene, this._scrollTimerType = _scrollTimerType, this._padding = _padding, this._padding || (this._padding = { t: 0, b: 15, l: 0, r: 60 });
29971
30298
  }
@@ -29987,7 +30314,8 @@ const _ScrollTimer = class _ScrollTimer {
29987
30314
  startScroll(offsetX, offsetY, targetViewport) {
29988
30315
  this._offsetX = offsetX, this._offsetY = offsetY, this._moveX = offsetX, this._moveY = offsetY, targetViewport != null ? this._viewport = targetViewport : this._viewport = this.getViewportByCoord(this._scene), this._runRenderLoop();
29989
30316
  }
29990
- _scroll(viewport) {
30317
+ //eslint-disable-next-line complexity
30318
+ _autoScroll(viewport) {
29991
30319
  const topBounding = (viewport == null ? void 0 : viewport.top) || 0, bottomBounding = topBounding + ((viewport == null ? void 0 : viewport.height) || 0), leftBounding = (viewport == null ? void 0 : viewport.left) || 0, rightBounding = leftBounding + ((viewport == null ? void 0 : viewport.width) || 0), { t = 0, b = 0, r = 0, l = 0 } = this._padding;
29992
30320
  let x = 0, y = 0, shouldScroll = !1;
29993
30321
  if (this._scrollTimerType & 1 && (this._moveX < leftBounding + l && (x = this._moveX - leftBounding - l, shouldScroll = !0), this._moveX > rightBounding - r && (x = this._moveX - rightBounding + r, shouldScroll = !0)), this._scrollTimerType & 2 && (this._moveY < topBounding + t && (y = this._moveY - topBounding - t, shouldScroll = !0), this._moveY > bottomBounding - b && (y = this._moveY - bottomBounding + b, shouldScroll = !0)), !shouldScroll)
@@ -29998,7 +30326,7 @@ const _ScrollTimer = class _ScrollTimer {
29998
30326
  }), viewportScrollVal = viewport == null ? void 0 : viewport.transScroll2ViewportScrollValue(x, y);
29999
30327
  if (this._scrollX = (viewportScrollVal == null ? void 0 : viewportScrollVal.x) || 0, this._scrollY = (viewportScrollVal == null ? void 0 : viewportScrollVal.y) || 0, limited) {
30000
30328
  const ancestorScene = this._findAncestorScene(viewport == null ? void 0 : viewport.scene), newViewport = this.getViewportByCoord(ancestorScene);
30001
- newViewport && this._scroll(newViewport);
30329
+ newViewport && this._autoScroll(newViewport);
30002
30330
  }
30003
30331
  }
30004
30332
  scrolling(offsetX, offsetY, scrollFunction) {
@@ -30017,7 +30345,7 @@ const _ScrollTimer = class _ScrollTimer {
30017
30345
  return this._scene;
30018
30346
  }
30019
30347
  _runRenderLoop() {
30020
- this._scroll(this._viewport), this._scrollFunction && this._scrollFunction(this._scrollX, this._scrollY), this._requestNewFrameNumber = requestNewFrame(this._runRenderLoop.bind(this));
30348
+ this._autoScroll(this._viewport), this._scrollFunction && this._scrollFunction(this._scrollX, this._scrollY), this._requestNewFrameNumber = requestNewFrame(this._runRenderLoop.bind(this));
30021
30349
  }
30022
30350
  _findAncestorScene(scene) {
30023
30351
  let parent = scene == null ? void 0 : scene.getParent();
@@ -30232,7 +30560,7 @@ const TransformerManagerTypeArray = [
30232
30560
  const { isCropper } = this._getConfig(applyObject), scene = this._getTopScene();
30233
30561
  if (!scene)
30234
30562
  return;
30235
- this._addCancelObserver(scene), scene.disableEvent();
30563
+ this._addCancelObserver(scene), scene.disableObjectsEvent();
30236
30564
  const scrollTimer = ScrollTimer.create(scene);
30237
30565
  scrollTimer.startScroll(evtOffsetX, evtOffsetY);
30238
30566
  const { scrollX, scrollY } = getCurrentScrollXY(scrollTimer);
@@ -30253,7 +30581,7 @@ const TransformerManagerTypeArray = [
30253
30581
  this._moving(moveOffsetX, moveOffsetY, scrollTimer, isCropper);
30254
30582
  });
30255
30583
  }), scenePointerUpSub = scene.onPointerUp$.subscribeEvent((event) => {
30256
- scenePointerMoveSub == null || scenePointerMoveSub.unsubscribe(), scenePointerUpSub == null || scenePointerUpSub.unsubscribe(), scene.enableEvent(), !isCropper && this.refreshControls(), scrollTimer.dispose();
30584
+ scenePointerMoveSub == null || scenePointerMoveSub.unsubscribe(), scenePointerUpSub == null || scenePointerUpSub.unsubscribe(), scene.enableObjectsEvent(), !isCropper && this.refreshControls(), scrollTimer.dispose();
30257
30585
  const { offsetX, offsetY } = event;
30258
30586
  isCropper ? this._changeEnd$.next({
30259
30587
  objects: /* @__PURE__ */ new Map([[applyObject.oKey, applyObject]]),
@@ -30521,7 +30849,7 @@ const TransformerManagerTypeArray = [
30521
30849
  const topScene = this._getTopScene(), { keepRatio, isCropper } = this._getConfig(applyObject);
30522
30850
  if (topScene == null)
30523
30851
  return;
30524
- topScene.disableEvent();
30852
+ topScene.disableObjectsEvent();
30525
30853
  const scrollTimer = ScrollTimer.create(topScene);
30526
30854
  scrollTimer.startScroll(evtOffsetX, evtOffsetY);
30527
30855
  const { scrollX, scrollY } = getCurrentScrollXY(scrollTimer);
@@ -30552,7 +30880,7 @@ const TransformerManagerTypeArray = [
30552
30880
  }), topScene.setCursor(cursor);
30553
30881
  }), this._topScenePointerUpSub = topScene.onPointerUp$.subscribeEvent((event) => {
30554
30882
  var _a11, _b;
30555
- (_a11 = this._topScenePointerMoveSub) == null || _a11.unsubscribe(), (_b = this._topScenePointerUpSub) == null || _b.unsubscribe(), topScene.enableEvent(), topScene.resetCursor(), scrollTimer.dispose(), this._startStateMap.clear();
30883
+ (_a11 = this._topScenePointerMoveSub) == null || _a11.unsubscribe(), (_b = this._topScenePointerUpSub) == null || _b.unsubscribe(), topScene.enableObjectsEvent(), topScene.resetCursor(), scrollTimer.dispose(), this._startStateMap.clear();
30556
30884
  const { offsetX, offsetY } = event;
30557
30885
  isCropper ? (this._recoverySizeBoundary([applyObject], ancestorLeft, ancestorTop, topSceneWidth, topSceneHeight), this._changeEnd$.next({
30558
30886
  objects: /* @__PURE__ */ new Map([[applyObject.oKey, applyObject]]),
@@ -30585,7 +30913,7 @@ const TransformerManagerTypeArray = [
30585
30913
  const topScene = this._getTopScene();
30586
30914
  if (topScene == null)
30587
30915
  return;
30588
- topScene.disableEvent();
30916
+ topScene.disableObjectsEvent();
30589
30917
  const viewportActualXY = topScene.getVpScrollXYInfoByPosToVp(Vector2.create(evtOffsetX, evtOffsetY));
30590
30918
  this._viewportScrollX = viewportActualXY.x, this._viewportScrollY = viewportActualXY.y;
30591
30919
  const cursor = this._getRotateAnchorCursor(
@@ -30601,7 +30929,7 @@ const TransformerManagerTypeArray = [
30601
30929
  const { offsetX: moveOffsetX, offsetY: moveOffsetY } = moveEvt;
30602
30930
  this._rotateMoving(moveOffsetX, moveOffsetY, centerX, centerY, agentOrigin), topScene.setCursor(cursor);
30603
30931
  }), topScenePointerUpSub = topScene.onPointerUp$.subscribeEvent((event) => {
30604
- topScenePointerMoveSub == null || topScenePointerMoveSub.unsubscribe(), topScenePointerUpSub == null || topScenePointerUpSub.unsubscribe(), topScene.enableEvent(), topScene.resetCursor(), this.refreshControls();
30932
+ topScenePointerMoveSub == null || topScenePointerMoveSub.unsubscribe(), topScenePointerUpSub == null || topScenePointerUpSub.unsubscribe(), topScene.enableObjectsEvent(), topScene.resetCursor(), this.refreshControls();
30605
30933
  const { offsetX, offsetY } = event;
30606
30934
  this._changeEnd$.next({
30607
30935
  objects: this._selectedObjectMap,
@@ -31032,188 +31360,6 @@ const TransformerManagerTypeArray = [
31032
31360
  };
31033
31361
  __name(_Transformer, "Transformer");
31034
31362
  let Transformer = _Transformer;
31035
- const _InputManager = class _InputManager extends Disposable {
31036
- constructor(scene) {
31037
- super();
31038
- /** This is a defensive check to not allow control attachment prior to an already active one. If already attached, previous control is unattached before attaching the new one. */
31039
- __publicField(this, "_alreadyAttached", !1);
31040
- // private _alreadyAttachedTo: HTMLElement;
31041
- // WorkBookObserver
31042
- __publicField(this, "_onInput$");
31043
- // Pointers
31044
- __publicField(this, "_onPointerMove");
31045
- __publicField(this, "_onPointerDown");
31046
- __publicField(this, "_onPointerUp");
31047
- __publicField(this, "_onPointerOut");
31048
- __publicField(this, "_onPointerCancel");
31049
- __publicField(this, "_onPointerEnter");
31050
- __publicField(this, "_onPointerLeave");
31051
- __publicField(this, "_onMouseWheel");
31052
- // Keyboard
31053
- __publicField(this, "_onKeyDown");
31054
- __publicField(this, "_onKeyUp");
31055
- // Drag
31056
- __publicField(this, "_onDragEnter");
31057
- __publicField(this, "_onDragLeave");
31058
- __publicField(this, "_onDragOver");
31059
- __publicField(this, "_onDrop");
31060
- __publicField(this, "_scene");
31061
- __publicField(this, "_currentMouseEnterPicked");
31062
- __publicField(this, "_startingPosition", new Vector2(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY));
31063
- __publicField(this, "_delayedTimeout", -1);
31064
- __publicField(this, "_delayedTripeTimeout", -1);
31065
- __publicField(this, "_doubleClickOccurred", 0);
31066
- __publicField(this, "_tripleClickState", !1);
31067
- __publicField(this, "_currentObject");
31068
- this._scene = scene;
31069
- }
31070
- /**
31071
- * TODO: DR-Univer, fix as unknown as
31072
- */
31073
- dispose() {
31074
- super.dispose(), this.detachControl(), this._scene = null, this._currentMouseEnterPicked = null, this._currentObject = null, this._startingPosition = null, clearTimeout(this._delayedTimeout), clearTimeout(this._delayedTripeTimeout), this._onPointerMove = null, this._onPointerDown = null, this._onPointerUp = null, this._onPointerEnter = null, this._onPointerLeave = null, this._onMouseWheel = null, this._onKeyDown = null, this._onKeyUp = null, this._onDragEnter = null, this._onDragLeave = null, this._onDragOver = null, this._onDrop = null;
31075
- }
31076
- // Handle events such as triggering mouseleave and mouseenter.
31077
- mouseLeaveEnterHandler(evt) {
31078
- var _a11;
31079
- const o = this._currentObject;
31080
- if (o == null)
31081
- (_a11 = this._currentMouseEnterPicked) == null || _a11.triggerPointerLeave(evt), this._currentMouseEnterPicked = null;
31082
- else if (o !== this._currentMouseEnterPicked) {
31083
- const previousPicked = this._currentMouseEnterPicked;
31084
- this._currentMouseEnterPicked = o, previousPicked == null || previousPicked.triggerPointerLeave(evt), o == null || o.triggerPointerEnter(evt);
31085
- }
31086
- }
31087
- // Handle events such as triggering dragleave and dragenter.
31088
- dragLeaveEnterHandler(evt) {
31089
- var _a11;
31090
- const o = this._currentObject;
31091
- if (o == null)
31092
- (_a11 = this._currentMouseEnterPicked) == null || _a11.triggerDragLeave(evt), this._currentMouseEnterPicked = null;
31093
- else if (o !== this._currentMouseEnterPicked) {
31094
- const previousPicked = this._currentMouseEnterPicked;
31095
- this._currentMouseEnterPicked = o, previousPicked == null || previousPicked.triggerDragLeave(evt), o == null || o.triggerDragEnter(evt);
31096
- }
31097
- }
31098
- // eslint-disable-next-line max-lines-per-function
31099
- attachControl(hasDown = !0, hasUp = !0, enableMove = !0, hasWheel = !0, hasEnter = !0, hasLeave = !0) {
31100
- const engine = this._scene.getEngine();
31101
- engine && (this._onPointerEnter = (evt) => {
31102
- var _a11;
31103
- evt.pointerId === void 0 && (evt.pointerId = 0), this._currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), (_a11 = this._currentObject) == null || _a11.triggerPointerMove(evt), this.mouseLeaveEnterHandler(evt);
31104
- }, this._onPointerLeave = (evt) => {
31105
- evt.pointerId === void 0 && (evt.pointerId = 0), this._currentObject = null, this.mouseLeaveEnterHandler(evt);
31106
- }, this._onPointerMove = (evt) => {
31107
- var _a11;
31108
- evt.pointerId === void 0 && (evt.pointerId = 0);
31109
- const currentObject = this._currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerMove(evt);
31110
- this.mouseLeaveEnterHandler(evt), this._checkDirectSceneEventTrigger(!isStop, this._currentObject) && (this._scene.onPointerMove$.emitEvent(evt), (_a11 = this._scene.getEngine()) == null || _a11.setRemainCapture());
31111
- }, this._onPointerDown = (evt) => {
31112
- evt.pointerId === void 0 && (evt.pointerId = 0);
31113
- const currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerDown(evt);
31114
- this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onPointerDown$.emitEvent(evt);
31115
- }, this._onPointerUp = (evt) => {
31116
- evt.pointerId === void 0 && (evt.pointerId = 0);
31117
- const currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerPointerUp(evt);
31118
- this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onPointerUp$.emitEvent(evt), this._prePointerDoubleOrTripleClick(evt);
31119
- }, this._onPointerCancel = (evt) => {
31120
- this._scene.onPointerCancel$.emitEvent(evt);
31121
- }, this._onPointerOut = (evt) => {
31122
- this._scene.onPointerOut$.emitEvent(evt);
31123
- }, this._onMouseWheel = (evt) => {
31124
- const currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerMouseWheel(evt);
31125
- this._scene.getViewports().forEach((vp) => {
31126
- vp.onMouseWheel$.emitEvent(evt);
31127
- }), this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onMouseWheel$.emitEvent(evt);
31128
- }, this._onKeyDown = (evt) => {
31129
- this._scene.onKeyDown$.emitEvent(evt);
31130
- }, this._onKeyUp = (evt) => {
31131
- this._scene.onKeyUp$.emitEvent(evt);
31132
- }, this._onDragEnter = (evt) => {
31133
- var _a11;
31134
- this._currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), (_a11 = this._currentObject) == null || _a11.triggerDragOver(evt), this.dragLeaveEnterHandler(evt);
31135
- }, this._onDragLeave = (evt) => {
31136
- this._currentObject = null, this.dragLeaveEnterHandler(evt);
31137
- }, this._onDragOver = (evt) => {
31138
- var _a11, _b;
31139
- this._currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY);
31140
- const isStop = (_a11 = this._currentObject) == null ? void 0 : _a11.triggerDragOver(evt);
31141
- this.dragLeaveEnterHandler(evt), this._checkDirectSceneEventTrigger(!isStop, this._currentObject) && (this._scene.onDragOver$.emitEvent(evt), (_b = this._scene.getEngine()) == null || _b.setRemainCapture());
31142
- }, this._onDrop = (evt) => {
31143
- const currentObject = this._getCurrentObject(evt.offsetX, evt.offsetY), isStop = currentObject == null ? void 0 : currentObject.triggerDrop(evt);
31144
- this._checkDirectSceneEventTrigger(!isStop, currentObject) && this._scene.onDrop$.emitEvent(evt);
31145
- }, this._onInput$ = engine.onInputChanged$.subscribeEvent((eventData) => {
31146
- const evt = eventData;
31147
- if (eventData.deviceType === DeviceType.Keyboard && (eventData.currentState === 1 && this._onKeyDown(evt), eventData.currentState === 0 && this._onKeyUp(evt)), eventData.dataTransfer) {
31148
- enableMove && (eventData.inputIndex === PointerInput.Horizontal || eventData.inputIndex === PointerInput.Vertical || eventData.inputIndex === PointerInput.DeltaHorizontal || eventData.inputIndex === PointerInput.DeltaVertical) ? this._onDragOver(evt) : hasEnter && eventData.currentState === 4 ? this._onDragEnter(evt) : hasLeave && eventData.currentState === 5 ? this._onDragLeave(evt) : hasUp && eventData.currentState === 6 && this._onDrop(evt);
31149
- return;
31150
- }
31151
- if (eventData.deviceType === DeviceType.Mouse || eventData.deviceType === DeviceType.Touch)
31152
- switch (hasDown && eventData.inputIndex >= PointerInput.LeftClick && eventData.inputIndex <= PointerInput.RightClick && eventData.currentState === 1 && this._onPointerDown(evt), hasUp && eventData.inputIndex >= PointerInput.LeftClick && eventData.inputIndex <= PointerInput.RightClick && eventData.currentState === 0 && this._onPointerUp(evt), enableMove && eventData.type === "pointermove" ? this._onPointerMove(evt) : hasWheel && (eventData.inputIndex === PointerInput.MouseWheelX || eventData.inputIndex === PointerInput.MouseWheelY || eventData.inputIndex === PointerInput.MouseWheelZ) ? this._onMouseWheel(evt) : hasEnter && eventData.currentState === 2 ? this._onPointerEnter(evt) : hasLeave && eventData.currentState === 3 && this._onPointerLeave(evt), evt.type) {
31153
- case "pointerout":
31154
- this._onPointerOut(evt);
31155
- break;
31156
- case "pointercancel":
31157
- this._onPointerCancel(evt);
31158
- break;
31159
- }
31160
- }), this.disposeWithMe(
31161
- toDisposable(
31162
- this._onInput$
31163
- )
31164
- ), this._alreadyAttached = !0);
31165
- }
31166
- /**
31167
- * Detaches all event handlers
31168
- */
31169
- detachControl() {
31170
- var _a11;
31171
- !this._alreadyAttached || !this._scene.getEngine() || ((_a11 = this._onInput$) == null || _a11.unsubscribe(), this._alreadyAttached = !1);
31172
- }
31173
- _getCurrentObject(offsetX, offsetY) {
31174
- var _a11;
31175
- return (_a11 = this._scene) == null ? void 0 : _a11.pick(Vector2.FromArray([offsetX, offsetY]));
31176
- }
31177
- _checkDirectSceneEventTrigger(isTrigger, currentObject) {
31178
- let notObject = !1;
31179
- currentObject == null && (notObject = !0);
31180
- let isNotInSceneViewer = !0;
31181
- if (currentObject && currentObject.classType === RENDER_CLASS_TYPE.BASE_OBJECT) {
31182
- const scene = currentObject.getScene();
31183
- scene && (isNotInSceneViewer = scene.getParent().classType !== RENDER_CLASS_TYPE.SCENE_VIEWER);
31184
- }
31185
- return !this._scene.evented && isTrigger && isNotInSceneViewer || notObject;
31186
- }
31187
- /**
31188
- * @hidden
31189
- * @returns Boolean if delta for pointer exceeds drag movement threshold
31190
- */
31191
- _isPointerSwiping(pointerX, pointerY) {
31192
- return Math.abs(this._startingPosition.x - pointerX) > _InputManager.DragMovementThreshold || Math.abs(this._startingPosition.y - pointerY) > _InputManager.DragMovementThreshold;
31193
- }
31194
- _prePointerDoubleOrTripleClick(evt) {
31195
- var _a11, _b, _c, _d;
31196
- const { clientX, clientY } = evt;
31197
- this._isPointerSwiping(clientX, clientY) && this._resetDoubleClickParam(), this._delayedTimeout = setTimeout(() => {
31198
- this._resetDoubleClickParam();
31199
- }, _InputManager.DoubleClickDelay), this._doubleClickOccurred += 1, this._tripleClickState && ((_b = (_a11 = this._scene) == null ? void 0 : _a11.pick(Vector2.FromArray([evt.offsetX, evt.offsetY]))) == null || _b.triggerTripleClick(evt), this._scene.onTripleClick$.emitEvent(evt)), this._doubleClickOccurred === 2 && ((_d = (_c = this._scene) == null ? void 0 : _c.pick(Vector2.FromArray([evt.offsetX, evt.offsetY]))) == null || _d.triggerDblclick(evt), this._scene.onDblclick$.emitEvent(evt), this._resetDoubleClickParam(), this._tripleClickState = !0, clearTimeout(this._delayedTripeTimeout), this._delayedTripeTimeout = setTimeout(() => {
31200
- this._tripleClickState = !1;
31201
- }, _InputManager.TripleClickDelay)), this._startingPosition.x = clientX, this._startingPosition.y = clientY;
31202
- }
31203
- _resetDoubleClickParam() {
31204
- this._doubleClickOccurred = 0, clearTimeout(this._delayedTimeout);
31205
- }
31206
- };
31207
- __name(_InputManager, "InputManager"), /** The distance in pixel that you have to move to prevent some events */
31208
- __publicField(_InputManager, "DragMovementThreshold", 2), // in pixels
31209
- /** Time in milliseconds to wait to raise long press events if button is still pressed */
31210
- __publicField(_InputManager, "LongPressDelay", 500), // in milliseconds
31211
- /** Time in milliseconds with two consecutive clicks will be considered as a double or triple click */
31212
- __publicField(_InputManager, "DoubleClickDelay", 500), // in milliseconds
31213
- __publicField(_InputManager, "TripleClickDelay", 300), // in milliseconds
31214
- /** If you need to check double click without raising a single click at first click, enable this flag */
31215
- __publicField(_InputManager, "ExclusiveDoubleClickMode", !1);
31216
- let InputManager = _InputManager;
31217
31363
  const _ThinScene = class _ThinScene extends Disposable {
31218
31364
  constructor(sceneKey) {
31219
31365
  super();
@@ -31266,7 +31412,7 @@ const _ThinScene = class _ThinScene extends Disposable {
31266
31412
  get sceneKey() {
31267
31413
  return this._sceneKey;
31268
31414
  }
31269
- get evented() {
31415
+ get objectsEvented() {
31270
31416
  return this._evented;
31271
31417
  }
31272
31418
  set transform(trans) {
@@ -31284,10 +31430,15 @@ const _ThinScene = class _ThinScene extends Disposable {
31284
31430
  set scaleY(scaleY) {
31285
31431
  this._scaleY = scaleY;
31286
31432
  }
31287
- enableEvent() {
31433
+ enableObjectsEvent() {
31288
31434
  this._evented = !0;
31289
31435
  }
31290
- disableEvent() {
31436
+ /**
31437
+ * If scene.event is disabled, scene.pick(curosrPos) return null.
31438
+ * Then only scene itself can response to pointer event, all objects under the scene would not.
31439
+ * see sceneInputManager@_onPointerMove
31440
+ */
31441
+ disableObjectsEvent() {
31291
31442
  this._evented = !1;
31292
31443
  }
31293
31444
  triggerKeyDown(evt) {
@@ -31518,6 +31669,11 @@ const _Scene = class _Scene extends ThinScene {
31518
31669
  return layer;
31519
31670
  return this._createDefaultLayer(zIndex);
31520
31671
  }
31672
+ findLayerByZIndex(zIndex = 1) {
31673
+ for (const layer of this.getLayers())
31674
+ if (layer.zIndex === zIndex)
31675
+ return layer;
31676
+ }
31521
31677
  getLayerMaxZIndex() {
31522
31678
  let maxIndex = Number.MIN_VALUE;
31523
31679
  for (let i = 0; i < this._layers.length; i++) {
@@ -31694,7 +31850,7 @@ const _Scene = class _Scene extends ThinScene {
31694
31850
  layers[i].render(parentCtx, i === len - 1);
31695
31851
  }
31696
31852
  async requestRender(parentCtx) {
31697
- return new Promise((resolve, reject) => {
31853
+ return new Promise((resolve, _reject) => {
31698
31854
  this.render(parentCtx), requestNewFrame(resolve);
31699
31855
  });
31700
31856
  }
@@ -31814,15 +31970,19 @@ const _Scene = class _Scene extends ThinScene {
31814
31970
  viewport.dispose();
31815
31971
  }), viewports = [], this.clearLayer(), this.clearViewports(), this.detachControl(), (_a11 = this.onTransformChange$) == null || _a11.complete(), (_b = this._inputManager) == null || _b.dispose(), this._inputManager = null, (_c = this._transformer) == null || _c.dispose(), this._transformer = null, this.onPointerDown$.complete(), this.onPointerMove$.complete(), this.onPointerUp$.complete(), this.onPointerEnter$.complete(), this.onPointerLeave$.complete(), this.onDblclick$.complete(), this.onTripleClick$.complete(), this.onMouseWheel$.complete(), this.onKeyDown$.complete(), this.onKeyUp$.complete(), this._addObject$.complete(), super.dispose();
31816
31972
  }
31817
- // Determine the only object selected
31818
- pick(vec) {
31819
- let pickedViewport = this.getActiveViewportByCoord(vec);
31820
- if (pickedViewport || (pickedViewport = this._viewports[0]), !this.evented || !pickedViewport)
31821
- return;
31822
- const scrollBarRect = pickedViewport.pickScrollBar(vec);
31973
+ /**
31974
+ * Get the object under the pointer, if scene.event is disabled, the object is null.
31975
+ * @param {Vector2} coord
31976
+ * @return {Nullable<BaseObject | Scene | ThinScene>} object under the pointer
31977
+ */
31978
+ pick(coord) {
31979
+ let pickedViewport = this.getActiveViewportByCoord(coord);
31980
+ if (pickedViewport || (pickedViewport = this._viewports[0]), !this.objectsEvented || !pickedViewport)
31981
+ return null;
31982
+ const scrollBarRect = pickedViewport.pickScrollBar(coord);
31823
31983
  if (scrollBarRect)
31824
31984
  return scrollBarRect;
31825
- const vecFromSheetContent = pickedViewport.transformVector2SceneCoord(vec);
31985
+ const vecFromSheetContent = pickedViewport.transformVector2SceneCoord(coord);
31826
31986
  let isPickedObject = null;
31827
31987
  const objectOrder = this.getAllObjectsByOrderForPick().reverse(), objectLength = objectOrder.length;
31828
31988
  for (let i = 0; i < objectLength; i++) {
@@ -32215,6 +32375,7 @@ function isDisposable(thing) {
32215
32375
  return !!thing && typeof thing.dispose == "function";
32216
32376
  }
32217
32377
  __name(isDisposable, "isDisposable");
32378
+ const PLUGIN_CONFIG_KEY = "engine-render.config", defaultPluginConfig = {};
32218
32379
  var __defProp$1 = Object.defineProperty, __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor, __decorateClass$1 = /* @__PURE__ */ __name((decorators, target, key, kind) => {
32219
32380
  for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
32220
32381
  (decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
@@ -32223,8 +32384,10 @@ var __defProp$1 = Object.defineProperty, __getOwnPropDesc$1 = Object.getOwnPrope
32223
32384
  const IRenderingEngine = createIdentifier("univer.render-engine"), PLUGIN_NAME = "RENDER_ENGINE_PLUGIN";
32224
32385
  var _a9;
32225
32386
  let UniverRenderEnginePlugin = (_a9 = class extends Plugin {
32226
- constructor(_config, _injector) {
32227
- super(), this._injector = _injector, this._injector.add([IRenderingEngine, { useFactory: /* @__PURE__ */ __name(() => new Engine(), "useFactory") }]), this._injector.add([
32387
+ constructor(_config = defaultPluginConfig, _injector, _configService) {
32388
+ super(), this._config = _config, this._injector = _injector, this._configService = _configService;
32389
+ const { ...rest } = this._config;
32390
+ this._configService.setConfig(PLUGIN_CONFIG_KEY, rest), this._injector.add([IRenderingEngine, { useFactory: /* @__PURE__ */ __name(() => new Engine(), "useFactory") }]), this._injector.add([
32228
32391
  IRenderManagerService,
32229
32392
  {
32230
32393
  useClass: RenderManagerService
@@ -32233,7 +32396,8 @@ let UniverRenderEnginePlugin = (_a9 = class extends Plugin {
32233
32396
  }
32234
32397
  }, __name(_a9, "UniverRenderEnginePlugin"), __publicField(_a9, "pluginName", PLUGIN_NAME), _a9);
32235
32398
  UniverRenderEnginePlugin = __decorateClass$1([
32236
- __decorateParam$1(1, Inject(Injector))
32399
+ __decorateParam$1(1, Inject(Injector)),
32400
+ __decorateParam$1(2, IConfigService)
32237
32401
  ], UniverRenderEnginePlugin);
32238
32402
  function subtractViewportRange(range1, range2) {
32239
32403
  if (range2.startRow >= range1.endRow || range2.endRow <= range1.startRow || range2.startColumn >= range1.endColumn || range2.endColumn <= range1.startColumn)
@@ -34063,7 +34227,7 @@ let TextSelectionRenderManager = (_a10 = class extends RxDisposable {
34063
34227
  return;
34064
34228
  }
34065
34229
  const { segmentId, segmentPage } = startNode;
34066
- segmentId && this._currentSegmentId && segmentId !== this._currentSegmentId && this.setSegment(segmentId), segmentId && segmentPage !== this._currentSegmentPage && this.setSegmentPage(segmentPage), this._anchorNodePosition = position, evt.shiftKey && this._getActiveRangeInstance() ? this._updateActiveRangePosition(position) : !evt.ctrlKey && !this._isEmpty() && this._removeAllRanges(), scene.disableEvent();
34230
+ segmentId && this._currentSegmentId && segmentId !== this._currentSegmentId && this.setSegment(segmentId), segmentId && segmentPage !== this._currentSegmentPage && this.setSegmentPage(segmentPage), this._anchorNodePosition = position, evt.shiftKey && this._getActiveRangeInstance() ? this._updateActiveRangePosition(position) : !evt.ctrlKey && !this._isEmpty() && this._removeAllRanges(), scene.disableObjectsEvent();
34067
34231
  const scrollTimer = ScrollTimer.create(scene);
34068
34232
  this._scrollTimers.push(scrollTimer), scrollTimer.startScroll(evtOffsetX, evtOffsetY), this._onSelectionStart$.next((_b = this._getActiveRangeInstance()) == null ? void 0 : _b.startNodePosition), (_c = scene.getTransformer()) == null || _c.clearSelectedObjects();
34069
34233
  let preMoveOffsetX = evtOffsetX, preMoveOffsetY = evtOffsetY;
@@ -34073,7 +34237,7 @@ let TextSelectionRenderManager = (_a10 = class extends RxDisposable {
34073
34237
  })), this._scenePointerUpSubs.push(scene.onPointerUp$.subscribeEvent(() => {
34074
34238
  if ([...this._scenePointerMoveSubs, ...this._scenePointerUpSubs].forEach((e) => {
34075
34239
  e.unsubscribe();
34076
- }), scene.enableEvent(), this._anchorNodePosition && !this._focusNodePosition) {
34240
+ }), scene.enableObjectsEvent(), this._anchorNodePosition && !this._focusNodePosition) {
34077
34241
  const textRange = new TextRange(this._scene, this._document, this._docSkeleton, this._anchorNodePosition, void 0, this._selectionStyle, this._currentSegmentId);
34078
34242
  this._addTextRange(textRange);
34079
34243
  } else if (this._anchorNodePosition && this._focusNodePosition) {
@@ -34590,6 +34754,8 @@ export {
34590
34754
  CustomObject,
34591
34755
  DEFAULT_DOCUMENT_FONTSIZE,
34592
34756
  DEFAULT_FONTFACE_PLANE,
34757
+ DEFAULT_FRAME_LIST_SIZE,
34758
+ DEFAULT_FRAME_SAMPLE_SIZE,
34593
34759
  DEFAULT_MEASURE_TEXT,
34594
34760
  DEFAULT_OFFSET_SPACING,
34595
34761
  DEFAULT_PADDING_DATA,
@@ -34663,6 +34829,7 @@ export {
34663
34829
  RowHeaderLayout,
34664
34830
  SHAPE_OBJECT_ARRAY,
34665
34831
  SHAPE_TYPE,
34832
+ SHEET_EXTENSION_PREFIX,
34666
34833
  SHEET_EXTENSION_TYPE,
34667
34834
  SHEET_VIEWPORT_KEY,
34668
34835
  SLIDE_NAVIGATION_KEY,
@@ -34714,6 +34881,7 @@ export {
34714
34881
  degToRad,
34715
34882
  drawDiagonalLineByBorderType,
34716
34883
  drawLineByBorderType,
34884
+ expandRangeIfIntersects,
34717
34885
  fixLineWidthByScale,
34718
34886
  generateRandomKey,
34719
34887
  getAnchorBounding,
@@ -34782,7 +34950,6 @@ export {
34782
34950
  isValidRectRange,
34783
34951
  lineIterator,
34784
34952
  mergeInfoOffset,
34785
- mergeRangeIfIntersects,
34786
34953
  parseDataStreamToTree,
34787
34954
  pixelToPt,
34788
34955
  precisionTo,