@shijiu/jsview-vue 0.9.766 → 0.9.783

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 (64) 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/package.json +1 -1
  4. package/samples/DemoHomepage/App.vue +30 -6
  5. package/samples/DemoHomepage/components/TabFrame.vue +7 -0
  6. package/samples/DemoHomepage/router.js +16 -18
  7. package/samples/DemoHomepage/views/Homepage.vue +5 -1
  8. package/samples/FocusBlockDemos/AutoFocus/App.vue +51 -0
  9. package/samples/FocusBlockDemos/AutoFocus/BaseBlock.vue +82 -0
  10. package/samples/FocusBlockDemos/AutoFocus/DialogBlock.vue +89 -0
  11. package/samples/FocusBlockDemos/AutoFocus/DialogContorls.js +42 -0
  12. package/samples/FocusBlockDemos/AutoFocus/FocusNamesDefine.js +9 -0
  13. package/samples/FocusBlockDemos/AutoFocus/PlaneBlock.vue +71 -0
  14. package/samples/FocusBlockDemos/ProgressiveFocusControl/App.vue +78 -0
  15. package/samples/FocusBlockDemos/ProgressiveFocusControl/BaseBlock.vue +77 -0
  16. package/samples/FocusBlockDemos/ProgressiveFocusControl/DownPlaneBlock.vue +83 -0
  17. package/samples/FocusBlockDemos/ProgressiveFocusControl/FocusNamesDefine.js +12 -0
  18. package/samples/FocusBlockDemos/ProgressiveFocusControl/UpPlaneBlock.vue +83 -0
  19. package/samples/Marquee/App.vue +34 -3
  20. package/samples/MetroWidgetDemos/PingPong/App.vue +22 -11
  21. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +3 -3
  22. package/samples/MetroWidgetDemos/{Item.vue → PingPong/Item.vue} +1 -3
  23. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +3 -3
  24. package/samples/MetroWidgetDemos/{WidgetItem.vue → PingPong/WidgetItem.vue} +6 -1
  25. package/samples/MetroWidgetDemos/basic/App.vue +162 -0
  26. package/samples/MetroWidgetDemos/basic/Item.vue +43 -0
  27. package/samples/MetroWidgetDemos/direction/App.vue +158 -0
  28. package/samples/MetroWidgetDemos/direction/Item.vue +45 -0
  29. package/samples/MetroWidgetDemos/focusableItemBasic/App.vue +67 -0
  30. package/samples/MetroWidgetDemos/{Advanced → focusableItemBasic}/ButtonItem.vue +16 -20
  31. package/samples/MetroWidgetDemos/focusableItemMetroWidget/App.vue +74 -0
  32. package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/Item.vue +12 -30
  33. package/samples/MetroWidgetDemos/{Advanced/widgets → focusableItemMetroWidget}/WidgetItem.vue +10 -9
  34. package/samples/MetroWidgetDemos/focusableItemMix/App.vue +88 -0
  35. package/samples/MetroWidgetDemos/focusableItemMix/ButtonItem.vue +86 -0
  36. package/samples/MetroWidgetDemos/focusableItemMix/Item.vue +43 -0
  37. package/samples/MetroWidgetDemos/index.js +6 -0
  38. package/samples/MetroWidgetDemos/layoutType/App.vue +180 -0
  39. package/samples/MetroWidgetDemos/layoutType/Item.vue +45 -0
  40. package/samples/MetroWidgetDemos/padding/App.vue +222 -0
  41. package/samples/MetroWidgetDemos/padding/Item.vue +64 -0
  42. package/samples/MetroWidgetDemos/routeList.js +64 -0
  43. package/samples/MetroWidgetDemos/slideSetting/App.vue +225 -0
  44. package/samples/MetroWidgetDemos/slideSetting/Item.vue +45 -0
  45. package/samples/NinePatchDemo/App.vue +78 -122
  46. package/samples/NinePatchDemo/Item.vue +28 -26
  47. package/samples/Swiper/App.vue +148 -0
  48. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +15 -12
  49. package/utils/JsViewEngineWidget/TemplateParser.js +6 -1
  50. package/utils/JsViewPlugin/JsvPlayer/version.js +4 -4
  51. package/utils/JsViewVueTools/JsvTextTools.js +24 -3
  52. package/utils/JsViewVueWidget/JsvMarquee.vue +81 -20
  53. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +115 -79
  54. package/utils/JsViewVueWidget/JsvSwiper/index.js +3 -2
  55. package/samples/MetroWidgetDemos/Advanced/App.vue +0 -46
  56. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +0 -70
  57. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +0 -77
  58. package/samples/MetroWidgetDemos/Advanced/widgets/Widgets.vue +0 -116
  59. package/samples/MetroWidgetDemos/Advanced/widgets/focus1.png +0 -0
  60. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +0 -75
  61. package/samples/MetroWidgetDemos/Simple/App.vue +0 -45
  62. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +0 -111
  63. package/samples/MetroWidgetDemos/data.js +0 -205
  64. package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +0 -35
