@shijiu/jsview-vue 2.1.25 → 2.1.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/package.json +1 -1
  2. package/utils/JsViewEngineWidget/JsvFocusBlock.vue +1 -1
  3. package/utils/JsViewEngineWidget/JsvFocusHub.ts +123 -0
  4. package/utils/JsViewEngineWidget/JsvFocusManager.js +4 -3
  5. package/utils/JsViewEngineWidget/MetroWidget/AnimationManager.ts +145 -51
  6. package/utils/JsViewEngineWidget/MetroWidget/ListWidget.vue +51 -64
  7. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +62 -71
  8. package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +308 -613
  9. package/utils/JsViewEngineWidget/TemplateParser/CommonMetroTemplate.ts +127 -247
  10. package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +1 -0
  11. package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +36 -2
  12. package/utils/JsViewEngineWidget/WidgetCommon.ts +25 -6
  13. package/utils/JsViewPlugin/JsvAudio/{JsvAudioBrowser.vue → BrowserAudio/BrowserAudio.vue} +1 -1
  14. package/utils/JsViewPlugin/JsvAudio/index.js +1 -1
  15. package/utils/JsViewPlugin/JsvLatex/BrowserDomBuilder.js +37 -0
  16. package/utils/JsViewPlugin/JsvLatex/Color.ts +43 -0
  17. package/utils/JsViewPlugin/JsvLatex/JsvLatex.vue +159 -0
  18. package/utils/JsViewPlugin/JsvLatex/JsvLatexBridgeProxy.js +16 -0
  19. package/utils/JsViewPlugin/JsvLatex/JsvLatexBrowser.vue +59 -0
  20. package/utils/JsViewPlugin/JsvLatex/PluginLoader.js +171 -0
  21. package/utils/JsViewPlugin/JsvLatex/index.js +28 -0
  22. package/utils/JsViewPlugin/JsvLatex/mathjax-tex-svg.txt +1 -0
  23. package/utils/JsViewPlugin/JsvLatex/version.js +24 -0
  24. package/utils/JsViewPlugin/JsvLatex/version.mjs +24 -0
  25. package/utils/JsViewPlugin/index.js +2 -1
  26. package/utils/JsViewVueTools/JsvDynamicCssStyle.js +2 -52
  27. package/utils/JsViewVueTools/JsvPerformance.ts +11 -0
  28. package/utils/JsViewVueTools/JsvPreDownloader.ts +55 -11
  29. package/utils/JsViewVueTools/JsvStyleSheetsDeclarer.js +40 -0
  30. package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CanvasTexture.ts +143 -0
  31. package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CommandList.ts +24 -0
  32. package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/Path.ts +198 -0
  33. package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +31 -0
  34. package/utils/JsViewVueTools/JsvTextureStore/Store.ts +32 -0
  35. package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +38 -0
  36. package/utils/JsViewVueTools/index.js +3 -0
  37. package/utils/JsViewVueWidget/JsvEnableRenderBreak.vue +17 -0
  38. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +6 -0
  39. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +144 -0
  40. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +6 -0
  41. package/utils/JsViewVueWidget/JsvFreeMoveActor/{CallbackManager.js → CallbackManager.ts} +19 -10
  42. package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +45 -0
  43. package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +1 -1
  44. package/utils/JsViewVueWidget/JsvFreeMoveActor/JsvEnvBlocker.vue +124 -0
  45. package/utils/JsViewVueWidget/JsvFreeMoveActor/KeepFlags.ts +6 -0
  46. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +553 -0
  47. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +138 -0
  48. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +53 -0
  49. package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +11 -1
  50. package/utils/JsViewVueWidget/JsvHole.js +1 -1
  51. package/utils/JsViewVueWidget/JsvLine/JsvLine.vue +101 -0
  52. package/utils/JsViewVueWidget/JsvLine/LineManager.js +62 -0
  53. package/utils/JsViewVueWidget/JsvLine/index.js +3 -0
  54. package/utils/JsViewVueWidget/JsvMarquee.vue +316 -139
  55. package/utils/JsViewVueWidget/JsvMindMap/CommonType.ts +1 -0
  56. package/utils/JsViewVueWidget/JsvMindMap/Constant.ts +20 -0
  57. package/utils/JsViewVueWidget/JsvMindMap/DataTree.ts +394 -0
  58. package/utils/JsViewVueWidget/JsvMindMap/Geometry.ts +277 -0
  59. package/utils/JsViewVueWidget/JsvMindMap/JsvMindMap.vue +653 -0
  60. package/utils/JsViewVueWidget/JsvMindMap/index.js +1 -0
  61. package/utils/JsViewVueWidget/JsvMindMap/rtree.js +628 -0
  62. package/utils/JsViewVueWidget/JsvNinePatch.vue +2 -2
  63. package/utils/JsViewVueWidget/JsvPieChart.vue +124 -0
  64. package/utils/JsViewVueWidget/JsvPosterImage.vue +32 -9
  65. package/utils/JsViewVueWidget/JsvPreload/BrowserPreload.vue +135 -133
  66. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +273 -270
  67. package/utils/JsViewVueWidget/JsvSector.vue +107 -0
  68. package/utils/JsViewVueWidget/JsvTextBox.vue +14 -1
  69. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +28 -2
  70. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +122 -93
  71. package/utils/JsViewVueWidget/index.js +15 -7
  72. package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.js +0 -112
  73. package/utils/JsViewVueWidget/JsvFreeMoveActor/CommonTools.js +0 -18
  74. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.js +0 -216
  75. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.js +0 -66
  76. package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.js +0 -38
  77. package/utils/JsViewVueWidget/JsvFreeMoveActor/TypeDefine.js +0 -12
  78. package/utils/JsViewVueWidget/JsvTouchContainer.vue +0 -183
  79. package/utils/JsViewVueWidget/JsvTransparentDiv.vue +0 -87
  80. /package/utils/{JsViewVueWidget → JsViewPlugin/JsvAudio/BrowserAudio}/JsvSystemAudio.vue +0 -0
@@ -23,9 +23,10 @@ import {
23
23
  } from "../WidgetCommon";
24
24
  import { RenderItem } from "./RenderItem";
25
25
  import { VisibleInfo } from "./VisibleInfo";
26
- import { AnimationManager, AnimationTools } from "./AnimationManager";
26
+ // import { AnimationManager, AnimationTools } from "./AnimationManager";
27
27
  import { WidgetRectInfo } from "./WidgetRectInfo";
28
28
  import { checkType } from "../CheckType";
29
+ import { TaskType, MacroEndTaskManager, AnimationManager } from "./AnimationManager.ts"
29
30
 
30
31
  const TAG = "MetroWidget";
31
32
 
