@ives_xxz/framework 1.0.0

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 (139) hide show
  1. package/FW.d.ts +1845 -0
  2. package/FW.d.ts.meta +6 -0
  3. package/Framework.ts +148 -0
  4. package/Framework.ts.meta +10 -0
  5. package/README.md +93 -0
  6. package/README.md.meta +6 -0
  7. package/animation/FWAnimation.ts +13 -0
  8. package/animation/FWAnimation.ts.meta +10 -0
  9. package/animation/FWSkeleton.ts +176 -0
  10. package/animation/FWSkeleton.ts.meta +10 -0
  11. package/animation/FWTween.ts +60 -0
  12. package/animation/FWTween.ts.meta +10 -0
  13. package/animation.meta +13 -0
  14. package/component/FWVirtualViewComponent.ts +2080 -0
  15. package/component/FWVirtualViewComponent.ts.meta +10 -0
  16. package/component.meta +13 -0
  17. package/config/FWAssetConfig.ts +7 -0
  18. package/config/FWAssetConfig.ts.meta +10 -0
  19. package/config.meta +13 -0
  20. package/controller/FWLayerController.ts +236 -0
  21. package/controller/FWLayerController.ts.meta +10 -0
  22. package/controller.meta +13 -0
  23. package/data/FWData.ts +10 -0
  24. package/data/FWData.ts.meta +10 -0
  25. package/data.meta +13 -0
  26. package/define/FWEventDefine.ts +26 -0
  27. package/define/FWEventDefine.ts.meta +10 -0
  28. package/define/FWSystemDefine.ts +133 -0
  29. package/define/FWSystemDefine.ts.meta +10 -0
  30. package/define.meta +13 -0
  31. package/entry/FWEntry.ts +196 -0
  32. package/entry/FWEntry.ts.meta +10 -0
  33. package/entry.meta +13 -0
  34. package/expand/FWCocosExpand.ts +73 -0
  35. package/expand/FWCocosExpand.ts.meta +10 -0
  36. package/expand/FWDecorator.ts +256 -0
  37. package/expand/FWDecorator.ts.meta +10 -0
  38. package/expand/FWRollingViewNesting.ts +191 -0
  39. package/expand/FWRollingViewNesting.ts.meta +10 -0
  40. package/expand/FWTweenExpand.ts +44 -0
  41. package/expand/FWTweenExpand.ts.meta +10 -0
  42. package/expand.meta +13 -0
  43. package/item/FWVirtualListItem.ts +150 -0
  44. package/item/FWVirtualListItem.ts.meta +10 -0
  45. package/item.meta +13 -0
  46. package/language/FWLanguage.ts +69 -0
  47. package/language/FWLanguage.ts.meta +10 -0
  48. package/language/FWLanguageLabelLocalize.ts +144 -0
  49. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  50. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  51. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  52. package/language/FWLanguageSpriteLocalize.ts +81 -0
  53. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  54. package/language.meta +13 -0
  55. package/layer/FWLayer.ts +13 -0
  56. package/layer/FWLayer.ts.meta +10 -0
  57. package/layer.meta +13 -0
  58. package/log/FWLog.ts +115 -0
  59. package/log/FWLog.ts.meta +10 -0
  60. package/log.meta +13 -0
  61. package/logic/FWLogic.ts +10 -0
  62. package/logic/FWLogic.ts.meta +10 -0
  63. package/logic.meta +13 -0
  64. package/machine/FWAnimationMachine.ts +28 -0
  65. package/machine/FWAnimationMachine.ts.meta +10 -0
  66. package/machine/FWStateMachine.ts +75 -0
  67. package/machine/FWStateMachine.ts.meta +10 -0
  68. package/machine.meta +13 -0
  69. package/manager/FWAnimationManager.ts +128 -0
  70. package/manager/FWAnimationManager.ts.meta +10 -0
  71. package/manager/FWAssetManager.ts +349 -0
  72. package/manager/FWAssetManager.ts.meta +10 -0
  73. package/manager/FWAudioManager.ts +289 -0
  74. package/manager/FWAudioManager.ts.meta +10 -0
  75. package/manager/FWBundleManager.ts +91 -0
  76. package/manager/FWBundleManager.ts.meta +10 -0
  77. package/manager/FWComponentManager.ts +25 -0
  78. package/manager/FWComponentManager.ts.meta +10 -0
  79. package/manager/FWEngineManager.ts +63 -0
  80. package/manager/FWEngineManager.ts.meta +10 -0
  81. package/manager/FWEventManager.ts +275 -0
  82. package/manager/FWEventManager.ts.meta +10 -0
  83. package/manager/FWHotUpdateManager.ts +213 -0
  84. package/manager/FWHotUpdateManager.ts.meta +10 -0
  85. package/manager/FWLanguageManager.ts +116 -0
  86. package/manager/FWLanguageManager.ts.meta +10 -0
  87. package/manager/FWLayerManager.ts +490 -0
  88. package/manager/FWLayerManager.ts.meta +10 -0
  89. package/manager/FWManager.ts +8 -0
  90. package/manager/FWManager.ts.meta +10 -0
  91. package/manager/FWObjectManager.ts +91 -0
  92. package/manager/FWObjectManager.ts.meta +10 -0
  93. package/manager/FWResManager.ts +171 -0
  94. package/manager/FWResManager.ts.meta +10 -0
  95. package/manager/FWSocketManager.ts +94 -0
  96. package/manager/FWSocketManager.ts.meta +10 -0
  97. package/manager/FWStateManager.ts +102 -0
  98. package/manager/FWStateManager.ts.meta +10 -0
  99. package/manager/FWTaskManager.ts +38 -0
  100. package/manager/FWTaskManager.ts.meta +10 -0
  101. package/manager/FWTimeManager.ts +473 -0
  102. package/manager/FWTimeManager.ts.meta +10 -0
  103. package/manager/FWUiManager.ts +164 -0
  104. package/manager/FWUiManager.ts.meta +10 -0
  105. package/manager.meta +13 -0
  106. package/package.json +17 -0
  107. package/package.json.meta +6 -0
  108. package/scene/FWScene.ts +25 -0
  109. package/scene/FWScene.ts.meta +10 -0
  110. package/scene.meta +13 -0
  111. package/service/FWService.ts +7 -0
  112. package/service/FWService.ts.meta +10 -0
  113. package/service/http/FWHttp.ts +70 -0
  114. package/service/http/FWHttp.ts.meta +10 -0
  115. package/service/http.meta +13 -0
  116. package/service/socket/FWSocket.ts +236 -0
  117. package/service/socket/FWSocket.ts.meta +10 -0
  118. package/service/socket/FWSocketHandle.ts +17 -0
  119. package/service/socket/FWSocketHandle.ts.meta +10 -0
  120. package/service/socket/FWSocketSender.ts +16 -0
  121. package/service/socket/FWSocketSender.ts.meta +10 -0
  122. package/service/socket.meta +13 -0
  123. package/service.meta +13 -0
  124. package/state/FWState.ts +8 -0
  125. package/state/FWState.ts.meta +10 -0
  126. package/state.meta +13 -0
  127. package/utils/FWLodash.ts +105 -0
  128. package/utils/FWLodash.ts.meta +10 -0
  129. package/utils/FWMask.ts +222 -0
  130. package/utils/FWMask.ts.meta +10 -0
  131. package/utils/FWObject.ts +22 -0
  132. package/utils/FWObject.ts.meta +10 -0
  133. package/utils/FWObjectPool.ts +178 -0
  134. package/utils/FWObjectPool.ts.meta +10 -0
  135. package/utils/FWQueue.ts +47 -0
  136. package/utils/FWQueue.ts.meta +10 -0
  137. package/utils/FWTask.ts +223 -0
  138. package/utils/FWTask.ts.meta +10 -0
  139. package/utils.meta +13 -0