@@ -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,42 @@
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 ShowDialog(message) {
18
+ if (dialogConfigRef) {
19
+ console.log("通过showDialog开启对话框");
20
+ dialogConfigRef.messageText = message;
21
+ dialogConfigRef.switcher.value = true;
22
+ }
23
+ }
24
+
25
+ function CloseDialog() {
26
+ if (dialogConfigRef) {
27
+ console.log("通过closeDialog关闭对话框");
28
+ dialogConfigRef.messageText = null;
29
+ dialogConfigRef.switcher.value = false;
30
+ }
31
+ }
32
+
33
+ function GetDialogControl() {
34
+ return dialogConfigRef;
35
+ }
36
+
37
+ export {
38
+ CreateDialogControl,
39
+ ShowDialog,
40
+ CloseDialog,
41
+ GetDialogControl
42
+ }
@@ -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,78 @@
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
+ focusHub.setFocus("UpPlane");
48
+ break;
49
+ case DefaultKeyCodeMap.Down:
50
+ focusHub.setFocus("DownPlane");
51
+ break;
52
+ default:
53
+ keyConsumed = false;
54
+ }
55
+
56
+ return keyConsumed; // 若为true则会阻止按键下发到子节点
57
+ }
58
+
59
+ onMounted(()=>{
60
+ // 启动后先让上半区域获得焦点
61
+ focusHub.setFocus("UpPlane");
62
+ })
63
+
64
+ </script>
65
+
66
+ <template>
67
+ <jsv-focus-block
68
+ :onAction = "{
69
+ onKeyDown: onKeyDownFunc
70
+ }"
71
+ >
72
+ <up-plane-block :style="{top:100}" />
73
+ <down-plane-block :style="{top:220}"/>
74
+ </jsv-focus-block>
75
+ </template>
76
+
77
+ <style scoped>
78
+ </style>
@@ -0,0 +1,77 @@
1
+ <script setup>
2
+ import { shallowRef } from "vue";
3
+ import { DefaultKeyCodeMap } from "jsview"
4
+
5
+ const props = defineProps({
6
+ name: String,
7
+ style: {
8
+ type: Object,
9
+ default: {},
10
+ },
11
+ onLeftRight: Function,
12
+ });
13
+
14
+ const hasFocused = shallowRef(false);
15
+
16
+ const onFocusFunc = () => {
17
+ console.log(`子节点 ${props.name} 获得焦点`);
18
+ hasFocused.value = true;
19
+ };
20
+
21
+ const onBlurFunc = () => {
22
+ console.log(`子节点 ${props.name} 失去焦点`);
23
+ hasFocused.value = false;
24
+ };
25
+
26
+ const onDispatchKeyDownFunc = (ev)=>{
27
+ console.log(`子节点 ${props.name} 收到下发按键 code=${ev.keyCode}`);
28
+ return false;
29
+ }
30
+
31
+ const onKeyDownFunc = (ev)=>{
32
+ console.log(`子节点 ${props.name} 收到回流按键 code=${ev.keyCode}`);
33
+
34
+ // 将按键转化为left/right指令
35
+ let keyConsumed = true;
36
+ switch(ev.keyCode) {
37
+ case DefaultKeyCodeMap.Left:
38
+ props.onLeftRight?.("left");
39
+ break;
40
+ case DefaultKeyCodeMap.Right:
41
+ props.onLeftRight?.("right");
42
+ break;
43
+ default:
44
+ keyConsumed = false;
45
+ }
46
+
47
+ if (keyConsumed) {
48
+ console.log(`子节点 ${props.name} 截断按键回流处理`)
49
+ }
50
+ return keyConsumed;
51
+ }
52
+
53
+ </script>
54
+
55
+ <template>
56
+ <jsv-focus-block
57
+ :name="name"
58
+ :onAction="{
59
+ onDispatchKeyDown: onDispatchKeyDownFunc,
60
+ onKeyDown: onKeyDownFunc,
61
+ onFocus: onFocusFunc,
62
+ onBlur: onBlurFunc,
63
+ }"
64
+ >
65
+ <div
66
+ :style="{
67
+ ...props.style,
68
+ width: 100,
69
+ height: 100,
70
+ fontSize: 35,
71
+ backgroundColor: hasFocused ? 'rgba(255,0,0,1)' : 'rgba(0,255,0,1)',
72
+ }"
73
+ >
74
+ {{ props.name }}
75
+ </div>
76
+ </jsv-focus-block>
77
+ </template>
@@ -0,0 +1,83 @@
1
+ <script setup>
2
+ import { inject } from "vue"
3
+ import { useFocusHub } from "jsview"
4
+ import BaseBlock from "./BaseBlock.vue";
5
+ import FocusNames from "./FocusNamesDefine"
6
+
7
+ const props = defineProps({
8
+ style: {
9
+ type: Object,
10
+ default: {},
11
+ },
12
+ });
13
+
14
+ let focusHub = useFocusHub();
15
+ let ChildBlockNames = [FocusNames.Box1, FocusNames.Box2, FocusNames.Box3];
16
+ let globalColumn = inject("globalColumn"); // 从App获取的全局coloumn信息
17
+ let lastIndex = 0;
18
+ let planeName = FocusNames.DownPlane;
19
+
20
+ const onFocusFunc = () => {
21
+ console.log(`父节点 ${planeName} 获得焦点`);
22
+
23
+ // 让子焦点获焦
24
+ lastIndex = globalColumn.index; // 同步全局节点信息
25
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
26
+ };
27
+
28
+ const onBlurFunc = () => {
29
+ console.log(`父节点 ${planeName} 失去焦点`);
30
+ };
31
+
32
+ const onDispatchKeyDownFunc = (ev)=>{
33
+ console.log(`父节点 ${planeName} 收到下发按键 code=${ev.keyCode}`);
34
+ return false;
35
+ }
36
+
37
+ const onKeyDownFunc = (ev)=>{
38
+ console.log(`父节点 ${planeName} 收到回流按键 code=${ev.keyCode}`);
39
+ return false;
40
+ }
41
+
42
+ const leftRightFunc = (action)=>{
43
+ let indexChanged = false;
44
+
45
+ if (action == "left") {
46
+ if (lastIndex >= 0) {
47
+ lastIndex--;
48
+ indexChanged = true;
49
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到${ChildBlockNames[lastIndex]}`);
50
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
51
+ }
52
+ } else if (action = "right") {
53
+ if (lastIndex < ChildBlockNames.length - 1) {
54
+ lastIndex++;
55
+ indexChanged = true;
56
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到${ChildBlockNames[lastIndex]}`);
57
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
58
+ }
59
+ }
60
+
61
+ if (indexChanged) {
62
+ // 回传lastIndex columen, 以方便Plane切换后保持column
63
+ globalColumn.index = lastIndex;
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <template>
69
+ <jsv-focus-block
70
+ :name="planeName"
71
+ :onAction="{
72
+ onDispatchKeyDown: onDispatchKeyDownFunc,
73
+ onKeyDown: onKeyDownFunc,
74
+ onFocus: onFocusFunc,
75
+ onBlur: onBlurFunc,
76
+ }"
77
+ :style="props.style"
78
+ >
79
+ <base-block :name="ChildBlockNames[0]" :style="{left:150 * 1}" :onLeftRight="leftRightFunc" />
80
+ <base-block :name="ChildBlockNames[1]" :style="{left:150 * 2}" :onLeftRight="leftRightFunc" />
81
+ <base-block :name="ChildBlockNames[2]" :style="{left:150 * 3}" :onLeftRight="leftRightFunc" />
82
+ </jsv-focus-block>
83
+ </template>
@@ -0,0 +1,12 @@
1
+ const FocusNames = {
2
+ UpPlane: "UpPlane",
3
+ DownPlane: "DownPlane",
4
+ BoxA: "A",
5
+ BoxB: "B",
6
+ BoxC: "C",
7
+ Box1: "1",
8
+ Box2: "2",
9
+ Box3: "3",
10
+ }
11
+
12
+ export default FocusNames;
@@ -0,0 +1,83 @@
1
+ <script setup>
2
+ import { inject } from "vue"
3
+ import { useFocusHub } from "jsview"
4
+ import BaseBlock from "./BaseBlock.vue";
5
+ import FocusNames from "./FocusNamesDefine"
6
+
7
+ const props = defineProps({
8
+ style: {
9
+ type: Object,
10
+ default: {},
11
+ },
12
+ });
13
+
14
+ let focusHub = useFocusHub();
15
+ let ChildBlockNames = [FocusNames.BoxA, FocusNames.BoxB, FocusNames.BoxC];
16
+ let globalColumn = inject("globalColumn"); // 从App获取的全局coloumn信息
17
+ let lastIndex = 0;
18
+ let planeName = FocusNames.UpPlane;
19
+
20
+ const onFocusFunc = () => {
21
+ console.log(`父节点 ${planeName} 获得焦点`);
22
+
23
+ // 让子焦点获焦
24
+ lastIndex = globalColumn.index; // 同步全局节点信息
25
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
26
+ };
27
+
28
+ const onBlurFunc = () => {
29
+ console.log(`父节点 ${planeName} 失去焦点`);
30
+ };
31
+
32
+ const onDispatchKeyDownFunc = (ev)=>{
33
+ console.log(`父节点 ${planeName} 收到下发按键 code=${ev.keyCode}`);
34
+ return false;
35
+ }
36
+
37
+ const onKeyDownFunc = (ev)=>{
38
+ console.log(`父节点 ${planeName} 收到回流按键 code=${ev.keyCode}`);
39
+ return false;
40
+ }
41
+
42
+ const leftRightFunc = (action)=>{
43
+ let indexChanged = false;
44
+
45
+ if (action == "left") {
46
+ if (lastIndex >= 0) {
47
+ lastIndex--;
48
+ indexChanged = true;
49
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到${ChildBlockNames[lastIndex]}`);
50
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
51
+ }
52
+ } else if (action = "right") {
53
+ if (lastIndex < ChildBlockNames.length - 1) {
54
+ lastIndex++;
55
+ indexChanged = true;
56
+ console.log(`父节点 ${planeName} 收到left指令 切换子节点到${ChildBlockNames[lastIndex]}`);
57
+ focusHub.setFocus(ChildBlockNames[lastIndex]);
58
+ }
59
+ }
60
+
61
+ if (indexChanged) {
62
+ // 回传lastIndex columen, 以方便Plane切换后保持column
63
+ globalColumn.index = lastIndex;
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <template>
69
+ <jsv-focus-block
70
+ :name="planeName"
71
+ :onAction="{
72
+ onDispatchKeyDown: onDispatchKeyDownFunc,
73
+ onKeyDown: onKeyDownFunc,
74
+ onFocus: onFocusFunc,
75
+ onBlur: onBlurFunc,
76
+ }"
77
+ :style="props.style"
78
+ >
79
+ <base-block :name="ChildBlockNames[0]" :style="{left:150 * 1}" :onLeftRight="leftRightFunc" />
80
+ <base-block :name="ChildBlockNames[1]" :style="{left:150 * 2}" :onLeftRight="leftRightFunc" />
81
+ <base-block :name="ChildBlockNames[2]" :style="{left:150 * 3}" :onLeftRight="leftRightFunc" />
82
+ </jsv-focus-block>
83
+ </template>
@@ -1,8 +1,8 @@
1
1
  <!--
2
2
  * @Author: ChenChanghua
3
3
  * @Date: 2022-01-18 18:24:18
4
- * @LastEditors: ChenChanghua
5
- * @LastEditTime: 2022-11-10 15:29:12
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2023-03-09 13:43:43
6
6
  * @Description: file content
7
7
  -->
8
8
  <script setup>
@@ -168,7 +168,6 @@ onMounted(() => {
168
168
  lineHeight: 70,
169
169
  fontSize: 50,
170
170
  color: '#000000',
171
- direction: 'rtl',
172
171
  }"
173
172
  text="انجليزي"
174
173
  :slideSpeed="slideSpeed"
@@ -243,5 +242,37 @@ onMounted(() => {
243
242
  超长rtl文字
244
243
  </div>
245
244
  </div>
245
+ <div
246
+ :style="{
247
+ left: 50,
248
+ top: 610,
249
+ width: width,
250
+ height: height,
251
+ backgroundColor: '#FFFFFF',
252
+ }"
253
+ >
254
+ <jsv-marquee
255
+ :style="{
256
+ width,
257
+ height,
258
+ lineHeight: 70,
259
+ fontSize: 50,
260
+ color: '#000000',
261
+ }"
262
+ text="测试文字"
263
+ :forceSlide="true"
264
+ :slideSpeed="slideSpeed"
265
+ slideDirection="ets"
266
+ />
267
+ <div :style="{
268
+ left: width + 20,
269
+ height: height,
270
+ color: '#ffffff',
271
+ fontSize: 50,
272
+ lineHeight: 50,
273
+ }">
274
+ 反向滚动示例
275
+ </div>
276
+ </div>
246
277
  </jsv-focus-block>
247
278
  </template>