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

294 lines
11 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 };