123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- local function genCode(handler)
- local settings = handler.project:GetSettings("Publish").codeGeneration
- local codePkgName = handler:ToFilename(handler.pkg.name);
- local exportCodePath = handler.exportCodePath..'/'..codePkgName
- local namespaceName = codePkgName
- local binderName = codePkgName..'Binder'
- if settings.packageName~=nil and settings.packageName~='' then
- namespaceName = settings.packageName..'.'..namespaceName;
- end
-
- local classes = handler:CollectClasses(settings.ignoreNoname, settings.ignoreNoname, nil)
- handler:SetupCodeFolder(exportCodePath, "cpp,h")
- local getMemberByName = settings.getMemberByName
- local classCnt = classes.Count
- local writer = CodeWriter.new()
- for i=0,classCnt-1 do
- local classInfo = classes[i]
- local members = classInfo.members
- local references = classInfo.references
- writer:reset()
- writer:writeln('#ifndef __%s_%s_H__', codePkgName, classInfo.className)
- writer:writeln('#define __%s_%s_H__', codePkgName, classInfo.className)
- writer:writeln()
- writer:writeln('#include "FairyGUI.h"')
- writer:writeln()
-
- writer:writeln('namespace %s', namespaceName)
- writer:startBlock()
- local refCount = references.Count
- if refCount>0 then
- for j=0,refCount-1 do
- local ref = references[j]
- writer:writeln('class %s;', ref)
- end
- end
- writer:writeln('class %s : public %s', classInfo.className, classInfo.superClassName)
- writer:startBlock()
- writer:writeln('public:')
- writer:incIndent()
- writer:writeln('static const std::string URL;')
- writer:writeln('static %s* create();', classInfo.className)
- writer:writeln()
- local memberCnt = members.Count
- for j=0,memberCnt-1 do
- local memberInfo = members[j]
- writer:writeln('%s* %s;', memberInfo.type, memberInfo.varName)
- end
- writer:decIndent()
- writer:writeln()
- writer:writeln('protected:')
- writer:incIndent()
- writer:writeln('virtual void onConstruct() override;')
- writer:decIndent()
- writer:writeln()
- writer:writeln('private:')
- writer:incIndent()
- writer:writeln('static %s* createByBinder();', classInfo.className)
- writer:writeln('friend class %s;', binderName)
- writer:decIndent()
- writer:endBlock()
- writer:endBlock()
- writer:writeln()
- writer:writeln('#endif')
- writer:save(exportCodePath..'/'..classInfo.className..'.h')
-
- writer:reset()
- writer:writeln('#include "%s.h"', binderName)
- writer:writeln()
- writer:writeln('namespace %s', namespaceName)
- writer:startBlock()
- writer:writeln('USING_NS_FGUI;')
- writer:writeln()
- writer:writeln('const std::string %s::URL = "ui://%s%s";', classInfo.className, handler.pkg.id, classInfo.resId)
- writer:writeln()
- writer:writeln('%s* %s:create()', classInfo.className, classInfo.className)
- writer:startBlock()
- writer:writeln('return dynamic_cast<%s*>(UIPackage::createObject("%s", "%s"));', classInfo.className, handler.pkg.name, classInfo.resName)
- writer:endBlock()
- writer:writeln()
- writer:writeln('%s* %s::createByBinder()', classInfo.className, classInfo.className)
- writer:startBlock()
- writer:writeln('%s *pRet = new(std::nothrow) %s();', classInfo.className, classInfo.className)
- writer:writeln('if (pRet && pRet->init())')
- writer:startBlock()
- writer:writeln('pRet->autorelease();')
- writer:writeln('return pRet;')
- writer:endBlock()
- writer:writeln('else')
- writer:startBlock()
- writer:writeln('delete pRet;')
- writer:writeln('pRet = nullptr;')
- writer:writeln('return nullptr;')
- writer:endBlock()
- writer:endBlock()
- writer:writeln()
- writer:writeln('void %s::onConstruct()', classInfo.className)
- writer:startBlock()
- for j=0,memberCnt-1 do
- local memberInfo = members[j]
- if memberInfo.group==0 then
- if getMemberByName then
- writer:writeln('%s = dynamic_cast<%s*>(getChild("%s"));', memberInfo.varName, memberInfo.type, memberInfo.name)
- else
- writer:writeln('%s = dynamic_cast<%s*>(getChildAt(%s));', memberInfo.varName, memberInfo.type, memberInfo.index)
- end
- elseif memberInfo.group==1 then
- if getMemberByName then
- writer:writeln('%s = getController("%s");', memberInfo.varName, memberInfo.name)
- else
- writer:writeln('%s = getControllerAt(%s);', memberInfo.varName, memberInfo.index)
- end
- else
- if getMemberByName then
- writer:writeln('%s = getTransition("%s");', memberInfo.varName, memberInfo.name)
- else
- writer:writeln('%s = getTransitionAt(%s);', memberInfo.varName, memberInfo.index)
- end
- end
- end
- writer:endBlock()
- writer:endBlock()
- writer:save(exportCodePath..'/'..classInfo.className..'.cpp')
- end
- writer:reset()
- writer:writeln('#ifndef __%s_%s_H__', codePkgName, binderName)
- writer:writeln('#define __%s_%s_H__', codePkgName, binderName)
- writer:writeln()
- writer:writeln('#include "FairyGUI.h"')
- for i=0,classCnt-1 do
- local classInfo = classes[i]
- writer:writeln('#include "%s.h";', classInfo.className)
- end
- writer:writeln()
- writer:writeln('namespace %s', namespaceName)
- writer:startBlock()
- writer:writeln('class %s', binderName)
- writer:startBlock()
- writer:writeln('public:')
- writer:incIndent()
- writer:writeln('static void bindAll();')
- writer:decIndent()
- writer:endBlock()
- writer:endBlock()
- writer:writeln()
- writer:writeln('#endif')
- writer:save(exportCodePath..'/'..binderName..'.h')
-
- writer:reset()
- writer:writeln('#include "%s.h"', binderName)
- writer:writeln()
- writer:writeln('namespace %s', namespaceName)
- writer:startBlock()
- writer:writeln('USING_NS_FGUI;')
- writer:writeln()
- writer:writeln('void %s:bindAll()', binderName)
- writer:startBlock()
- for i=0,classCnt-1 do
- local classInfo = classes[i]
- writer:writeln('UIObjectFactory::setExtension(%s::URL, std::bind(&%s::createByBinder));', classInfo.className, classInfo.className)
- end
- writer:endBlock()
- writer:endBlock()
-
- writer:save(exportCodePath..'/'..binderName..'.cpp')
- end
- return genCode
|