Library.hx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package hrt.prefab;
  2. class Library extends Prefab {
  3. public function new() {
  4. super(null);
  5. type = "prefab";
  6. }
  7. override function makeInstance(ctx:Context):Context {
  8. if( ctx.shared.parent != null ) ctx = ctx.clone(this);
  9. return super.makeInstance(ctx);
  10. }
  11. /**
  12. Returns the prefab within children that matches the given absolute path
  13. **/
  14. public function getFromPath( path : String ) : Prefab {
  15. var parts = path.split(".");
  16. var cur : Prefab = this;
  17. for( p in parts ) {
  18. var found = false;
  19. for( c in cur.children )
  20. if( c.name == p ) {
  21. found = true;
  22. cur = c;
  23. break;
  24. }
  25. if( !found ) return null;
  26. }
  27. return cur;
  28. }
  29. static var registeredElements = new Map<String,{ cl : Class<Prefab> #if editor, inf : hide.prefab.HideProps #end }>();
  30. static var registeredExtensions = new Map<String,String>();
  31. public static function getRegistered() {
  32. return registeredElements;
  33. }
  34. public static function isOfType( prefabKind : String, cl : Class<Prefab> ) {
  35. var inf = registeredElements.get(prefabKind);
  36. if( inf == null ) return false;
  37. var c : Class<Dynamic> = inf.cl;
  38. while( c != null ) {
  39. if( c == cl ) return true;
  40. c = Type.getSuperClass(c);
  41. }
  42. return false;
  43. }
  44. public static function register( type : String, cl : Class<Prefab>, ?extension : String ) {
  45. registeredElements.set(type, { cl : cl #if editor, inf : Type.createEmptyInstance(cl).getHideProps() #end });
  46. if( extension != null ) registeredExtensions.set(extension, type);
  47. return true;
  48. }
  49. public static function create( extension : String ) {
  50. var type = getPrefabType(extension);
  51. var p : hrt.prefab.Prefab;
  52. if( type == null )
  53. p = new Library();
  54. else
  55. p = Type.createInstance(registeredElements.get(type).cl,[]);
  56. return p;
  57. }
  58. public static function getPrefabType(path: String) {
  59. var extension = path.split(".").pop().toLowerCase();
  60. return registeredExtensions.get(extension);
  61. }
  62. #if editor
  63. override function getHideProps() : HideProps {
  64. return { icon : "sitemap", name : "Prefab", allowParent: _ -> false};
  65. }
  66. #end
  67. static var _ = Library.register("prefab", Library, "prefab");
  68. }