@shijiu/jsview-vue 0.9.766 → 0.9.804

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 (88) hide show
  1. package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
  2. package/dom/bin/jsview-dom.min.js +1 -1
  3. package/dom/bin/jsview-engine-js-browser.min.js +1 -1
  4. package/dom/target_core_revision.js +4 -4
  5. package/package.json +1 -1
  6. package/samples/Basic/components/anim/AnimTransition.vue +4 -4
  7. package/samples/DemoHomepage/App.vue +30 -6
  8. package/samples/DemoHomepage/components/TabFrame.vue +7 -0
  9. package/samples/DemoHomepage/router.js +21 -18
  10. package/samples/DemoHomepage/views/Homepage.vue +5 -1
  11. package/samples/FilterDemo/VideoLayer.vue +2 -2
  12. package/samples/FocusBlockDemos/AutoFocus/App.vue +56 -0
  13. package/samples/FocusBlockDemos/AutoFocus/BaseBlock.vue +82 -0
  14. package/samples/FocusBlockDemos/AutoFocus/DialogBlock.vue +89 -0
  15. package/samples/FocusBlockDemos/AutoFocus/DialogContorls.js +47 -0
  16. package/samples/FocusBlockDemos/AutoFocus/FocusNamesDefine.js +9 -0
  17. package/samples/FocusBlockDemos/AutoFocus/PlaneBlock.vue +71 -0
  18. package/samples/FocusBlockDemos/ProgressiveFocusControl/App.vue +84 -0
  19. package/samples/FocusBlockDemos/ProgressiveFocusControl/BaseBlock.vue +77 -0
  20. package/samples/FocusBlockDemos/ProgressiveFocusControl/DownPlaneBlock.vue +83 -0
  21. package/samples/FocusBlockDemos/ProgressiveFocusControl/FocusNamesDefine.js +12 -0
  22. package/samples/FocusBlockDemos/ProgressiveFocusControl/UpPlaneBlock.vue +83 -0
  23. package/samples/GiftRain/App.vue +248 -0
  24. package/samples/GiftRain/audio/boom.mp3 +0 -0
  25. package/samples/GiftRain/audio/get.mp3 +0 -0
  26. package/samples/GiftRain/common/Sound.js +48 -0
  27. package/samples/GiftRain/components/RedPacket.vue +161 -0
  28. package/samples/GiftRain/components/Score.vue +55 -0
  29. package/samples/GiftRain/components/SpriteTranslate.vue +72 -0
  30. package/samples/GridDemo/Item.vue +1 -0
  31. package/samples/ImpactStop/App.vue +2 -2
  32. package/samples/Marquee/App.vue +34 -3
  33. package/samples/MetroWidgetDemos/PingPong/App.vue +22 -11
  34. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +3 -3
  35. package/samples/MetroWidgetDemos/{Item.vue → PingPong/Item.vue} +1 -3
  36. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +3 -3
  37. package/samples/MetroWidgetDemos/{WidgetItem.vue → PingPong/WidgetItem.vue} +6 -1
  38. package/samples/MetroWidgetDemos/basic/App.vue +162 -0
  39. package/samples/MetroWidgetDemos/basic/Item.vue +43 -0
  40. package/samples/MetroWidgetDemos/direction/App.vue +158 -0
  41. package/samples/MetroWidgetDemos/direction/Item.vue +45 -0
  42. package/samples/MetroWidgetDemos/focusableItemBasic/App.vue +67 -0
  43. package/samples/MetroWidgetDemos/{Advanced → focusableItemBasic}/ButtonItem.vue +16 -20
  44. package/samples/MetroWidgetDemos/focusableItemMetroWidget/App.vue +74 -0
  45. package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/Item.vue +12 -30
  46. package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/WidgetItem.vue +10 -9
  47. package/samples/MetroWidgetDemos/focusableItemMix/App.vue +88 -0
  48. package/samples/MetroWidgetDemos/focusableItemMix/ButtonItem.vue +86 -0
  49. package/samples/MetroWidgetDemos/focusableItemMix/Item.vue +43 -0
  50. package/samples/MetroWidgetDemos/index.js +6 -0
  51. package/samples/MetroWidgetDemos/layoutType/App.vue +180 -0
  52. package/samples/MetroWidgetDemos/layoutType/Item.vue +45 -0
  53. package/samples/MetroWidgetDemos/padding/App.vue +222 -0
  54. package/samples/MetroWidgetDemos/padding/Item.vue +64 -0
  55. package/samples/MetroWidgetDemos/routeList.js +64 -0
  56. package/samples/MetroWidgetDemos/slideSetting/App.vue +225 -0
  57. package/samples/MetroWidgetDemos/slideSetting/Item.vue +45 -0
  58. package/samples/NinePatchDemo/App.vue +78 -122
  59. package/samples/NinePatchDemo/Item.vue +28 -26
  60. package/samples/Swiper/App.vue +148 -0
  61. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +15 -12
  62. package/utils/JsViewEngineWidget/TemplateParser.js +6 -1
  63. package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +17 -1
  64. package/utils/JsViewPlugin/JsvAudio/JsvAudio.vue +15 -38
  65. package/utils/JsViewPlugin/JsvAudio/version.js +10 -10
  66. package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
  67. package/utils/JsViewVueTools/JsvTextTools.js +26 -3
  68. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +1 -1
  69. package/utils/JsViewVueWidget/JsvFilterView.vue +1 -1
  70. package/utils/JsViewVueWidget/JsvMarquee.vue +81 -20
  71. package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -1
  72. package/utils/JsViewVueWidget/JsvPosterDiv.vue +1 -1
  73. package/utils/JsViewVueWidget/JsvPosterImage.vue +1 -1
  74. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +43 -9
  75. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +115 -79
  76. package/utils/JsViewVueWidget/JsvSwiper/index.js +3 -2
  77. package/utils/JsViewVueWidget/JsvTextBox.vue +1 -1
  78. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +1 -1
  79. package/samples/MetroWidgetDemos/Advanced/App.vue +0 -46
  80. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +0 -70
  81. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +0 -77
  82. package/samples/MetroWidgetDemos/Advanced/widgets/Widgets.vue +0 -116
  83. package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
  84. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +0 -75
  85. package/samples/MetroWidgetDemos/Simple/App.vue +0 -45
  86. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +0 -111
  87. package/samples/MetroWidgetDemos/data.js +0 -205
  88. package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +0 -35
