Browse Source

added Settings prefab

Nicolas Cannasse 7 năm trước cách đây
mục cha
commit
980876df08
3 tập tin đã thay đổi với 140 bổ sung5 xóa
  1. 6 1
      hide/prefab/EditContext.hx
  2. 95 0
      hide/prefab/Settings.hx
  3. 39 4
      hide/view/Prefab.hx

+ 6 - 1
hide/prefab/EditContext.hx

@@ -8,6 +8,8 @@ class EditContext {
 	public var prefabPath : String;
 	public var ide(get,never) : hide.ui.Ide;
 	public var scene : hide.comp.Scene;
+	public var view : hide.view.Prefab;
+	public var cleanups : Array<Void->Void>;
 	public var properties : hide.comp.PropsEditor;
 	function get_ide() return hide.ui.Ide.inst;
 	#end
@@ -20,7 +22,10 @@ class EditContext {
 		return rootContext.shared.contexts.get(p);
 	}
 
-	public function refresh() {
+	/**
+		Rebuild the edit window
+	**/
+	public function rebuild() {
 	}
 
 	public function getNamedObjects( ?exclude : h3d.scene.Object ) {

+ 95 - 0
hide/prefab/Settings.hx

@@ -0,0 +1,95 @@
+package hide.prefab;
+
+class Settings extends Prefab {
+
+	var modelType : String;
+	var ignoredFields : Array<String> = [];
+	public var data : Dynamic = {};
+
+	override function save() {
+		var o = Reflect.copy(data);
+		o.modelType = modelType;
+		if( ignoredFields.length > 0 )
+			o.ignoredFields = ignoredFields;
+		return o;
+	}
+
+	override function load( o : Dynamic ) {
+		this.data = o;
+		modelType = o.modelType;
+		ignoredFields = o.ignoredFields;
+		if( ignoredFields == null ) ignoredFields = [];
+		Reflect.deleteField(o, "modelType");
+		Reflect.deleteField(o, "ignoredFields");
+	}
+
+	override function getHideProps() : HideProps {
+		return { icon : "cogs", name : "Settings" };
+	}
+
+	override function edit( ctx : EditContext ) {
+		#if editor
+		var props = ctx.properties.add(new hide.Element('
+			<dl>
+				<dt>Model</dt><dd><select><option value="">-- Choose --</option></select>
+			</dl>
+			<br/>
+		'),this);
+		var select = props.find("select");
+		var models = ctx.ide.typesCache.getModels();
+		for( m in models )
+			new hide.Element('<option>').attr("value", m.id).text(ctx.ide.typesCache.getModelName(m)).appendTo(select);
+		var modelDef = null;
+		if( modelType != null ) {
+			modelDef = ctx.ide.typesCache.get(modelType, true);
+			if( modelDef == null )
+				new hide.Element('<option>').attr("value", modelType).text("?"+modelType).appendTo(select);
+			select.val(modelType);
+		}
+		select.change(function(_) {
+			var prev = save();
+			var type = select.val();
+			load({ modelType : type });
+			ctx.rebuild();
+			ctx.properties.undo.change(Custom(function(undo) {
+				if( undo )
+					load(prev);
+				else
+					load({ modelType : type });
+				ctx.rebuild();
+			}));
+		});
+
+		if( modelDef == null ) {
+			ctx.properties.add(new hide.Element('$modelType was not found in source definitions'));
+			return;
+		}
+
+		var fields = Reflect.fields(data);
+		fields.remove("type");
+		fields.remove("modelType");
+		fields.remove("ignoredFields");
+		var changed = false;
+		for( f in modelDef.fields )
+			if( !fields.remove(f.name) ) {
+				if( f.def == null ) continue;
+				changed = true;
+				Reflect.setField(data, f.name, f.def);
+			}
+		for( f in fields ) {
+			changed = true;
+			Reflect.deleteField(data, f);
+		}
+		if( changed )
+			ctx.view.modified = true;
+
+		ctx.properties.addProps(modelDef.fields, this.data);
+		var rebuild = ctx.rebuild;
+		ctx.ide.typesCache.watch(rebuild);
+		ctx.cleanups.push(ctx.ide.typesCache.unwatch.bind(rebuild));
+		#end
+	}
+
+	static var _ = Library.register("settings", Settings);
+
+}

+ 39 - 4
hide/view/Prefab.hx

@@ -2,6 +2,29 @@ package hide.view;
 
 import hide.prefab.Prefab in PrefabElement;
 
+class EditContext extends hide.prefab.EditContext {
+
+	public var elt : PrefabElement;
+
+	public function new(ctx, elt) {
+		super(ctx);
+		this.elt = elt;
+	}
+
+	override function rebuild() {
+		properties.clear();
+		cleanup();
+		elt.edit(this);
+	}
+
+	public function cleanup() {
+		for( c in cleanups.copy() )
+			c();
+		cleanups = [];
+	}
+
+}
+
 class Prefab extends FileView {
 
 	var data : hide.prefab.Library;
@@ -16,6 +39,8 @@ class Prefab extends FileView {
 	var lightDirection = new h3d.Vector( 1, 2, -4 );
 	var tree : hide.comp.IconTree<PrefabElement>;
 
+	var curEdit : EditContext;
+
 	override function getDefaultContent() {
 		return haxe.io.Bytes.ofString(ide.toJSON(new hide.prefab.Library().save()));
 	}
@@ -25,7 +50,6 @@ class Prefab extends FileView {
 	}
 
 	override function onDisplay() {
-
 		root.html('
 			<div class="flex vertical">
 				<div class="toolbar"></div>
@@ -78,12 +102,16 @@ class Prefab extends FileView {
 	}
 
 	function selectObject( elt : PrefabElement ) {
-		properties.clear();
-		var edit = new hide.prefab.EditContext(context);
+		if( curEdit != null )
+			curEdit.cleanup();
+		var edit = new EditContext(context, elt);
 		edit.prefabPath = state.path;
 		edit.properties = properties;
 		edit.scene = scene;
-		elt.edit(edit);
+		edit.view = this;
+		edit.cleanups = [];
+		edit.rebuild();
+		curEdit = edit;
 	}
 
 	function resetCamera() {
@@ -251,6 +279,13 @@ class Prefab extends FileView {
 			scene.s2d.y = scene.s2d.height >> 1;
 		};
 		scene.onResize();
+
+		if( curEdit != null ) {
+			curEdit.cleanup();
+			var e = curEdit.elt.name;
+			var elt = data.getPrefabByName(e);
+			if( elt != null ) selectObject(elt);
+		}
 	}
 
 	function update(dt:Float) {