@shijiu/jsview-vue 2.0.1021 → 2.0.1073

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 (33) hide show
  1. package/package.json +4 -3
  2. package/utils/JsViewEngineWidget/CheckType.js +82 -0
  3. package/utils/JsViewEngineWidget/MetroWidget/AnimationManager.ts +72 -0
  4. package/utils/JsViewEngineWidget/MetroWidget/Const.ts +24 -0
  5. package/utils/JsViewEngineWidget/MetroWidget/ListWidget.vue +295 -0
  6. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +110 -1651
  7. package/utils/JsViewEngineWidget/MetroWidget/MetroWidgetSetup.js +1867 -0
  8. package/utils/JsViewEngineWidget/MetroWidget/PageUpdater.ts +111 -0
  9. package/utils/JsViewEngineWidget/MetroWidget/RenderItem.ts +153 -0
  10. package/utils/JsViewEngineWidget/MetroWidget/VisibleInfo.ts +43 -0
  11. package/utils/JsViewEngineWidget/MetroWidget/WidgetRectInfo.ts +49 -0
  12. package/utils/JsViewEngineWidget/TemplateParser/CommonMetroTemplate.ts +1424 -0
  13. package/utils/JsViewEngineWidget/TemplateParser/Fence.ts +135 -0
  14. package/utils/JsViewEngineWidget/TemplateParser/ListMetroTemplate.ts +177 -0
  15. package/utils/JsViewEngineWidget/TemplateParser/MetroTemplate.ts +334 -0
  16. package/utils/JsViewEngineWidget/TemplateParser/TemplateItemAdder.ts +147 -0
  17. package/utils/JsViewEngineWidget/TemplateParser/index.ts +4 -0
  18. package/utils/JsViewEngineWidget/{WidgetCommon.js → WidgetCommon.ts} +64 -71
  19. package/utils/JsViewEngineWidget/index.js +2 -1
  20. package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +26 -1
  21. package/utils/JsViewPlugin/JsvAudio/JsvAudio.vue +120 -133
  22. package/utils/JsViewPlugin/JsvAudio/JsvAudioBrowser.vue +11 -7
  23. package/utils/JsViewPlugin/JsvPlayer/GetVersion.js +1 -1
  24. package/utils/JsViewPlugin/JsvPlayer/JsvPlayerBrowser.vue +379 -41
  25. package/utils/JsViewPlugin/JsvPlayer/version.mjs +5 -5
  26. package/utils/JsViewVueTools/JsvHashHistory.js +2 -1
  27. package/utils/JsViewVueWidget/JsvRadarChart.vue +220 -0
  28. package/utils/JsViewVueWidget/JsvSystemAudio.vue +76 -44
  29. package/utils/JsViewVueWidget/index.js +1 -0
  30. package/utils/JsViewEngineWidget/MetroWidget/Const.js +0 -11
  31. package/utils/JsViewEngineWidget/MetroWidget/PageUpdater.js +0 -136
  32. package/utils/JsViewEngineWidget/MetroWidget/ToolFunctions.js +0 -18
  33. package/utils/JsViewEngineWidget/TemplateParser.js +0 -2004
