@shijiu/jsview-vue 0.9.500 → 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.
Files changed (223) 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/target_core_revision.js +4 -3
  4. package/index.js +10 -0
  5. package/package.json +8 -1
  6. package/patches/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +16 -5
  7. package/samples/AnimPicture/App.vue +89 -106
  8. package/samples/Basic/App.vue +65 -68
  9. package/samples/Basic/components/ContentBlock.vue +31 -36
  10. package/samples/Basic/components/anim/AnimGroup.vue +61 -75
  11. package/samples/Basic/components/anim/AnimKeyframeBasic.vue +54 -43
  12. package/samples/Basic/components/anim/AnimKeyframeComposite.vue +25 -31
  13. package/samples/Basic/components/anim/AnimTransition.vue +142 -105
  14. package/samples/Basic/components/div/DivBackground.vue +38 -16
  15. package/samples/Basic/components/div/DivClip.vue +143 -78
  16. package/samples/Basic/components/div/DivCssScoped.vue +10 -10
  17. package/samples/Basic/components/div/DivCssVar.vue +40 -42
  18. package/samples/Basic/components/div/DivGroup1.vue +45 -39
  19. package/samples/Basic/components/div/DivGroup2.vue +56 -45
  20. package/samples/Basic/components/div/DivLayout.vue +63 -5
  21. package/samples/Basic/components/div/DivRadius.vue +51 -42
  22. package/samples/Basic/components/div/DivTransform.vue +21 -16
  23. package/samples/Basic/components/panel/Panel1.vue +46 -44
  24. package/samples/Basic/components/panel/Panel2.vue +22 -26
  25. package/samples/Basic/components/panel/TitleBar.vue +12 -12
  26. package/samples/Basic/components/text/TextAlign.vue +54 -44
  27. package/samples/Basic/components/text/TextEmoji.vue +16 -20
  28. package/samples/Basic/components/text/TextFontStyle.vue +77 -53
  29. package/samples/Basic/components/text/TextGroup1.vue +46 -38
  30. package/samples/Basic/components/text/TextGroup2.vue +25 -28
  31. package/samples/Basic/components/text/TextOverflow.vue +76 -57
  32. package/samples/BasicFocusControl/App.vue +22 -43
  33. package/samples/BasicFocusControl/components/BaseBlock.vue +42 -43
  34. package/samples/BasicFocusControl/components/MainArea.vue +55 -70
  35. package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +11 -15
  36. package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +21 -24
  37. package/samples/BasicFocusControl/components/SideBar.vue +32 -47
  38. package/samples/BasicFocusControl/components/SideBarBlock.vue +20 -23
  39. package/samples/ColorSpace/App.vue +15 -24
  40. package/samples/DemoHomepage/App.vue +7 -11
  41. package/samples/DemoHomepage/components/BodyFrame.vue +19 -9
  42. package/samples/DemoHomepage/components/TabFrame.vue +7 -8
  43. package/samples/DemoHomepage/router.js +33 -34
  44. package/samples/DemoHomepage/views/Homepage.vue +24 -8
  45. package/samples/FilterDemo/AnimatePic.vue +58 -0
  46. package/samples/FilterDemo/App.vue +99 -61
  47. package/samples/FilterDemo/VideoLayer.vue +62 -0
  48. package/samples/FlipCard/App.vue +32 -41
  49. package/samples/FlipCard/FlipCard.vue +48 -54
  50. package/samples/GridDemo/App.vue +109 -77
  51. package/samples/GridDemo/ButtonBlock.vue +50 -49
  52. package/samples/GridDemo/FocusItem.vue +19 -38
  53. package/samples/GridDemo/Item.vue +46 -54
  54. package/samples/HashHistory/App.vue +63 -79
  55. package/samples/HashHistory/components/HorizontalButtonList.vue +72 -95
  56. package/samples/HashHistory/components/Item.vue +42 -56
  57. package/samples/HashHistory/router.js +23 -12
  58. package/samples/HashHistory/views/MainPage.vue +35 -46
  59. package/samples/HashHistory/views/SubPage.vue +34 -47
  60. package/samples/Input/App.vue +2 -3
  61. package/samples/Input/FullKeyboard.vue +2 -6
  62. package/samples/Input/InputPanel.vue +2 -3
  63. package/samples/Input/KeyboardItem.vue +1 -1
  64. package/samples/LongImage/App.vue +11 -27
  65. package/samples/LongImage/Button.vue +50 -145
  66. package/samples/LongImage/ButtonItem.vue +44 -0
  67. package/samples/LongImage/LongImageScroll.vue +71 -106
  68. package/samples/LongImage/Scroll.vue +7 -9
  69. package/samples/LongText/App.vue +13 -28
  70. package/samples/LongText/Button.vue +43 -145
  71. package/samples/LongText/ButtonItem.vue +44 -0
  72. package/samples/LongText/LongTextScroll.vue +68 -101
  73. package/samples/LongText/Scroll.vue +7 -9
  74. package/samples/Marquee/App.vue +34 -37
  75. package/samples/MaskClip/App.vue +17 -30
  76. package/samples/MetroWidgetDemos/Advanced/App.vue +47 -0
  77. package/samples/MetroWidgetDemos/Advanced/ButtonItem.vue +90 -0
  78. package/samples/MetroWidgetDemos/Advanced/Buttons.vue +70 -0
  79. package/samples/MetroWidgetDemos/Advanced/Mixed.vue +77 -0
  80. package/samples/MetroWidgetDemos/Advanced/Widgets.vue +71 -0
  81. package/samples/MetroWidgetDemos/Item.vue +67 -0
  82. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/App.vue +80 -104
  83. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/Item.vue +7 -0
  84. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/bg.jpg +0 -0
  85. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_content.png +0 -0
  86. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_left.png +0 -0
  87. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_mid.png +0 -0
  88. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/coupon_right.png +0 -0
  89. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/focus_border.png +0 -0
  90. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/holder_logo.png +0 -0
  91. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/jrbm.png +0 -0
  92. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_left.png +0 -0
  93. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_mid.png +0 -0
  94. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/line_right.png +0 -0
  95. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/loading.png +0 -0
  96. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/logo.png +0 -0
  97. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/mcjx.png +0 -0
  98. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/tao.png +0 -0
  99. package/samples/{ClassNameDemo → MetroWidgetDemos/PerformanceTest}/assets/tmall.png +0 -0
  100. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/border.png +0 -0
  101. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/components/ContentItem.vue +60 -86
  102. package/samples/{SimpleWidgetDemo → MetroWidgetDemos/PerformanceTest}/components/MyTab.vue +0 -0
  103. package/samples/MetroWidgetDemos/PerformanceTest/data.js +45 -0
  104. package/samples/MetroWidgetDemos/PingPong/App.vue +135 -0
  105. package/samples/MetroWidgetDemos/PingPong/AppPage.vue +58 -0
  106. package/samples/MetroWidgetDemos/PingPong/AppTab.vue +69 -0
  107. package/samples/MetroWidgetDemos/PingPong/Item.vue +92 -0
  108. package/samples/MetroWidgetDemos/PingPong/ViewSwiper.vue +214 -0
  109. package/samples/MetroWidgetDemos/Simple/AbsoluteTemplate.vue +75 -0
  110. package/samples/MetroWidgetDemos/Simple/App.vue +45 -0
  111. package/samples/MetroWidgetDemos/Simple/RelativeTemplate.vue +111 -0
  112. package/samples/MetroWidgetDemos/WidgetItem.vue +89 -0
  113. package/samples/MetroWidgetDemos/data.js +204 -0
  114. package/samples/NinePatchDemo/App.vue +114 -115
  115. package/samples/NinePatchDemo/Item.vue +7 -8
  116. package/samples/Preload/App.vue +61 -63
  117. package/samples/Preload/Item.vue +21 -29
  118. package/samples/QrcodeDemo/App.vue +24 -29
  119. package/samples/SoundPool/App.vue +77 -106
  120. package/samples/SprayView/App.vue +10 -8
  121. package/samples/SpriteImage/App.vue +1 -2
  122. package/samples/TextBox/App.vue +86 -101
  123. package/samples/TextBox/RenderCenter.vue +1 -1
  124. package/samples/TextBox/RenderLeft.vue +1 -1
  125. package/samples/TextBox/RenderOneLine.vue +1 -1
  126. package/samples/TextBox/RenderRight.vue +1 -1
  127. package/samples/TextShadowDemo/App.vue +1 -2
  128. package/samples/TextureAnimation/App.vue +16 -13
  129. package/samples/TextureSize/App.vue +15 -25
  130. package/samples/ThrowMoveDemo/AccelerateDemo.vue +2 -4
  131. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +2 -3
  132. package/samples/ThrowMoveDemo/TargetDemo.vue +3 -4
  133. package/samples/ThrowMoveDemo/UDParabolicDemo.vue +2 -3
  134. package/samples/TouchSample/App.vue +2 -3
  135. package/samples/TouchSample/Item.vue +15 -13
  136. package/samples/TouchSample/MetroWidgetHorizontal.vue +2 -2
  137. package/samples/TouchSample/MetroWidgetVertical.vue +1 -1
  138. package/samples/TouchSample/TouchContainerHorizontal.vue +4 -3
  139. package/samples/TouchSample/TouchContainerVertical.vue +3 -2
  140. package/samples/TransitPage/App.vue +20 -32
  141. package/samples/VideoDemo/App.vue +65 -81
  142. package/samples/VideoDemo/components/Button.vue +41 -52
  143. package/samples/VideoDemo/components/Controllor.vue +171 -169
  144. package/samples/VideoDemo/components/VideoFrame.vue +87 -99
  145. package/samples/VisibleSensorDemo/App.vue +167 -0
  146. package/scripts/jsview-jsmap-serve.js +42 -0
  147. package/scripts/jsview-post-install.js +1 -1
  148. package/tsconfig.json +3 -0
  149. package/utils/JsViewEngineWidget/JsvFocusBlock.vue +204 -193
  150. package/utils/JsViewEngineWidget/JsvFocusManager.js +30 -17
  151. package/utils/JsViewEngineWidget/MetroWidget/MetroWidget.vue +1561 -1656
  152. package/utils/JsViewEngineWidget/MetroWidget/PageUpdater.js +136 -0
  153. package/utils/JsViewEngineWidget/MetroWidget/ToolFunctions.js +18 -0
  154. package/utils/JsViewEngineWidget/TemplateParser.js +111 -1
  155. package/utils/JsViewEngineWidget/WidgetCommon.js +8 -2
  156. package/utils/JsViewEngineWidget/index.js +4 -4
  157. package/utils/JsViewPlugin/JsvPlayer/GetVersion.js +1 -1
  158. package/utils/JsViewPlugin/JsvPlayer/JsvMedia.js +266 -57
  159. package/utils/JsViewPlugin/JsvPlayer/JsvPlayer.vue +5 -1
  160. package/utils/JsViewPlugin/JsvPlayer/version.js +5 -5
  161. package/utils/JsViewVueTools/JsvRefTaker.js +35 -0
  162. package/utils/JsViewVueTools/index.js +19 -0
  163. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +8 -4
  164. package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +2 -2
  165. package/utils/JsViewVueWidget/JsvFilterView.vue +59 -51
  166. package/utils/JsViewVueWidget/JsvGrid.vue +139 -41
  167. package/utils/JsViewVueWidget/JsvMaskClipDiv.vue +3 -1
  168. package/utils/JsViewVueWidget/JsvNativeSharedDiv.vue +8 -17
  169. package/utils/JsViewVueWidget/JsvNinePatch.vue +1 -1
  170. package/utils/JsViewVueWidget/JsvPosterDiv.vue +37 -7
  171. package/utils/JsViewVueWidget/JsvPosterImage.vue +34 -13
  172. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +2 -12
  173. package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +1 -1
  174. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +13 -10
  175. package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +2 -3
  176. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +6 -1
  177. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +6 -1
  178. package/utils/JsViewVueWidget/JsvTextureAnim/JsvTextureAnim.vue +25 -21
  179. package/utils/JsViewVueWidget/JsvTransparentDiv.vue +7 -8
  180. package/utils/JsViewVueWidget/JsvVisibleSensor/JsvVisibleSensor.vue +141 -0
  181. package/utils/JsViewVueWidget/JsvVisibleSensor/index.js +9 -0
  182. package/utils/JsViewVueWidget/index.js +42 -0
  183. package/samples/AdvanceMetroWidget/App.vue +0 -123
  184. package/samples/AdvanceMetroWidget/Frame.vue +0 -102
  185. package/samples/AdvanceMetroWidget/Item.vue +0 -63
  186. package/samples/AdvanceMetroWidget/data.js +0 -137
  187. package/samples/ClassNameDemo/App.vue +0 -119
  188. package/samples/ClassNameDemo/components/ContentItem.vue +0 -253
  189. package/samples/ClassNameDemo/components/LoadingView.vue +0 -43
  190. package/samples/ClassNameDemo/components/TitleView.vue +0 -24
  191. package/samples/ClassNameDemo/data.js +0 -24
  192. package/samples/FlowMultiWidget/App.vue +0 -91
  193. package/samples/FlowMultiWidget/assets/nine_patch_focus.png +0 -0
  194. package/samples/FlowMultiWidget/components/Block.vue +0 -107
  195. package/samples/FlowMultiWidget/components/FlowPage.vue +0 -60
  196. package/samples/FlowMultiWidget/components/Item.vue +0 -103
  197. package/samples/FlowMultiWidget/components/MenuItem.vue +0 -72
  198. package/samples/FlowMultiWidget/components/MyMenu.vue +0 -90
  199. package/samples/FlowMultiWidget/data.js +0 -446
  200. package/samples/HashHistory/views/BasePage.vue +0 -19
  201. package/samples/HashHistory/views/SubPageFirst.vue +0 -10
  202. package/samples/HashHistory/views/SubPageSecond.vue +0 -10
  203. package/samples/SimpleWidgetDemo/assets/bg.jpg +0 -0
  204. package/samples/SimpleWidgetDemo/assets/coupon_content.png +0 -0
  205. package/samples/SimpleWidgetDemo/assets/coupon_left.png +0 -0
  206. package/samples/SimpleWidgetDemo/assets/coupon_mid.png +0 -0
  207. package/samples/SimpleWidgetDemo/assets/coupon_right.png +0 -0
  208. package/samples/SimpleWidgetDemo/assets/focus_border.png +0 -0
  209. package/samples/SimpleWidgetDemo/assets/holder_logo.png +0 -0
  210. package/samples/SimpleWidgetDemo/assets/jrbm.png +0 -0
  211. package/samples/SimpleWidgetDemo/assets/line_left.png +0 -0
  212. package/samples/SimpleWidgetDemo/assets/line_mid.png +0 -0
  213. package/samples/SimpleWidgetDemo/assets/line_right.png +0 -0
  214. package/samples/SimpleWidgetDemo/assets/loading.png +0 -0
  215. package/samples/SimpleWidgetDemo/assets/logo.png +0 -0
  216. package/samples/SimpleWidgetDemo/assets/mcjx.png +0 -0
  217. package/samples/SimpleWidgetDemo/assets/tao.png +0 -0
  218. package/samples/SimpleWidgetDemo/assets/tmall.png +0 -0
  219. package/samples/SimpleWidgetDemo/data.js +0 -124
  220. package/utils/JsViewEngineWidget/MetroWidget/ContentView.vue +0 -63
  221. package/utils/JsViewEngineWidget/MetroWidget/DivWrapper.vue +0 -51
  222. package/utils/JsViewEngineWidget/MetroWidget/ItemView.vue +0 -213
  223. package/utils/JsViewEngineWidget/MetroWidget/RootView.vue +0 -154
