1 module unecht.core.componentManager; 2 3 version(UEIncludeEditor): 4 5 import unecht.core.object; 6 import unecht.core.components.editor.menus:EditorMenuItem; 7 8 //TODO: get rid using new editor creation 9 /// 10 mixin template UERegisterInspector(T) 11 { 12 shared static this() 13 { 14 import unecht.meta.uda:getUDA; 15 16 enum componentName = getUDA!(T,EditorInspector).componentName; 17 18 UEComponentsManager.editors[componentName] = new T(); 19 } 20 } 21 22 /// UDA 23 struct EditorInspector 24 { 25 /// 26 string componentName; 27 } 28 29 /// 30 interface IComponentEditor 31 { 32 /// 33 bool render(UEObject _component); 34 } 35 36 /// 37 static struct UEComponentsManager 38 { 39 /// 40 static IComponentEditor[string] editors; 41 /// 42 static string[] componentNames; 43 /// 44 version(UEIncludeEditor)static EditorMenuItem[] menuItems; 45 46 /// 47 static void initComponentManager() 48 { 49 import unecht.core.component; 50 import std.stdio; 51 52 auto tid = typeid(UEObject); 53 54 foreach(m; ModuleInfo) 55 { 56 //writefln("scan mod: %s",m.name); 57 58 foreach(cla; m.localClasses) 59 { 60 if(hasBaseClass(cla, tid)) 61 { 62 //writefln("obj: %s",cla.name); 63 64 scope obj = cast(UEObject)cla.create(); 65 if(obj) 66 { 67 auto editor = obj.createEditor(); 68 if(editor) 69 { 70 // only add editor if not already registered by a custom implementation 71 if(!(obj.typename in UEComponentsManager.editors)) 72 UEComponentsManager.editors[obj.typename] = editor; 73 } 74 } 75 76 if(hasBaseClass(cla, typeid(UEComponent))) 77 { 78 scope comp = cast(UEComponent)cla.create(); 79 if(comp) 80 { 81 UEComponentsManager.componentNames ~= cla.name; 82 comp.getMenuItems(UEComponentsManager.menuItems); 83 } 84 } 85 } 86 } 87 } 88 } 89 } 90 91 /// 92 private bool hasBaseClass(in TypeInfo_Class v, in TypeInfo_Class base) pure nothrow 93 { 94 if(v is base) 95 return true; 96 else if(v && v !is typeid(Object)) 97 return hasBaseClass(v.base, base); 98 else 99 return false; 100 }