@shijiu/jsview-vue 2.2.35 → 2.2.128
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/bin/browser/BrowserApic.vue.mjs +2 -1
- package/bin/browser/BrowserApic2.vue.mjs +2 -1
- package/bin/browser/BrowserApicLib.mjs +2 -1
- package/bin/browser/BrowserQrcode.vue.mjs +3 -1
- package/bin/browser/BrowserTextureAnim.vue.mjs +7 -6
- package/bin/jsview-vue.mjs +1557 -894
- package/bin/types/JsViewEngineWidget/MetroWidget/Slide.d.ts +21 -0
- package/bin/types/JsViewEngineWidget/TemplateParser/MetroTemplate.d.ts +2 -8
- package/bin/types/JsViewEngineWidget/WidgetCommon.d.ts +9 -3
- package/bin/types/JsViewVueTools/ConstSymbol.d.ts +2 -0
- package/bin/types/JsViewVueTools/ForgeConstDefine.d.ts +11 -0
- package/bin/types/JsViewVueTools/JsvRuntimeBridge.d.ts +113 -57
- package/bin/types/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.d.ts +11 -0
- package/bin/types/JsViewVueTools/JsvTextureStore/Texture.d.ts +8 -0
- package/bin/types/JsViewVueWidget/JsvConnectLine/JsvConnectLine.vue.d.ts +1 -1
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.d.ts +4 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorControl.d.ts +65 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ActorState.d.ts +6 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.d.ts +11 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.d.ts +15 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue.d.ts +6 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetAction.d.ts +71 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetCondition.d.ts +95 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/SetState.d.ts +62 -0
- package/bin/types/JsViewVueWidget/JsvFreeMoveActor/index.d.ts +2 -1
- package/bin/types/JsViewVueWidget/JsvLine/JsvLine.vue.d.ts +1 -1
- package/bin/types/JsViewVueWidget/JsvNativeSharedDiv.vue.d.ts +66 -28
- package/bin/types/JsViewVueWidget/JsvNinePatch.vue.d.ts +1 -0
- package/bin/types/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue.d.ts +176 -0
- package/bin/types/JsViewVueWidget/JsvScrollBox/ScrollSymbol.d.ts +7 -0
- package/bin/types/JsViewVueWidget/JsvScrollBox/index.d.ts +1 -0
- package/bin/types/JsViewVueWidget/JsvTextBox.vue.d.ts +3 -3
- package/bin/types/JsViewVueWidget/index.d.ts +1 -0
- package/package.json +1 -1
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +10 -1
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +398 -309
- package/utils/JsViewEngineWidget/MetroWidget/RenderItem.ts +2 -1
- package/utils/JsViewEngineWidget/MetroWidget/Slide.ts +56 -0
- package/utils/JsViewEngineWidget/MetroWidget/TaskManager.ts +51 -10
- package/utils/JsViewEngineWidget/MetroWidget/TokenGenerator.ts +10 -0
- package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +9 -3
- package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +25 -35
- package/utils/JsViewEngineWidget/WidgetCommon.ts +20 -7
- package/utils/JsViewPlugin/JsvPlayer/BrowserJsvPlayer.vue +13 -1
- package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +470 -338
- package/utils/JsViewVueTools/ConstSymbol.ts +3 -0
- package/utils/JsViewVueTools/ForgeConstDefine.ts +11 -0
- package/utils/JsViewVueTools/JsvRuntimeBridge.js +172 -50
- package/utils/JsViewVueTools/JsvTextureStore/CapturedTexture/CapturedTexture.ts +62 -0
- package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +41 -7
- package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +15 -1
- package/utils/JsViewVueTools/index.js +2 -0
- package/utils/JsViewVueWidget/JsvApic/JsvApic/BrowserApic.vue +6 -6
- package/utils/JsViewVueWidget/JsvApic/JsvApic2/BrowserApic2.vue +5 -6
- package/utils/JsViewVueWidget/JsvApic/JsvBrowserApicLib/ApicDataBase.js +5 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +1 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +23 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +4 -4
- package/utils/JsViewVueWidget/JsvFreeMoveActor/CallbackManager.ts +6 -6
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +1 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +43 -9
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +24 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +50 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +56 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +3 -0
- package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +6 -1
- package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +121 -68
- package/utils/JsViewVueWidget/JsvNinePatch.vue +4 -1
- package/utils/JsViewVueWidget/JsvPosterImage.vue +22 -9
- package/utils/JsViewVueWidget/JsvQrcode/BrowserQrcode.vue +6 -2
- package/utils/JsViewVueWidget/JsvScrollBox/JsvScrollBox.vue +309 -0
- package/utils/JsViewVueWidget/JsvScrollBox/ScrollSymbol.ts +15 -0
- package/utils/JsViewVueWidget/JsvScrollBox/index.js +2 -0
- package/utils/JsViewVueWidget/JsvTextBox.vue +12 -4
- package/utils/JsViewVueWidget/JsvTextureAnim/BrowserTextureAnim.vue +9 -6
- package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +2 -0
- package/utils/JsViewVueWidget/index.js +1 -0
|
@@ -27,7 +27,9 @@ import { RenderItem } from "./RenderItem";
|
|
|
27
27
|
import { VisibleInfo } from "./VisibleInfo";
|
|
28
28
|
import { WidgetRectInfo } from "./WidgetRectInfo";
|
|
29
29
|
import ActorControl from "../../JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts";
|
|
30
|
-
import { TaskType, SlideAnimWrapper, TaskManager, AnimationManager } from "./TaskManager.ts";
|
|
30
|
+
import { TaskType, SlideAnimWrapper, TaskManager, AnimationManager, SlideTaskType } from "./TaskManager.ts";
|
|
31
|
+
import { getDirectionByRect, RectCache } from "./Slide.ts";
|
|
32
|
+
import { ForgeConst } from "../../JsViewVueTools/ForgeConstDefine.ts";
|
|
31
33
|
|
|
32
34
|
const TAG = "MetroWidget";
|
|
33
35
|
|
|
@@ -109,7 +111,7 @@ export const setup = (
|
|
|
109
111
|
};
|
|
110
112
|
|
|
111
113
|
let innerKeepTraceRange = 0;
|
|
112
|
-
if (typeof props.keepTraceRange > 0) {
|
|
114
|
+
if (typeof props.keepTraceRange == "number" && props.keepTraceRange > 0) {
|
|
113
115
|
innerKeepTraceRange = props.keepTraceRange;
|
|
114
116
|
} else {
|
|
115
117
|
if (props.touchFlag > 0) {
|
|
@@ -173,7 +175,6 @@ export const setup = (
|
|
|
173
175
|
let preEdgeRect = null;
|
|
174
176
|
let isFocus = false;
|
|
175
177
|
let vertical = props.direction == VERTICAL;
|
|
176
|
-
let preAnchorItemIndex = -1;
|
|
177
178
|
let templateItemAdder = null;
|
|
178
179
|
let permanentItemList = [];
|
|
179
180
|
let mounted = false;
|
|
@@ -182,7 +183,6 @@ export const setup = (
|
|
|
182
183
|
let childSlideEventLock = false;
|
|
183
184
|
let onKeyDownLock = false;
|
|
184
185
|
let visibleInfo = new VisibleInfo();
|
|
185
|
-
let preSlideDirection = 0;
|
|
186
186
|
let alreadyCallItemFocus = false;
|
|
187
187
|
let innerSlideSetting = props.slideSetting
|
|
188
188
|
const currentFocusIndex = ref(0);
|
|
@@ -196,125 +196,181 @@ export const setup = (
|
|
|
196
196
|
&& item.templateInfo[pos_key] + item.templateInfo[size_key] - 1 < visibleInfo.end;
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
|
|
199
|
+
//tools
|
|
200
|
+
const lastOfArray = (array) => {
|
|
201
|
+
if (array instanceof Array && array.length > 0) {
|
|
202
|
+
return array[array.length - 1]
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const onAddTask = (allTask) => {
|
|
202
208
|
let resizeTaskMap = {};
|
|
203
|
-
let slideTask = null;
|
|
204
209
|
//统一处理itemResize和slide动画
|
|
205
210
|
let minIndex = Infinity;
|
|
206
|
-
let slideInfo = null;
|
|
207
211
|
let mergeTmp = false;
|
|
208
212
|
let anchorInfo = null;
|
|
209
|
-
let duration = 200;
|
|
210
|
-
let easing = null;
|
|
211
213
|
|
|
212
214
|
let pos_key = vertical ? "top" : "left";
|
|
213
215
|
let size_key = vertical ? "height" : "width";
|
|
214
|
-
let doAnim = false;
|
|
215
216
|
|
|
216
|
-
let existOnFocusChange = false;
|
|
217
217
|
let targetVisibleStart = visibleInfo.start;
|
|
218
|
+
let slideDoAnim = false;
|
|
218
219
|
|
|
219
|
-
|
|
220
|
-
taskList.forEach(i => {
|
|
221
|
-
if (i.type == TaskType.SLIDE) {
|
|
222
|
-
slideTask = i;
|
|
223
|
-
mergeTmp = mergeTmp || i.params?.updateParam?.mergeTmp;
|
|
224
|
-
if (!isNaN(i.params?.target)) {
|
|
225
|
-
targetVisibleStart = -i.params.target;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
});
|
|
220
|
+
mRectCache.cacheManually();
|
|
229
221
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
222
|
+
/**
|
|
223
|
+
* 处理resize
|
|
224
|
+
*/
|
|
225
|
+
let resizeAnimInfo = {
|
|
226
|
+
doAnim: false,
|
|
227
|
+
duration: 200,
|
|
228
|
+
easing: "",
|
|
229
|
+
}
|
|
230
|
+
let resizeList = allTask.resize.concat();
|
|
231
|
+
if (resizeList.length > 0) {
|
|
232
|
+
//resize
|
|
233
|
+
resizeList.forEach(task => {
|
|
233
234
|
resizeTaskMap[task.params.index] = task;
|
|
234
|
-
resizeList.push(task);
|
|
235
235
|
const { index, animInfo } = task.params;
|
|
236
|
-
|
|
236
|
+
if (animInfo) {
|
|
237
|
+
resizeAnimInfo.doAnim = true;
|
|
238
|
+
resizeAnimInfo.duration = animInfo.duration ?? resizeAnimInfo.duration;
|
|
239
|
+
resizeAnimInfo.easing = animInfo.duration ?? "";
|
|
240
|
+
}
|
|
237
241
|
minIndex = Math.min(minIndex, index);
|
|
238
242
|
|
|
239
|
-
|
|
240
|
-
|
|
243
|
+
metroTemplate.updateItemSize(task.params.index, {
|
|
244
|
+
width: task.params.width,
|
|
245
|
+
height: task.params.height,
|
|
246
|
+
})
|
|
247
|
+
});
|
|
241
248
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
249
|
+
//使用上一帧的状态计算anchorPosition
|
|
250
|
+
if (resizeTaskMap[id2Index(focusId)]) {
|
|
251
|
+
const task = resizeTaskMap[id2Index(focusId)];
|
|
252
|
+
const animInfo = task.params.animInfo;
|
|
253
|
+
if (typeof animInfo?.anchor == "number") {
|
|
254
|
+
const preRect = getItemById(focusId)?.templateInfo?.layoutCache.getPreRect();
|
|
255
|
+
if (preRect) {
|
|
256
|
+
anchorInfo = {
|
|
257
|
+
anchorPosition: preRect[pos_key] + preRect[size_key] * animInfo.anchor - 1 - visibleInfo.start,
|
|
258
|
+
anchor: animInfo.anchor,
|
|
259
|
+
}
|
|
248
260
|
}
|
|
249
261
|
}
|
|
250
|
-
} else if (task.type == TaskType.ON_FOCUS_CHANGE) {
|
|
251
|
-
existOnFocusChange = true;
|
|
252
262
|
}
|
|
253
263
|
}
|
|
254
264
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
265
|
+
/**
|
|
266
|
+
* 获取slide的targetRect
|
|
267
|
+
* 多个slide task取最后一个
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
/* 两种改变方式: 直接指定Position; 通过targetRect计算 */
|
|
271
|
+
let targetRect = null;
|
|
272
|
+
let direction = undefined;
|
|
273
|
+
|
|
274
|
+
let validSlideTask = false;
|
|
275
|
+
if (allTask.slide.length > 0) {
|
|
276
|
+
validSlideTask = true;
|
|
277
|
+
//有滚动时, 取消延时加载
|
|
278
|
+
tryCancelDelayLoad();
|
|
279
|
+
let slideTask = lastOfArray(allTask.slide);
|
|
280
|
+
slideDoAnim = slideTask.params.doAnim;
|
|
281
|
+
switch (slideTask.subType) {
|
|
282
|
+
case SlideTaskType.SLIDE_BY_DIV: {
|
|
283
|
+
const div = slideTask.params.div;
|
|
284
|
+
const item_layout = div.jsvGetRelativePosition(toRaw(locateDiv.value));
|
|
285
|
+
let fakeItem = {
|
|
286
|
+
templateInfo: {
|
|
287
|
+
left: item_layout.left,
|
|
288
|
+
top: item_layout.top,
|
|
289
|
+
width: item_layout.width,
|
|
290
|
+
height: item_layout.height,
|
|
291
|
+
centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
|
|
292
|
+
centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
|
|
293
|
+
index: id2Index(focusId),
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
templateItemAdder.tryAddItemByPosition(vertical ? fakeItem.templateInfo.top : fakeItem.templateInfo.left);
|
|
297
|
+
targetRect = fakeItem.templateInfo;
|
|
298
|
+
} break;
|
|
299
|
+
case SlideTaskType.SLIDE_BY_POS: {
|
|
300
|
+
const position = slideTask.params.position;
|
|
301
|
+
templateItemAdder.tryAddItemByPosition(position);
|
|
302
|
+
targetVisibleStart = position;
|
|
303
|
+
} break;
|
|
304
|
+
case SlideTaskType.SLIDE_BY_ITEM: {
|
|
305
|
+
const index = slideTask.params.index;
|
|
306
|
+
templateItemAdder.tryAddItemByIndex(index);
|
|
307
|
+
const targetItem = getItemByIndex(index);
|
|
308
|
+
if (targetItem) {
|
|
309
|
+
if (typeof slideTask.params.direction != "undefined") {
|
|
310
|
+
direction = slideTask.params.direction;
|
|
311
|
+
}
|
|
312
|
+
targetRect = targetItem.templateInfo;
|
|
313
|
+
} else {
|
|
314
|
+
//无效的滚动
|
|
315
|
+
validSlideTask = false;
|
|
316
|
+
}
|
|
317
|
+
} break;
|
|
318
|
+
case SlideTaskType.SLIDE_BY_RECT: {
|
|
319
|
+
if (typeof slideTask.params.direction != "undefined") {
|
|
320
|
+
direction = slideTask.params.direction;
|
|
321
|
+
}
|
|
322
|
+
targetRect = slideTask.params.rect;
|
|
323
|
+
} break;
|
|
324
|
+
default:
|
|
325
|
+
break;
|
|
259
326
|
}
|
|
260
|
-
}
|
|
261
327
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
if (templateCacheFrameCount != Forge.sFrameCount.count) {
|
|
267
|
-
metroTemplate.cacheLayout(minIndex, minIndex + 20);
|
|
268
|
-
templateCacheFrameCount = Forge.sFrameCount.count;
|
|
269
|
-
}
|
|
270
|
-
//resize
|
|
271
|
-
resizeList.forEach(task => {
|
|
272
|
-
metroTemplate.updateItemSize(task.params.index, {
|
|
273
|
-
width: task.params.width,
|
|
274
|
-
height: task.params.height,
|
|
275
|
-
})
|
|
276
|
-
});
|
|
277
|
-
//保持anchor
|
|
328
|
+
mergeTmp = mergeTmp || slideTask.params?.updateParam?.mergeTmp;
|
|
329
|
+
}
|
|
330
|
+
if (!validSlideTask && resizeList.length > 0) {
|
|
331
|
+
//没有slide任务时, 采用resize的slide位置计算
|
|
278
332
|
if (anchorInfo) {
|
|
333
|
+
//保持anchor
|
|
279
334
|
const focusItem = getItemById(focusId);
|
|
280
335
|
const start = focusItem.templateInfo[pos_key] + focusItem.templateInfo[size_key] * anchorInfo.anchor - 1 - anchorInfo.anchorPosition;
|
|
281
|
-
targetVisibleStart = normalizeVisibleStart(start, focusItem.templateInfo);
|
|
336
|
+
targetVisibleStart = normalizeVisibleStart(start, focusItem.templateInfo, focusItem.templateInfo.index);
|
|
282
337
|
} else {
|
|
283
|
-
|
|
338
|
+
targetRect = getItemById(focusId).templateInfo;
|
|
284
339
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
340
|
+
slideDoAnim = resizeAnimInfo.doAnim;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (targetRect) {
|
|
344
|
+
const v = visibleInfo.copy();
|
|
345
|
+
let preInfo = null;
|
|
346
|
+
if (resizeList.length > 0) {
|
|
347
|
+
//存在resize时, 需要调整targetRect
|
|
348
|
+
preInfo = mRectCache.getPreRect();
|
|
349
|
+
if (preInfo) {
|
|
350
|
+
v.start = targetRect.left - preInfo.left + v.start;
|
|
351
|
+
preInfo.left += (v.start - visibleInfo.start);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
targetVisibleStart = _calculateVisibleStart(targetRect, direction, targetRect, v, preInfo);
|
|
355
|
+
} else {
|
|
356
|
+
//resize通过anchor直接设置了visibleStart
|
|
357
|
+
if (resizeList.length > 0) {
|
|
358
|
+
let tRect = getItemById(focusId)?.templateInfo;
|
|
359
|
+
if (tRect) {
|
|
360
|
+
mRectCache.cache({
|
|
361
|
+
left: tRect.left,
|
|
362
|
+
top: tRect.top,
|
|
363
|
+
width: tRect.width,
|
|
364
|
+
height: tRect.height,
|
|
365
|
+
frameCount: Forge.sFrameCount.count,
|
|
366
|
+
})
|
|
313
367
|
}
|
|
314
368
|
}
|
|
315
369
|
}
|
|
316
370
|
|
|
371
|
+
let needSlide = false;
|
|
317
372
|
if (targetVisibleStart != visibleInfo.start) {
|
|
373
|
+
needSlide = true;
|
|
318
374
|
taskManager.run(() => {
|
|
319
375
|
const preVisibleStart = visibleInfo.start;
|
|
320
376
|
visibleInfo.start = targetVisibleStart;
|
|
@@ -323,6 +379,7 @@ export const setup = (
|
|
|
323
379
|
}
|
|
324
380
|
});
|
|
325
381
|
}
|
|
382
|
+
|
|
326
383
|
//updatePage
|
|
327
384
|
let updateHandler
|
|
328
385
|
taskManager.run(() => {
|
|
@@ -342,39 +399,41 @@ export const setup = (
|
|
|
342
399
|
// resize item 动画
|
|
343
400
|
if (resizeList.length > 0) {
|
|
344
401
|
updateHandler.applyTmp();
|
|
345
|
-
if (doAnim) {
|
|
402
|
+
if (resizeAnimInfo.doAnim) {
|
|
346
403
|
const visibleIndexList = Array.from(pageUpdater.getTmpRange());
|
|
347
404
|
//创建item slide anim
|
|
348
405
|
for (let index of visibleIndexList) {
|
|
349
406
|
const renderItem = getItemByIndex(index);
|
|
350
407
|
const { left, top } = renderItem.templateInfo;
|
|
351
408
|
if (index >= minIndex) {
|
|
352
|
-
const layoutCache = renderItem.templateInfo.layoutCache;
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
resizeTaskMap[index]
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
409
|
+
const layoutCache = renderItem.templateInfo.layoutCache.getPreRect();
|
|
410
|
+
if (layoutCache) {
|
|
411
|
+
const doItemSlide = (div) => {
|
|
412
|
+
taskManager.run(() => {
|
|
413
|
+
const cancel = animationManager.startSlideAnim(
|
|
414
|
+
div,
|
|
415
|
+
[layoutCache.left - left, layoutCache.top - top],
|
|
416
|
+
[0, 0],
|
|
417
|
+
resizeTaskMap[index] ?
|
|
418
|
+
resizeTaskMap[index].params.animInfo
|
|
419
|
+
: { duration: resizeAnimInfo.duration }
|
|
420
|
+
)
|
|
421
|
+
return () => {
|
|
422
|
+
cancel()
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
}
|
|
368
426
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
427
|
+
if (renderItem.mounted.value) {
|
|
428
|
+
doItemSlide(renderItem.rootDiv);
|
|
429
|
+
} else {
|
|
430
|
+
taskManager.run(() => {
|
|
431
|
+
const unregister = renderItem.addDivMountedListener((div) => {
|
|
432
|
+
doItemSlide(div);
|
|
433
|
+
});
|
|
434
|
+
return unregister;
|
|
375
435
|
});
|
|
376
|
-
|
|
377
|
-
});
|
|
436
|
+
}
|
|
378
437
|
}
|
|
379
438
|
}
|
|
380
439
|
}
|
|
@@ -382,13 +441,22 @@ export const setup = (
|
|
|
382
441
|
}
|
|
383
442
|
|
|
384
443
|
//处理滚动动画
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
444
|
+
if (needSlide) {
|
|
445
|
+
let animInfo = undefined;
|
|
446
|
+
if (slideDoAnim) {
|
|
447
|
+
animInfo = {
|
|
448
|
+
easing: null,//resizeAnimInfo.doAnim ? resizeAnimInfo.easing : '' /* innerSlideSetting.Easing */,
|
|
449
|
+
duration: resizeAnimInfo.doAnim ? resizeAnimInfo.duration : innerSlideSetting.Duration,
|
|
450
|
+
speed: innerSlideSetting.Speed,
|
|
451
|
+
onStart: null,
|
|
452
|
+
onEnd: null,
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
executeSlide(visibleInfo.start, animInfo, updateHandler)
|
|
388
456
|
}
|
|
389
457
|
|
|
390
458
|
//回调
|
|
391
|
-
if (
|
|
459
|
+
if (resizeList.length > 0 && props.onAllItemResizeDone) {
|
|
392
460
|
taskManager.run(() => {
|
|
393
461
|
const handler = setTimeout(() => {
|
|
394
462
|
props.onAllItemResizeDone();
|
|
@@ -398,7 +466,7 @@ export const setup = (
|
|
|
398
466
|
}
|
|
399
467
|
})
|
|
400
468
|
}
|
|
401
|
-
if ((
|
|
469
|
+
if ((needSlide || allTask.focus.length > 0) && props.onFocusRectChange) {
|
|
402
470
|
taskManager.run(() => {
|
|
403
471
|
const handler = setTimeout(() => {
|
|
404
472
|
props.onFocusRectChange();
|
|
@@ -409,22 +477,21 @@ export const setup = (
|
|
|
409
477
|
})
|
|
410
478
|
}
|
|
411
479
|
}
|
|
412
|
-
const taskManager = new TaskManager(
|
|
480
|
+
const taskManager = new TaskManager(onAddTask);
|
|
413
481
|
const animationManager = new AnimationManager();
|
|
414
482
|
|
|
415
|
-
const executeSlide = (
|
|
483
|
+
const executeSlide = (target, animObj, updateHandler) => {
|
|
416
484
|
let preLeft = slideDivLeft.value;
|
|
417
485
|
let preTop = slideDivTop.value;
|
|
418
486
|
taskManager.run(() => {
|
|
419
|
-
slideDivLeft.value = vertical ? 0 : -
|
|
420
|
-
slideDivTop.value = vertical ? -
|
|
487
|
+
slideDivLeft.value = vertical ? 0 : -target;
|
|
488
|
+
slideDivTop.value = vertical ? -target : 0;
|
|
421
489
|
return () => {
|
|
422
490
|
slideDivLeft.value = preLeft;
|
|
423
491
|
slideDivTop.value = preTop;
|
|
424
492
|
}
|
|
425
493
|
});
|
|
426
|
-
|
|
427
|
-
if (slideInfo.animObj) {
|
|
494
|
+
if (animObj) {
|
|
428
495
|
updateHandler.applyTmp();
|
|
429
496
|
taskManager.run(() => {
|
|
430
497
|
const from = vertical ? [0, preTop - slideDivTop.value] : [preLeft - slideDivLeft.value, 0];
|
|
@@ -433,7 +500,7 @@ export const setup = (
|
|
|
433
500
|
from,
|
|
434
501
|
[0, 0],
|
|
435
502
|
{
|
|
436
|
-
...
|
|
503
|
+
...animObj,
|
|
437
504
|
onEnd: () => {
|
|
438
505
|
updateHandler.apply()
|
|
439
506
|
}
|
|
@@ -454,26 +521,27 @@ export const setup = (
|
|
|
454
521
|
clearTimeout(handler);
|
|
455
522
|
}
|
|
456
523
|
})
|
|
457
|
-
return viewSlid
|
|
458
524
|
}
|
|
459
525
|
|
|
460
526
|
const updateItemSize = (index, newSize, animInfo) => {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
527
|
+
const item = getItemByIndex(index);
|
|
528
|
+
if (item && (item.templateInfo.width !== newSize.width || item.templateInfo.height !== newSize.height)) {
|
|
529
|
+
taskManager.addTask(TaskType.RESIZE_ITEM,
|
|
530
|
+
{
|
|
531
|
+
index,
|
|
532
|
+
width: newSize.width,
|
|
533
|
+
height: newSize.height,
|
|
534
|
+
animInfo,
|
|
535
|
+
preRect: {
|
|
536
|
+
left: item.templateInfo.left,
|
|
537
|
+
top: item.templateInfo.top,
|
|
538
|
+
width: item.templateInfo.width,
|
|
539
|
+
height: item.templateInfo.height,
|
|
540
|
+
},
|
|
541
|
+
});
|
|
542
|
+
}
|
|
468
543
|
}
|
|
469
544
|
|
|
470
|
-
const _slideTo = (target, animObj, updateParam = { mergeTmp: false }) => {
|
|
471
|
-
if (slideLock || target == visibleInfo.start) {
|
|
472
|
-
return
|
|
473
|
-
};
|
|
474
|
-
taskManager.addTask(TaskType.SLIDE, { target: -target, animObj, updateParam });
|
|
475
|
-
};
|
|
476
|
-
|
|
477
545
|
let callFocusAfterUpdate = false;
|
|
478
546
|
|
|
479
547
|
//methods
|
|
@@ -689,27 +757,6 @@ export const setup = (
|
|
|
689
757
|
enterFocusRect = rect;
|
|
690
758
|
};
|
|
691
759
|
|
|
692
|
-
const slideTo = (position, doAnim) => {
|
|
693
|
-
//有外部触发的滚动时, 取消load
|
|
694
|
-
tryCancelDelayLoad();
|
|
695
|
-
templateItemAdder.tryAddItemByPosition(position);
|
|
696
|
-
if (
|
|
697
|
-
typeof position !== "undefined" &&
|
|
698
|
-
position != null
|
|
699
|
-
) {
|
|
700
|
-
let animObj = null;
|
|
701
|
-
if (doAnim) {
|
|
702
|
-
animObj = {
|
|
703
|
-
easing: innerSlideSetting.Easing,
|
|
704
|
-
onStart: null,
|
|
705
|
-
speed: innerSlideSetting.Speed,
|
|
706
|
-
duration: innerSlideSetting.Duration,
|
|
707
|
-
};
|
|
708
|
-
}
|
|
709
|
-
_slideTo(position, animObj);
|
|
710
|
-
}
|
|
711
|
-
};
|
|
712
|
-
|
|
713
760
|
const setZIndex = (index, normalZIndex, focusZIndex) => {
|
|
714
761
|
const targetItem = getItemByIndex(index);
|
|
715
762
|
if (targetItem) {
|
|
@@ -722,45 +769,63 @@ export const setup = (
|
|
|
722
769
|
}
|
|
723
770
|
}
|
|
724
771
|
|
|
725
|
-
const
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
772
|
+
const slideToInner = (position, doAnim, updateParam = { mergeTmp: false }) => {
|
|
773
|
+
if (slideLock || position == (vertical ? slideDivTop.value : slideDivLeft.value)) {
|
|
774
|
+
return
|
|
775
|
+
};
|
|
776
|
+
taskManager.addTask(TaskType.SLIDE, { position, doAnim, updateParam }, SlideTaskType.SLIDE_BY_POS);
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
const slideTo = (position, doAnim) => {
|
|
780
|
+
if (typeof position == "number") {
|
|
781
|
+
slideToInner(position, doAnim);
|
|
732
782
|
}
|
|
733
783
|
};
|
|
734
784
|
|
|
785
|
+
const slideToItemInner = (index, doAnim, direction = undefined, preItem = undefined) => {
|
|
786
|
+
taskManager.addTask(
|
|
787
|
+
TaskType.SLIDE,
|
|
788
|
+
{
|
|
789
|
+
index,
|
|
790
|
+
doAnim,
|
|
791
|
+
direction,
|
|
792
|
+
preItem,
|
|
793
|
+
},
|
|
794
|
+
SlideTaskType.SLIDE_BY_ITEM);
|
|
795
|
+
};
|
|
796
|
+
const slideToItem = (index, doAnim) => {
|
|
797
|
+
slideToItemInner(index, doAnim)
|
|
798
|
+
}
|
|
799
|
+
|
|
735
800
|
const slideToDiv = (div, doAnim) => {
|
|
736
|
-
|
|
737
|
-
|
|
801
|
+
slideToDivInner(div, doAnim);
|
|
802
|
+
}
|
|
803
|
+
const slideToDivInner = (div, doAnim, direction = undefined) => {
|
|
738
804
|
if (div) {
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
top: item_layout.top,
|
|
746
|
-
width: item_layout.width,
|
|
747
|
-
height: item_layout.height,
|
|
748
|
-
centerYPos: Math.floor(item_layout.top + item_layout.height / 2),
|
|
749
|
-
centerXPos: Math.floor(item_layout.left + item_layout.width / 2),
|
|
750
|
-
index: id2Index(focusId),
|
|
805
|
+
taskManager.addTask(
|
|
806
|
+
TaskType.SLIDE,
|
|
807
|
+
{
|
|
808
|
+
div,
|
|
809
|
+
doAnim,
|
|
810
|
+
direction,
|
|
751
811
|
},
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
812
|
+
SlideTaskType.SLIDE_BY_DIV);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
const slideToRect = (rect, doAnim, direction = undefined) => {
|
|
816
|
+
if (rect
|
|
817
|
+
&& typeof rect.left == 'number'
|
|
818
|
+
&& typeof rect.top == 'number'
|
|
819
|
+
&& typeof rect.width == 'number'
|
|
820
|
+
&& typeof rect.height == 'number') {
|
|
821
|
+
taskManager.addTask(
|
|
822
|
+
TaskType.SLIDE,
|
|
823
|
+
{
|
|
824
|
+
rect,
|
|
825
|
+
doAnim,
|
|
826
|
+
direction,
|
|
827
|
+
},
|
|
828
|
+
SlideTaskType.SLIDE_BY_RECT);
|
|
764
829
|
}
|
|
765
830
|
}
|
|
766
831
|
|
|
@@ -844,7 +909,12 @@ export const setup = (
|
|
|
844
909
|
);
|
|
845
910
|
updater.apply();
|
|
846
911
|
onItemFocus(getItemById(focusId), null);
|
|
847
|
-
|
|
912
|
+
let targetRect = mRectCache.getCurRect() ?? mRectCache.getPreRect();
|
|
913
|
+
if (targetRect) {
|
|
914
|
+
slideToRect(targetRect, false);
|
|
915
|
+
} else {
|
|
916
|
+
slideToItem(id2Index(focusId), false);
|
|
917
|
+
}
|
|
848
918
|
//template和slideDivStyle均确定后再次重设box condition
|
|
849
919
|
updateTouchBoxCondition();
|
|
850
920
|
};
|
|
@@ -1323,16 +1393,11 @@ export const setup = (
|
|
|
1323
1393
|
},
|
|
1324
1394
|
};
|
|
1325
1395
|
|
|
1326
|
-
let cur_slide = _calculateVisibleStart(fakeItem.templateInfo, direction);
|
|
1396
|
+
let cur_slide = _calculateVisibleStart(fakeItem.templateInfo, direction, fakeItem.templateInfo, visibleInfo);
|
|
1327
1397
|
if (cur_slide != visibleInfo.start) {
|
|
1328
|
-
|
|
1398
|
+
slideToInner(
|
|
1329
1399
|
cur_slide,
|
|
1330
|
-
|
|
1331
|
-
easing: "",
|
|
1332
|
-
onStart: null,
|
|
1333
|
-
speed: innerSlideSetting.Speed,
|
|
1334
|
-
duration: innerSlideSetting.Duration,
|
|
1335
|
-
},
|
|
1400
|
+
true,
|
|
1336
1401
|
{
|
|
1337
1402
|
mergeTmp: true
|
|
1338
1403
|
});
|
|
@@ -1344,7 +1409,7 @@ export const setup = (
|
|
|
1344
1409
|
|
|
1345
1410
|
const _changeFocusId = (id, cache_pre = true) => {
|
|
1346
1411
|
preFocusId = cache_pre ? focusId : -1;
|
|
1347
|
-
focusId = id;
|
|
1412
|
+
focusId = id >= 0 && id < metroTemplate.size ? id : 0;
|
|
1348
1413
|
currentFocusIndex.value = id2Index(id);
|
|
1349
1414
|
taskManager.addTask(TaskType.ON_FOCUS_CHANGE);
|
|
1350
1415
|
}
|
|
@@ -1431,22 +1496,12 @@ export const setup = (
|
|
|
1431
1496
|
onItemBlur(preFocusItem);
|
|
1432
1497
|
onItemFocus(next_focus_item, preEdgeRect);
|
|
1433
1498
|
|
|
1434
|
-
|
|
1435
1499
|
if (next_focus_item.itemConfig.itemSlide == METRO_WIDGET_CONST.ITEM_SLIDE.ACT_ITEM_FOCUS) {
|
|
1436
|
-
|
|
1437
|
-
next_focus_item.
|
|
1500
|
+
slideToItemInner(
|
|
1501
|
+
next_focus_item.index,
|
|
1502
|
+
true,
|
|
1438
1503
|
vertical ? vertical_direction : horizontal_direction,
|
|
1439
|
-
preFocusItem
|
|
1440
|
-
);
|
|
1441
|
-
if (visibleInfo.start !== cur_visible_start) {
|
|
1442
|
-
let animObj = {
|
|
1443
|
-
easing: "",
|
|
1444
|
-
onStart: null,
|
|
1445
|
-
speed: innerSlideSetting.Speed,
|
|
1446
|
-
duration: innerSlideSetting.Duration,
|
|
1447
|
-
};
|
|
1448
|
-
_slideTo(cur_visible_start, animObj, { mergeTmp: false });
|
|
1449
|
-
}
|
|
1504
|
+
preFocusItem);
|
|
1450
1505
|
} else {
|
|
1451
1506
|
const updater = pageUpdater.update(
|
|
1452
1507
|
metroTemplate,
|
|
@@ -1505,19 +1560,20 @@ export const setup = (
|
|
|
1505
1560
|
}
|
|
1506
1561
|
};
|
|
1507
1562
|
|
|
1508
|
-
const normalizeVisibleStart = (origin,
|
|
1563
|
+
const normalizeVisibleStart = (origin, targetRect = undefined, index = undefined) => {
|
|
1509
1564
|
let pos_key = vertical ? "top" : "left";
|
|
1510
1565
|
let size_key = vertical ? "height" : "width";
|
|
1511
1566
|
let visibleStart = origin;
|
|
1567
|
+
|
|
1512
1568
|
if ((innerSlideSetting.BoundaryProtect & SlideSetting.START_PROTECT) > 0) {
|
|
1513
1569
|
if (visibleInfo.start >= 0) {
|
|
1514
1570
|
let boundary = 0;
|
|
1515
1571
|
//首个元素是占位符时, 在保证获焦区域完全展示的前提下要保证首个不可获焦元素的完全展示
|
|
1516
1572
|
const headTemplateInfo = getItemByIndex(0).templateInfo;
|
|
1517
1573
|
if (
|
|
1518
|
-
|
|
1519
|
-
&& (!headTemplateInfo.focusable ||
|
|
1520
|
-
&&
|
|
1574
|
+
targetRect
|
|
1575
|
+
&& (!headTemplateInfo.focusable || index == headTemplateInfo.index)
|
|
1576
|
+
&& targetRect[pos_key] + targetRect[size_key] <=
|
|
1521
1577
|
visibleInfo.range
|
|
1522
1578
|
) {
|
|
1523
1579
|
boundary = headTemplateInfo[size_key];
|
|
@@ -1536,9 +1592,9 @@ export const setup = (
|
|
|
1536
1592
|
if (visibleInfo.end <= lastEnd) {
|
|
1537
1593
|
let boundary = lastVisibleStart;
|
|
1538
1594
|
if (
|
|
1539
|
-
|
|
1540
|
-
&& (!lastTemplateInfo.focusable ||
|
|
1541
|
-
&&
|
|
1595
|
+
targetRect
|
|
1596
|
+
&& (!lastTemplateInfo.focusable || index == lastTemplateInfo.index)
|
|
1597
|
+
&& targetRect[pos_key] - lastVisibleStart >= 0
|
|
1542
1598
|
) {
|
|
1543
1599
|
boundary = lastTemplateInfo[pos_key] - visibleInfo.range;
|
|
1544
1600
|
}
|
|
@@ -1551,18 +1607,31 @@ export const setup = (
|
|
|
1551
1607
|
return visibleStart;
|
|
1552
1608
|
}
|
|
1553
1609
|
|
|
1554
|
-
|
|
1555
|
-
const _calculateVisibleStart = (
|
|
1556
|
-
if (!
|
|
1610
|
+
const mRectCache = new RectCache();
|
|
1611
|
+
const _calculateVisibleStart = (targetRect, _direction, templateInfo, visibleInfo, preInfo = null) => {
|
|
1612
|
+
if (!targetRect) {
|
|
1557
1613
|
console.error("MetroWidget: _calculateVisibleStart target item is null");
|
|
1558
1614
|
return 0;
|
|
1559
1615
|
}
|
|
1616
|
+
const curRect = {
|
|
1617
|
+
left: targetRect.left,
|
|
1618
|
+
top: targetRect.top,
|
|
1619
|
+
width: targetRect.width,
|
|
1620
|
+
height: targetRect.height,
|
|
1621
|
+
frameCount: Forge.sFrameCount.count,
|
|
1622
|
+
}
|
|
1623
|
+
mRectCache.cache(curRect);
|
|
1624
|
+
let preRect = mRectCache.getPreRect();
|
|
1560
1625
|
if (preInfo) {
|
|
1561
|
-
|
|
1626
|
+
preRect = preInfo;
|
|
1627
|
+
}
|
|
1628
|
+
let direction = _direction;
|
|
1629
|
+
if (typeof direction != "number") {
|
|
1630
|
+
//通过preRect确定direction
|
|
1631
|
+
let d = getDirectionByRect(curRect, preRect);
|
|
1632
|
+
direction = vertical ? d.vertical : d.horizontal;
|
|
1562
1633
|
}
|
|
1563
1634
|
|
|
1564
|
-
preSlideDirection = direction;
|
|
1565
|
-
preAnchorItemIndex = targetTemplateInfo.index;
|
|
1566
1635
|
let pos_key = vertical ? "top" : "left";
|
|
1567
1636
|
let size_key = vertical ? "height" : "width";
|
|
1568
1637
|
let center_key = vertical ? "centerYPos" : "centerXPos";
|
|
@@ -1577,7 +1646,7 @@ export const setup = (
|
|
|
1577
1646
|
|
|
1578
1647
|
//首页不滚动
|
|
1579
1648
|
if (innerSlideSetting.FixFirstPage) {
|
|
1580
|
-
if (
|
|
1649
|
+
if (targetRect[pos_key] + targetRect[size_key] - 1 < visibleInfo.range) {
|
|
1581
1650
|
new_visible_start = 0;
|
|
1582
1651
|
needCalculate = false;
|
|
1583
1652
|
}
|
|
@@ -1585,19 +1654,19 @@ export const setup = (
|
|
|
1585
1654
|
|
|
1586
1655
|
if (needCalculate) {
|
|
1587
1656
|
new_visible_start = Math.ceil(
|
|
1588
|
-
|
|
1657
|
+
targetRect[pos_key] + targetRect[size_key] / 2 -
|
|
1589
1658
|
visibleInfo.range * innerSlideSetting.FixPercent
|
|
1590
1659
|
);
|
|
1591
1660
|
}
|
|
1592
1661
|
break;
|
|
1593
1662
|
case SlideSetting.Type.WHOLE_PAGE:
|
|
1594
|
-
if (typeof
|
|
1663
|
+
if (!templateInfo || typeof templateInfo.pageHeadIndex == "undefined") {
|
|
1595
1664
|
//TODO 子控制滚动时whole page滚动
|
|
1596
1665
|
console.error(
|
|
1597
1666
|
"child controlled whole page slide type is not supported."
|
|
1598
1667
|
);
|
|
1599
1668
|
} else {
|
|
1600
|
-
new_visible_start = getItemByIndex(
|
|
1669
|
+
new_visible_start = getItemByIndex(templateInfo.pageHeadIndex)
|
|
1601
1670
|
.templateInfo[pos_key];
|
|
1602
1671
|
}
|
|
1603
1672
|
|
|
@@ -1605,7 +1674,7 @@ export const setup = (
|
|
|
1605
1674
|
case SlideSetting.Type.SEAMLESS:
|
|
1606
1675
|
//首页不滚动
|
|
1607
1676
|
if (innerSlideSetting.FixFirstPage) {
|
|
1608
|
-
if (
|
|
1677
|
+
if (targetRect[pos_key] + targetRect[size_key] - 1 < visibleInfo.range) {
|
|
1609
1678
|
new_visible_start = 0;
|
|
1610
1679
|
needCalculate = false;
|
|
1611
1680
|
}
|
|
@@ -1618,68 +1687,72 @@ export const setup = (
|
|
|
1618
1687
|
* end-1.0: 焦点往左时不处理, 往右的时候更新position以保持焦点的end位置一致
|
|
1619
1688
|
* 重合区域: 保持焦点的中心位置一致
|
|
1620
1689
|
*/
|
|
1621
|
-
const
|
|
1622
|
-
const
|
|
1623
|
-
const
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
if (targetStart < rect0End) {
|
|
1649
|
-
pre = targetStart;
|
|
1650
|
-
} else {
|
|
1651
|
-
pre = rect0End;
|
|
1690
|
+
const itemStart = targetRect[pos_key];
|
|
1691
|
+
const itemEnd = targetRect[pos_key] + targetRect[size_key] - 1;
|
|
1692
|
+
const itemMainSize = targetRect[size_key];
|
|
1693
|
+
|
|
1694
|
+
if (preRect) {
|
|
1695
|
+
const rect0Start = visibleInfo.start;
|
|
1696
|
+
const rect0End = visibleInfo.start + visibleInfo.range * innerSlideSetting.StartPercent;
|
|
1697
|
+
const rect0Range = rect0End - rect0Start + 1
|
|
1698
|
+
const rect1Start = visibleInfo.start + visibleInfo.range * innerSlideSetting.EndPercent;
|
|
1699
|
+
const rect1End = visibleInfo.start + visibleInfo.range - 1;
|
|
1700
|
+
const rect1Range = rect1End - rect1Start + 1;
|
|
1701
|
+
|
|
1702
|
+
let target0 = Math.min(preRect[pos_key], rect0End);
|
|
1703
|
+
let target1 = Math.max(preRect[pos_key] + preRect[size_key] - 1, rect1Start);
|
|
1704
|
+
|
|
1705
|
+
let rect0Result = undefined;
|
|
1706
|
+
let rect1Result = undefined;
|
|
1707
|
+
|
|
1708
|
+
//item的head对齐rect0的end
|
|
1709
|
+
if (itemStart < rect0End) {
|
|
1710
|
+
if (target0 < rect0Start) {
|
|
1711
|
+
//preRect位置错误或者item的尺寸大于区域范围(保证item完整显示)
|
|
1712
|
+
// rect0Result = itemStart;
|
|
1713
|
+
} else {
|
|
1714
|
+
if (direction <= 0) {
|
|
1715
|
+
//inRect0, 只处理往左/往上
|
|
1716
|
+
rect0Result = visibleInfo.start + (itemStart - target0)
|
|
1652
1717
|
}
|
|
1653
|
-
rect0Result = visibleInfo.start + (itemStart - pre);
|
|
1654
1718
|
}
|
|
1655
1719
|
}
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
if (
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
let pre;
|
|
1663
|
-
if (targetEnd > rect1Start) {
|
|
1664
|
-
pre = targetEnd;
|
|
1720
|
+
|
|
1721
|
+
//item的头部对齐rect1的start
|
|
1722
|
+
if (itemEnd > rect1Start) {
|
|
1723
|
+
if (target1 > rect1End) {
|
|
1724
|
+
//preRect位置错误或者item的尺寸大于区域范围(保证item完整显示)
|
|
1725
|
+
// rect1Result = itemEnd - visibleInfo.range;
|
|
1665
1726
|
} else {
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1727
|
+
if (direction >= 0) {
|
|
1728
|
+
//inRect1, 只处理往右/往下
|
|
1729
|
+
rect1Result = visibleInfo.start + (itemEnd - target1);
|
|
1730
|
+
}
|
|
1670
1731
|
}
|
|
1671
1732
|
}
|
|
1672
|
-
|
|
1673
|
-
|
|
1733
|
+
|
|
1734
|
+
if (typeof rect0Result !== "undefined" && typeof rect1Result !== "undefined") {
|
|
1735
|
+
//重叠区域
|
|
1736
|
+
new_visible_start = rect0Result;
|
|
1737
|
+
} else if (typeof rect0Result !== "undefined") {
|
|
1738
|
+
new_visible_start = rect0Result;
|
|
1739
|
+
} else if (typeof rect1Result !== "undefined") {
|
|
1740
|
+
new_visible_start = rect1Result;
|
|
1741
|
+
}
|
|
1674
1742
|
}
|
|
1675
1743
|
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1744
|
+
//保证item处于safe area范围
|
|
1745
|
+
const headSafeArea = innerSlideSetting.HeadSafeArea * visibleInfo.range;
|
|
1746
|
+
const tailSafeArea = innerSlideSetting.TailSafeArea * visibleInfo.range;
|
|
1747
|
+
if (itemMainSize > visibleInfo.range - headSafeArea - tailSafeArea) {
|
|
1748
|
+
// 大item
|
|
1749
|
+
new_visible_start = Math.round(itemStart - (visibleInfo.range - itemMainSize) / 2)
|
|
1750
|
+
} else {
|
|
1751
|
+
if (itemStart < new_visible_start + headSafeArea) {
|
|
1752
|
+
new_visible_start = itemStart - headSafeArea;
|
|
1753
|
+
} else if (itemEnd > new_visible_start + visibleInfo.range - 1 - tailSafeArea) {
|
|
1754
|
+
new_visible_start = itemEnd - visibleInfo.range + tailSafeArea;
|
|
1755
|
+
}
|
|
1683
1756
|
}
|
|
1684
1757
|
}
|
|
1685
1758
|
break;
|
|
@@ -1690,8 +1763,7 @@ export const setup = (
|
|
|
1690
1763
|
);
|
|
1691
1764
|
}
|
|
1692
1765
|
|
|
1693
|
-
|
|
1694
|
-
new_visible_start = normalizeVisibleStart(new_visible_start, targetTemplateInfo);
|
|
1766
|
+
new_visible_start = normalizeVisibleStart(new_visible_start, targetRect, templateInfo?.index);
|
|
1695
1767
|
return Math.round(new_visible_start);
|
|
1696
1768
|
};
|
|
1697
1769
|
|
|
@@ -1727,6 +1799,7 @@ export const setup = (
|
|
|
1727
1799
|
console.log(`MetroWidget: ${props.name} get focus while data is empty.`);
|
|
1728
1800
|
return;
|
|
1729
1801
|
}
|
|
1802
|
+
|
|
1730
1803
|
let focus_id =
|
|
1731
1804
|
typeof enterFocusId !== "undefined" &&
|
|
1732
1805
|
enterFocusId >= 0 &&
|
|
@@ -1752,18 +1825,30 @@ export const setup = (
|
|
|
1752
1825
|
onItemBlur(getItemById(preFocusId));
|
|
1753
1826
|
props.onBlur?.();
|
|
1754
1827
|
isFocus = false;
|
|
1828
|
+
mRectCache.clean()
|
|
1755
1829
|
};
|
|
1756
1830
|
|
|
1757
1831
|
const _updatePage = (rangeSet) => {
|
|
1832
|
+
let cur = id2Index(focusId);
|
|
1833
|
+
if (cur >= 0) {
|
|
1834
|
+
rangeSet.add(cur)
|
|
1835
|
+
}
|
|
1758
1836
|
const tmpArray = Array.from(rangeSet);
|
|
1759
|
-
|
|
1837
|
+
let newArray = tmpArray.map((item) => {
|
|
1760
1838
|
return getItemByIndex(item);
|
|
1761
1839
|
});
|
|
1840
|
+
const newItemList = newArray.filter((i) => { return !renderData.value?.includes(i) });
|
|
1841
|
+
renderData.value = newArray;
|
|
1762
1842
|
if (props.enableItemRenderBreak) {
|
|
1763
1843
|
itemRender.value = false;
|
|
1764
|
-
|
|
1844
|
+
const f = () => {
|
|
1845
|
+
// 关闭强制TriggerManualBlock,改为vue内部通过dom的任务数来确定是否执行打断
|
|
1846
|
+
// if (newItemList.length > 12 && props.enableItemRenderBreak) {
|
|
1847
|
+
// window.JsView?.triggerManualBlocker?.();
|
|
1848
|
+
// }
|
|
1765
1849
|
itemRender.value = true;
|
|
1766
|
-
}
|
|
1850
|
+
};
|
|
1851
|
+
nextTick(f);
|
|
1767
1852
|
}
|
|
1768
1853
|
};
|
|
1769
1854
|
|
|
@@ -1831,7 +1916,6 @@ export const setup = (
|
|
|
1831
1916
|
}
|
|
1832
1917
|
|
|
1833
1918
|
const mergeTouchSlideToSlideDiv = (touchCount) => {
|
|
1834
|
-
// console.log("testtest", props.name, `touchToDiv div: ${slideDivTop.value}, visibleStart:${visibleInfo.start} swapCount: ${Forge.sFrameCount.count}`)
|
|
1835
1919
|
if (vertical) {
|
|
1836
1920
|
slideDivTop.value = -visibleInfo.start;
|
|
1837
1921
|
} else {
|
|
@@ -1919,7 +2003,7 @@ export const setup = (
|
|
|
1919
2003
|
anchorPos += anchorSpacing;
|
|
1920
2004
|
}
|
|
1921
2005
|
const reachConditionList = anchorPosList.map(pos => {
|
|
1922
|
-
actorController
|
|
2006
|
+
return actorController
|
|
1923
2007
|
.condition(reachAnchorGroup)
|
|
1924
2008
|
.reachPosition(pos, undefined)
|
|
1925
2009
|
.then([(data) => { updateRenderItems(true, true) }])
|
|
@@ -2061,7 +2145,11 @@ export const setup = (
|
|
|
2061
2145
|
actorController = new ActorControl();
|
|
2062
2146
|
const divView = touchDiv.value.jsvGetProxyView();
|
|
2063
2147
|
actorController.bindForgeView(divView, true);
|
|
2064
|
-
divView.DragEnables?.(
|
|
2148
|
+
divView.DragEnables?.(
|
|
2149
|
+
ForgeConst.DragFlags.TOUCH_RECV_MOVE_BIT |
|
|
2150
|
+
ForgeConst.DragFlags.TOUCH_RECV_FLING_BIT |
|
|
2151
|
+
ForgeConst.DragFlags.TOUCH_RECV_FIRST_START |
|
|
2152
|
+
ForgeConst.DragFlags.TOUCH_RECV_LAST_END);
|
|
2065
2153
|
// debugAnimId = actorController.debugGetAnimId();
|
|
2066
2154
|
// debugViewId = divView.ViewId;
|
|
2067
2155
|
// console.log("testtest", props.name, `animId:${debugAnimId} viewId:${debugViewId}`);
|
|
@@ -2139,7 +2227,7 @@ export const setup = (
|
|
|
2139
2227
|
}
|
|
2140
2228
|
|
|
2141
2229
|
let init_focus_id = 0;
|
|
2142
|
-
let
|
|
2230
|
+
let initVisibleStart = 0;
|
|
2143
2231
|
|
|
2144
2232
|
if (typeof props.initFocusId == "number") {
|
|
2145
2233
|
templateItemAdder.tryAddItemById(props.initFocusId);
|
|
@@ -2147,18 +2235,19 @@ export const setup = (
|
|
|
2147
2235
|
if (item) {
|
|
2148
2236
|
init_focus_id = props.initFocusId;
|
|
2149
2237
|
if (item.itemConfig.itemSlide == METRO_WIDGET_CONST.ITEM_SLIDE.ACT_ITEM_FOCUS) {
|
|
2150
|
-
|
|
2238
|
+
initVisibleStart = _calculateVisibleStart(item.templateInfo, 0, item.templateInfo, visibleInfo);
|
|
2151
2239
|
}
|
|
2152
2240
|
}
|
|
2153
2241
|
}
|
|
2154
2242
|
focusId = init_focus_id;
|
|
2155
|
-
visibleInfo.start = cur_visible_start;
|
|
2156
2243
|
|
|
2157
|
-
|
|
2244
|
+
let initVisibleInfo = visibleInfo.copy();
|
|
2245
|
+
initVisibleInfo.start = initVisibleStart;
|
|
2246
|
+
//保证创建速度, 先描画一屏
|
|
2158
2247
|
const initUpdater = pageUpdater.update(
|
|
2159
2248
|
metroTemplate,
|
|
2160
|
-
|
|
2161
|
-
|
|
2249
|
+
initVisibleInfo.startWithPadding,
|
|
2250
|
+
initVisibleInfo.endWithPadding,
|
|
2162
2251
|
0,
|
|
2163
2252
|
false,
|
|
2164
2253
|
permanentItemList
|
|
@@ -2168,8 +2257,8 @@ export const setup = (
|
|
|
2168
2257
|
const delayLoadHandler = setTimeout(() => {
|
|
2169
2258
|
const updateHandler = pageUpdater.update(
|
|
2170
2259
|
metroTemplate,
|
|
2171
|
-
|
|
2172
|
-
|
|
2260
|
+
initVisibleInfo.startWithPadding - innerKeepTraceRange * pageRange,
|
|
2261
|
+
initVisibleInfo.endWithPadding + innerKeepTraceRange * pageRange,
|
|
2173
2262
|
focusId,
|
|
2174
2263
|
false,
|
|
2175
2264
|
permanentItemList
|
|
@@ -2183,8 +2272,8 @@ export const setup = (
|
|
|
2183
2272
|
onMounted(() => {
|
|
2184
2273
|
_changeFocusId(focusId, false);
|
|
2185
2274
|
mounted = true;
|
|
2186
|
-
if (
|
|
2187
|
-
|
|
2275
|
+
if (initVisibleStart) {
|
|
2276
|
+
slideToInner(initVisibleStart, false);
|
|
2188
2277
|
}
|
|
2189
2278
|
if (isFocus && !alreadyCallItemFocus) {
|
|
2190
2279
|
onItemFocus(getItemById(focusId), preEdgeRect);
|