@@ -3,11 +3,11 @@
3
3
  */
4
4
 
5
5
  const TargetRevision = {
6
- "CoreRevision": 1021277,
7
- "CoreRevisionAndBranch": "1021277",
8
- "JseRevision": "1.0.830",
6
+ "CoreRevision": 1021336,
7
+ "CoreRevisionAndBranch": "1021336",
8
+ "JseRevision": "1.0.882",
9
9
  "JseUrl":
10
- "http://cdn.release.qcast.cn/forge_js/master/JsViewES6_react_r830.jsv.9e271859.js"
10
+ "http://cdn.release.qcast.cn/forge_js/master/JsViewES6_react_r882.jsv.d4cae49e.js"
11
11
  };
12
12
 
13
13
  // 不要用export default,update-env脚本不能解析
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "./dom/*.js",
8
8
  "./loader/*.js"
9
9
  ],
10
- "version": "0.9.766",
10
+ "version": "0.9.804",
11
11
  "bin": {
12
12
  "jsview-post-build": "./scripts/jsview-post-build.js",
13
13
  "jsview-post-install": "./scripts/jsview-post-install.js",
@@ -105,7 +105,7 @@ onBeforeUnmount(() => {
105
105
  transformOrigin: state.transformOrigin,
106
106
  }"
107
107
  >
108
- 移动缩放旋转
108
+ {{"移动缩放旋转"}}
109
109
  </div>
110
110
  <div
111
111
  class="content-font"
@@ -117,7 +117,7 @@ onBeforeUnmount(() => {
117
117
  transform: state.transformTranslate,
118
118
  }"
119
119
  >
120
- 移动
120
+ {{"移动"}}
121
121
  </div>
122
122
  <div
123
123
  class="content-font"
@@ -130,7 +130,7 @@ onBeforeUnmount(() => {
130
130
  transform: state.transformScale,
131
131
  }"
132
132
  >
133
- 缩放
133
+ {{"缩放"}}
134
134
  </div>
135
135
  <div
136
136
  class="content-font"
@@ -143,7 +143,7 @@ onBeforeUnmount(() => {
143
143
  transform: state.transformRotate,
144
144
  }"
145
145
  >
146
- 旋转
146
+ {{"旋转"}}
147
147
  </div>
148
148
  </div>
149
149
  </div>
@@ -8,16 +8,31 @@
8
8
  <script setup>
9
9
  import { shallowRef, onMounted, defineExpose } from "vue";
10
10
  import { JsvPreload, buildPreloadInfo, jJsvRuntimeBridge } from "jsview";
11
+ import { useRouter, useRoute } from "vue-router";
11
12
 
12
13
  let backgroundImageUrl = shallowRef(null);
13
14
 
14
15
  let preloadInfo = shallowRef([]);
15
16
 
17
+ let globalRoute = useRoute();
18
+ let globalRouter = useRouter();
19
+
16
20
  let _onPreloadDone = () => {
17
21
  console.log("background load done");
18
22
  jJsvRuntimeBridge.notifyPageLoaded();
19
23
  };
20
24
 
25
+ const onKeyDown = (ev)=>{
26
+ if (ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
27
+ if (globalRoute.fullPath != "/") {
28
+ // 回调一级路由
29
+ globalRouter.go(-1);
30
+ }
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+
21
36
  onMounted(() => {
22
37
  console.log("simulate async get background url");
23
38
  setTimeout(() => {
@@ -26,6 +41,9 @@ onMounted(() => {
26
41
  "https://qcast-image.oss-cn-qingdao.aliyuncs.com/JsViewVideo/ImageTestSample/BackgroundLongmao.jpg";
27
42
  preloadInfo.value = [buildPreloadInfo(backgroundImageUrl.value)];
28
43
  }, 0);
44
+
45
+ // window.myJsvRouter = useRouter();
46
+ // window.myJsvRoute = useRoute();
29
47
  });
30
48
  </script>
31
49
 
@@ -50,12 +68,18 @@ export default {
50
68
  backgroundImage: backgroundImageUrl,
51
69
  }"
52
70
  />
53
- <router-view v-slot="{ Component, route }">
54
- <keep-alive>
55
- <component v-if="route.meta.keepAlive" :is="Component" />
56
- </keep-alive>
57
- <component v-if="!route.meta.keepAlive" :is="Component" />
58
- </router-view>
71
+ <jsv-focus-block
72
+ :onAction="{
73
+ onKeyDown,
74
+ }"
75
+ >
76
+ <router-view v-slot="{ Component, route }">
77
+ <keep-alive>
78
+ <component v-if="route.meta.keepAlive" :is="Component" />
79
+ </keep-alive>
80
+ <component v-if="!route.meta.keepAlive" :is="Component" />
81
+ </router-view>
82
+ </jsv-focus-block>
59
83
  </div>
60
84
  </template>
61
85
 
@@ -39,6 +39,13 @@ export default {
39
39
  focusable: true,
40
40
  id: 1,
41
41
  },
42
+ {
43
+ width: 200,
44
+ height: 50,
45
+ name: "FocusBlock",
46
+ focusable: true,
47
+ id: 2,
48
+ },
42
49
  ];
43
50
  const direction = VERTICAL;
44
51
  return {
@@ -1,7 +1,7 @@
1
1
  import { createRouter } from "vue-router";
2
2
  import { createJsvHashHistory } from "jsview";
3
-
4
- const routeList = [
3
+ import { metroWidgetRouteList } from "../MetroWidgetDemos"
4
+ let routeList = [
5
5
  // 功能实例
6
6
  {
7
7
  name: "Home",
@@ -162,32 +162,35 @@ const routeList = [
162
162
  path: "/feature/ImpactStop",
163
163
  component: () => import("jsview/samples/ImpactStop/App"),
164
164
  },
165
-
166
- // MetroWidget示例
167
- {
168
- name: "简单示例",
169
- path: "/metroWidget/Simple",
170
- component: () => import("jsview/samples/MetroWidgetDemos/Simple/App"),
171
- },
172
165
  {
173
- name: "嵌套示例",
174
- path: "/metroWidget/Advanced",
175
- component: () => import("jsview/samples/MetroWidgetDemos/Advanced/App"),
166
+ name: "轮播",
167
+ path: "/feature/JsvSwiper",
168
+ component: () => import("jsview/samples/Swiper/App"),
176
169
  },
170
+
171
+ // Focus示例
177
172
  {
178
- name: "性能测试",
179
- path: "/metroWidget/PerformanceTest",
173
+ name: "渐进式焦点处理",
174
+ path: "/focusBlock/ProgressiveFocusControl",
180
175
  component: () =>
181
- import("jsview/samples/MetroWidgetDemos/PerformanceTest/App"),
176
+ import("jsview/samples/FocusBlockDemos/ProgressiveFocusControl/App"),
182
177
  },
183
178
  {
184
- name: "乒乓模式",
185
- path: "/metroWidget/PingPong",
179
+ name: "autoFocus对话框",
180
+ path: "/focusBlock/AutoFocusDialog",
186
181
  component: () =>
187
- import("jsview/samples/MetroWidgetDemos/PingPong/App"),
182
+ import("jsview/samples/FocusBlockDemos/AutoFocus/App"),
188
183
  },
184
+ {
185
+ name:"红包雨",
186
+ path:"/feature/GiftRain",
187
+ component:()=>import("jsview/samples/GiftRain/App"),
188
+ }
189
189
  ];
190
190
 
191
+ //添加MetroWidget demo
192
+ routeList = routeList.concat(metroWidgetRouteList);
193
+
191
194
  const router = createRouter({
192
195
  // 浏览器调试和盒子上都可以使用类WebHashHistory的createJsvHashHistory(推荐)
193
196
  // 或 createMemoryHistory;
@@ -10,6 +10,7 @@ const colorTemplete = ["#89BEB2", "#C9BA83", "#DED38C", "#DE9C53"];
10
10
 
11
11
  const featureData = [];
12
12
  const metroWidgetData = [];
13
+ const focusBlockData = [];
13
14
  for (let item of routeList) {
14
15
  let obj = {
15
16
  name: item.name,
@@ -24,9 +25,12 @@ for (let item of routeList) {
24
25
  } else if (item.path.indexOf("metroWidget") >= 0) {
25
26
  obj.backgroundColor = colorTemplete[metroWidgetData.length % 4];
26
27
  metroWidgetData.push(obj);
28
+ } else if (item.path.indexOf("focusBlock") >= 0) {
29
+ obj.backgroundColor = colorTemplete[focusBlockData.length % 4];
30
+ focusBlockData.push(obj);
27
31
  }
28
32
  }
29
- const dataList = [featureData, metroWidgetData];
33
+ const dataList = [featureData, metroWidgetData, focusBlockData];
30
34
 
31
35
  let showExitDialog = shallowRef(false);
32
36
  let contentData = shallowRef(dataList[0]);
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { JsvVideo } from "jsview";
2
+ import JsvPlayer from "jsview/utils/JsViewPlugin/JsvPlayer";
3
3
 
4
4
  const props = defineProps({
5
5
  top: {
@@ -47,7 +47,7 @@ const video_url =
47
47
  animation: 'opacityVideoDemo_CompositeOpacity 3s infinite',
48
48
  }"
49
49
  >
50
- <jsv-video
50
+ <JsvPlayer
51
51
  :src="video_url"
52
52
  autoplay="autoplay"
53
53
  loop="loop"
@@ -0,0 +1,56 @@
1
+ <!--
2
+ * 【界面概述】
3
+ * JsvFocusBlock的autoFocus效果展示
4
+ * 主要用于Dialog弹出的场景,当Dialog内部的JsvFocusBlock设置autoFocus后,
5
+ * Dialog只要展示就会抢走焦点,同时,此样例也展示了,当Dialog退出后,只要App讲焦点
6
+ * 还给Dialog弹出前的焦点分支的根部,按照渐进式焦点处理写法,各级的onFocus触发后
7
+ * 后会再次将焦点传递给目标的子节点
8
+ *
9
+ -->
10
+
11
+ <template>
12
+ <plane-block :style="{left: 50, top: 50}"/>
13
+ <dialog-block v-if="showDialog"/>
14
+ </template>
15
+
16
+
17
+ <script setup>
18
+ import { shallowRef, watch, onMounted, onUnmounted } from "vue"
19
+ import { useFocusHub, jJsvRuntimeBridge } from "jsview"
20
+ import PlaneBlock from "./PlaneBlock.vue"
21
+ import DialogBlock from "./DialogBlock.vue"
22
+ import { CreateDialogControl, ReleaseDialogControl } from "./DialogContorls.js"
23
+ import FocusNames from "./FocusNamesDefine.js"
24
+
25
+ // 获取 FocusHub 操作句柄
26
+ let focusHub = useFocusHub();
27
+
28
+ // 创建 Dialog 控制节点,并讲showDialog这个reactive变量和控制节点关联上
29
+ let showDialog = shallowRef(false);
30
+ CreateDialogControl(showDialog);
31
+
32
+ watch(showDialog, ()=>{
33
+ if (showDialog.value == false) {
34
+ // Dialog消失后,将焦点设置给主区域,而主区域具体的focus对象则
35
+ // 按照渐进式焦点写法,触发了MainPlane的onFocus后,自动在一点点讲焦点给回原本的焦点子节点
36
+ focusHub.setFocus(FocusNames.MainPlane);
37
+ }
38
+ })
39
+
40
+ onUnmounted(()=>{
41
+ // 退出时释放control全局引用
42
+ ReleaseDialogControl();
43
+ })
44
+
45
+ onMounted(()=>{
46
+ // 启动后先让主区域获得焦点
47
+ focusHub.setFocus(FocusNames.MainPlane);
48
+
49
+ // 通知小程序之家关闭启动图
50
+ jJsvRuntimeBridge.notifyPageLoaded();
51
+ })
52
+
53
+ </script>
54
+
55
+ <style scoped>
56
+ </style>
@@ -0,0 +1,82 @@
1
+ <script setup>
2
+ import { shallowRef } from "vue";
3
+ import { DefaultKeyCodeMap } from "jsview"
4
+ import { ShowDialog } from "./DialogContorls.js"
5
+
6
+ const props = defineProps({
7
+ name: String,
8
+ style: {
9
+ type: Object,
10
+ default: {},
11
+ },
12
+ onLeftRight: Function,
13
+ });
14
+
15
+ const hasFocused = shallowRef(false);
16
+
17
+ const onFocusFunc = () => {
18
+ console.log(`子节点 ${props.name} 获得焦点`);
19
+ hasFocused.value = true;
20
+ };
21
+
22
+ const onBlurFunc = () => {
23
+ console.log(`子节点 ${props.name} 失去焦点`);
24
+ hasFocused.value = false;
25
+ };
26
+
27
+ const onDispatchKeyDownFunc = (ev)=>{
28
+ console.log(`子节点 ${props.name} 收到下发按键 code=${ev.keyCode}`);
29
+ return false;
30
+ }
31
+
32
+ const onKeyDownFunc = (ev)=>{
33
+ console.log(`子节点 ${props.name} 收到回流按键 code=${ev.keyCode}`);
34
+
35
+ // 将按键转化为left/right指令
36
+ let keyConsumed = true;
37
+ switch(ev.keyCode) {
38
+ case DefaultKeyCodeMap.Left:
39
+ props.onLeftRight?.("left");
40
+ break;
41
+ case DefaultKeyCodeMap.Right:
42
+ props.onLeftRight?.("right");
43
+ break;
44
+ case DefaultKeyCodeMap.Ok:
45
+ // 启动对话框,并让对话框显示自己的模块名
46
+ ShowDialog(`来自 ${props.name} 的信息`);
47
+ break;
48
+ default:
49
+ keyConsumed = false;
50
+ }
51
+
52
+ if (keyConsumed) {
53
+ console.log(`子节点 ${props.name} 截断按键回流处理`)
54
+ }
55
+ return keyConsumed;
56
+ }
57
+
58
+ </script>
59
+
60
+ <template>
61
+ <jsv-focus-block
62
+ :name="name"
63
+ :onAction="{
64
+ onDispatchKeyDown: onDispatchKeyDownFunc,
65
+ onKeyDown: onKeyDownFunc,
66
+ onFocus: onFocusFunc,
67
+ onBlur: onBlurFunc,
68
+ }"
69
+ >
70
+ <div
71
+ :style="{
72
+ ...props.style,
73
+ width: 100,
74
+ height: 100,
75
+ fontSize: 35,
76
+ backgroundColor: hasFocused ? 'rgba(255,0,0,1)' : 'rgba(0,255,0,1)',
77
+ }"
78
+ >
79
+ {{ props.name }}
80
+ </div>
81
+ </jsv-focus-block>
82
+ </template>
@@ -0,0 +1,89 @@
1
+ <script setup>
2
+ import { onUnmounted } from "vue";
3
+ import { DefaultKeyCodeMap } from "jsview"
4
+ import { CloseDialog, GetDialogControl } from "./DialogContorls.js";
5
+ import FocusNames from "./FocusNamesDefine.js";
6
+
7
+ const dialogControlRef = GetDialogControl();
8
+
9
+ // 声明按键处理函数,只处理OK键
10
+ const onKeyDownFunc = (ev)=>{
11
+ console.log(`对话框收到回流按键 keyCode=${ev.keyCode}`);
12
+ if (ev.keyCode == DefaultKeyCodeMap.Ok) {
13
+ CloseDialog();
14
+ return true; // 阻断继续回流
15
+ }
16
+
17
+ return false;
18
+ }
19
+
20
+ const onFocusFunc = ()=>{
21
+ console.log(`对话框获得焦点`);
22
+ }
23
+
24
+ const onBlurFunc = ()=>{
25
+ console.log(`对话框失去焦点`);
26
+ }
27
+
28
+ onUnmounted(()=>{
29
+ console.log(`对话框被卸载`);
30
+ })
31
+
32
+ // 当此组件加载后,会通过autoFocus自动抢到焦点
33
+
34
+ </script>
35
+
36
+ <template>
37
+ <jsv-focus-block
38
+ :name="FocusNames.Dialog"
39
+ autoFocus
40
+ :onAction="{
41
+ onFocus: onFocusFunc,
42
+ onBlur: onBlurFunc,
43
+ onKeyDown: onKeyDownFunc,
44
+ }"
45
+ >
46
+ <div :style="{ top: 200, left: 465 }">
47
+ <div class="background"></div>
48
+ <div class="message">{{dialogControlRef.messageText}}</div>
49
+ <div :style="{ top: 120, left: 125 }">
50
+ <div class="focus"></div>
51
+ <div class="normal">确定</div>
52
+ </div>
53
+ </div>
54
+ </jsv-focus-block>
55
+ </template>
56
+
57
+ <style scoped>
58
+ .focus {
59
+ top: -5px;
60
+ left: -5px;
61
+ width: 100px;
62
+ height: 50px;
63
+ background-color: #0000ff;
64
+ }
65
+
66
+ .normal {
67
+ width: 90px;
68
+ height: 40px;
69
+ color: #ffffff;
70
+ text-align: center;
71
+ font-size: 30px;
72
+ }
73
+
74
+ .background {
75
+ left: 0px;
76
+ top: 0px;
77
+ width: 350px;
78
+ height: 200px;
79
+ background-color: rgba(0, 0, 0, 0.7);
80
+ }
81
+ .message {
82
+ top: 20px;
83
+ width: 350px;
84
+ height: 50px;
85
+ color: #ffffff;
86
+ font-size: 40px;
87
+ text-align: center;
88
+ }
89
+ </style>
@@ -0,0 +1,47 @@
1
+ let dialogConfigRef = null;
2
+
3
+ function CreateDialogControl(switcherRef) {
4
+ if (dialogConfigRef == null) {
5
+ dialogConfigRef = {
6
+ messageText: null,
7
+ switcher: switcherRef, // shallowRef对象
8
+ }
9
+ console.log("对话框控制对象创建完毕");
10
+ } else {
11
+ console.warn("对话框控制对象已经创建过");
12
+ }
13
+
14
+ return dialogConfigRef;
15
+ }
16
+
17
+ function ReleaseDialogControl() {
18
+ dialogConfigRef = null;
19
+ }
20
+
21
+ function ShowDialog(message) {
22
+ if (dialogConfigRef) {
23
+ console.log("通过showDialog开启对话框");
24
+ dialogConfigRef.messageText = message;
25
+ dialogConfigRef.switcher.value = true;
26
+ }
27
+ }
28
+
29
+ function CloseDialog() {
30
+ if (dialogConfigRef) {
31
+ console.log("通过closeDialog关闭对话框");
32
+ dialogConfigRef.messageText = null;
33
+ dialogConfigRef.switcher.value = false;
34
+ }
35
+ }
36
+
37
+ function GetDialogControl() {
38
+ return dialogConfigRef;
39
+ }
40
+
41
+ export {
42
+ CreateDialogControl,
43
+ ReleaseDialogControl,
44
+ ShowDialog,
45
+ CloseDialog,
46
+ GetDialogControl
47
+ }
@@ -0,0 +1,9 @@
1
+ const FocusNames = {
2
+ MainPlane: "MainPlane",
3
+ Dialog: "Dialog",
4
+ BoxX: "方格X",
5
+ BoxY: "方格Y",
6
+ BoxZ: "方格Z",
7
+ }
8
+
9
+ export default FocusNames;
@@ -0,0 +1,71 @@
1
+ <script setup>
2
+ import { useFocusHub } from "jsview"
3
+ import FocusNames from "./FocusNamesDefine";
4
+ import BaseBlock from "./BaseBlock.vue";
5
+
6
+ const props = defineProps({
7
+ style: {
8
+ type: Object,
9
+ default: {},
10
+ },
11
+ });
12
+
13
+ let focusHub = useFocusHub();
14
+ let ChildBlockNames = [FocusNames.BoxX, FocusNames.BoxY, FocusNames.BoxZ];
15
+ let lastIndex = 0;
16
+ let planeName = FocusNames.MainPlane;
17
+
18
+ const onFocusFunc = () => {
19
+ console.log(`父节点 ${planeName} 获得焦点`);
20
+
21
+ // 渐进式焦点设置方式,让子焦点获焦
22
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
23
+ };
24
+
25
+ const onBlurFunc = () => {
26
+ console.log(`父节点 ${planeName} 失去焦点`);
27
+ };
28
+
29
+ const onDispatchKeyDownFunc = (ev)=>{
30
+ console.log(`父节点 ${planeName} 收到下发按键 code=${ev.keyCode}`);
31
+ return false;
32
+ }
33
+
34
+ const onKeyDownFunc = (ev)=>{
35
+ console.log(`父节点 ${planeName} 收到回流按键 code=${ev.keyCode}`);
36
+ return false;
37
+ }
38
+
39
+ const leftRightFunc = (action)=>{
40
+ if (action == "left") {
41
+ if (lastIndex > 0) {
42
+ lastIndex--;
43
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到"${ChildBlockNames[lastIndex]}`);
44
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
45
+ }
46
+ } else if (action = "right") {
47
+ if (lastIndex < ChildBlockNames.length - 1) {
48
+ lastIndex++;
49
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到"${ChildBlockNames[lastIndex]}"`);
50
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
51
+ }
52
+ }
53
+ }
54
+ </script>
55
+
56
+ <template>
57
+ <jsv-focus-block
58
+ :name="planeName"
59
+ :onAction="{
60
+ onDispatchKeyDown: onDispatchKeyDownFunc,
61
+ onKeyDown: onKeyDownFunc,
62
+ onFocus: onFocusFunc,
63
+ onBlur: onBlurFunc,
64
+ }"
65
+ :style="props.style"
66
+ >
67
+ <base-block :name="ChildBlockNames[0]" :style="{left:150 * 1}" :onLeftRight="leftRightFunc" />
68
+ <base-block :name="ChildBlockNames[1]" :style="{left:150 * 2}" :onLeftRight="leftRightFunc" />
69
+ <base-block :name="ChildBlockNames[2]" :style="{left:150 * 3}" :onLeftRight="leftRightFunc" />
70
+ </jsv-focus-block>
71
+ </template>
@@ -0,0 +1,84 @@
1
+ <!--
2
+ * 【界面概述】
3
+ * 渐进式焦点展示,整个界面分为上下两个部分,每个部分有3个方格,当方格获焦的时候会变更颜色。
4
+ * 所展示的效果是,上下两个部分只了解到兄弟节点focusBlock的名字,而并不知道其子节点的名字。
5
+ * 当从上部分的子焦点切换到下部分的子焦点过程,是首先指定父节点来进行setFocus,
6
+ * 然后通过onFocus事件处理再进一步setFocus到子焦点上
7
+ *
8
+ *
9
+ * 【技巧说明】
10
+ * Q: 如何进行按键响应?
11
+ * A: 重载函数onKeyDown/onKeyUp/onDispatchKeyDown/onDispatchKeyUp中任何一个关心
12
+ * 的按键事件响应函数,处理ev.keyCode判断按键值,通过返回值控制消息传递链是否中止
13
+ *
14
+ * Q: 如何进行焦点切换?
15
+ * A: 首先为子焦点设置name属性,当需要进行焦点切换的时候,通过 useFocusHub() 提供的hub
16
+ * 的 setFocus 函数处理
17
+ *
18
+ * Q: setFocus的第二个参数keepChildFocus的作用是什么?
19
+ * A: 使用场景举例:
20
+ * 针对有子节点的FocusBlock,当子节点已经获焦后,通过对自身进行setFocus并且设置
21
+ * keepChildFocus=false,可让自己的子焦点失焦
22
+ *
23
+ -->
24
+
25
+ <script setup>
26
+ import { onMounted, shallowRef, provide } from "vue"
27
+ import { useFocusHub } from "jsview"
28
+ import UpPlaneBlock from "./UpPlaneBlock.vue";
29
+ import DownPlaneBlock from "./DownPlaneBlock.vue";
30
+ import { DefaultKeyCodeMap } from "jsview"
31
+
32
+ let focusHub = useFocusHub();
33
+
34
+ let columnIndexData = {
35
+ index: 0
36
+ }; // Plane切换时的共享column数据
37
+
38
+ provide("globalColumn", columnIndexData);
39
+
40
+ const onKeyDownFunc = (ev)=>{
41
+ console.log(`App 根节点 收到回流按键 code=${ev.keyCode}`);
42
+
43
+ // 将按键转化为left/right指令
44
+ let keyConsumed = true;
45
+ switch(ev.keyCode) {
46
+ case DefaultKeyCodeMap.Up:
47
+ // 通过第二个参数 焦点pass to child,回避掉对焦点链上父节点设置focus会使使其子焦点失焦的问题
48
+ // pass to child功能:
49
+ // 1. 当子焦点在焦点链上时,对父节点进行setFocus操作,不会让子焦点失焦(不会抢子节点的焦点状态)
50
+ // 2. 当父节点从失焦状态,通过setFocus获焦时,若此父节点上一次失焦时,其子节点有焦点状态,
51
+ // 则此次父节点获焦也会让这个子焦点获焦
52
+ focusHub.setFocus("UpPlane", true);
53
+ break;
54
+ case DefaultKeyCodeMap.Down:
55
+ // 同UpPlane, 设置第二个参数 焦点pass to child, 回避掉对焦点链上父节点设置focus会使使其子焦点失焦的问题
56
+ focusHub.setFocus("DownPlane", true);
57
+ break;
58
+ default:
59
+ keyConsumed = false;
60
+ }
61
+
62
+ return keyConsumed; // 若为true则会阻止按键下发到子节点
63
+ }
64
+
65
+ onMounted(()=>{
66
+ // 启动后先让上半区域获得焦点
67
+ focusHub.setFocus("UpPlane");
68
+ })
69
+
70
+ </script>
71
+
72
+ <template>
73
+ <jsv-focus-block
74
+ :onAction = "{
75
+ onKeyDown: onKeyDownFunc
76
+ }"
77
+ >
78
+ <up-plane-block :style="{top:100}" />
79
+ <down-plane-block :style="{top:220}"/>
80
+ </jsv-focus-block>
81
+ </template>
82
+
83
+ <style scoped>
84
+ </style>