@@ -0,0 +1,191 @@
1
+ import FWLog from '../log/FWLog';
2
+
3
+ const { ccclass, property, menu } = cc._decorator;
4
+
5
+ interface EventTouch extends cc.Event.EventTouch {
6
+ simulate?: boolean;
7
+ mock?: boolean; // 是否为模拟事件
8
+ }
9
+
10
+ @ccclass
11
+ @menu('CustomComponent/FWRollingViewNesting')
12
+ export default class FWRollingViewNesting extends cc.Component {
13
+ @property({
14
+ tooltip: '方向判定阈值(像素),小于该值不触发方向拦截',
15
+ min: 3,
16
+ max: 15,
17
+ })
18
+ dirThreshold = 15;
19
+
20
+ private scrollView: cc.ScrollView = null;
21
+ private _isBoundaryV = 0; //为没有开启滚动所以没有边界 1为上边界 2为下边界 3为不滑动;
22
+ private _isBoundaryH = 0; //为没有开启滚动所以没有边界 1为左边界 2为右边界 3为不滑动;
23
+
24
+ protected onEnable(): void {
25
+ this.scrollView = this.node.getComponent(cc.ScrollView);
26
+ if (this.scrollView) {
27
+ (this.scrollView as any).hasNestedViewGroup = (event, captureListeners) => {
28
+ if (event.eventPhase !== cc.Event.CAPTURING_PHASE) return false;
29
+ const hasNested = this._processNestedEvent(event, captureListeners);
30
+ // 只处理 TOUCH_END 和 TOUCH_CANCEL,且没有被嵌套拦截时,通知其他嵌套ViewGroup处理事件
31
+ if (
32
+ (event.type === cc.Node.EventType.TOUCH_END ||
33
+ event.type === cc.Node.EventType.TOUCH_CANCEL) &&
34
+ !hasNested
35
+ ) {
36
+ for (const item of captureListeners) {
37
+ this.onEnd(event, captureListeners, item);
38
+ }
39
+
40
+ this.onEnd(event, captureListeners, event.target);
41
+ }
42
+ return hasNested;
43
+ };
44
+ }
45
+ }
46
+
47
+ protected onDisable(): void {
48
+ this.unscheduleAllCallbacks();
49
+ }
50
+
51
+ private onEnd(event, captureListeners, item) {
52
+ if (item !== this.node) {
53
+ const viewGroup = item.getComponent(cc.ViewGroup);
54
+ if (viewGroup) {
55
+ if (
56
+ event.type === cc.Node.EventType.TOUCH_END &&
57
+ typeof viewGroup._onTouchEnded === 'function'
58
+ ) {
59
+ let touch = event.touch;
60
+ if (viewGroup.content) {
61
+ viewGroup._handleReleaseLogic(touch);
62
+ }
63
+ }
64
+ if (
65
+ event.type === cc.Node.EventType.TOUCH_CANCEL &&
66
+ typeof viewGroup._onTouchCancelled === 'function'
67
+ ) {
68
+ if (!event.simulate) {
69
+ let touch = event.touch;
70
+ if (viewGroup.content) {
71
+ viewGroup._handleReleaseLogic(touch);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ private _processNestedEvent(event: EventTouch, captureListeners: any[]): boolean {
80
+ if (!captureListeners) return false;
81
+
82
+ for (let i = 0; i < captureListeners.length; ++i) {
83
+ const item = captureListeners[i];
84
+ if (this.node === item) {
85
+ return event.target?.getComponent(cc.ViewGroup)
86
+ ? this.itemIsView(event.target, event)
87
+ : false;
88
+ }
89
+ if (item.getComponent(cc.ViewGroup)) {
90
+ return this.itemIsView(item, event);
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+
96
+ itemIsView(target: cc.Node, event: EventTouch): boolean {
97
+ const scrollView = target.getComponent(cc.ScrollView);
98
+ if (!scrollView) return false;
99
+
100
+ const delta = this._getTouchDelta(event);
101
+ this._checkBoundary(scrollView);
102
+
103
+ return this._shouldIntercept(delta, scrollView);
104
+ }
105
+
106
+ /**
107
+ * 获取当前触摸的移动距离
108
+ * @returns {cc.Vec2} 触摸移动的偏移量
109
+ */
110
+ private _getTouchDelta(event: EventTouch): cc.Vec2 {
111
+ if (!event) return cc.v2(0, 0);
112
+ // 使用事件的起始位置和当前位置计算偏移
113
+ const startPos = event.getStartLocation ? event.getStartLocation() : cc.v2(0, 0);
114
+ const currentPos = event.getLocation ? event.getLocation() : cc.v2(0, 0);
115
+ return currentPos.sub(startPos);
116
+ }
117
+ //边界检测
118
+ private _checkBoundary(scrollView: cc.ScrollView) {
119
+ const offset = scrollView.getScrollOffset();
120
+ const maxOffset = scrollView.getMaxScrollOffset();
121
+
122
+ // 垂直边界
123
+ if (!scrollView.vertical) {
124
+ this._isBoundaryV = 0;
125
+ } else if (maxOffset.y <= 2) {
126
+ this._isBoundaryV = 3; //内部不滑动
127
+ } else if (offset.y <= 10) {
128
+ this._isBoundaryV = 1; // 顶部边界
129
+ } else if (offset.y >= maxOffset.y - 10) {
130
+ this._isBoundaryV = 2; // 底部边界
131
+ } else {
132
+ this._isBoundaryV = 0;
133
+ }
134
+ // 水平边界
135
+ if (!scrollView.horizontal) {
136
+ this._isBoundaryH = 0;
137
+ } else if (maxOffset.x <= 2) {
138
+ this._isBoundaryH = 3; //内部不滑动
139
+ } else if (offset.x >= -10) {
140
+ this._isBoundaryH = 1; // 左边界
141
+ } else if (offset.x <= -maxOffset.x + 10) {
142
+ this._isBoundaryH = 2; // 右边界
143
+ } else {
144
+ this._isBoundaryH = 0;
145
+ }
146
+
147
+ // FWLog.response('_isBoundaryV:', this._isBoundaryV);
148
+ // FWLog.response('_isBoundaryH:', this._isBoundaryH);
149
+ // console.log('offsetx:%d,offsety:%d', offset.x, offset.y);
150
+ // console.log('maxOffsetx:%d,maxOffsety:%d', maxOffset.x, maxOffset.y);
151
+ }
152
+
153
+ //方向拦截,边界拦截
154
+ private _shouldIntercept(delta: cc.Vec2, scrollView: cc.ScrollView): boolean {
155
+ //console.log('deltax:%d,deltay:%d', delta.x, delta.y);
156
+ //判断水平方向位移
157
+ if (scrollView.horizontal && this.scrollView.horizontal) {
158
+ //同向位移
159
+ if (Math.abs(delta.x) > this.dirThreshold) {
160
+ // 左边界且向左滚动,或右边界且向右滚动,交给父级处理
161
+ if (
162
+ (this._isBoundaryH === 1 && delta.x > 0) ||
163
+ (this._isBoundaryH === 2 && delta.x < 0) ||
164
+ this._isBoundaryH === 3
165
+ ) {
166
+ return false;
167
+ }
168
+ // 非边界,自己处理
169
+ return true;
170
+ }
171
+ }
172
+ // 垂直方向拦截
173
+ if (scrollView.vertical && this.scrollView.vertical) {
174
+ if (Math.abs(delta.y) > this.dirThreshold) {
175
+ // 顶部边界且向下滚动,或底部边界且向上滚动,交给父级处理
176
+ if (
177
+ (this._isBoundaryV === 1 && delta.y < 0) ||
178
+ (this._isBoundaryV === 2 && delta.y > 0) ||
179
+ this._isBoundaryV === 3
180
+ ) {
181
+ return false;
182
+ }
183
+ // 非边界,自己处理
184
+ return true;
185
+ }
186
+ }
187
+
188
+ // 默认不拦截
189
+ return false;
190
+ }
191
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "3107e3b8-c4c4-41f0-8223-3e85b0b40821",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,44 @@
1
+ cc.ActionInterval.prototype.step = function (dt: number) {
2
+ if (this.paused) {
3
+ return;
4
+ }
5
+ if (this._firstTick && !this._goto) {
6
+ this._firstTick = false;
7
+ this._elapsed = 0;
8
+ } else {
9
+ this._elapsed += dt;
10
+ }
11
+ let t =
12
+ this._elapsed / (this._duration > 0.0000001192092896 ? this._duration : 0.0000001192092896);
13
+ t = 1 > t ? t : 1;
14
+ this.update(t > 0 ? t : 0);
15
+ //Compatible with repeat class, Discard after can be deleted (this._repeatMethod)
16
+ if (this._repeatMethod && this._timesForRepeat > 1 && this.isDone()) {
17
+ if (!this._repeatForever) {
18
+ this._timesForRepeat--;
19
+ }
20
+ this.startWithTarget(this.target);
21
+ this.step(this._elapsed - this._duration);
22
+ }
23
+ };
24
+
25
+ cc.Tween.prototype.pause = function () {
26
+ this._finalAction.paused = true;
27
+ };
28
+
29
+ cc.Tween.prototype.resume = function () {
30
+ this._finalAction.paused = false;
31
+ };
32
+
33
+ cc.Tween.prototype.setSpeed = function (speed: number) {
34
+ this._finalAction._speedMethod = true;
35
+ this._finalAction._speed = speed;
36
+ };
37
+
38
+ cc.Tween.prototype.getDuration = function () {
39
+ return this._finalAction._duration;
40
+ };
41
+
42
+ cc.Tween.prototype.getElapsed = function () {
43
+ return this._finalAction._elapsed;
44
+ };
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "93bd79eb-6b88-4783-a4c8-37d56fe720b4",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
package/expand.meta ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "ver": "1.1.3",
3
+ "uuid": "3261d225-82a8-4353-bd88-35178ac39c7a",
4
+ "importer": "folder",
5
+ "isBundle": false,
6
+ "bundleName": "",
7
+ "priority": 1,
8
+ "compressionType": {},
9
+ "optimizeHotUpdate": {},
10
+ "inlineSpriteFrames": {},
11
+ "isRemoteBundle": {},
12
+ "subMetas": {}
13
+ }
@@ -0,0 +1,150 @@
1
+ import FWVirtualViewComponent from '../component/FWVirtualViewComponent';
2
+ import FWObject from '../utils/FWObject';
3
+
4
+ /******************************************
5
+ * @author kL <klk0@qq.com>
6
+ * @date 2019/6/6
7
+ * @doc 列表Item组件.
8
+ * 说明:
9
+ * 1、此组件须配合List组件使用。(配套的配套的..)
10
+ * @end
11
+ ******************************************/
12
+ const { ccclass, property, disallowMultiple, menu, executionOrder } = cc._decorator;
13
+
14
+ enum SelectedType {
15
+ NONE = 0,
16
+ TOGGLE = 1,
17
+ SWITCH = 2,
18
+ }
19
+
20
+ @ccclass
21
+ @disallowMultiple()
22
+ @menu('CustomComponent/FWVirtualListItem')
23
+ @executionOrder(-5001) //先于List
24
+ export default class FWVirtualListItem extends FWObject {
25
+ onGet(args: any) {}
26
+ onPut() {}
27
+ onInit() {}
28
+
29
+ //选择模式
30
+ @property({
31
+ type: cc.Enum(SelectedType),
32
+ tooltip: CC_DEV && '选择模式',
33
+ })
34
+ selectedMode: SelectedType = SelectedType.NONE;
35
+
36
+ //自适应尺寸
37
+ @property({
38
+ tooltip: CC_DEV && '自适应尺寸(宽或高)',
39
+ })
40
+ adaptiveSize: boolean = false;
41
+
42
+ //按钮组件
43
+ private _btnCom: any;
44
+ get btnCom() {
45
+ if (!this._btnCom) this._btnCom = this.node.getComponent(cc.Button);
46
+ return this._btnCom;
47
+ }
48
+ //依赖的List组件
49
+ public list: FWVirtualViewComponent;
50
+ //是否已经注册过事件
51
+ private _eventReg = false;
52
+ //序列id
53
+ public listId: number;
54
+
55
+ onLoad() {}
56
+
57
+ onDestroy() {
58
+ this.node.off(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
59
+ }
60
+
61
+ _registerEvent() {
62
+ if (!this._eventReg) {
63
+ if (this.btnCom && this.list.selectedMode > 0) {
64
+ this.btnCom.clickEvents.unshift(this.createEvt(this, 'onClickThis'));
65
+ }
66
+ if (this.adaptiveSize) {
67
+ this.node.on(cc.Node.EventType.SIZE_CHANGED, this._onSizeChange, this);
68
+ }
69
+ this._eventReg = true;
70
+ }
71
+ }
72
+
73
+ _onSizeChange() {
74
+ this.list._onItemAdaptive(this.node);
75
+ }
76
+ /**
77
+ * 创建事件
78
+ * @param {cc.Component} component 组件脚本
79
+ * @param {string} handlerName 触发函数名称
80
+ * @param {cc.Node} node 组件所在node(不传的情况下取component.node)
81
+ * @returns cc.Component.EventHandler
82
+ */
83
+ createEvt(component: cc.Component, handlerName: string, node: cc.Node = null) {
84
+ if (!component.isValid) return; //有些异步加载的,节点以及销毁了。
85
+ component['comName'] =
86
+ component['comName'] ||
87
+ component.name
88
+ .match(/\<(.*?)\>/g)
89
+ .pop()
90
+ .replace(/\<|>/g, '');
91
+ let evt = new cc.Component.EventHandler();
92
+ evt.target = node || component.node;
93
+ evt.component = component['comName'];
94
+ evt.handler = handlerName;
95
+ return evt;
96
+ }
97
+
98
+ showAni(aniType: number, callFunc: Function, del: boolean) {
99
+ let t: any = this;
100
+ let tween: cc.Tween;
101
+ switch (aniType) {
102
+ case 0: //向上消失
103
+ tween = cc
104
+ .tween(t.node)
105
+ .to(0.2, { scale: 0.7 })
106
+ .by(0.3, { y: t.node.height * 2 });
107
+ break;
108
+ case 1: //向右消失
109
+ tween = cc
110
+ .tween(t.node)
111
+ .to(0.2, { scale: 0.7 })
112
+ .by(0.3, { x: t.node.width * 2 });
113
+ break;
114
+ case 2: //向下消失
115
+ tween = cc
116
+ .tween(t.node)
117
+ .to(0.2, { scale: 0.7 })
118
+ .by(0.3, { y: t.node.height * -2 });
119
+ break;
120
+ case 3: //向左消失
121
+ tween = cc
122
+ .tween(t.node)
123
+ .to(0.2, { scale: 0.7 })
124
+ .by(0.3, { x: t.node.width * -2 });
125
+ break;
126
+ default: //默认:缩小消失
127
+ tween = cc.tween(t.node).to(0.3, { scale: 0.1 });
128
+ break;
129
+ }
130
+ if (callFunc || del) {
131
+ tween.call(() => {
132
+ if (del) {
133
+ t.list._delSingleItem(t.node);
134
+ for (let n: number = t.list.displayData.length - 1; n >= 0; n--) {
135
+ if (t.list.displayData[n].id == t.listId) {
136
+ t.list.displayData.splice(n, 1);
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ callFunc();
142
+ });
143
+ }
144
+ tween.start();
145
+ }
146
+
147
+ onClickThis() {
148
+ this.list.selectedId = this.listId;
149
+ }
150
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "32751987-766e-44d4-af5a-4625d46aabf6",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
package/item.meta ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "ver": "1.1.3",
3
+ "uuid": "8c7436d1-86e8-49f9-86ee-e4a41a6010de",
4
+ "importer": "folder",
5
+ "isBundle": false,
6
+ "bundleName": "",
7
+ "priority": 1,
8
+ "compressionType": {},
9
+ "optimizeHotUpdate": {},
10
+ "inlineSpriteFrames": {},
11
+ "isRemoteBundle": {},
12
+ "subMetas": {}
13
+ }
@@ -0,0 +1,69 @@
1
+ import { FWEventDefine } from '../define/FWEventDefine';
2
+ import { FWLodash } from '../utils/FWLodash';
3
+
4
+ const { ccclass, property, executeInEditMode } = cc._decorator;
5
+
6
+ @ccclass
7
+ @executeInEditMode
8
+ export default abstract class FWLanguage extends cc.Component {
9
+ @property
10
+ protected _language: number = 0;
11
+
12
+ @property({
13
+ type: FWLodash.CCEnum(['请选择语言', ...FW.Entry.languageMgr.getSupportedLanguages()]),
14
+ displayName: 'language',
15
+ visible: true,
16
+ serializable: true,
17
+ })
18
+ get language() {
19
+ return this._language;
20
+ }
21
+ set language(value: number) {
22
+ this._language = value;
23
+ this.onLanguageChange();
24
+ }
25
+ protected refresh() {
26
+ if (CC_EDITOR) {
27
+ this.onRefresh();
28
+ this.refreshInspector();
29
+ }
30
+ }
31
+
32
+ private refreshInspector() {
33
+ //@ts-ignore
34
+ Editor.Utils.refreshSelectedInspector('node', this.node.uuid);
35
+ }
36
+
37
+ protected onLoad(): void {
38
+ FW.Entry.evtMgr.register(
39
+ FWEventDefine.LanguageEvent.LANGUAGE_CHANGE,
40
+ () => {
41
+ this._language = FW.Entry.languageMgr.getLanguageIndex();
42
+ this.onLanguageChange();
43
+ },
44
+ this,
45
+ );
46
+ }
47
+
48
+ protected onEnable(): void {
49
+ if (!CC_EDITOR) {
50
+ this._language = FW.Entry.languageMgr.getLanguageIndex();
51
+ this.onLanguageChange();
52
+ }
53
+ }
54
+
55
+ protected onDestroy(): void {
56
+ FW.Entry.evtMgr.targetOff(this);
57
+ }
58
+
59
+ protected getSupportedLanguages(): string[] {
60
+ return FW.Entry.languageMgr.getSupportedLanguages();
61
+ }
62
+
63
+ protected getBundles(): string[] {
64
+ return FW.Entry.languageMgr.getBundles();
65
+ }
66
+
67
+ protected abstract onRefresh?(): void;
68
+ protected abstract onLanguageChange?(): void;
69
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "cfffdc57-7607-48db-be11-91ba8da0e96c",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,144 @@
1
+ import { FWLodash } from '../utils/FWLodash';
2
+ import FWLanguage from './FWLanguage';
3
+
4
+ const { ccclass, property, executeInEditMode, menu, requireComponent } = cc._decorator;
5
+
6
+ @ccclass
7
+ @menu('Language/FWLanguageLabelLocalize')
8
+ @requireComponent(cc.Label)
9
+ @executeInEditMode
10
+ export default class FWLanguageLabelLocalize extends FWLanguage {
11
+ @property({
12
+ type: FWLodash.CCEnum(['请选择语言包']),
13
+ displayName: 'bundle',
14
+ visible: true,
15
+ })
16
+ get bundle() {
17
+ return this._bundle;
18
+ }
19
+ set bundle(value: number) {
20
+ this._bundle = value;
21
+ this.onBundleChange();
22
+ }
23
+
24
+ @property({
25
+ type: FWLodash.CCEnum(['请选择索引']),
26
+ displayName: 'key',
27
+ visible: true,
28
+ })
29
+ get key() {
30
+ return this._key;
31
+ }
32
+ set key(value: number) {
33
+ this._key = value;
34
+ this.refresh();
35
+ }
36
+
37
+ protected onLoad(): void {
38
+ super.onLoad?.();
39
+ this.label = this.node.getComponent(cc.Label);
40
+ }
41
+
42
+ protected onEnable(): void {
43
+ super.onEnable?.();
44
+ this.onBundleChange();
45
+ }
46
+
47
+ public onRefresh(): void {
48
+ const label = this.node.getComponent(cc.Label);
49
+ if (this._language == 0 || this._bundle == 0 || this._key == 0) {
50
+ label.string = '';
51
+ return;
52
+ }
53
+ const keys = FW.Entry.languageMgr.getLanguagePackageEnumKeys(this.bundleName);
54
+ const str = FW.Entry.languageMgr.getLanguagePackageValue(
55
+ this.bundleName,
56
+ keys[this.key - 1],
57
+ this.languageName,
58
+ );
59
+ label.string = str;
60
+ }
61
+
62
+ protected onBundleChange(): void {
63
+ this.updateKeys();
64
+ this.refreshKes();
65
+ this.refresh();
66
+ }
67
+
68
+ protected onLanguageChange(): void {
69
+ if (this._language == 0) {
70
+ this._bundle = 0;
71
+ this._key = 0;
72
+ }
73
+ this.updateBundles();
74
+ this.updateKeys();
75
+ this.refreshBundles();
76
+ this.refreshKes();
77
+ this.refresh();
78
+ }
79
+
80
+ protected refreshKes() {
81
+ if (CC_EDITOR) {
82
+ //@ts-ignore
83
+ cc.Class.Attr.setClassAttr(
84
+ this.constructor,
85
+ 'key',
86
+ 'enumList',
87
+ //@ts-ignore
88
+ cc.Enum.getList(CCEnum(this._keys)),
89
+ );
90
+ }
91
+ }
92
+
93
+ protected updateKeys() {
94
+ if (this._language > 0 && this._bundle > 0) {
95
+ this._keys = [
96
+ '请选择索引',
97
+ ...Object.keys(FW.Entry.languageMgr.getLanguagePackageEnum(this.bundleName)),
98
+ ];
99
+ } else {
100
+ this._keys = ['请选择索引'];
101
+ }
102
+ }
103
+
104
+ get bundleName() {
105
+ const bundles = this.getBundles();
106
+ return bundles[this._bundle - 1];
107
+ }
108
+
109
+ get languageName() {
110
+ const languages = this.getSupportedLanguages();
111
+ return languages[this._language - 1];
112
+ }
113
+
114
+ protected updateBundles() {
115
+ if (this._language > 0) {
116
+ this._bundles = ['请选择语言包', ...this.getBundles()];
117
+ } else {
118
+ this._bundles = ['请选择语言包'];
119
+ }
120
+ }
121
+
122
+ protected refreshBundles() {
123
+ if (CC_EDITOR) {
124
+ //@ts-ignore
125
+ cc.Class.Attr.setClassAttr(
126
+ this.constructor,
127
+ 'bundle',
128
+ 'enumList',
129
+ //@ts-ignore
130
+ cc.Enum.getList(CCEnum(this._bundles)),
131
+ );
132
+ }
133
+ }
134
+
135
+ protected label: cc.Label = null;
136
+ @property
137
+ protected _key: number = 0;
138
+ @property
139
+ protected _keys: string[] = [];
140
+ @property
141
+ protected _bundle: number = 0;
142
+ @property
143
+ protected _bundles: string[] = [];
144
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "3fb1f7df-6641-459a-b357-fff3ad37a9d0",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }