GenCode_CPP.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import { FairyEditor } from 'csharp';
  2. import CodeWriter from './CodeWriter';
  3. function genCode(handler: FairyEditor.PublishHandler) {
  4. let settings = (<FairyEditor.GlobalPublishSettings>handler.project.GetSettings("Publish")).codeGeneration;
  5. let codePkgName = handler.ToFilename(handler.pkg.name); //convert chinese to pinyin, remove special chars etc.
  6. let exportCodePath = handler.exportCodePath + '/' + codePkgName;
  7. let namespaceName = codePkgName;
  8. let binderName = codePkgName + 'Binder';
  9. if (settings.packageName)
  10. namespaceName = settings.packageName + '.' + namespaceName;
  11. //CollectClasses(stripeMemeber, stripeClass, fguiNamespace)
  12. let classes = handler.CollectClasses(settings.ignoreNoname, settings.ignoreNoname, null);
  13. handler.SetupCodeFolder(exportCodePath, "cpp,h") //check if target folder exists, and delete old files
  14. let getMemberByName = settings.getMemberByName;
  15. let classCnt = classes.Count
  16. let writer = new CodeWriter();
  17. for (let i: number = 0; i < classCnt; i++) {
  18. let classInfo = classes.get_Item(i);
  19. let members = classInfo.members;
  20. let references = classInfo.references;
  21. writer.reset();
  22. writer.writeln('#ifndef __%s_%s_H__', codePkgName, classInfo.className);
  23. writer.writeln('#define __%s_%s_H__', codePkgName, classInfo.className);
  24. writer.writeln();
  25. writer.writeln('#include "FairyGUI.h"');
  26. writer.writeln();
  27. writer.writeln('namespace %s', namespaceName);
  28. writer.startBlock();
  29. let refCount = references.Count;
  30. if (refCount > 0) {
  31. for (let j: number = 0; j < refCount; j++) {
  32. let ref = references.get_Item(j);
  33. writer.writeln('class %s;', ref);
  34. }
  35. }
  36. writer.writeln('class %s : public %s', classInfo.className, classInfo.superClassName);
  37. writer.startBlock();
  38. writer.writeln('public:');
  39. writer.incIndent();
  40. writer.writeln('static const std::string URL;');
  41. writer.writeln('static %s* create();', classInfo.className);
  42. writer.writeln();
  43. let memberCnt = members.Count;
  44. for (let j: number = 0; j < memberCnt; j++) {
  45. let memberInfo = members.get_Item(j);
  46. writer.writeln('%s* %s;', memberInfo.type, memberInfo.varName);
  47. }
  48. writer.decIndent();
  49. writer.writeln();
  50. writer.writeln('protected:');
  51. writer.incIndent();
  52. writer.writeln('virtual void onConstruct() override;');
  53. writer.decIndent();
  54. writer.writeln();
  55. writer.writeln('private:');
  56. writer.incIndent();
  57. writer.writeln('static %s* createByBinder();', classInfo.className);
  58. writer.writeln('friend class %s;', binderName);
  59. writer.decIndent();
  60. writer.endBlock();
  61. writer.endBlock();
  62. writer.writeln();
  63. writer.writeln('#endif');
  64. writer.save(exportCodePath + '/' + classInfo.className + '.h');
  65. //----------------
  66. writer.reset();
  67. writer.writeln('#include "%s.h"', binderName);
  68. writer.writeln();
  69. writer.writeln('namespace %s', namespaceName);
  70. writer.startBlock();
  71. writer.writeln('USING_NS_FGUI;');
  72. writer.writeln();
  73. writer.writeln('const std::string %s::URL = "ui://%s%s";', classInfo.className, handler.pkg.id, classInfo.resId);
  74. writer.writeln();
  75. writer.writeln('%s* %s:create()', classInfo.className, classInfo.className);
  76. writer.startBlock();
  77. writer.writeln('return dynamic_cast<%s*>(UIPackage::createObject("%s", "%s"));', classInfo.className, handler.pkg.name, classInfo.resName);
  78. writer.endBlock();
  79. writer.writeln();
  80. writer.writeln('%s* %s::createByBinder()', classInfo.className, classInfo.className);
  81. writer.startBlock();
  82. writer.writeln('%s *pRet = new(std::nothrow) %s();', classInfo.className, classInfo.className);
  83. writer.writeln('if (pRet && pRet->init())');
  84. writer.startBlock();
  85. writer.writeln('pRet->autorelease();');
  86. writer.writeln('return pRet;');
  87. writer.endBlock();
  88. writer.writeln('else');
  89. writer.startBlock();
  90. writer.writeln('delete pRet;');
  91. writer.writeln('pRet = nullptr;');
  92. writer.writeln('return nullptr;');
  93. writer.endBlock();
  94. writer.endBlock();
  95. writer.writeln();
  96. writer.writeln('void %s::onConstruct()', classInfo.className);
  97. writer.startBlock();
  98. for (let j: number = 0; j < memberCnt; j++) {
  99. let memberInfo = members.get_Item(j);
  100. if (memberInfo.group == 0) {
  101. if (getMemberByName)
  102. writer.writeln('%s = dynamic_cast<%s*>(getChild("%s"));', memberInfo.varName, memberInfo.type, memberInfo.name);
  103. else
  104. writer.writeln('%s = dynamic_cast<%s*>(getChildAt(%s));', memberInfo.varName, memberInfo.type, memberInfo.index);
  105. }
  106. else if (memberInfo.group == 1) {
  107. if (getMemberByName)
  108. writer.writeln('%s = getController("%s");', memberInfo.varName, memberInfo.name);
  109. else
  110. writer.writeln('%s = getControllerAt(%s);', memberInfo.varName, memberInfo.index);
  111. }
  112. else {
  113. if (getMemberByName)
  114. writer.writeln('%s = getTransition("%s");', memberInfo.varName, memberInfo.name);
  115. else
  116. writer.writeln('%s = getTransitionAt(%s);', memberInfo.varName, memberInfo.index);
  117. }
  118. }
  119. writer.endBlock();
  120. writer.endBlock();
  121. writer.save(exportCodePath + '/' + classInfo.className + '.cpp');
  122. }
  123. writer.reset();
  124. writer.writeln('#ifndef __%s_%s_H__', codePkgName, binderName);
  125. writer.writeln('#define __%s_%s_H__', codePkgName, binderName);
  126. writer.writeln();
  127. writer.writeln('#include "FairyGUI.h"');
  128. for (let i: number = 0; i < classCnt; i++) {
  129. let classInfo = classes.get_Item(i);
  130. writer.writeln('#include "%s.h";', classInfo.className);
  131. }
  132. writer.writeln();
  133. writer.writeln('namespace %s', namespaceName);
  134. writer.startBlock();
  135. writer.writeln('class %s', binderName);
  136. writer.startBlock();
  137. writer.writeln('public:');
  138. writer.incIndent();
  139. writer.writeln('static void bindAll();');
  140. writer.decIndent();
  141. writer.endBlock();
  142. writer.endBlock();
  143. writer.writeln();
  144. writer.writeln('#endif');
  145. writer.save(exportCodePath + '/' + binderName + '.h');
  146. //-----------------------------------
  147. writer.reset();
  148. writer.writeln('#include "%s.h"', binderName);
  149. writer.writeln();
  150. writer.writeln('namespace %s', namespaceName);
  151. writer.startBlock();
  152. writer.writeln('USING_NS_FGUI;');
  153. writer.writeln();
  154. writer.writeln('void %s:bindAll()', binderName);
  155. writer.startBlock();
  156. for (let i: number = 0; i < classCnt; i++) {
  157. let classInfo = classes.get_Item(i);
  158. writer.writeln('UIObjectFactory::setExtension(%s::URL, std::bind(&%s::createByBinder));', classInfo.className, classInfo.className);
  159. }
  160. writer.endBlock();
  161. writer.endBlock();
  162. writer.save(exportCodePath + '/' + binderName + '.cpp');
  163. }
  164. export { genCode };