mirror of
https://gitee.com/dgflash/oops-plugin-framework.git
synced 2026-05-09 22:02:45 +08:00
137 lines
3.7 KiB
TypeScript
137 lines
3.7 KiB
TypeScript
import { CCString, Enum, EventHandler, _decorator } from 'cc';
|
||
import { VMBase } from './VMBase';
|
||
|
||
// +普通 label 更新数据的情况,label.string = xxx;
|
||
// +frameIndex 插件,通过number 数值设置 BhvFrameIndex 来切换当前贴图
|
||
// +spriteFrame 直接替换贴图的情况 ,
|
||
// 读取本地路径 data.spriteFrame = $res:/pic/com1
|
||
// 读取网页路径 data.spriteFrame = $url:http:xxxxxxxxxx.png
|
||
// +特殊条件控制
|
||
|
||
// 比较条件:,如果传入值 > /< />= /<= /== 某值时,执行的action类型
|
||
|
||
const { ccclass, property, executeInEditMode, menu, help } = _decorator;
|
||
|
||
enum FILTER_MODE {
|
||
'none',
|
||
'==', // 正常计算,比较 等于
|
||
'!=', // 正常计算,比较 不等于
|
||
'>', // 正常计算,比较>
|
||
'>=', // 正常计算,比较>=
|
||
'<', // 正常计算,比较<
|
||
'<=', // 正常计算,比较>=
|
||
}
|
||
|
||
/**
|
||
* [VM-Event]
|
||
* 提供 ViewModel 的相关基础功能,
|
||
* 如果值发生变化将会调用对应的函数方法
|
||
*/
|
||
@ccclass
|
||
@executeInEditMode
|
||
@menu('OopsFramework/Mvvm/VM-EventCall (调用函数)')
|
||
@help('https://gitee.com/dgflash/oops-framework/wikis/pages?sort_id=12037640&doc_id=2873565')
|
||
export default class VMEvent extends VMBase {
|
||
@property({
|
||
tooltip: '使用模板模式,可以使用多路径监听'
|
||
})
|
||
templateMode = false;
|
||
|
||
@property({
|
||
tooltip: '监听获取值的路径',
|
||
visible: function () {
|
||
// @ts-ignore
|
||
return this.templateMode === false;
|
||
}
|
||
})
|
||
watchPath = '';
|
||
|
||
@property({
|
||
tooltip: '触发一次后会自动关闭该事件'
|
||
})
|
||
triggerOnce = false;
|
||
|
||
@property({
|
||
tooltip: '监听获取值的多条路径,这些值的改变都会通过这个函数回调,请使用 pathArr 区分获取的值 ',
|
||
type: [CCString],
|
||
visible: function () {
|
||
// @ts-ignore
|
||
return this.templateMode === true;
|
||
}
|
||
})
|
||
protected watchPathArr: string[] = [];
|
||
|
||
@property({
|
||
tooltip: '过滤模式,会根据条件过滤掉时间的触发',
|
||
type: Enum(FILTER_MODE)
|
||
})
|
||
filterMode: FILTER_MODE = FILTER_MODE.none;
|
||
|
||
@property({
|
||
visible: function () {
|
||
// @ts-ignore
|
||
return this.filterMode !== FILTER_MODE.none;
|
||
}
|
||
})
|
||
compareValue = '';
|
||
|
||
@property([EventHandler])
|
||
changeEvents: EventHandler[] = [];
|
||
|
||
onValueInit() {
|
||
|
||
}
|
||
|
||
onValueChanged(newVar: any, oldVar: any, pathArr: any[]) {
|
||
const res = this.conditionCheck(newVar, this.compareValue);
|
||
if (!res) return;
|
||
|
||
if (Array.isArray(this.changeEvents)) {
|
||
this.changeEvents.forEach((v) => {
|
||
v.emit([newVar, oldVar, pathArr]);
|
||
});
|
||
}
|
||
|
||
// 激活一次后,自动关闭组件
|
||
if (this.triggerOnce === true) {
|
||
this.enabled = false;
|
||
}
|
||
}
|
||
|
||
/** 条件检查 */
|
||
private conditionCheck(a: any, b: any): boolean {
|
||
const cod = FILTER_MODE;
|
||
|
||
switch (this.filterMode) {
|
||
case cod.none:
|
||
return true;
|
||
case cod['==']:
|
||
if (a == b) return true;
|
||
break;
|
||
case cod['!=']:
|
||
if (a != b) return true;
|
||
break;
|
||
case cod['<']:
|
||
if (a < b) return true;
|
||
break;
|
||
case cod['>']:
|
||
if (a > b) return true;
|
||
break;
|
||
case cod['>=']:
|
||
if (a >= b) return true;
|
||
break;
|
||
case cod['<']:
|
||
if (a < b) return true;
|
||
break;
|
||
case cod['<=']:
|
||
if (a <= b) return true;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
}
|