@@ -0,0 +1,90 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2022-07-11 13:26:24
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2022-07-11 17:00:47
6
+ * @Description: file content
7
+ -->
8
+ <script setup>
9
+ import { ref } from "vue";
10
+ import { useFocusHub } from "jsview";
11
+
12
+ const props = defineProps({
13
+ data: Object,
14
+ query: String,
15
+ onAction: Object,
16
+ onItemEdge: Function,
17
+ });
18
+ const focusHub = useFocusHub();
19
+
20
+ let focusIndex = ref(0);
21
+ let focused = ref(false);
22
+ let focusBlock = ref(null);
23
+
24
+ const onFocus = () => {
25
+ //onFocus时, 获得焦点, 以处理自己内部的焦点逻辑
26
+ focusHub.setFocus(props.data.name);
27
+ focused.value = true;
28
+ };
29
+ const onBlur = () => {
30
+ focused.value = false;
31
+ focusIndex.value = 0;
32
+ //onBlur的时候, 需要将焦点返还给父
33
+ focusBlock.value?.returnFocusToParent();
34
+ };
35
+ const onKeyDown = (ev) => {
36
+ if (ev.keyCode == 37 && focusIndex.value == 1) {
37
+ focusIndex.value = 0;
38
+ return true;
39
+ } else if (ev.keyCode == 39 && focusIndex.value == 0) {
40
+ focusIndex.value = 1;
41
+ return true;
42
+ } else if (ev.keyCode == 13) {
43
+ console.log("button click", props.data);
44
+ return true;
45
+ }
46
+ return false;
47
+ };
48
+
49
+ props.onAction.register("onFocus", onFocus);
50
+ props.onAction.register("onBlur", onBlur);
51
+ </script>
52
+
53
+ <template>
54
+ <jsv-focus-block
55
+ ref="focusBlock"
56
+ :name="data.name"
57
+ :onAction="{
58
+ onKeyDown: onKeyDown,
59
+ }"
60
+ >
61
+ <div
62
+ :style="{
63
+ width: 50,
64
+ height: 50,
65
+ fontSize: 20,
66
+ color: '#FFFFFF',
67
+ backgroundColor: '#00AA00',
68
+ }"
69
+ ></div>
70
+
71
+ <div
72
+ :style="{
73
+ left: 50,
74
+ width: 50,
75
+ height: 50,
76
+ backgroundColor: '#0000AA',
77
+ }"
78
+ ></div>
79
+
80
+ <div
81
+ :style="{
82
+ visibility: this.focused ? 'visible' : 'hidden',
83
+ left: 50 * focusIndex,
84
+ width: 10,
85
+ height: 10,
86
+ backgroundColor: '#FF0000',
87
+ }"
88
+ ></div>
89
+ </jsv-focus-block>
90
+ </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,67 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2022-05-10 15:21:24
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2022-07-11 17:00:58
6
+ * @Description: file content
7
+ -->
8
+ <script setup>
9
+ import { ref } from "vue";
10
+
11
+ const props = defineProps({
12
+ data: Object,
13
+ query: Object,
14
+ onAction: Object,
15
+ });
16
+
17
+ const focused = ref(false);
18
+
19
+ // 自身的焦点状态自己记录, 通过回调来改变
20
+ const onFocus = () => {
21
+ focused.value = true;
22
+ };
23
+ const onBlur = () => {
24
+ focused.value = false;
25
+ };
26
+ const onClick = () => {
27
+ console.log("item onclick ", props.data);
28
+ };
29
+
30
+ // 一般在create的时候进行回调的注册, 使用 option api的可以在created时进行注册
31
+ props.onAction.register("onFocus", onFocus);
32
+ props.onAction.register("onBlur", onBlur);
33
+ props.onAction.register("onClick", onClick);
34
+ </script>
35
+
36
+ <template>
37
+ <div
38
+ :style="{
39
+ width: data.width,
40
+ height: data.height,
41
+ transform: focused ? 'scale3d(1.2, 1.2, 1.2)' : '',
42
+ transition: 'transform 0.2s linear',
43
+ }"
44
+ >
45
+ <div
46
+ v-if="focused"
47
+ :style="{
48
+ left: -2,
49
+ top: -2,
50
+ width: data.width + 4,
51
+ height: data.height + 4,
52
+ backgroundColor: '#FF0000',
53
+ }"
54
+ ></div>
55
+ <div
56
+ :style="{
57
+ width: data.width,
58
+ height: data.height,
59
+ fontSize: '30px',
60
+ color: '#FFFFFF',
61
+ backgroundColor: data.color,
62
+ }"
63
+ >
64
+ {{ data.content }}
65
+ </div>
66
+ </div>
67
+ </template>
@@ -1,9 +1,9 @@
1
1
  <!--
