Accounting/FUI_UserData/ASH/plugins/myEditorExtention/GenCode_CSharp.ts

294 lines
11 KiB
TypeScript
Raw Normal View History

2023-09-24 21:35:44 +08:00
import { FairyEditor, System } from 'csharp';
import { CalFGUIData } from '../myEditorExtention/main';
import CodeWriter from './CodeWriter';
function genCode(handler: FairyEditor.PublishHandler, calData:CalFGUIData) {
let settings = (<FairyEditor.GlobalPublishSettings>handler.project.GetSettings("Publish")).codeGeneration;
let properties = (<FairyEditor.CustomProps>handler.project.GetSettings("CustomProperties")).elements;
if(!properties.ContainsKey("NameSpace")){
console.error("请添加属性NameSpace")
}
if(!properties.ContainsKey("ChineseToPinYin")){
console.error("请添加属性ChineseToPinYin")
}
let namespaceName = properties.get_Item("NameSpace");
let toPinYin = properties.get_Item("ChineseToPinYin") == "true";
let codePkgName ;
if(toPinYin){
codePkgName = handler.ToFilename(handler.pkg.name); //convert chinese to pinyin, remove special chars etc.
}
else{
if(RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(handler.pkg.name)){
codePkgName=handler.pkg.name;
}else{
console.error("名字包含非法字符:"+handler.pkg.name);
}
}
let exportCodePath = handler.exportCodePath + '/' + codePkgName;
//CollectClasses(stripeMemeber, stripeClass, fguiNamespace)
let classes = handler.CollectClasses(true, false, null);
handler.SetupCodeFolder(exportCodePath, "cs"); //check if target folder exists, and delete old files
let getMemberByName = settings.getMemberByName;
let classCnt = classes.Count;
let writer = new CodeWriter();
for (let i: number = 0; i < classCnt; i++) {
let classInfo = classes.get_Item(i);
let url = classInfo.res.GetURL();
let data = calData.GetData(url);
if (!data || !data.isGenerate) {
continue;
}
let className = classInfo.className;
if(!toPinYin){
className = settings.classNamePrefix + classInfo.resName;
if(!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(className)){
console.error("名字包含非法字符:"+className);
className = classInfo.className;
}
}
let members = classInfo.members;
writer.reset();
writer.writeln('using FairyGUI;');
writer.writeln('using FairyGUI.Utils;');
writer.writeln('using DragonSoul.Shared;');
writer.writeln('using System;');
writer.writeln();
writer.writeln('namespace %s', namespaceName);
writer.startBlock();
writer.writeln("public partial class %s",className);
writer.startBlock();
writer.writeln("public const string UIPackageName = \"%s\";",codePkgName);
writer.writeln("public const string UIResName = \"%s\";",classInfo.resName);
writer.writeln();
writer.writeln("public %s self;",classInfo.superClassName);
writer.writeln();
let memberCnt = members.Count
// 是否为自定义类型组件标记数组
// 是否为跨包组件标记数组
let crossPackageFlagsArray:boolean[] = new Array(memberCnt);
//是否生成代码
let customTypeArray :boolean[] = new Array(memberCnt);
let baseTypeNameArray :string[] = new Array(memberCnt);
let memberTypeNameArray :string[] = new Array(memberCnt);
for (let j: number = 0; j < memberCnt; j++) {
let memberInfo = members.get_Item(j);
crossPackageFlagsArray[j]=false;
customTypeArray[j]=false;
baseTypeNameArray[j] = memberInfo.type;
memberTypeNameArray[j] = memberInfo.type;
let hasRes:boolean = memberInfo.res!=null;
if(!hasRes){
customTypeArray[j]=false;
}else{
let url = memberInfo.res.GetURL();
let data = calData.GetData(url);
customTypeArray[j] = data && data.isGenerate;
}
let typeName = memberInfo.type;
if(!toPinYin && memberInfo.res){
typeName = settings.classNamePrefix + memberInfo.res.name;
if(!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(typeName)){
console.error("名字包含非法字符:" + typeName);
typeName = memberInfo.type;
}
}
// 判断是不是跨包类型组件
let crossPkg:boolean = hasRes? memberInfo.res.owner.name != handler.pkg.name:false;
crossPackageFlagsArray[j] = crossPkg;
if(crossPkg){
if(!customTypeArray[j])
{
for (let k = 0; k<classCnt;k++ ){
var __classInfo =classes.get_Item(k);
if (memberInfo.res.name == __classInfo.resName)
{
console.log(111)
typeName = __classInfo.superClassName;
baseTypeNameArray[j] = typeName;
break
}
}
typeName = baseTypeNameArray[j];
memberTypeNameArray[j] = typeName;
writer.writeln('public %s %s;', typeName, memberInfo.varName);
}
else
{
baseTypeNameArray[j] = typeName;
memberTypeNameArray[j] = typeName;
writer.writeln('public %s %s;', typeName, memberInfo.varName);
}
}
else{
if(hasRes){
if(customTypeArray[j]){
writer.writeln('public %s %s;', typeName, memberInfo.varName);
}else{
//寻找名称一样的组件的基础类型
for (let k = 0; k<classCnt;k++ ){
var __classInfo =classes.get_Item(k);
if (memberInfo.res.name == __classInfo.resName)
{
typeName = __classInfo.superClassName;
baseTypeNameArray[j] =typeName;
break
}
}
writer.writeln('public %s %s;', typeName, memberInfo.varName);
}
}
else
{
writer.writeln('public %s %s;', typeName, memberInfo.varName);
}
memberTypeNameArray[j] = typeName;
}
}
writer.writeln('public const string URL = "ui://%s%s";', handler.pkg.id, classInfo.resId);
writer.writeln();
writer.writeln('public %s(GObject go=null)',className);
writer.startBlock();
writer.writeln('if (go == null)');
writer.startBlock();
writer.writeln('throw new Exception($\"can\'t create view : {this.GetType()}\");');
writer.endBlock();
writer.writeln('self = (%s)go;',classInfo.superClassName);
writer.writeln('var com = go.asCom;');
writer.writeln();
writer.writeln('if(com != null)');
writer.startBlock();
for (let j: number = 0; j < memberCnt; j++)
{
let memberInfo = members.get_Item(j);
let typeName = baseTypeNameArray[j];
let memberTypeName = memberTypeNameArray[j];
let bIsCrassPkg = crossPackageFlagsArray[j];
let bIsCustomComponent =customTypeArray[j];
if (memberInfo.group==0)
{
{
//跨包必定导出,必定自定义
if (bIsCrassPkg)
if(bIsCustomComponent){
writer.writeln('%s = Create<%s>(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index)
}
else
writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index)
else
{
if(bIsCustomComponent)
{
writer.writeln('%s = Create<%s>(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index)
}
else{
writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index)
}
}
}
}
else if (memberInfo.group==1)
{
if (getMemberByName)
{
writer.writeln('%s = com.GetController("%s");', memberInfo.varName, memberInfo.name)
}
else
writer.writeln('%s = com.GetControllerAt(%s);', memberInfo.varName, memberInfo.index)
}else
{
if (getMemberByName)
{
writer.writeln('%s = com.GetTransition("%s");', memberInfo.varName, memberInfo.name)
}
else
writer.writeln('%s = com.GetTransitionAt(%s);', memberInfo.varName, memberInfo.index)
}
}
writer.endBlock();
writer.endBlock();
writer.writeln('public void Dispose()');
writer.startBlock();
writer.writeln('self = null;');
for (let j: number = 0; j < memberCnt; j++) {
let memberInfo = members.get_Item(j);
let bIsCustomComponent = customTypeArray[j];
if (memberInfo.group==0 )
{
if (!bIsCustomComponent)
{
writer.writeln('%s = null;', memberInfo.varName)
}
}
else if (memberInfo.group == 1 )
{
if (getMemberByName )
{
writer.writeln('%s = null;', memberInfo.varName)
}
else
writer.writeln('%s = null;', memberInfo.varName)
}
else
{
if (getMemberByName )
writer.writeln('%s = null;', memberInfo.varName)
else{
writer.writeln('%s = null;', memberInfo.varName)
}
}
}
writer.endBlock();
writer.endBlock(); //class
writer.endBlock(); //namepsace
writer.save(exportCodePath + '/' + className + '.cs');
}
writer.reset();
writer.writeln('namespace %s',namespaceName);
writer.startBlock();
writer.writeln('public static partial class FUIPackage');
writer.startBlock();
writer.writeln('public const string %s = "%s";',codePkgName,codePkgName);
for (let k = 0; k<classCnt;k++ ){
var classInfo =classes.get_Item(k);
writer.writeln('public const string %s_%s = "ui://%s/%s";',codePkgName,classInfo.resName,codePkgName,classInfo.resName)
}
writer.endBlock() //class
writer.endBlock() //namespace
let binderPackageName = 'Package'+codePkgName
writer.save(exportCodePath+'/'+binderPackageName+'.cs')
}
export { genCode };