@@ -0,0 +1,147 @@
1
+
2
+ import { MetroTemplate, TemplateItem } from "./MetroTemplate";
3
+ import { HORIZONTAL } from "../WidgetCommon";
4
+ class TemplateItemAdder {
5
+ private _MetroTemplate: MetroTemplate;
6
+ private _Data: Array<object>;
7
+ private _PageRange: number;
8
+ private _MeasureFunc: Function;
9
+ private _CurIndex: number;
10
+ private _CurPage: number;
11
+ private _SideEffect: Function;
12
+ private _Key: string;
13
+ private _ID: number;
14
+
15
+ constructor(
16
+ template_parser: MetroTemplate,
17
+ data: Array<object>,
18
+ measure_func: Function,
19
+ page_range: number,
20
+ side_effect: Function,
21
+ id: number
22
+ ) {
23
+ this._MetroTemplate = template_parser;
24
+ this._Data = data;
25
+ this._PageRange = page_range;
26
+ this._MeasureFunc = measure_func;
27
+ this._CurIndex = 0;
28
+ this._CurPage = 0;
29
+ this._SideEffect = side_effect;
30
+ this._Key =
31
+ this._MetroTemplate.direction === HORIZONTAL
32
+ ? "left"
33
+ : "top";
34
+ this._ID = id;
35
+ }
36
+
37
+ private addDataToTemplate(data: Array<object>, index: number) {
38
+ const itemData = data[index];
39
+ const measureObj = this._MeasureFunc(itemData);
40
+
41
+ let templateItem = this._MetroTemplate.addItem(measureObj);
42
+ this._SideEffect?.(itemData, templateItem, measureObj);
43
+ return templateItem;
44
+ }
45
+
46
+ public tryAddItem(cur_item: TemplateItem | null = null, page_num: number = 1) {
47
+ let added = false;
48
+ if (
49
+ this._CurIndex < this._Data.length &&
50
+ (!cur_item ||
51
+ cur_item[this._Key] >= (this._CurPage - 1) * this._PageRange)
52
+ ) {
53
+ while (this._CurIndex < this._Data.length) {
54
+ try {
55
+ let item = this.addDataToTemplate(this._Data, this._CurIndex);
56
+ this._CurIndex++;
57
+ if (item[this._Key] >= (this._CurPage + page_num) * this._PageRange) {
58
+ this._CurPage += page_num;
59
+ break;
60
+ }
61
+ } catch (e) {
62
+ console.error(
63
+ `MetroWidget: ${this._ID} parse template item ${this._CurIndex} failed. data: `,
64
+ this._Data
65
+ );
66
+ throw e;
67
+ }
68
+ }
69
+ this._MetroTemplate.calculateNeighborWhenAddStop();
70
+ added = true;
71
+ }
72
+ // 添加完成需要计算neighbor
73
+ return added;
74
+ }
75
+
76
+ tryAddItemByPosition(position: number) {
77
+ const page_num = Math.ceil(position / this._PageRange + 1);
78
+ if (page_num > this._CurPage) {
79
+ this.tryAddItem(null, page_num - this._CurPage);
80
+ }
81
+ }
82
+
83
+ tryAddItemByIndex(index: number) {
84
+ let _index = Math.min(index, this._Data.length - 1);
85
+ let added = false;
86
+ while (this._CurIndex <= _index) {
87
+ added = true;
88
+ try {
89
+ let item = this.addDataToTemplate(this._Data, this._CurIndex);
90
+ this._CurIndex++;
91
+ if (item[this._Key] >= (this._CurPage + 1) * this._PageRange) {
92
+ this._CurPage++;
93
+ }
94
+ } catch (e) {
95
+ console.error(
96
+ `MetroWidget: ${this._ID} parse template item ${this._CurIndex} failed. data:`,
97
+ this._Data
98
+ );
99
+ throw e;
100
+ }
101
+ }
102
+ if (added) {
103
+ this._MetroTemplate.calculateNeighborWhenAddStop();
104
+ }
105
+ //再添加一屏
106
+ this.tryAddItem(this._MetroTemplate.getItemByIndex(index), 2);
107
+ }
108
+
109
+ tryAddItemById(id: number) {
110
+ let _id = Math.min(id, this._Data.length - 1); // id小于等于index, 因此为了避免过界取小值
111
+ const last_id = this._MetroTemplate.focusableSize - 1;
112
+ if (last_id < _id) {
113
+ let added = false;
114
+ let cur_id = last_id;
115
+ while (cur_id < _id && this._CurIndex < this._Data.length) {
116
+ added = true;
117
+ try {
118
+ let item = this.addDataToTemplate(this._Data, this._CurIndex);
119
+ cur_id = item.id;
120
+ if (item[this._Key] >= (this._CurPage + 1) * this._PageRange) {
121
+ this._CurPage++;
122
+ }
123
+ this._CurIndex++;
124
+ } catch (e) {
125
+ console.error(
126
+ `MetroWidget: ${this._ID} parse template item ${this._CurIndex} failed. data:`,
127
+ this._Data
128
+ );
129
+ throw e;
130
+ }
131
+ }
132
+ if (added) {
133
+ this._MetroTemplate.calculateNeighborWhenAddStop();
134
+ }
135
+ }
136
+ //再添加一屏
137
+ this.tryAddItem(this._MetroTemplate.getItemById(id), 2);
138
+ }
139
+
140
+ updateData(data: Array<object>) {
141
+ this._Data = data;
142
+ }
143
+ }
144
+
145
+ export {
146
+ TemplateItemAdder,
147
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./CommonMetroTemplate"
2
+ export * from "./TemplateItemAdder"
3
+ export * from "./ListMetroTemplate"
4
+ export * from "./MetroTemplate"
@@ -5,61 +5,37 @@
5
5
  * @LastEditTime: 2022-12-01 16:49:21
6
6
  * @Description: file content
7
7
  */
8
- class BaseDispatcher {
8
+ export class BaseDispatcher {
9
+ private _Component: any;
10
+
9
11
  constructor() {
12
+ console.error("BaseDispatcher is deprecated and will be removed soon. Use MetroWidget exposed methods instead.");
10
13
  this._Component = null;
11
14
  this.registerComponent = this.registerComponent.bind(this);
12
15
  this.unregisterComponent = this.unregisterComponent.bind(this);
13
16
  this.dispatch = this.dispatch.bind(this);
14
17
  }
15
18
 
16
- registerComponent(component) {
19
+ registerComponent(component: any) {
20
+ console.error("BaseDispatcher is deprecated and will be removed soon. Use MetroWidget exposed methods instead.");
17
21
  this._Component = component;
18
22
  }
19
23
 
20
24
  unregisterComponent() {
25
+ console.error("BaseDispatcher is deprecated and will be removed soon. Use MetroWidget exposed methods instead.");
21
26
  this._Component = null;
22
27
  }
23
28
 
24
- dispatch(event) {
29
+ dispatch(event: any) {
25
30
  if (event && this._Component) {
31
+ console.error("BaseDispatcher is deprecated and will be removed soon. Use MetroWidget exposed methods instead.");
26
32
  this._Component._dispatchEvent(event);
27
33
  }
28
34
  }
29
35
  }
30
36
 
31
- const EdgeDirection = {
32
- left: Symbol("left"),
33
- right: Symbol("right"),
34
- top: Symbol("top"),
35
- bottom: Symbol("bottom"),
36
-
37
- opposite: (dir) => {
38
- switch (dir) {
39
- case EdgeDirection.left:
40
- return EdgeDirection.right;
41
- case EdgeDirection.right:
42
- return EdgeDirection.left;
43
- case EdgeDirection.top:
44
- return EdgeDirection.bottom;
45
- case EdgeDirection.bottom:
46
- return EdgeDirection.top;
47
- }
48
- },
49
- };
50
-
51
- const SlideStyle = {
52
- seamLess: Symbol("seamless"),
53
- wholePage: Symbol("wholePage"),
54
- seamlessFixedId: Symbol("seamlessFixedId"),
55
- startBoundaryProtect: 1,
56
- endBoundaryProtect: 2,
57
- };
58
-
59
- const VERTICAL = Symbol("vertical");
60
- const HORIZONTAL = Symbol("horizontal");
61
-
62
- const getMeasureObj = (width, height, focusable, hasSub) => {
37
+ export const getMeasureObj = (width: number, height: number, focusable: number, hasSub: number) => {
38
+ console.error("getMeasureObj is deprecated and will be removed soon.");
63
39
  return {
64
40
  width: width,
65
41
  height: height,
@@ -68,9 +44,8 @@ const getMeasureObj = (width, height, focusable, hasSub) => {
68
44
  };
69
45
  };
70
46
 
71
- const FDIV_ROUTER_NAME = "fdivRouter";
72
-
73
- function getPositionRelativeToView(divElement, targetElement) {
47
+ export function getPositionRelativeToView(divElement: any, targetElement: any) {
48
+ console.error("getPositionRelativeToView is deprecated and will be removed soon.");
74
49
  if (!divElement) {
75
50
  return null;
76
51
  }
@@ -89,19 +64,54 @@ function getPositionRelativeToView(divElement, targetElement) {
89
64
  return position;
90
65
  }
91
66
 
67
+ export const EdgeDirection = {
68
+ left: Symbol("left"),
69
+ right: Symbol("right"),
70
+ top: Symbol("top"),
71
+ bottom: Symbol("bottom"),
72
+
73
+ opposite: (dir: Symbol) => {
74
+ switch (dir) {
75
+ case EdgeDirection.left:
76
+ return EdgeDirection.right;
77
+ case EdgeDirection.right:
78
+ return EdgeDirection.left;
79
+ case EdgeDirection.top:
80
+ return EdgeDirection.bottom;
81
+ case EdgeDirection.bottom:
82
+ return EdgeDirection.top;
83
+ }
84
+ },
85
+ };
86
+
87
+ export const SlideStyle = {
88
+ seamLess: Symbol("seamless"),
89
+ wholePage: Symbol("wholePage"),
90
+ seamlessFixedId: Symbol("seamlessFixedId"),
91
+ startBoundaryProtect: 1,
92
+ endBoundaryProtect: 2,
93
+ };
94
+
95
+ export const VERTICAL = Symbol("vertical");
96
+ export const HORIZONTAL = Symbol("horizontal");
97
+
92
98
  const defaultSpeed = 1.5;
93
99
  const defaultEasing = "";
94
-
95
- class SlideSetting {
96
- static Type = {
100
+ export class SlideSetting {
101
+ public static Type = {
97
102
  WHOLE_PAGE: 0,
98
103
  SEAMLESS: 1,
99
104
  FIX_POSITION: 2,
100
105
  };
101
- static START_PROTECT = 1;
102
- static END_PROTECT = 2;
106
+ public static START_PROTECT = 1;
107
+ public static END_PROTECT = 2;
108
+
109
+ public readonly Type: number;
110
+ public readonly Speed: number;
111
+ public readonly Easing: string;
112
+ public readonly BoundaryProtect: number;
103
113
 
104
- constructor(type, speed, easing, boundaryProtect) {
114
+ protected constructor(type: number, speed: number, easing: string, boundaryProtect: number) {
105
115
  this.Type = type;
106
116
  this.Speed = speed;
107
117
  this.Easing = easing;
@@ -121,7 +131,7 @@ class SlideSetting {
121
131
  * boundaryProtect: 确定滚动位置能否小于0或者大于最大长度
122
132
  * }
123
133
  **/
124
- class WholePageSlide extends SlideSetting {
134
+ export class WholePageSlide extends SlideSetting {
125
135
  constructor({
126
136
  speed = defaultSpeed,
127
137
  easing = defaultEasing,
@@ -145,7 +155,10 @@ class WholePageSlide extends SlideSetting {
145
155
  * boundaryProtect: 确定滚动位置能否小于0或者大于最大长度
146
156
  * }
147
157
  **/
148
- class SeamlessSlide extends SlideSetting {
158
+ export class SeamlessSlide extends SlideSetting {
159
+ public readonly StartPercent: number;
160
+ public readonly EndPercent: number;
161
+
149
162
  constructor({
150
163
  startPercent = 0.2,
151
164
  endPercent = 0.8,
@@ -172,7 +185,9 @@ class SeamlessSlide extends SlideSetting {
172
185
  * boundaryProtect: 确定滚动位置能否小于0或者大于最大长度
173
186
  * }
174
187
  **/
175
- class FixPositionSlide extends SlideSetting {
188
+ export class FixPositionSlide extends SlideSetting {
189
+ public readonly FixPercent: number;
190
+
176
191
  constructor({
177
192
  fixPercent = .5,
178
193
  speed = defaultSpeed,
@@ -184,32 +199,10 @@ class FixPositionSlide extends SlideSetting {
184
199
  }
185
200
  }
186
201
 
187
- const FocusMoveType = {
202
+ export const FocusMoveType = {
188
203
  NO_ADJUST: 0x00000000,
189
204
  COLUMN_LOOP: 0x00000001,
190
205
  ROW_LOOP: 0x00000001 << 1,
191
206
  COLUMN_FIND_NEAR: 0x00000001 << 2,
192
207
  ROW_FIND_NEAR: 0x00000001 << 3,
193
- };
194
-
195
- // randomColor() {
196
- // let randomColor = Math.round(Math.random() * 2 ** 24).toString(16);
197
- // return (
198
- // "#" + new Array(6 - randomColor.length).fill("0").join("") + randomColor
199
- // );
200
- // },
201
- export {
202
- BaseDispatcher,
203
- EdgeDirection,
204
- SlideStyle,
205
- VERTICAL,
206
- HORIZONTAL,
207
- getMeasureObj,
208
- FDIV_ROUTER_NAME,
209
- getPositionRelativeToView,
210
- SlideSetting,
211
- WholePageSlide,
212
- SeamlessSlide,
213
- FixPositionSlide,
214
- FocusMoveType,
215
- };
208
+ };
@@ -10,7 +10,8 @@ export * from "./MetroWidget/Dispatcher";
10
10
 
11
11
  export { default as SimpleWidget } from "./MetroWidget/MetroWidget.vue";
12
12
  export { default as MetroWidget } from "./MetroWidget/MetroWidget.vue";
13
- export { METRO_WIDGET } from "./MetroWidget/Const.js";
13
+ export { default as ListWidget } from "./MetroWidget/ListWidget.vue";
14
+ export { METRO_WIDGET, METRO_WIDGET_CONST } from "./MetroWidget/Const.ts";
14
15
 
15
16
  export { default as JsvFocusBlock } from "./JsvFocusBlock.vue";
16
17
  export { jsvCreateFocusManager, useFocusHub } from "./JsvFocusManager";
@@ -10,6 +10,11 @@ import Events from "./Events.js"
10
10
 
11
11
  const TAG = "JsvAudio";
12
12
 
13
+ let keyToken = 0;
14
+ const getKeyToken = () => {
15
+ return ++keyToken;
16
+ }
17
+
13
18
  class AudioManager {
14
19
  constructor() {
15
20
  this.audioMap = {};
@@ -63,6 +68,8 @@ class AudioProxy {
63
68
  this._created = false;
64
69
  this._eventListener = {};
65
70
  this._propCache = {};
71
+ this._onVisibilityChange = this.onVisibilityChange.bind(this);
72
+ window.JsView?.onVisibilityChange(this._onVisibilityChange);
66
73
  }
67
74
 
68
75
  /** 初始化函数, 外部不应该调用 */
@@ -298,8 +305,26 @@ class AudioProxy {
298
305
  window.JMD.unsubscribe(this._playerId, this._onEvent);
299
306
  JsvAudioBridgeProxy.ReleasePlayer(this._playerId);
300
307
  this._audioManager.releaseAudio(this._playerId);
308
+ window.JsView?.removeEventCallback(this._onVisibilityChange);
309
+ }
310
+ }
311
+
312
+ onVisibilityChange(state) {
313
+ console.log(TAG, "audio visibility change", JSON.stringify(state));
314
+ if (state.status == "show") {
315
+ if (typeof this._propCache["customerPause"] != "undefined") {
316
+ const customerPause = this._propCache["customerPause"];
317
+ delete this._propCache["customerPause"];
318
+ if (!customerPause) {
319
+ this.play();
320
+ }
321
+ }
322
+ } else {
323
+ // pause when invisible
324
+ this._propCache["customerPause"] = this._propCache["paused"];
325
+ this.pause();
301
326
  }
302
327
  }
303
328
  }
304
329
 
305
- export { sAudioManager };
330
+ export { sAudioManager, getKeyToken };