@shijiu/jsview-vue 0.9.590 → 0.9.602
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/target_core_revision.js +4 -4
- package/package.json +1 -1
- package/samples/Basic/components/div/DivLayout.vue +34 -5
- package/samples/MetroWidgetDemos/Advanced/App.vue +7 -171
- package/samples/MetroWidgetDemos/Advanced/Buttons.vue +70 -0
- package/samples/MetroWidgetDemos/Advanced/Mixed.vue +77 -0
- package/samples/MetroWidgetDemos/Advanced/Widgets.vue +71 -0
- package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +75 -0
- package/samples/MetroWidgetDemos/Simple/App.vue +5 -154
- package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +111 -0
- package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +11 -5
- package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +3 -4
- package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
- package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +2 -2
- package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +6 -1
- package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +6 -1
|
@@ -2,18 +2,16 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-07-11 13:31:36
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-07-
|
|
5
|
+
* @LastEditTime: 2022-07-18 10:00:27
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
9
9
|
import { MetroWidget, VERTICAL, EdgeDirection } from "jsview";
|
|
10
10
|
import { useRouter } from "vue-router";
|
|
11
|
-
import { ref } from "vue";
|
|
12
11
|
import { useFocusHub } from "jsview";
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import Item from "../Item.vue";
|
|
12
|
+
import Buttons from "./Buttons.vue";
|
|
13
|
+
import Mixed from "./Mixed.vue";
|
|
14
|
+
import Widgets from "./Widgets.vue";
|
|
17
15
|
|
|
18
16
|
const router = useRouter();
|
|
19
17
|
const foucsHub = useFocusHub();
|
|
@@ -27,65 +25,6 @@ const onKeyDown = (ev) => {
|
|
|
27
25
|
}
|
|
28
26
|
return true;
|
|
29
27
|
};
|
|
30
|
-
|
|
31
|
-
//item为Buttonitem的一些回调
|
|
32
|
-
const provideData = () => {
|
|
33
|
-
return advanceButton;
|
|
34
|
-
};
|
|
35
|
-
const measures = (item) => {
|
|
36
|
-
return {
|
|
37
|
-
width: item.width,
|
|
38
|
-
height: item.height,
|
|
39
|
-
marginRight: item.marginRight,
|
|
40
|
-
marginBottom: item.marginBottom,
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
|
-
const onEdge = (edgeInfo) => {
|
|
44
|
-
if (edgeInfo.direction == EdgeDirection.right) {
|
|
45
|
-
foucsHub.setFocus("mwWidget");
|
|
46
|
-
} else if (edgeInfo.direction == EdgeDirection.bottom) {
|
|
47
|
-
foucsHub.setFocus("mwMix");
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
//item为Widgetitem的一些回调
|
|
52
|
-
const provideData2 = () => {
|
|
53
|
-
return advanceMetroWidget;
|
|
54
|
-
};
|
|
55
|
-
const measures2 = (item) => {
|
|
56
|
-
return {
|
|
57
|
-
width: item.width,
|
|
58
|
-
height: item.height,
|
|
59
|
-
marginRight: item.marginRight,
|
|
60
|
-
marginBottom: item.marginBottom,
|
|
61
|
-
doSlide: false,
|
|
62
|
-
};
|
|
63
|
-
};
|
|
64
|
-
const onEdge2 = (edgeInfo) => {
|
|
65
|
-
if (edgeInfo.direction == EdgeDirection.left) {
|
|
66
|
-
foucsHub.setFocus("mwButton");
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
//item混排的回调
|
|
71
|
-
const provideData3 = () => {
|
|
72
|
-
return advanceMix;
|
|
73
|
-
};
|
|
74
|
-
const measures3 = (item) => {
|
|
75
|
-
return {
|
|
76
|
-
width: item.width,
|
|
77
|
-
height: item.height,
|
|
78
|
-
marginRight: item.marginRight,
|
|
79
|
-
marginBottom: item.marginBottom,
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
const onEdge3 = (edgeInfo) => {
|
|
83
|
-
if (edgeInfo.direction == EdgeDirection.right) {
|
|
84
|
-
foucsHub.setFocus("mwWidget");
|
|
85
|
-
} else if (edgeInfo.direction == EdgeDirection.top) {
|
|
86
|
-
foucsHub.setFocus("mwButton");
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
28
|
</script>
|
|
90
29
|
|
|
91
30
|
<template>
|
|
@@ -101,111 +40,8 @@ const onEdge3 = (edgeInfo) => {
|
|
|
101
40
|
backgroundColor: '#007788',
|
|
102
41
|
}"
|
|
103
42
|
>
|
|
104
|
-
<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
top: 50,
|
|
108
|
-
width: 300,
|
|
109
|
-
height: 400,
|
|
110
|
-
fontSize: 30,
|
|
111
|
-
color: '#FFFFFF',
|
|
112
|
-
}"
|
|
113
|
-
>
|
|
114
|
-
{{ `item可以是可获得焦点的控件` }}
|
|
115
|
-
</div>
|
|
116
|
-
<metro-widget
|
|
117
|
-
name="mwButton"
|
|
118
|
-
:top="150"
|
|
119
|
-
:left="50"
|
|
120
|
-
:provideData="provideData"
|
|
121
|
-
:width="220"
|
|
122
|
-
:height="400"
|
|
123
|
-
:direction="VERTICAL"
|
|
124
|
-
:measures="measures"
|
|
125
|
-
:onEdge="onEdge"
|
|
126
|
-
>
|
|
127
|
-
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
128
|
-
<button-item
|
|
129
|
-
:data="data"
|
|
130
|
-
:query="query"
|
|
131
|
-
:onAction="onAction"
|
|
132
|
-
:onItemEdge="onItemEdge"
|
|
133
|
-
/>
|
|
134
|
-
</template>
|
|
135
|
-
</metro-widget>
|
|
136
|
-
|
|
137
|
-
<div
|
|
138
|
-
:style="{
|
|
139
|
-
left: 50,
|
|
140
|
-
top: 350,
|
|
141
|
-
width: 300,
|
|
142
|
-
height: 400,
|
|
143
|
-
fontSize: 30,
|
|
144
|
-
color: '#FFFFFF',
|
|
145
|
-
}"
|
|
146
|
-
>
|
|
147
|
-
{{ `item可以普通描画控件和可获焦控件混排` }}
|
|
148
|
-
</div>
|
|
149
|
-
<metro-widget
|
|
150
|
-
name="mwMix"
|
|
151
|
-
:top="450"
|
|
152
|
-
:left="50"
|
|
153
|
-
:provideData="provideData3"
|
|
154
|
-
:width="260"
|
|
155
|
-
:height="440"
|
|
156
|
-
:padding="{
|
|
157
|
-
top: 20,
|
|
158
|
-
left: 20,
|
|
159
|
-
}"
|
|
160
|
-
:direction="VERTICAL"
|
|
161
|
-
:measures="measures3"
|
|
162
|
-
:onEdge="onEdge3"
|
|
163
|
-
>
|
|
164
|
-
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
165
|
-
<button-item
|
|
166
|
-
v-if="data.type == 'button'"
|
|
167
|
-
:data="data"
|
|
168
|
-
:query="query"
|
|
169
|
-
:onAction="onAction"
|
|
170
|
-
:onItemEdge="onItemEdge"
|
|
171
|
-
/>
|
|
172
|
-
<item v-else :data="data" :query="query" :onAction="onAction" />
|
|
173
|
-
</template>
|
|
174
|
-
</metro-widget>
|
|
175
|
-
|
|
176
|
-
<div
|
|
177
|
-
:style="{
|
|
178
|
-
left: 500,
|
|
179
|
-
top: 50,
|
|
180
|
-
width: 500,
|
|
181
|
-
height: 400,
|
|
182
|
-
fontSize: 30,
|
|
183
|
-
color: '#FFFFFF',
|
|
184
|
-
}"
|
|
185
|
-
>
|
|
186
|
-
{{ `进一步, MetroWidget的item\n可以是包含MetroWidget的组件` }}
|
|
187
|
-
</div>
|
|
188
|
-
<metro-widget
|
|
189
|
-
name="mwWidget"
|
|
190
|
-
:top="150"
|
|
191
|
-
:left="400"
|
|
192
|
-
:provideData="provideData2"
|
|
193
|
-
:width="600"
|
|
194
|
-
:height="600"
|
|
195
|
-
:direction="VERTICAL"
|
|
196
|
-
:measures="measures2"
|
|
197
|
-
:onEdge="onEdge2"
|
|
198
|
-
>
|
|
199
|
-
<!-- data为每个item的数据, query提供获取MetroWidget内部状态的一些接口, onAction提供item注册自身回调的接口, onItemEdge则是item内部焦点处理到达边缘后, 需要通知MetroWidget时的回调 -->
|
|
200
|
-
<!-- measure2中会返回doSlide: false, 既MetroWidget自身不处理滚动, 滚动由子的sendFocusRectEvent控制 -->
|
|
201
|
-
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
202
|
-
<widget-item
|
|
203
|
-
:data="data"
|
|
204
|
-
:query="query"
|
|
205
|
-
:onAction="onAction"
|
|
206
|
-
:onItemEdge="onItemEdge"
|
|
207
|
-
/>
|
|
208
|
-
</template>
|
|
209
|
-
</metro-widget>
|
|
43
|
+
<buttons></buttons>
|
|
44
|
+
<mixed></mixed>
|
|
45
|
+
<widgets></widgets>
|
|
210
46
|
</jsv-focus-block>
|
|
211
47
|
</template>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-07-11 13:31:36
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-07-18 09:49:59
|
|
6
|
+
* @Description: file content
|
|
7
|
+
-->
|
|
8
|
+
<script setup>
|
|
9
|
+
import { MetroWidget, VERTICAL, EdgeDirection } from "jsview";
|
|
10
|
+
import { useFocusHub } from "jsview";
|
|
11
|
+
import { advanceButton } from "../data";
|
|
12
|
+
import ButtonItem from "./ButtonItem.vue";
|
|
13
|
+
|
|
14
|
+
const foucsHub = useFocusHub();
|
|
15
|
+
|
|
16
|
+
//item为Buttonitem的一些回调
|
|
17
|
+
const provideData = () => {
|
|
18
|
+
return advanceButton;
|
|
19
|
+
};
|
|
20
|
+
const measures = (item) => {
|
|
21
|
+
return {
|
|
22
|
+
width: item.width,
|
|
23
|
+
height: item.height,
|
|
24
|
+
marginRight: item.marginRight,
|
|
25
|
+
marginBottom: item.marginBottom,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
const onEdge = (edgeInfo) => {
|
|
29
|
+
if (edgeInfo.direction == EdgeDirection.right) {
|
|
30
|
+
foucsHub.setFocus("mwWidget");
|
|
31
|
+
} else if (edgeInfo.direction == EdgeDirection.bottom) {
|
|
32
|
+
foucsHub.setFocus("mwMix");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<template>
|
|
38
|
+
<div
|
|
39
|
+
:style="{
|
|
40
|
+
left: 50,
|
|
41
|
+
top: 50,
|
|
42
|
+
width: 300,
|
|
43
|
+
height: 400,
|
|
44
|
+
fontSize: 30,
|
|
45
|
+
color: '#FFFFFF',
|
|
46
|
+
}"
|
|
47
|
+
>
|
|
48
|
+
{{ `item可以是可获得焦点的控件` }}
|
|
49
|
+
</div>
|
|
50
|
+
<metro-widget
|
|
51
|
+
name="mwButton"
|
|
52
|
+
:top="150"
|
|
53
|
+
:left="50"
|
|
54
|
+
:provideData="provideData"
|
|
55
|
+
:width="220"
|
|
56
|
+
:height="400"
|
|
57
|
+
:direction="VERTICAL"
|
|
58
|
+
:measures="measures"
|
|
59
|
+
:onEdge="onEdge"
|
|
60
|
+
>
|
|
61
|
+
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
62
|
+
<button-item
|
|
63
|
+
:data="data"
|
|
64
|
+
:query="query"
|
|
65
|
+
:onAction="onAction"
|
|
66
|
+
:onItemEdge="onItemEdge"
|
|
67
|
+
/>
|
|
68
|
+
</template>
|
|
69
|
+
</metro-widget>
|
|
70
|
+
</template>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-07-11 13:31:36
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-07-18 09:57:40
|
|
6
|
+
* @Description: file content
|
|
7
|
+
-->
|
|
8
|
+
<script setup>
|
|
9
|
+
import { MetroWidget, VERTICAL, EdgeDirection } from "jsview";
|
|
10
|
+
import { useFocusHub } from "jsview";
|
|
11
|
+
import { advanceMix } from "../data";
|
|
12
|
+
import ButtonItem from "./ButtonItem.vue";
|
|
13
|
+
import Item from "../Item.vue";
|
|
14
|
+
|
|
15
|
+
const foucsHub = useFocusHub();
|
|
16
|
+
|
|
17
|
+
//item混排的回调
|
|
18
|
+
const provideData = () => {
|
|
19
|
+
return advanceMix;
|
|
20
|
+
};
|
|
21
|
+
const measures = (item) => {
|
|
22
|
+
return {
|
|
23
|
+
width: item.width,
|
|
24
|
+
height: item.height,
|
|
25
|
+
marginRight: item.marginRight,
|
|
26
|
+
marginBottom: item.marginBottom,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
const onEdge = (edgeInfo) => {
|
|
30
|
+
if (edgeInfo.direction == EdgeDirection.right) {
|
|
31
|
+
foucsHub.setFocus("mwWidget");
|
|
32
|
+
} else if (edgeInfo.direction == EdgeDirection.top) {
|
|
33
|
+
foucsHub.setFocus("mwButton");
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<template>
|
|
39
|
+
<div
|
|
40
|
+
:style="{
|
|
41
|
+
left: 50,
|
|
42
|
+
top: 350,
|
|
43
|
+
width: 300,
|
|
44
|
+
height: 400,
|
|
45
|
+
fontSize: 30,
|
|
46
|
+
color: '#FFFFFF',
|
|
47
|
+
}"
|
|
48
|
+
>
|
|
49
|
+
{{ `item可以普通描画控件和可获焦控件混排` }}
|
|
50
|
+
</div>
|
|
51
|
+
<metro-widget
|
|
52
|
+
name="mwMix"
|
|
53
|
+
:top="450"
|
|
54
|
+
:left="50"
|
|
55
|
+
:provideData="provideData"
|
|
56
|
+
:width="260"
|
|
57
|
+
:height="440"
|
|
58
|
+
:padding="{
|
|
59
|
+
top: 20,
|
|
60
|
+
left: 20,
|
|
61
|
+
}"
|
|
62
|
+
:direction="VERTICAL"
|
|
63
|
+
:measures="measures"
|
|
64
|
+
:onEdge="onEdge"
|
|
65
|
+
>
|
|
66
|
+
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
67
|
+
<button-item
|
|
68
|
+
v-if="data.type == 'button'"
|
|
69
|
+
:data="data"
|
|
70
|
+
:query="query"
|
|
71
|
+
:onAction="onAction"
|
|
72
|
+
:onItemEdge="onItemEdge"
|
|
73
|
+
/>
|
|
74
|
+
<item v-else :data="data" :query="query" :onAction="onAction" />
|
|
75
|
+
</template>
|
|
76
|
+
</metro-widget>
|
|
77
|
+
</template>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-07-11 13:31:36
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-07-18 09:59:32
|
|
6
|
+
* @Description: file content
|
|
7
|
+
-->
|
|
8
|
+
<script setup>
|
|
9
|
+
import { MetroWidget, VERTICAL, EdgeDirection } from "jsview";
|
|
10
|
+
import { useFocusHub } from "jsview";
|
|
11
|
+
import { advanceMetroWidget } from "../data";
|
|
12
|
+
import WidgetItem from "../WidgetItem.vue";
|
|
13
|
+
|
|
14
|
+
const foucsHub = useFocusHub();
|
|
15
|
+
|
|
16
|
+
//item为Widgetitem的一些回调
|
|
17
|
+
const provideData = () => {
|
|
18
|
+
return advanceMetroWidget;
|
|
19
|
+
};
|
|
20
|
+
// measures中会返回doSlide: false, 既MetroWidget自身不处理滚动, 滚动由子的sendFocusRectEvent控制
|
|
21
|
+
const measures = (item) => {
|
|
22
|
+
return {
|
|
23
|
+
width: item.width,
|
|
24
|
+
height: item.height,
|
|
25
|
+
marginRight: item.marginRight,
|
|
26
|
+
marginBottom: item.marginBottom,
|
|
27
|
+
doSlide: false,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const onEdge = (edgeInfo) => {
|
|
31
|
+
if (edgeInfo.direction == EdgeDirection.left) {
|
|
32
|
+
foucsHub.setFocus("mwButton");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<template>
|
|
38
|
+
<div
|
|
39
|
+
:style="{
|
|
40
|
+
left: 500,
|
|
41
|
+
top: 50,
|
|
42
|
+
width: 500,
|
|
43
|
+
height: 400,
|
|
44
|
+
fontSize: 30,
|
|
45
|
+
color: '#FFFFFF',
|
|
46
|
+
}"
|
|
47
|
+
>
|
|
48
|
+
{{ `进一步, MetroWidget的item\n可以是包含MetroWidget的组件` }}
|
|
49
|
+
</div>
|
|
50
|
+
<metro-widget
|
|
51
|
+
name="mwWidget"
|
|
52
|
+
:top="150"
|
|
53
|
+
:left="400"
|
|
54
|
+
:provideData="provideData"
|
|
55
|
+
:width="600"
|
|
56
|
+
:height="600"
|
|
57
|
+
:direction="VERTICAL"
|
|
58
|
+
:measures="measures"
|
|
59
|
+
:onEdge="onEdge"
|
|
60
|
+
>
|
|
61
|
+
<!-- data为每个item的数据, query提供获取MetroWidget内部状态的一些接口, onAction提供item注册自身回调的接口, onItemEdge则是item内部焦点处理到达边缘后, 需要通知MetroWidget时的回调 -->
|
|
62
|
+
<template #renderItem="{ data, query, onAction, onItemEdge }">
|
|
63
|
+
<widget-item
|
|
64
|
+
:data="data"
|
|
65
|
+
:query="query"
|
|
66
|
+
:onAction="onAction"
|
|
67
|
+
:onItemEdge="onItemEdge"
|
|
68
|
+
/>
|
|
69
|
+
</template>
|
|
70
|
+
</metro-widget>
|
|
71
|
+
</template>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: ChenChanghua
|
|
3
|
+
* @Date: 2022-07-11 13:31:36
|
|
4
|
+
* @LastEditors: ChenChanghua
|
|
5
|
+
* @LastEditTime: 2022-07-18 10:03:44
|
|
6
|
+
* @Description: file content
|
|
7
|
+
-->
|
|
8
|
+
<script setup>
|
|
9
|
+
import { MetroWidget, WholePageSlide, HORIZONTAL, EdgeDirection } from "jsview";
|
|
10
|
+
import { useFocusHub } from "jsview";
|
|
11
|
+
import { simpleDataAbs } from "../data";
|
|
12
|
+
import Item from "../Item.vue";
|
|
13
|
+
const foucsHub = useFocusHub();
|
|
14
|
+
|
|
15
|
+
const wholePageSlide = new WholePageSlide();
|
|
16
|
+
|
|
17
|
+
const provideDataAbs = () => {
|
|
18
|
+
return simpleDataAbs;
|
|
19
|
+
};
|
|
20
|
+
const measuresAbs = (item) => {
|
|
21
|
+
return {
|
|
22
|
+
width: item.width,
|
|
23
|
+
height: item.height,
|
|
24
|
+
marginRight: item.marginRight,
|
|
25
|
+
marginBottom: item.marginBottom,
|
|
26
|
+
left: item.left,
|
|
27
|
+
top: item.top,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const onEdgeAbs = (edgeInfo) => {
|
|
31
|
+
if (edgeInfo.direction == EdgeDirection.left) {
|
|
32
|
+
foucsHub.setFocus("mw");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<template>
|
|
38
|
+
<div
|
|
39
|
+
:style="{
|
|
40
|
+
left: 700,
|
|
41
|
+
top: 50,
|
|
42
|
+
width: 700,
|
|
43
|
+
height: 50,
|
|
44
|
+
color: '#FFFFFF',
|
|
45
|
+
fontSize: 30,
|
|
46
|
+
}"
|
|
47
|
+
>
|
|
48
|
+
绝对坐标布局
|
|
49
|
+
</div>
|
|
50
|
+
<!-- 绝对坐标布局, 将layoutType设为absolute, measures返回的对象需要有left,top信息 -->
|
|
51
|
+
<metro-widget
|
|
52
|
+
name="mwAbs"
|
|
53
|
+
:top="150"
|
|
54
|
+
:left="700"
|
|
55
|
+
:provideData="provideDataAbs"
|
|
56
|
+
:width="500"
|
|
57
|
+
:height="400"
|
|
58
|
+
:padding="{
|
|
59
|
+
left: 50,
|
|
60
|
+
top: 50,
|
|
61
|
+
right: 50,
|
|
62
|
+
bottom: 50,
|
|
63
|
+
}"
|
|
64
|
+
:direction="HORIZONTAL"
|
|
65
|
+
:measures="measuresAbs"
|
|
66
|
+
:slideSetting="wholePageSlide"
|
|
67
|
+
:onEdge="onEdgeAbs"
|
|
68
|
+
layoutType="absolute"
|
|
69
|
+
>
|
|
70
|
+
<!-- data为每个item的数据, query提供获取MetroWidget内部状态的一些接口, onAction提供item注册自身回调的接口 -->
|
|
71
|
+
<template #renderItem="{ data, query, onAction }">
|
|
72
|
+
<item :data="data" :query="query" :onAction="onAction" />
|
|
73
|
+
</template>
|
|
74
|
+
</metro-widget>
|
|
75
|
+
</template>
|
|
@@ -2,24 +2,18 @@
|
|
|
2
2
|
* @Author: ChenChanghua
|
|
3
3
|
* @Date: 2022-07-11 13:31:36
|
|
4
4
|
* @LastEditors: ChenChanghua
|
|
5
|
-
* @LastEditTime: 2022-07-
|
|
5
|
+
* @LastEditTime: 2022-07-18 10:06:28
|
|
6
6
|
* @Description: file content
|
|
7
7
|
-->
|
|
8
8
|
<script setup>
|
|
9
9
|
import { MetroWidget, WholePageSlide, HORIZONTAL, EdgeDirection } from "jsview";
|
|
10
10
|
import { useRouter } from "vue-router";
|
|
11
|
-
import { ref } from "vue";
|
|
12
11
|
import { useFocusHub } from "jsview";
|
|
13
|
-
import
|
|
14
|
-
import
|
|
12
|
+
import AbsoluteTemplate from "./AbsoluteTemplate.vue";
|
|
13
|
+
import RelativeTemplate from "./RelativeTemplate.vue";
|
|
15
14
|
|
|
16
15
|
const router = useRouter();
|
|
17
16
|
const foucsHub = useFocusHub();
|
|
18
|
-
const mwRef = ref(null);
|
|
19
|
-
|
|
20
|
-
const wholePageSlide = new WholePageSlide();
|
|
21
|
-
let innerData = simpleData.concat();
|
|
22
|
-
let dataPool = [];
|
|
23
17
|
|
|
24
18
|
const onFocus = () => {
|
|
25
19
|
foucsHub.setFocus("button");
|
|
@@ -30,66 +24,6 @@ const onKeyDown = (ev) => {
|
|
|
30
24
|
}
|
|
31
25
|
return true;
|
|
32
26
|
};
|
|
33
|
-
|
|
34
|
-
const provideData = () => {
|
|
35
|
-
return innerData;
|
|
36
|
-
};
|
|
37
|
-
const measures = (item) => {
|
|
38
|
-
return {
|
|
39
|
-
width: item.width,
|
|
40
|
-
height: item.height,
|
|
41
|
-
marginRight: item.marginRight,
|
|
42
|
-
marginBottom: item.marginBottom,
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
const onEdge = (edgeInfo) => {
|
|
46
|
-
// MetroWidget焦点到达边缘后的回调
|
|
47
|
-
if (edgeInfo.direction == EdgeDirection.top) {
|
|
48
|
-
buttonFocus.value = true;
|
|
49
|
-
foucsHub.setFocus("button");
|
|
50
|
-
} else if (edgeInfo.direction == EdgeDirection.right) {
|
|
51
|
-
foucsHub.setFocus("mwAbs");
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const buttonFocus = ref(true);
|
|
56
|
-
const buttonOnKeyDown = (ev) => {
|
|
57
|
-
switch (ev.keyCode) {
|
|
58
|
-
case 40:
|
|
59
|
-
buttonFocus.value = false;
|
|
60
|
-
foucsHub.setFocus("mw");
|
|
61
|
-
break;
|
|
62
|
-
case 13:
|
|
63
|
-
if (innerData.length == simpleData.length) {
|
|
64
|
-
innerData = [];
|
|
65
|
-
dataPool = simpleData.concat();
|
|
66
|
-
} else {
|
|
67
|
-
innerData.push(dataPool.shift());
|
|
68
|
-
}
|
|
69
|
-
mwRef.value?.refreshData(true);
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const provideDataAbs = () => {
|
|
76
|
-
return simpleDataAbs;
|
|
77
|
-
};
|
|
78
|
-
const measuresAbs = (item) => {
|
|
79
|
-
return {
|
|
80
|
-
width: item.width,
|
|
81
|
-
height: item.height,
|
|
82
|
-
marginRight: item.marginRight,
|
|
83
|
-
marginBottom: item.marginBottom,
|
|
84
|
-
left: item.left,
|
|
85
|
-
top: item.top,
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
const onEdgeAbs = (edgeInfo) => {
|
|
89
|
-
if (edgeInfo.direction == EdgeDirection.left) {
|
|
90
|
-
foucsHub.setFocus("mw");
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
27
|
</script>
|
|
94
28
|
|
|
95
29
|
<template>
|
|
@@ -105,90 +39,7 @@ const onEdgeAbs = (edgeInfo) => {
|
|
|
105
39
|
backgroundColor: '#007788',
|
|
106
40
|
}"
|
|
107
41
|
>
|
|
108
|
-
<
|
|
109
|
-
|
|
110
|
-
:onAction="{
|
|
111
|
-
onKeyDown: buttonOnKeyDown,
|
|
112
|
-
}"
|
|
113
|
-
>
|
|
114
|
-
<div
|
|
115
|
-
:style="{
|
|
116
|
-
left: 100,
|
|
117
|
-
top: 50,
|
|
118
|
-
width: 500,
|
|
119
|
-
height: 100,
|
|
120
|
-
color: '#FFFFFF',
|
|
121
|
-
fontSize: 30,
|
|
122
|
-
backgroundColor: buttonFocus ? '#AA0000' : '#444444',
|
|
123
|
-
}"
|
|
124
|
-
>
|
|
125
|
-
{{ `自适应布局\n获焦时按确认查看时item排布的方式` }}
|
|
126
|
-
</div>
|
|
127
|
-
</jsv-focus-block>
|
|
128
|
-
|
|
129
|
-
<!-- item的排布区域为600*300, 但由于获焦时需要放大, 因此需要往外扩展padding, 合起来宽高为700*400 -->
|
|
130
|
-
<metro-widget
|
|
131
|
-
name="mw"
|
|
132
|
-
ref="mwRef"
|
|
133
|
-
:top="150"
|
|
134
|
-
:left="50"
|
|
135
|
-
:provideData="provideData"
|
|
136
|
-
:width="500"
|
|
137
|
-
:height="400"
|
|
138
|
-
:padding="{
|
|
139
|
-
left: 50,
|
|
140
|
-
top: 50,
|
|
141
|
-
right: 50,
|
|
142
|
-
bottom: 50,
|
|
143
|
-
}"
|
|
144
|
-
:direction="HORIZONTAL"
|
|
145
|
-
:measures="measures"
|
|
146
|
-
:slideSetting="wholePageSlide"
|
|
147
|
-
:onEdge="onEdge"
|
|
148
|
-
>
|
|
149
|
-
<!-- data为每个item的数据, query提供获取MetroWidget内部状态的一些接口, onAction提供item注册自身回调的接口 -->
|
|
150
|
-
<template #renderItem="{ data, query, onAction }">
|
|
151
|
-
<item :data="data" :query="query" :onAction="onAction" />
|
|
152
|
-
</template>
|
|
153
|
-
</metro-widget>
|
|
154
|
-
|
|
155
|
-
<div
|
|
156
|
-
:style="{
|
|
157
|
-
left: 700,
|
|
158
|
-
top: 50,
|
|
159
|
-
width: 700,
|
|
160
|
-
height: 50,
|
|
161
|
-
color: '#FFFFFF',
|
|
162
|
-
fontSize: 30,
|
|
163
|
-
}"
|
|
164
|
-
>
|
|
165
|
-
绝对坐标布局
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
<!-- 绝对坐标布局, 将layoutType设为absolute, measures返回的对象需要有left,top信息 -->
|
|
169
|
-
<metro-widget
|
|
170
|
-
name="mwAbs"
|
|
171
|
-
:top="150"
|
|
172
|
-
:left="700"
|
|
173
|
-
:provideData="provideDataAbs"
|
|
174
|
-
:width="500"
|
|
175
|
-
:height="400"
|
|
176
|
-
:padding="{
|
|
177
|
-
left: 50,
|
|
178
|
-
top: 50,
|
|
179
|
-
right: 50,
|
|
180
|
-
bottom: 50,
|
|
181
|
-
}"
|
|
182
|
-
:direction="HORIZONTAL"
|
|
183
|
-
:measures="measuresAbs"
|
|
184
|
-
:slideSetting="wholePageSlide"
|
|
185
|
-
:onEdge="onEdgeAbs"
|
|
186
|
-
layoutType="absolute"
|
|
187
|
-
>
|
|
188
|
-
<!-- data为每个item的数据, query提供获取MetroWidget内部状态的一些接口, onAction提供item注册自身回调的接口 -->
|
|
189
|
-
<template #renderItem="{ data, query, onAction }">
|
|
190
|
-
<item :data="data" :query="query" :onAction="onAction" />
|
|
191
|
-
</template>
|
|
192
|
-
</metro-widget>
|
|
42
|
+
<absolute-template></absolute-template>
|
|
43
|
+
<relative-template></relative-template>
|
|
193
44
|
</jsv-focus-block>
|
|
194
45
|
</template>
|