2
2
  * 【界面概述】
3
- * 展示SimpleWidget控件的用法
3
+ * 展示MetroWidget控件的用法
4
4
  *
5
5
  * 【控件介绍】
6
- * SimpleWidget:
6
+ * MetroWidget:
7
7
  * top {int} 控件的y,默认为0
8
8
  * left {int} 控件的x, 默认为0
9
9
  * width {int} (必选)控件的宽
@@ -19,7 +19,7 @@
19
19
  * slideEasing {string} 页面滑动动画easing
20
20
 
21
21
  * data {array} (必选)数据列表
22
- * dispatcher {SWidgetDispatcher} 用于设置SimpleWidget控件内部的状态,默认为null
22
+ * dispatcher {SWidgetDispatcher} 用于设置MetroWidget控件内部的状态,默认为null
23
23
  * measures {function} (必选)返回item的模板信息的回调,
24
24
  * @params item {object} data中的数据
25
25
  * @return 模板信息,
@@ -49,8 +49,8 @@
49
49
  @params id {int} item的id
50
50
  @return {object} item的位置 {xPos, yPos, width, height}
51
51
  }
52
- * onEdge: 若单元格内另有可接管按键的控件(如SimpleWidget),该控件到达边缘需要通知SimpleWidget时的回调
53
- * onAction: 单元格内控件需要通过onAction.register方法向SimpleWidget注册onFocus, onBlur, onClick
52
+ * onEdge: 若单元格内另有可接管按键的控件(如MetroWidget),该控件到达边缘需要通知MetroWidget时的回调
53
+ * onAction: 单元格内控件需要通过onAction.register方法向MetroWidget注册onFocus, onBlur, onClick
54
54
  *