@@ -71,17 +72,12 @@ const _getMetroTemplate = function (
71
72
 
72
73
  export const setup = (
73
74
  props,
74
- touchContainerW,
75
- touchContainerH,
76
75
  itemRender,
77
76
  locateDiv,
78
77
  renderData,
79
78
  slideDiv,
80
79
  slideDivLeft,
81
80
  slideDivTop,
82
- itemResizeSlideDiv,
83
- itemResizeSlideLeft,
84
- itemResizeSlideTop,
85
81
  focusNode,
86
82
  pageUpdateToken,
87
83
  templateMode) => {
@@ -107,86 +103,202 @@ export const setup = (
107
103
  let preFocusId = -1;
108
104
  let preEdgeRect = null;
109
105
  let isFocus = false;
110
- let touchListener = null;
111
- let slidePile = null;
112
- let dragDirection = Forge.DragSetting.DIRECTION_HORIZONTAL;
113
106
  let vertical = props.direction == VERTICAL;
114
107
  let preAnchorItemIndex = -1;
115
- let preSeamlessSlideDirection = 1;
116
108
  let templateItemAdder = null;
117
109
  let permanentItemList = [];
118
- let preUpdateVisibleStart = 0;
119
110
  let mounted = false;
120
111
  let pageRange = vertical ? props.height : props.width;
121
112
  let slideLock = false;
122
113
  let childSlideEventLock = false;
123
114
  let onKeyDownLock = false;
124
115
  let visibleInfo = new VisibleInfo();
116
+ let preSlideDirection = 0;
125
117
 
126
118
  const DEFAULT_ANIMATION_DURATION = 200;
119
+
120
+ const isItemVisible = (item) => {
121
+ let pos_key = vertical ? "top" : "left";
122
+ let size_key = vertical ? "height" : "width";
123
+ return item.templateInfo[pos_key] >= visibleInfo.start
124
+ && item.templateInfo[pos_key] + item.templateInfo[size_key] - 1 < visibleInfo.end;
125
+ }
126
+
127
127
  const animationManager = new AnimationManager();
128
+ const onMacroTaskEnd = (taskList) => {
129
+ let resizeList = [];
130
+ let resizeTaskMap = {};
131
+ let slideTask = null;
132
+ //统一处理itemResize和slide动画
133
+ let minIndex = Infinity;
134
+ let slideInfo = null;
135
+ let anchorInfo = null;
136
+ let duration = 200;
137
+ let easing = null;
128
138
 
129
- const updateDivPosition =
130
- (divRef, leftRef, topRef, onStart, onEnd) => (x, y, animInfo) => {
131
- if (toRaw(divRef.value)) {
132
- const pre_left = leftRef.value;
133
- const pre_top = topRef.value;
134
- leftRef.value = x;
135
- topRef.value = y;
136
-
137
- if (animInfo) {
138
- let startCallback = () => {
139
- onStart?.();
140
- animInfo?.onStart?.();
141
- };
142
- let endCallback = (animDone) => {
143
- onEnd?.(animDone);
144
- animInfo?.onEnd?.(animDone);
145
- };
139
+ let pos_key = vertical ? "top" : "left";
140
+ let size_key = vertical ? "height" : "width";
141
+ let doAnim = false;
142
+
143
+ for (let task of taskList) {
144
+ if (task.type == TaskType.RESIZE_ITEM) {
145
+ resizeTaskMap[task.params.index] = task;
146
+ resizeList.push(task);
147
+ const { index, animInfo } = task.params;
148
+ doAnim = doAnim || !!animInfo;
149
+ minIndex = Math.min(minIndex, index);
150
+
151
+ duration = task.params.animInfo?.duration ?? duration;
152
+ easing = task.params.animInfo?.easing ?? easing;
153
+
154
+ if (index == id2Index(focusId) && typeof animInfo?.anchor != "undefined") {
155
+ //记录锚点信息
156
+ const item = getItemByIndex(index);
157
+ anchorInfo = {
158
+ anchorPosition: item.templateInfo[pos_key] + item.templateInfo[size_key] * animInfo.anchor - 1 - visibleInfo.start,
159
+ anchor: animInfo.anchor,
160
+ }
161
+ }
162
+ } else if (task.type == TaskType.SLIDE) {
163
+ //滚动动画取最后一个
164
+ slideTask = task;
165
+ }
166
+ }
146
167
 
147
- const delta_x = Math.round(pre_left - x);
148
- const delta_y = Math.round(pre_top - y);
149
-
150
- const animNode = AnimationTools.getDivSlideAnim(
151
- toRaw(divRef.value),
152
- delta_x,
153
- delta_y,
154
- 0,
155
- 0,
156
- {
157
- easing: animInfo.easing,
158
- duration: animInfo.duration,
159
- speed: animInfo.speed,
160
- onStart: startCallback,
161
- onEnd: endCallback,
168
+ if (slideTask) {
169
+ slideInfo = {
170
+ target: slideTask.params.target,
171
+ animObj: slideTask.params.animObj,
172
+ }
173
+ }
174
+
175
+ if (resizeList.length > 0) {
176
+ //TODO 应该是尺寸变化后的可视item需要记录位置, 但暂时先记录20个
177
+ metroTemplate.cacheLayout(minIndex, minIndex + 20);
178
+ //resize
179
+ resizeList.forEach(task => {
180
+ metroTemplate.updateItemSize(task.params.index, {
181
+ width: task.params.width,
182
+ height: task.params.height,
183
+ })
184
+ });
185
+ let preVisibleStart = visibleInfo.start;
186
+ //保持anchor
187
+ if (anchorInfo) {
188
+ const focusItem = getItemById(focusId);
189
+ const start = focusItem.templateInfo[pos_key] + focusItem.templateInfo[size_key] * anchorInfo.anchor - 1 - anchorInfo.anchorPosition;
190
+ visibleInfo.start = normalizeVisibleStart(start, focusItem.templateInfo);
191
+ if (!isItemVisible(focusItem)) {
192
+ visibleInfo.start = _calculateVisibleStart(getItemById(focusId).templateInfo, preSlideDirection);
193
+ }
194
+ } else {
195
+ visibleInfo.start = _calculateVisibleStart(getItemById(focusId).templateInfo, preSlideDirection);
196
+ }
197
+ if (preVisibleStart != visibleInfo.start) {
198
+ //只有resize引起的slide动画时, 动画时长使用resize设置, 否者使用slideSetting设置
199
+ slideInfo = {
200
+ target: -visibleInfo.start,
201
+ animObj: doAnim ? {
202
+ easing: "",
203
+ onStart: null,
204
+ speed: slideTask ? props.slideSetting.Speed : null,
205
+ duration: slideTask ? props.slideSetting.Duration : duration,
206
+ onEnd: (animDone) => {
207
+ },
208
+ } : {
209
+ //resize无动画时正常slide
210
+ easing: "",
211
+ onStart: null,
212
+ onEnd: null,
213
+ speed: props.slideSetting.Speed,
214
+ duration: props.slideSetting.Duration,
215
+ },
216
+ }
217
+ }
218
+ const handler = pageUpdater.update(
219
+ metroTemplate,
220
+ visibleInfo.startWithPadding,
221
+ visibleInfo.endWithPadding,
222
+ focusId,
223
+ true,
224
+ permanentItemList
225
+ );
226
+ handler.applyTmp();
227
+ if (doAnim) {
228
+ const visibleIndexList = Array.from(pageUpdater.getTmpRange());
229
+ //创建item slide anim
230
+ for (let index of visibleIndexList) {
231
+ const renderItem = getItemByIndex(index);
232
+ const { left, top } = renderItem.templateInfo;
233
+ if (index >= minIndex) {
234
+ const layoutCache = renderItem.templateInfo.layoutCache;
235
+ if (renderItem.mounted.value) {
236
+ animationManager.startSlideAnim(renderItem.rootDiv,
237
+ [layoutCache.left - left, layoutCache.top - top],
238
+ [0, 0],
239
+ resizeTaskMap[index] ?
240
+ resizeTaskMap[index].params.animInfo
241
+ : { duration: duration });
242
+ } else {
243
+ renderItem.addDivMountedListener((div) => {
244
+ animationManager.startSlideAnim(div,
245
+ [layoutCache.left - left, layoutCache.top - top],
246
+ [0, 0],
247
+ resizeTaskMap[index] ?
248
+ resizeTaskMap[index].params.animInfo
249
+ : { duration: duration });
250
+ })
162
251
  }
163
- );
164
- animationManager.tryStartAnim(Forge.sFrameCount.count, animNode);
165
- } else {
166
- onStart?.();
167
- onEnd?.();
252
+ }
168
253
  }
169
254
  }
170
- };
255
+ }
171
256
 
172
- const updateSlideDiv = updateDivPosition(slideDiv, slideDivLeft, slideDivTop);
257
+ //处理滚动动画
258
+ if (slideInfo) {
259
+ const target = slideInfo.target;
260
+ let preLeft = slideDivLeft.value;
261
+ let preTop = slideDivTop.value;
262
+ slideDivLeft.value = vertical ? 0 : target;
263
+ slideDivTop.value = vertical ? target : 0;
264
+ if (slideInfo.animObj) {
265
+ animationManager.startSlideAnim(
266
+ slideDiv.value,
267
+ vertical ? [0, preTop - slideDivTop.value] : [preLeft - slideDivLeft.value, 0],
268
+ [0, 0],
269
+ slideInfo.animObj);
270
+ }
271
+ _onScroll();
272
+ }
273
+ }
173
274
 
174
- const _slideTo = (target, animObj) => {
175
- if (vertical) {
176
- updateSlideDiv(0, -target - itemResizeSlideTop.value, animObj);
177
- } else {
178
- updateSlideDiv(-target - itemResizeSlideLeft.value, 0, animObj);
275
+ const onMacroEndTaskBreak = (list) => {
276
+ if (list) {
277
+ list.forEach(task => {
278
+ if (task.type == TaskType.RESIZE_ITEM) {
279
+ metroTemplate.updateItemSize(task.params.index, {
280
+ width: task.params.width,
281
+ height: task.params.height,
282
+ })
283
+ }
284
+ })
179
285
  }
180
- _onScroll();
181
- };
286
+ }
287
+ const macroEndTaskManager = new MacroEndTaskManager(onMacroTaskEnd, onMacroEndTaskBreak);
182
288
 
183
- const updateItemResizeSlideDiv = updateDivPosition(
184
- itemResizeSlideDiv,
185
- itemResizeSlideLeft,
186
- itemResizeSlideTop
187
- );
289
+ const updateItemSize = (index, newSize, animInfo) => {
290
+ macroEndTaskManager.addTask(TaskType.RESIZE_ITEM,
291
+ {
292
+ index,
293
+ width: newSize.width,
294
+ height: newSize.height,
295
+ animInfo,
296
+ });
297
+ }
188
298
 
189
- let itemMovingInfo = null;
299
+ const _slideTo = (target, animObj) => {
300
+ macroEndTaskManager.addTask(TaskType.SLIDE, { target: -target, animObj })
301
+ };
190
302
 
191
303
  let callFocusAfterUpdate = false;
192
304
 
@@ -224,30 +336,6 @@ export const setup = (
224
336
  };
225
337
  };
226
338
 
227
- const _dispatchEvent = (event) => {
228
- console.error("dispatchEvent is deprecated and will be removed soon. Use MetroWidget exported method instead.")
229
- switch (event.type) {
230
- case Dispatcher.Type.setEnterFocusId:
231
- setEnterFocusId(event.data);
232
- break;
233
- case Dispatcher.Type.setEnterFocusRect:
234
- setEnterFocusRect(event.data);
235
- break;
236
- case Dispatcher.Type.updateItem:
237
- break;
238
- case Dispatcher.Type.slideToItem:
239
- if (event.data) {
240
- slideToItem(event.data?.id, event.data?.doAnim);
241
- }
242
- break;
243
- case Dispatcher.Type.setFocusId:
244
- setFocusId(event.data?.id, event.data?.needSlide, event.data?.doAnim);
245
- break;
246
- default:
247
- break;
248
- }
249
- };
250
-
251
339
  const id2Index = (id) => {
252
340
  return metroTemplate.id2Index(id);
253
341
  };
@@ -434,6 +522,7 @@ export const setup = (
434
522
  easing: props.slideSetting.Easing,
435
523
  onStart: null,
436
524
  speed: props.slideSetting.Speed,
525
+ duration: props.slideSetting.Duration,
437
526
  onEnd: () => {
438
527
  updater.apply();
439
528
  },
@@ -537,40 +626,21 @@ export const setup = (
537
626
  } else {
538
627
  templateItemAdder.tryAddItemById(focusId);
539
628
  }
540
- let lastTemplateInfo = getItemByIndex(metroTemplate.size - 1)?.templateInfo;
541
- touchListener = _getTouchListener();
542
- touchContainerW.value = vertical
543
- ? props.width
544
- : lastTemplateInfo
545
- ? lastTemplateInfo.left + lastTemplateInfo.width
546
- : 0;
547
- touchContainerH.value = vertical
548
- ? lastTemplateInfo
549
- ? lastTemplateInfo.top + lastTemplateInfo.height
550
- : 0
551
- : props.height;
552
- slidePile = new Forge.RectArea(
553
- 0,
554
- 0,
555
- widgetRectInfo.contentWidth,
556
- widgetRectInfo.contentHeight,
557
- );
558
- dragDirection =
559
- vertical
560
- ? Forge.DragSetting.DIRECTION_VERTICAL
561
- : Forge.DragSetting.DIRECTION_HORIZONTAL;
562
629
  }
563
630
  const updater = pageUpdater.update(
564
631
  metroTemplate,
565
- visibleInfo.startWithPadding,
566
- visibleInfo.endWithPadding,
632
+ visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
633
+ Math.min(
634
+ visibleInfo.startMax + visibleInfo.range + visibleInfo.padding.end - 1,
635
+ visibleInfo.endWithPadding + props.keepTraceRange * pageRange
636
+ ),
567
637
  focusId,
568
638
  false,
569
639
  permanentItemList
570
640
  );
571
641
  updater.apply();
572
642
  onItemFocus(getItemById(focusId), null);
573
- slideToItem(focusId, false);
643
+ slideToItem(id2Index(focusId), false);
574
644
  };
575
645
 
576
646
  const getVisibleItems = () => {
@@ -586,8 +656,6 @@ export const setup = (
586
656
  };
587
657
  };
588
658
 
589
- window.aaa = getVisibleItems;
590
-
591
659
  const moveFocus = (direction) => {
592
660
  if (direction == "left" || direction == 37 || direction == EdgeDirection.left) {
593
661
  _moveToNext(-1, 0);
@@ -606,6 +674,10 @@ export const setup = (
606
674
  return dataList.length;
607
675
  }
608
676
 
677
+ const getCurrentFocusIndex = () => {
678
+ return id2Index(focusId);
679
+ }
680
+
609
681
  const exportObject = {
610
682
  lock,
611
683
  unlock,
@@ -616,11 +688,11 @@ export const setup = (
616
688
  setEnterFocusRect,
617
689
  slideToItem,
618
690
  refreshData,
619
- _dispatchEvent,
620
691
  getVisibleItems,
621
692
  moveFocus,
622
693
  getCustomerDataSize,
623
694
  setZIndex,
695
+ getCurrentFocusIndex,
624
696
  };
625
697
 
626
698
  const _calculateNearestItemByRect = (visibleSet, enter_rect_info) => {
@@ -845,195 +917,11 @@ export const setup = (
845
917
  return true;
846
918
  };
847
919
 
848
- const flushItemCoord = (index) => {
849
- for (let i = index; i < innerData.length; ++i) {
850
- const item = getItemByIndex(i);
851
- const renderStyle = item.renderStyle;
852
- const templateInfo = item.templateInfo;
853
- renderStyle.left = templateInfo.left;
854
- renderStyle.top = templateInfo.top;
855
- renderStyle.width = templateInfo.width;
856
- renderStyle.height = templateInfo.height;
857
- }
858
- };
859
-
860
- const updateItemSize = (index, newSize, locateSet, animInfo = null) => {
861
- if (index < 0 || !newSize) {
862
- console.warn(TAG, "updateItemSize params invalid.");
863
- return;
864
- }
865
-
866
- const keyItem = getItemByIndex(index);
867
- if (
868
- keyItem.renderStyle.width == newSize.width &&
869
- keyItem.renderStyle.height == newSize.height
870
- ) {
871
- return;
872
- }
873
-
874
- const keyItemPreRect = {
875
- left: keyItem.templateInfo.left,
876
- top: keyItem.templateInfo.top,
877
- width: keyItem.templateInfo.width,
878
- height: keyItem.templateInfo.height,
879
- };
880
- const preVisibleStart = visibleInfo.start;
881
-
882
- metroTemplate.updateItemSize(index, newSize);
883
-
884
- const locateType = locateSet?.type ?? METRO_WIDGET_CONST.ITEM_RESIZE.WIDGET_SET;
885
- switch (locateType) {
886
- case METRO_WIDGET_CONST.ITEM_RESIZE.ANCHOR:
887
- let anchor = locateSet.anchor;
888
- if (!checkType(anchor, Number)) {
889
- console.error(`updateItemSize error: params of locateType 'ANCHOR' is invalid, expected Number but got ${typeof locateSet.anchor}.\n Use default anchor 0.`);
890
- anchor = 0;
891
- }
892
- const sizeKey = vertical ? "height" : "width";
893
- const newVisibleStart = Math.round(
894
- keyItem.templateInfo[sizeKey] * anchor
895
- + preVisibleStart
896
- - keyItemPreRect[sizeKey] * anchor
897
- );
898
- visibleInfo.start = newVisibleStart < 0 ? 0 : newVisibleStart;
899
- break;
900
- case METRO_WIDGET_CONST.ITEM_RESIZE.WIDGET_SET:
901
- visibleInfo.start = _calculateVisibleStart(keyItem.templateInfo, preSeamlessSlideDirection);
902
- break;
903
- case METRO_WIDGET_CONST.ITEM_RESIZE.CUSTOMER_SET:
904
- const customerFunc = locateSet.func;
905
- if (!checkType(customerFunc, Function)) {
906
- console.error(`updateItemSize error: params of locateType 'CUSTOMER_SETTING' is invalid, expected Function but got ${typeof locateSet.func}.\n Use locateType 'WIDGET_SETTING'`);
907
- visibleInfo.start = _calculateVisibleStart(keyItem, preSeamlessSlideDirection);
908
- break;
909
- } else {
910
- // 为了方便理解, 提供给外部以及外部返回的可视区域起始包含padding
911
- const paddingStart = vertical ? widgetRectInfo.padding.top : widgetRectInfo.padding.left;
912
- const newItemPadding = customerFunc(
913
- keyItemPreRect,
914
- {
915
- left: keyItem.templateInfo.left,
916
- top: keyItem.templateInfo.top,
917
- width: keyItem.templateInfo.width,
918
- height: keyItem.templateInfo.height,
919
- },
920
- (vertical ? keyItemPreRect.top : keyItemPreRect.left) - (preVisibleStart - paddingStart),
921
- );
922
- visibleInfo.start = (vertical ? keyItem.templateInfo.top : keyItem.templateInfo.left) - newItemPadding + paddingStart;
923
- }
924
- break;
925
- default:
926
- throw new Error("undefined locate type", locateSet.type);
927
- }
928
-
929
- const updater = pageUpdater.update(
930
- metroTemplate,
931
- visibleInfo.startWithPadding - props.keepTraceRange * pageRange,
932
- Math.min(
933
- visibleInfo.startMax + visibleInfo.range + visibleInfo.padding.end - 1,
934
- visibleInfo.endWithPadding + props.keepTraceRange * pageRange
935
- ),
936
- keyItem.id,
937
- false,
938
- permanentItemList
920
+ const randomColor = () => {
921
+ let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
922
+ return (
923
+ "#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor + "77"
939
924
  );
940
-
941
- let renderList = [];
942
- const tmpRange = pageUpdater.getTmpRange();
943
- if (tmpRange) {
944
- renderList = Array.from(tmpRange).map((i) => {
945
- return getItemByIndex(i);
946
- });
947
- }
948
-
949
- const preRectInfo = {};
950
- for (let i of renderList) {
951
- preRectInfo[i.index] = {
952
- left: i.renderStyle.left,
953
- top: i.renderStyle.top,
954
- width: i.renderStyle.width,
955
- height: i.renderStyle.height,
956
- };
957
- }
958
- flushItemCoord(index);
959
-
960
- //item animation
961
- if (animInfo) {
962
- const onItemMoveEnd = (animDone) => {
963
- itemMovingInfo = null;
964
- animInfo?.onEnd();
965
- };
966
- let curFrameCount = Forge.sFrameCount.count;
967
- for (let i of renderList) {
968
- if (i.index < index) {
969
- continue;
970
- }
971
- if (
972
- preRectInfo[i.index].left != i.renderStyle.left ||
973
- preRectInfo[i.index].top != i.renderStyle.top
974
- ) {
975
- itemMovingInfo = {
976
- index: index,
977
- deltaLeft: preRectInfo[i.index].left - i.renderStyle.left,
978
- deltaTop: preRectInfo[i.index].top - i.renderStyle.top,
979
- easing: animInfo.easing,
980
- duration: animInfo.duration,
981
- frameCount: curFrameCount,
982
- };
983
- }
984
- const doItemAnim = (div) => {
985
- const animNode = AnimationTools.getDivSlideAnim(
986
- div,
987
- preRectInfo[i.index].left - i.renderStyle.left,
988
- preRectInfo[i.index].top - i.renderStyle.top,
989
- 0,
990
- 0,
991
- {
992
- easing: animInfo.easing ?? null,
993
- duration: animInfo.duration ?? DEFAULT_ANIMATION_DURATION,
994
- onEnd: i.index === index ? onItemMoveEnd : null,
995
- }
996
- );
997
- animationManager.tryStartAnim(curFrameCount, animNode, i.index);
998
- };
999
- if (i.rootDiv) {
1000
- doItemAnim(toRaw(i.rootDiv));
1001
- } else {
1002
- i.addDivMountedListener(doItemAnim);
1003
- }
1004
- }
1005
- } else {
1006
- itemMovingInfo = null;
1007
- }
1008
-
1009
- const slideDivPos =
1010
- (vertical ? itemResizeSlideTop.value : itemResizeSlideLeft.value) -
1011
- (visibleInfo.start - preVisibleStart);
1012
-
1013
- if (animInfo) {
1014
- const slideAnim = {
1015
- easing: animInfo.easing ?? null,
1016
- onStart: null,
1017
- duration: animInfo.duration ?? DEFAULT_ANIMATION_DURATION,
1018
- onEnd: (animDone) => {
1019
- updater.apply();
1020
- },
1021
- };
1022
- updater.applyTmp();
1023
-
1024
- updateItemResizeSlideDiv(
1025
- vertical ? 0 : slideDivPos,
1026
- vertical ? slideDivPos : 0,
1027
- slideAnim
1028
- );
1029
- } else {
1030
- updateItemResizeSlideDiv(
1031
- vertical ? 0 : slideDivPos,
1032
- vertical ? slideDivPos : 0,
1033
- null
1034
- );
1035
- pageUpdater.apply();
1036
- }
1037
925
  };
1038
926
 
1039
927
  const _onTemplateAdd = (customerData, templateItem, measuresObj) => {
@@ -1103,16 +991,10 @@ export const setup = (
1103
991
  innerData.push(item);
1104
992
  if (item.itemConfig.permanent) {
1105
993
  permanentItemList.push({
1106
- index: item.index - 1,
994
+ index: item.index,
1107
995
  alreadyShow: false,
1108
996
  });
1109
997
  }
1110
- const lastTemplateInfo = getItemByIndex(metroTemplate.size - 1).templateInfo;
1111
- if (vertical) {
1112
- touchContainerH.value = lastTemplateInfo.top + lastTemplateInfo.height - 1;
1113
- } else {
1114
- touchContainerW.value = lastTemplateInfo.left + lastTemplateInfo.width - 1;
1115
- }
1116
998
  };
1117
999
 
1118
1000
  const _itemOnFocusSideEffect = (item, edgeRect) => {
@@ -1190,6 +1072,7 @@ export const setup = (
1190
1072
  easing: "",
1191
1073
  onStart: null,
1192
1074
  speed: props.slideSetting.Speed,
1075
+ duration: props.slideSetting.Duration,
1193
1076
  onEnd: () => {
1194
1077
  updater.apply();
1195
1078
  },
@@ -1306,6 +1189,7 @@ export const setup = (
1306
1189
  easing: "",
1307
1190
  onStart: null,
1308
1191
  speed: props.slideSetting.Speed,
1192
+ duration: props.slideSetting.Duration,
1309
1193
  onEnd: (animDone) => {
1310
1194
  updater.apply();
1311
1195
  },
@@ -1323,36 +1207,6 @@ export const setup = (
1323
1207
  //不做滚动时,保证获焦的item创建. 为了避免提前隐藏, 使用applyTmp
1324
1208
  updater.applyTmp();
1325
1209
  }
1326
- if (
1327
- itemMovingInfo &&
1328
- itemMovingInfo.frameCount == Forge.sFrameCount.count
1329
- ) {
1330
- //缩放的动画正在进行时
1331
- const tmpRangeList = pageUpdater.getTmpRange();
1332
- for (let index of tmpRangeList) {
1333
- const item = getItemByIndex(index);
1334
- if (item.index > itemMovingInfo.index && !toRaw(item.rootDiv)) {
1335
- item.addDivMountedListener((div) => {
1336
- const animNode = AnimationTools.getDivSlideAnim(
1337
- toRaw(div),
1338
- itemMovingInfo.deltaLeft,
1339
- itemMovingInfo.deltaTop,
1340
- 0,
1341
- 0,
1342
- {
1343
- easing: itemMovingInfo.easing,
1344
- duration: itemMovingInfo.duration,
1345
- }
1346
- );
1347
- animationManager.tryStartAnim(
1348
- Forge.sFrameCount.count,
1349
- animNode,
1350
- item.index
1351
- );
1352
- });
1353
- }
1354
- }
1355
- }
1356
1210
  }
1357
1211
  } else {
1358
1212
  //到达边缘
@@ -1396,26 +1250,78 @@ export const setup = (
1396
1250
  }
1397
1251
  };
1398
1252
 
1253
+ const normalizeVisibleStart = (origin, targetItem = null) => {
1254
+ let pos_key = vertical ? "top" : "left";
1255
+ let size_key = vertical ? "height" : "width";
1256
+ let visible_start = origin;
1257
+ if ((props.slideSetting.BoundaryProtect & SlideSetting.START_PROTECT) > 0) {
1258
+ let boundary = 0;
1259
+ //首个元素是占位符时, 在保证获焦区域完全展示的前提下要保证首个不可获焦元素的完全展示
1260
+ const headTemplateInfo = getItemByIndex(0).templateInfo;
1261
+ if (
1262
+ targetItem
1263
+ && (!headTemplateInfo.focusable || targetItem.index == headTemplateInfo.index)
1264
+ && targetItem[pos_key] + targetItem[size_key] <=
1265
+ visibleInfo.range
1266
+ ) {
1267
+ boundary = headTemplateInfo[size_key];
1268
+ }
1269
+ visible_start = visible_start < boundary ? 0 : visible_start;
1270
+ }
1271
+ if ((props.slideSetting.BoundaryProtect & SlideSetting.END_PROTECT) > 0) {
1272
+ let lastTemplateInfo = getItemByIndex(metroTemplate.getTailItemIndex()).templateInfo;
1273
+ let last_visible_start =
1274
+ lastTemplateInfo[pos_key] +
1275
+ lastTemplateInfo[size_key] -
1276
+ visibleInfo.range;
1277
+ last_visible_start = last_visible_start < 0 ? 0 : last_visible_start;
1278
+ let boundary = last_visible_start;
1279
+ if (
1280
+ targetItem
1281
+ && (!lastTemplateInfo.focusable || targetItem.index == lastTemplateInfo.index)
1282
+ && targetItem[pos_key] - last_visible_start >= 0
1283
+ ) {
1284
+ //最后元素是占位符, 在保证获焦区域完全展示的前提下要保证不可获焦元素的完全展示
1285
+ boundary = lastTemplateInfo[pos_key] - visibleInfo.range;
1286
+ }
1287
+ visible_start =
1288
+ visible_start > boundary ? last_visible_start : visible_start;
1289
+ }
1290
+ return visible_start;
1291
+ }
1292
+
1399
1293
  const _calculateVisibleStart = (targetTemplateInfo, direction) => {
1400
1294
  if (!targetTemplateInfo) {
1401
1295
  console.error("MetroWidget: _calculateVisibleStart target item is null");
1402
1296
  return 0;
1403
1297
  }
1404
1298
 
1405
- preSeamlessSlideDirection = direction;
1299
+ preSlideDirection = direction;
1406
1300
  preAnchorItemIndex = targetTemplateInfo.index;
1407
1301
  let pos_key = vertical ? "top" : "left";
1408
1302
  let size_key = vertical ? "height" : "width";
1409
1303
  let center_key = vertical ? "centerYPos" : "centerXPos";
1410
1304
  let new_visible_start = visibleInfo.start;
1411
1305
 
1306
+ let needCalculate = true;
1412
1307
  switch (props.slideSetting.Type) {
1413
1308
  case SlideSetting.Type.FIX_POSITION:
1414
1309
  //FIX_POSITION 模式会将当前 item 的中心固定到指定位置
1415
- new_visible_start = Math.ceil(
1416
- targetTemplateInfo[center_key] -
1417
- visibleInfo.range * props.slideSetting.FixPercent
1418
- );
1310
+
1311
+ //首页不滚动
1312
+ if (props.slideSetting.FixFirstPage) {
1313
+ if (targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] - 1 < visibleInfo.range) {
1314
+ new_visible_start = 0;
1315
+ needCalculate = false;
1316
+ }
1317
+ }
1318
+
1319
+ if (needCalculate) {
1320
+ new_visible_start = Math.ceil(
1321
+ targetTemplateInfo[center_key] -
1322
+ visibleInfo.range * props.slideSetting.FixPercent
1323
+ );
1324
+ }
1419
1325
  break;
1420
1326
  case SlideSetting.Type.WHOLE_PAGE:
1421
1327
  if (typeof targetTemplateInfo.pageHeadIndex == "undefined") {
@@ -1430,50 +1336,59 @@ export const setup = (
1430
1336
 
1431
1337
  break;
1432
1338
  case SlideSetting.Type.SEAMLESS:
1433
- if (
1434
- targetTemplateInfo[size_key] >=
1435
- visibleInfo.range *
1436
- (props.slideSetting.EndPercent - props.slideSetting.StartPercent)
1437
- ) {
1438
- //尺寸较大的item
1439
- new_visible_start =
1440
- targetTemplateInfo[center_key] - visibleInfo.range * 0.5;
1441
- } else {
1442
- if (direction > 0) {
1443
- if (
1444
- targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] >
1445
- visibleInfo.start +
1446
- visibleInfo.range * props.slideSetting.EndPercent
1447
- ) {
1448
- new_visible_start =
1449
- targetTemplateInfo[pos_key] +
1450
- targetTemplateInfo[size_key] -
1451
- visibleInfo.range * props.slideSetting.EndPercent;
1452
- }
1453
- } else if (direction < 0) {
1454
- if (
1455
- targetTemplateInfo[pos_key] <
1456
- visibleInfo.start +
1457
- visibleInfo.range * props.slideSetting.StartPercent
1458
- ) {
1459
- new_visible_start =
1460
- targetTemplateInfo[pos_key] -
1461
- visibleInfo.range * props.slideSetting.StartPercent;
1462
- }
1339
+ //首页不滚动
1340
+ if (props.slideSetting.FixFirstPage) {
1341
+ if (targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] - 1 < visibleInfo.range) {
1342
+ new_visible_start = 0;
1343
+ needCalculate = false;
1344
+ }
1345
+ }
1346
+ if (needCalculate) {
1347
+ if (
1348
+ targetTemplateInfo[size_key] >=
1349
+ visibleInfo.range *
1350
+ (props.slideSetting.EndPercent - props.slideSetting.StartPercent)
1351
+ ) {
1352
+ //尺寸较大的item
1353
+ new_visible_start =
1354
+ targetTemplateInfo[center_key] - visibleInfo.range * 0.5;
1463
1355
  } else {
1464
- //不是沿widget方向的移动
1465
- if (targetTemplateInfo[pos_key] < visibleInfo.start) {
1466
- new_visible_start =
1467
- targetTemplateInfo[pos_key] -
1468
- visibleInfo.range * props.slideSetting.StartPercent;
1469
- } else if (
1470
- targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] >
1471
- visibleInfo.end
1472
- ) {
1473
- new_visible_start =
1474
- targetTemplateInfo[pos_key] +
1475
- targetTemplateInfo[size_key] -
1476
- visibleInfo.range * props.slideSetting.EndPercent;
1356
+ if (direction > 0) {
1357
+ if (
1358
+ targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] >
1359
+ visibleInfo.start +
1360
+ visibleInfo.range * props.slideSetting.EndPercent
1361
+ ) {
1362
+ new_visible_start =
1363
+ targetTemplateInfo[pos_key] +
1364
+ targetTemplateInfo[size_key] -
1365
+ visibleInfo.range * props.slideSetting.EndPercent;
1366
+ }
1367
+ } else if (direction < 0) {
1368
+ if (
1369
+ targetTemplateInfo[pos_key] <
1370
+ visibleInfo.start +
1371
+ visibleInfo.range * props.slideSetting.StartPercent
1372
+ ) {
1373
+ new_visible_start =
1374
+ targetTemplateInfo[pos_key] -
1375
+ visibleInfo.range * props.slideSetting.StartPercent;
1376
+ }
1377
+ } else {
1378
+ //不是沿widget方向的移动
1379
+ if (targetTemplateInfo[pos_key] < visibleInfo.start) {
1380
+ new_visible_start =
1381
+ targetTemplateInfo[pos_key] -
1382
+ visibleInfo.range * props.slideSetting.StartPercent;
1383
+ } else if (
1384
+ targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] >
1385
+ visibleInfo.end
1386
+ ) {
1387
+ new_visible_start =
1388
+ targetTemplateInfo[pos_key] +
1389
+ targetTemplateInfo[size_key] -
1390
+ visibleInfo.range * props.slideSetting.EndPercent;
1391
+ }
1477
1392
  }
1478
1393
  }
1479
1394
  }
@@ -1484,38 +1399,7 @@ export const setup = (
1484
1399
  props.slideSetting.Type
1485
1400
  );
1486
1401
  }
1487
-
1488
- if ((props.slideSetting.BoundaryProtect & SlideSetting.START_PROTECT) > 0) {
1489
- let boundary = 0;
1490
- //首个元素是占位符时, 在保证获焦区域完全展示的前提下要保证首个不可获焦元素的完全展示
1491
- const headTemplateInfo = getItemByIndex(0).templateInfo;
1492
- if (
1493
- !headTemplateInfo.focusable &&
1494
- targetTemplateInfo[pos_key] + targetTemplateInfo[size_key] <=
1495
- visibleInfo.range
1496
- ) {
1497
- boundary = headTemplateInfo[size_key];
1498
- }
1499
- new_visible_start = new_visible_start < boundary ? 0 : new_visible_start;
1500
- }
1501
- if ((props.slideSetting.BoundaryProtect & SlideSetting.END_PROTECT) > 0) {
1502
- let lastTemplateInfo = getItemByIndex(metroTemplate.size - 1).templateInfo;
1503
- let last_visible_start =
1504
- lastTemplateInfo[pos_key] +
1505
- lastTemplateInfo[size_key] -
1506
- visibleInfo.range;
1507
- last_visible_start = last_visible_start < 0 ? 0 : last_visible_start;
1508
- let boundary = last_visible_start;
1509
- if (
1510
- !lastTemplateInfo.focusable &&
1511
- targetTemplateInfo[pos_key] - last_visible_start >= 0
1512
- ) {
1513
- //最后元素是占位符, 在保证获焦区域完全展示的前提下要保证不可获焦元素的完全展示
1514
- boundary = lastTemplateInfo[pos_key] - visibleInfo.range;
1515
- }
1516
- new_visible_start =
1517
- new_visible_start > boundary ? last_visible_start : new_visible_start;
1518
- }
1402
+ new_visible_start = normalizeVisibleStart(new_visible_start, targetTemplateInfo);
1519
1403
  return Math.round(new_visible_start);
1520
1404
  };
1521
1405
 
@@ -1549,7 +1433,7 @@ export const setup = (
1549
1433
  isFocus = true;
1550
1434
  preFocusId = -1;
1551
1435
  if (innerData.length === 0) {
1552
- console.warn(`MetroWidget: ${props.name} get focus while data is empty.`);
1436
+ console.log(`MetroWidget: ${props.name} get focus while data is empty.`);
1553
1437
  return;
1554
1438
  }
1555
1439
  let focus_id =
@@ -1580,122 +1464,6 @@ export const setup = (
1580
1464
  isFocus = false;
1581
1465
  };
1582
1466
 
1583
- const _updateFocusByDragInfo = (viewX, viewY) => {
1584
- let enterFocusRect = null;
1585
- //模拟最小区域作为输入区域
1586
- if (vertical) {
1587
- enterFocusRect = {
1588
- direction: EdgeDirection.top,
1589
- rect: {
1590
- x: props.left - viewX,
1591
- y: props.top - viewY,
1592
- width: 10,
1593
- height: 10,
1594
- },
1595
- };
1596
- } else {
1597
- enterFocusRect = {
1598
- direction: EdgeDirection.left,
1599
- rect: {
1600
- x: props.left - viewX,
1601
- y: props.top - viewY,
1602
- width: 10,
1603
- height: 10,
1604
- },
1605
- };
1606
- }
1607
- focusId = _calculateNearestItemByRect(pageUpdater.getRange(), enterFocusRect);
1608
- };
1609
-
1610
- const _onDragUpdateItem = (visible_start, visible_end) => {
1611
- templateItemAdder.tryAddItemByPosition(visible_end);
1612
- const updater = pageUpdater.update(
1613
- metroTemplate,
1614
- visible_start,
1615
- visible_end,
1616
- 0,
1617
- false,
1618
- permanentItemList
1619
- );
1620
- updater.apply();
1621
-
1622
- Forge.sRenderBridge.InstantPerformSwap();
1623
- };
1624
-
1625
- const _getTouchListener = () => {
1626
- if (!props.enableTouch) {
1627
- return null;
1628
- }
1629
- let callback = {
1630
- OnDragStart: (msg) => {
1631
- if (mounted) {
1632
- Promise.resolve().then(() => {
1633
- let cur_visible_start = visibleInfo.start - pageRange * 2;
1634
- let cur_visible_end = visibleInfo.start + pageRange * 3 - 1;
1635
- preUpdateVisibleStart = cur_visible_start;
1636
- _onDragUpdateItem(cur_visible_start, cur_visible_end);
1637
- });
1638
- }
1639
- return true;
1640
- },
1641
- OnMoved: (msg) => {
1642
- if (mounted) {
1643
- Promise.resolve().then(() => {
1644
- if (
1645
- typeof msg.viewY != "undefined" &&
1646
- typeof msg.viewX != "undefined"
1647
- ) {
1648
- if (vertical) {
1649
- visibleInfo.start = -msg.viewY;
1650
- } else {
1651
- visibleInfo.start = -msg.viewX;
1652
- }
1653
- if (visibleInfo.start < 0) {
1654
- visibleInfo.start = 0;
1655
- }
1656
- }
1657
- if (
1658
- Math.abs(visibleInfo.start - preUpdateVisibleStart) <= pageRange
1659
- ) {
1660
- let cur_visible_start = visibleInfo.start - pageRange * 2;
1661
- let cur_visible_end = visibleInfo.start + pageRange * 3 - 1;
1662
- preUpdateVisibleStart = cur_visible_start;
1663
- _onDragUpdateItem(cur_visible_start, cur_visible_end);
1664
- }
1665
- });
1666
- }
1667
-
1668
- return true;
1669
- },
1670
- OnDragEnd: (msg) => {
1671
- updateSlideDiv(msg["viewX"], msg["viewY"], null);
1672
- preUpdateVisibleStart = visibleInfo.start;
1673
- _onDragUpdateItem(
1674
- visibleInfo.startWithPadding,
1675
- visibleInfo.endWithPadding
1676
- );
1677
- _updateFocusByDragInfo(msg["viewX"], msg["viewY"]);
1678
- _onScroll();
1679
- return true;
1680
- },
1681
- OnFling: (msg) => {
1682
- updateSlideDiv(msg["viewX"], msg["viewY"], null);
1683
- preUpdateVisibleStart = visibleInfo.start;
1684
- _onDragUpdateItem(
1685
- visibleInfo.startWithPadding,
1686
- visibleInfo.endWithPadding
1687
- );
1688
- _updateFocusByDragInfo(msg["viewX"], msg["viewY"]);
1689
- _onScroll();
1690
- return true;
1691
- },
1692
- OnRelease: (msg) => {
1693
- return true;
1694
- },
1695
- };
1696
- return callback;
1697
- };
1698
-
1699
1467
  const _updatePage = (rangeSet) => {
1700
1468
  const tmpArray = Array.from(rangeSet);
1701
1469
  renderData.value = tmpArray.map((item) => {
@@ -1712,7 +1480,7 @@ export const setup = (
1712
1480
  const _onScroll = () => {
1713
1481
  if (props.onScroll) {
1714
1482
  const lastTemplateInfo = getItemByIndex(
1715
- metroTemplate.size - 1
1483
+ metroTemplate.getTailItemIndex()
1716
1484
  )?.templateInfo;
1717
1485
  let totalWidth = 0;
1718
1486
  if (lastTemplateInfo) {
@@ -1726,49 +1494,8 @@ export const setup = (
1726
1494
  }
1727
1495
  };
1728
1496
 
1729
- const _initRootTouch = () => {
1730
- if (props.enableTouch && toRaw(slideDiv.value)) {
1731
- let view = toRaw(slideDiv.value).jsvGetProxyView(true);
1732
- var drag_setting = new Forge.DragSetting(
1733
- dragDirection,
1734
- 20,
1735
- false,
1736
- slidePile,
1737
- props.flingPageWidth,
1738
- props.flingPageEdge
1739
- );
1740
- view.EnableDrag(drag_setting, touchListener, "translateMat(dx,dy,0)");
1741
- }
1742
- };
1743
-
1744
- const _initItemViewTouch = (itemDivRef, index) => {
1745
- if (props.enableTouch) {
1746
- if (itemDivRef) {
1747
- // 为view添加触控处理
1748
- let view = itemDivRef.jsvGetProxyView(true);
1749
- let dragSetting = new Forge.DragSetting(
1750
- Forge.DragSetting.DIRECTION_DISABLE,
1751
- 20,
1752
- false,
1753
- new Forge.RectArea(0, 0, 0, 0),
1754
- -1,
1755
- 3 / 4
1756
- );
1757
- let callback = {
1758
- OnTap: (msg) => {
1759
- return onItemClick(getItemById(index));
1760
- },
1761
- };
1762
- view.EnableDrag(dragSetting, callback, "translateMat(dx,dy,0)");
1763
- }
1764
- }
1765
- };
1766
-
1767
1497
  //init
1768
1498
  pageUpdater = new PageUpdater(_updatePage);
1769
- dragDirection = vertical
1770
- ? Forge.DragSetting.DIRECTION_VERTICAL
1771
- : Forge.DragSetting.DIRECTION_HORIZONTAL;
1772
1499
  visibleInfo.range = vertical
1773
1500
  ? widgetRectInfo.contentHeight
1774
1501
  : widgetRectInfo.contentWidth;
@@ -1799,25 +1526,6 @@ export const setup = (
1799
1526
  templateItemAdder.tryAddItem(null, 2);
1800
1527
  }
1801
1528
 
1802
- //触控相关
1803
- const lastTemplateInfo = getItemByIndex(metroTemplate.size - 1)?.templateInfo;
1804
- if (lastTemplateInfo) {
1805
- touchListener = _getTouchListener();
1806
- touchContainerW.value =
1807
- vertical
1808
- ? props.width
1809
- : lastTemplateInfo.left + lastTemplateInfo.width;
1810
- touchContainerH.value =
1811
- vertical
1812
- ? lastTemplateInfo.top + lastTemplateInfo.height
1813
- : props.height;
1814
- }
1815
- slidePile = new Forge.RectArea(
1816
- 0,
1817
- 0,
1818
- widgetRectInfo.contentWidth,
1819
- widgetRectInfo.contentHeight,
1820
- );
1821
1529
  let init_focus_id = 0;
1822
1530
  let cur_visible_start = 0;
1823
1531
 
@@ -1846,11 +1554,6 @@ export const setup = (
1846
1554
 
1847
1555
  onMounted(() => {
1848
1556
  mounted = true;
1849
- _initRootTouch();
1850
- for (let item of renderData.value) {
1851
- _initItemViewTouch(toRaw(item.rootDiv), item.index);
1852
- }
1853
-
1854
1557
  if (visibleInfo.start) {
1855
1558
  _slideTo(visibleInfo.start, null);
1856
1559
  }
@@ -1865,13 +1568,7 @@ export const setup = (
1865
1568
  }
1866
1569
  });
1867
1570
 
1868
- onUpdated(() => {
1869
- for (let item of renderData.value) {
1870
- if (!item.touchInit) {
1871
- _initItemViewTouch(toRaw(item.rootDiv), item.index);
1872
- }
1873
- }
1874
- });
1571
+ onUpdated(() => { });
1875
1572
 
1876
1573
  onBeforeUnmount(() => {
1877
1574
  mounted = false;
@@ -1887,6 +1584,4 @@ export const setup = (
1887
1584
  exportObject,
1888
1585
  setZIndex,
1889
1586
  }
1890
- }
1891
-
1892
- export const RENDER_ITEM_BREAK_KEY = "__QcodeJsviewMetroWidgetSlot";
1587
+ }