@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.
- package/package.json +1 -1
- package/utils/JsViewEngineWidget/JsvFocusBlock.vue +1 -1
- package/utils/JsViewEngineWidget/JsvFocusHub.ts +123 -0
- package/utils/JsViewEngineWidget/JsvFocusManager.js +4 -3
- package/utils/JsViewEngineWidget/MetroWidget/AnimationManager.ts +145 -51
- package/utils/JsViewEngineWidget/MetroWidget/ListWidget.vue +51 -64
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +62 -71
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +308 -613
- package/utils/JsViewEngineWidget/TemplateParser/CommonMetroTemplate.ts +127 -247
- package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +1 -0
- package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +36 -2
- package/utils/JsViewEngineWidget/WidgetCommon.ts +25 -6
- package/utils/JsViewPlugin/JsvAudio/{JsvAudioBrowser.vue → BrowserAudio/BrowserAudio.vue} +1 -1
- package/utils/JsViewPlugin/JsvAudio/index.js +1 -1
- package/utils/JsViewPlugin/JsvLatex/BrowserDomBuilder.js +37 -0
- package/utils/JsViewPlugin/JsvLatex/Color.ts +43 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatex.vue +159 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatexBridgeProxy.js +16 -0
- package/utils/JsViewPlugin/JsvLatex/JsvLatexBrowser.vue +59 -0
- package/utils/JsViewPlugin/JsvLatex/PluginLoader.js +171 -0
- package/utils/JsViewPlugin/JsvLatex/index.js +28 -0
- package/utils/JsViewPlugin/JsvLatex/mathjax-tex-svg.txt +1 -0
- package/utils/JsViewPlugin/JsvLatex/version.js +24 -0
- package/utils/JsViewPlugin/JsvLatex/version.mjs +24 -0
- package/utils/JsViewPlugin/index.js +2 -1
- package/utils/JsViewVueTools/JsvDynamicCssStyle.js +2 -52
- package/utils/JsViewVueTools/JsvPerformance.ts +11 -0
- package/utils/JsViewVueTools/JsvPreDownloader.ts +55 -11
- package/utils/JsViewVueTools/JsvStyleSheetsDeclarer.js +40 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CanvasTexture.ts +143 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/CommandList.ts +24 -0
- package/utils/JsViewVueTools/JsvTextureStore/CanvasTexture/Path.ts +198 -0
- package/utils/JsViewVueTools/JsvTextureStore/JsvTextureStore.ts +31 -0
- package/utils/JsViewVueTools/JsvTextureStore/Store.ts +32 -0
- package/utils/JsViewVueTools/JsvTextureStore/Texture.ts +38 -0
- package/utils/JsViewVueTools/index.js +3 -0
- package/utils/JsViewVueWidget/JsvEnableRenderBreak.vue +17 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActionRefObject.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.ts +144 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorState.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/{CallbackManager.js → CallbackManager.ts} +19 -10
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ForgeTypeDefine.ts +45 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/FreeMoveActor.vue +1 -1
- package/utils/JsViewVueWidget/JsvFreeMoveActor/JsvEnvBlocker.vue +124 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/KeepFlags.ts +6 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.ts +553 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.ts +138 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.ts +53 -0
- package/utils/JsViewVueWidget/JsvFreeMoveActor/index.js +11 -1
- package/utils/JsViewVueWidget/JsvHole.js +1 -1
- package/utils/JsViewVueWidget/JsvLine/JsvLine.vue +101 -0
- package/utils/JsViewVueWidget/JsvLine/LineManager.js +62 -0
- package/utils/JsViewVueWidget/JsvLine/index.js +3 -0
- package/utils/JsViewVueWidget/JsvMarquee.vue +316 -139
- package/utils/JsViewVueWidget/JsvMindMap/CommonType.ts +1 -0
- package/utils/JsViewVueWidget/JsvMindMap/Constant.ts +20 -0
- package/utils/JsViewVueWidget/JsvMindMap/DataTree.ts +394 -0
- package/utils/JsViewVueWidget/JsvMindMap/Geometry.ts +277 -0
- package/utils/JsViewVueWidget/JsvMindMap/JsvMindMap.vue +653 -0
- package/utils/JsViewVueWidget/JsvMindMap/index.js +1 -0
- package/utils/JsViewVueWidget/JsvMindMap/rtree.js +628 -0
- package/utils/JsViewVueWidget/JsvNinePatch.vue +2 -2
- package/utils/JsViewVueWidget/JsvPieChart.vue +124 -0
- package/utils/JsViewVueWidget/JsvPosterImage.vue +32 -9
- package/utils/JsViewVueWidget/JsvPreload/BrowserPreload.vue +135 -133
- package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +273 -270
- package/utils/JsViewVueWidget/JsvSector.vue +107 -0
- package/utils/JsViewVueWidget/JsvTextBox.vue +14 -1
- package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +28 -2
- package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +122 -93
- package/utils/JsViewVueWidget/index.js +15 -7
- package/utils/JsViewVueWidget/JsvFreeMoveActor/ActorControl.js +0 -112
- package/utils/JsViewVueWidget/JsvFreeMoveActor/CommonTools.js +0 -18
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetAction.js +0 -216
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetCondition.js +0 -66
- package/utils/JsViewVueWidget/JsvFreeMoveActor/SetState.js +0 -38
- package/utils/JsViewVueWidget/JsvFreeMoveActor/TypeDefine.js +0 -12
- package/utils/JsViewVueWidget/JsvTouchContainer.vue +0 -183
- package/utils/JsViewVueWidget/JsvTransparentDiv.vue +0 -87
- /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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
181
|
-
|
|
286
|
+
}
|
|
287
|
+
const macroEndTaskManager = new MacroEndTaskManager(onMacroTaskEnd, onMacroEndTaskBreak);
|
|
182
288
|
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
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
|
-
|
|
1434
|
-
|
|
1435
|
-
visibleInfo.range
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
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
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
visibleInfo.range * props.slideSetting.
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
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.
|
|
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.
|
|
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
|
+
}
|