55
55
  * Q: 如何进行布局,定制每个格的尺寸?
56
56
  * A: 首先选定一个布局的方式,一列列地横向布局(HROIZONTAL)还是一行行地纵向(VERTICAL)布局,设置给属性direction
@@ -71,102 +71,88 @@
71
71
  * A: 当焦点移动到控件边缘时,会调用onEdge回调。在回调中通过参数传递的值来决定焦点转移的行为
72
72
  -->
73
73
 
74
- <script>
75
- import { Options, Vue } from "vue-class-component";
74
+ <script setup>
76
75
  import { data1, data2, data3 } from "./data";
77
- import {
78
- VERTICAL,
79
- SimpleWidget,
80
- EdgeDirection,
81
- } from "jsview/utils/JsViewEngineWidget";
82
- import JsvNinePatch from "jsview/utils/JsViewVueWidget/JsvNinePatch";
83
76
  import borderImgPath from "./border.png";
84
77
  import Item from "./components/ContentItem.vue";
85
78
  import MyTab from "./components/MyTab.vue";
79
+ import { ref, onMounted, onBeforeUnmount } from "vue";
80
+ import { useRouter } from "vue-router";
81
+ import {
82
+ VERTICAL,
83
+ MetroWidget,
84
+ EdgeDirection,
85
+ jJsvRuntimeBridge,
86
+ useFocusHub,
87
+ } from "jsview";
86
88
 
