GenCode_CPP.js 7.2 KB

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