294 lines
11 KiB
TypeScript
294 lines
11 KiB
TypeScript
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 }; |