87
- @Options({
88
- components: {
89
- SimpleWidget,
90
- Item,
91
- JsvNinePatch,
92
- MyTab,
93
- },
94
- })
95
- class App extends Vue {
96
- constructor(props) {
97
- super(props);
98
- this.focusNode = null;
99
- this.direction = VERTICAL;
100
- this.contentData = data1;
101
- this.myId = 0;
102
- this.focusImgPath = borderImgPath;
103
- this.focusStyle = {};
104
- console.log("image path " + this.focusImgPath);
105
- this.requestDataTime = 0;
106
- }
89
+ const router = useRouter();
90
+ const focusHub = useFocusHub();
91
+ let contentData = data1;
92
+ let requestDataTime = 0;
93
+ const mwRef = ref(null);
107
94
 
108
- onKeyDown(ev) {
109
- // 8:Backspace, 27:Escape, 10000:盒子返回键
110
- if (ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
111
- this.$router?.go(-1); // 有router时,是从DemoHomepage进入,回退
112
- return true;
113
- }
114
- return false;
95
+ const onKeyDown = (ev) => {
96
+ // 8:Backspace, 27:Escape, 10000:盒子返回键
97
+ if (ev.keyCode == 8 || ev.keyCode == 27 || ev.keyCode == 10000) {
98
+ router.go(-1); // 有router时,是从DemoHomepage进入,回退
99
+ return true;
115
100
  }
101
+ return false;
102
+ };
116
103
 
117
- getMeasures() {
118
- return {
119
- width: 227,
120
- height: 351,
121
- focusable: true,
122
- };
104
+ const provideData = () => {
105
+ return contentData;
106
+ };
107
+ const measures = () => {
108
+ return {
109
+ width: 227,
110
+ height: 351,
111
+ focusable: true,
112
+ };
113
+ };
114
+ const onFocus = () => {
115
+ focusHub.setFocus("mw");
116
+ };
117
+ const onWidgetEdge = (edge) => {
118
+ if (edge.direction === EdgeDirection.top) {
119
+ focusHub.setFocus("tab");
123
120
  }
124
- onFocus() {
125
- console.log("App onFocus", this.$refs.rootNode);
126
- this.$refs.rootNode.findBlockByName("simpleWidget").requestFocus();
121
+ };
122
+ const onTabEdge = () => {
123
+ focusHub.setFocus("mw");
124
+ };
125
+ const onItemFocus = (id) => {
126
+ if (requestDataTime != 0) {
127
+ clearTimeout(requestDataTime);
128
+ requestDataTime = 0;
127
129
  }
128
- onWidgetEdge(edge) {
129
- if (edge.direction === EdgeDirection.top) {
130
- this.$refs.rootNode.findBlockByName("tab").requestFocus();
130
+ requestDataTime = setTimeout(() => {
131
+ switch (id) {
132
+ case 0:
133
+ contentData = data1;
134
+ break;
135
+ case 1:
136
+ contentData = data2;
137
+ break;
138
+ case 2:
139
+ contentData = data3;
140
+ break;
131
141
  }
132
- }
133
- onTabEdge() {
134
- this.$refs.rootNode.findBlockByName("simpleWidget").requestFocus();
135
- }
136
- onItemFocus(id) {
137
- if (this.requestDataTime != 0) {
138
- clearTimeout(this.requestDataTime);
139
- this.requestDataTime = 0;
140
- }
141
- this.requestDataTime = setTimeout(()=>{
142
- switch(id) {
143
- case 0:
144
- this.contentData = data1;
145
- break;
146
- case 1:
147
- this.contentData = data2;
148
- break;
149
- case 2:
150
- this.contentData = data3;
151
- break;
152
- }
153
- this.myId = id;
154
- }, 0);
155
- }
142
+ mwRef.value?.refreshData(true);
143
+ }, 0);
144
+ };
156
145
 
157
- beforeUnmount() {
158
- if (this.requestDataTime != 0) {
159
- clearTimeout(this.requestDataTime);
160
- this.requestDataTime = 0;
161
- }
162
- }
163
-
164
- mounted() {
165
- window.jJsvRuntimeBridge?.notifyPageLoaded();
146
+ onBeforeUnmount(() => {
147
+ if (requestDataTime != 0) {
148
+ clearTimeout(requestDataTime);
149
+ requestDataTime = 0;
166
150
  }
167
- }
151
+ });
168
152
 
169
- export default App;
153
+ onMounted(() => {
154
+ jJsvRuntimeBridge.notifyPageLoaded();
155
+ });
170
156
  </script>
171
157
 
172
158
  <template>
@@ -182,15 +168,15 @@ export default App;
182
168
  </div>
183
169
 
184
170
  <div class="widgetPos">
185
- <simple-widget
186
- name="simpleWidget"
187
- :key="myId"
188
- :data="contentData"
171
+ <metro-widget
172
+ name="mw"
173
+ ref="mwRef"
174
+ :provideData="provideData"
189
175
  :width="1253"
190
176
  :height="600"
191
177
  :padding="{ left: 26, top: 36, right: 26, bottom: 36 }"
192
- :direction="direction"
193
- :measures="getMeasures"
178
+ :direction="VERTICAL"
179
+ :measures="measures"
194
180
  :onEdge="onWidgetEdge"
195
181
  >
196
182
  <template #renderItem="{ data, query, onEdge, onAction }">
@@ -201,17 +187,7 @@ export default App;
201
187
  :onAction="onAction"
202
188
  />
203
189
  </template>
204
- </simple-widget>
205
- <div class="focusPos">
206
- <JsvNinePatch
207
- :style="focusStyle"
208
- :imageUrl="focusImgPath"
209
- :imageWidth="81"
210
- :contentWidth="25"
211
- :borderOutset="14"
212
- :animTime="0.2"
213
- />
214
- </div>
190
+ </metro-widget>
215
191
  </div>
216
192
  </div>
217
193
  </jsv-focus-block>
@@ -1,3 +1,10 @@
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2022-07-11 18:03:22
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2022-07-11 18:03:23
6
+ * @Description: file content
7
+ -->
1
8
  <script>
2
9
  export default {
3
10
  props: {