@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.
- package/dom/bin/jsview-browser-debug-dom.min.js +1 -1
- package/dom/bin/jsview-dom.min.js +1 -1
- package/dom/bin/jsview-engine-js-browser.min.js +1 -1
- package/dom/target_core_revision.js +4 -4
- package/package.json +1 -1
- package/samples/Basic/components/anim/AnimTransition.vue +4 -4
- package/samples/DemoHomepage/App.vue +30 -6
- package/samples/DemoHomepage/components/TabFrame.vue +7 -0
- package/samples/DemoHomepage/router.js +21 -18
- package/samples/DemoHomepage/views/Homepage.vue +5 -1
- package/samples/FilterDemo/VideoLayer.vue +2 -2
- package/samples/FocusBlockDemos/AutoFocus/App.vue +56 -0
- package/samples/FocusBlockDemos/AutoFocus/BaseBlock.vue +82 -0
- package/samples/FocusBlockDemos/AutoFocus/DialogBlock.vue +89 -0
- package/samples/FocusBlockDemos/AutoFocus/DialogContorls.js +47 -0
- package/samples/FocusBlockDemos/AutoFocus/FocusNamesDefine.js +9 -0
- package/samples/FocusBlockDemos/AutoFocus/PlaneBlock.vue +71 -0
- package/samples/FocusBlockDemos/ProgressiveFocusControl/App.vue +84 -0
- package/samples/FocusBlockDemos/ProgressiveFocusControl/BaseBlock.vue +77 -0
- package/samples/FocusBlockDemos/ProgressiveFocusControl/DownPlaneBlock.vue +83 -0
- package/samples/FocusBlockDemos/ProgressiveFocusControl/FocusNamesDefine.js +12 -0
- package/samples/FocusBlockDemos/ProgressiveFocusControl/UpPlaneBlock.vue +83 -0
- package/samples/GiftRain/App.vue +248 -0
- package/samples/GiftRain/audio/boom.mp3 +0 -0
- package/samples/GiftRain/audio/get.mp3 +0 -0
- package/samples/GiftRain/common/Sound.js +48 -0
- package/samples/GiftRain/components/RedPacket.vue +161 -0
- package/samples/GiftRain/components/Score.vue +55 -0
- package/samples/GiftRain/components/SpriteTranslate.vue +72 -0
- package/samples/GridDemo/Item.vue +1 -0
- package/samples/ImpactStop/App.vue +2 -2
- package/samples/Marquee/App.vue +34 -3
- package/samples/MetroWidgetDemos/PingPong/App.vue +22 -11
- package/samples/MetroWidgetDemos/PingPong/AppPage.vue +3 -3
- package/samples/MetroWidgetDemos/{Item.vue → PingPong/Item.vue} +1 -3
- package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +3 -3
- package/samples/MetroWidgetDemos/{WidgetItem.vue → PingPong/WidgetItem.vue} +6 -1
- package/samples/MetroWidgetDemos/basic/App.vue +162 -0
- package/samples/MetroWidgetDemos/basic/Item.vue +43 -0
- package/samples/MetroWidgetDemos/direction/App.vue +158 -0
- package/samples/MetroWidgetDemos/direction/Item.vue +45 -0
- package/samples/MetroWidgetDemos/focusableItemBasic/App.vue +67 -0
- package/samples/MetroWidgetDemos/{Advanced → focusableItemBasic}/ButtonItem.vue +16 -20
- package/samples/MetroWidgetDemos/focusableItemMetroWidget/App.vue +74 -0
- package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/Item.vue +12 -30
- package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/WidgetItem.vue +10 -9
- package/samples/MetroWidgetDemos/focusableItemMix/App.vue +88 -0
- package/samples/MetroWidgetDemos/focusableItemMix/ButtonItem.vue +86 -0
- package/samples/MetroWidgetDemos/focusableItemMix/Item.vue +43 -0
- package/samples/MetroWidgetDemos/index.js +6 -0
- package/samples/MetroWidgetDemos/layoutType/App.vue +180 -0
- package/samples/MetroWidgetDemos/layoutType/Item.vue +45 -0
- package/samples/MetroWidgetDemos/padding/App.vue +222 -0
- package/samples/MetroWidgetDemos/padding/Item.vue +64 -0
- package/samples/MetroWidgetDemos/routeList.js +64 -0
- package/samples/MetroWidgetDemos/slideSetting/App.vue +225 -0
- package/samples/MetroWidgetDemos/slideSetting/Item.vue +45 -0
- package/samples/NinePatchDemo/App.vue +78 -122
- package/samples/NinePatchDemo/Item.vue +28 -26
- package/samples/Swiper/App.vue +148 -0
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +15 -12
- package/utils/JsViewEngineWidget/TemplateParser.js +6 -1
- package/utils/JsViewPlugin/JsvAudio/AudioProxy.js +17 -1
- package/utils/JsViewPlugin/JsvAudio/JsvAudio.vue +15 -38
- package/utils/JsViewPlugin/JsvAudio/version.js +10 -10
- package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
- package/utils/JsViewVueTools/JsvTextTools.js +26 -3
- package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +1 -1
- package/utils/JsViewVueWidget/JsvFilterView.vue +1 -1
- package/utils/JsViewVueWidget/JsvMarquee.vue +81 -20
- package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -1
- package/utils/JsViewVueWidget/JsvPosterDiv.vue +1 -1
- package/utils/JsViewVueWidget/JsvPosterImage.vue +1 -1
- package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +43 -9
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +115 -79
- package/utils/JsViewVueWidget/JsvSwiper/index.js +3 -2
- package/utils/JsViewVueWidget/JsvTextBox.vue +1 -1
- package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +1 -1
- package/samples/MetroWidgetDemos/Advanced/App.vue +0 -46
- package/samples/MetroWidgetDemos/Advanced/Buttons.vue +0 -70
- package/samples/MetroWidgetDemos/Advanced/Mixed.vue +0 -77
- package/samples/MetroWidgetDemos/Advanced/widgets/Widgets.vue +0 -116
- package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
- package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +0 -75
- package/samples/MetroWidgetDemos/Simple/App.vue +0 -45
- package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +0 -111
- package/samples/MetroWidgetDemos/data.js +0 -205
- package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +0 -35
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
const TargetRevision = {
|
|
6
|
-
"CoreRevision":
|
|
7
|
-
"CoreRevisionAndBranch": "
|
|
8
|
-
"JseRevision": "1.0.
|
|
6
|
+
"CoreRevision": 1021336,
|
|
7
|
+
"CoreRevisionAndBranch": "1021336",
|
|
8
|
+
"JseRevision": "1.0.882",
|
|
9
9
|
"JseUrl":
|
|
10
|
-
"http://cdn.release.qcast.cn/forge_js/master/
|
|
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
|
@@ -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
|
-
<
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRouter } from "vue-router";
|
|
2
2
|
import { createJsvHashHistory } from "jsview";
|
|
3
|
-
|
|
4
|
-
|
|
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: "/
|
|
175
|
-
component: () => import("jsview/samples/
|
|
166
|
+
name: "轮播",
|
|
167
|
+
path: "/feature/JsvSwiper",
|
|
168
|
+
component: () => import("jsview/samples/Swiper/App"),
|
|
176
169
|
},
|
|
170
|
+
|
|
171
|
+
// Focus示例
|
|
177
172
|
{
|
|
178
|
-
name: "
|
|
179
|
-
path: "/
|
|
173
|
+
name: "渐进式焦点处理",
|
|
174
|
+
path: "/focusBlock/ProgressiveFocusControl",
|
|
180
175
|
component: () =>
|
|
181
|
-
import("jsview/samples/
|
|
176
|
+
import("jsview/samples/FocusBlockDemos/ProgressiveFocusControl/App"),
|
|
182
177
|
},
|
|
183
178
|
{
|
|
184
|
-
name: "
|
|
185
|
-
path: "/
|
|
179
|
+
name: "autoFocus对话框",
|
|
180
|
+
path: "/focusBlock/AutoFocusDialog",
|
|
186
181
|
component: () =>
|
|
187
|
-
import("jsview/samples/
|
|
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
|
|
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
|
-
<
|
|
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,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>
|