GenCode_CPP.lua 6.9 KB

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