Browse Source

Support updating dynamic fields in Attribute Edits

Josh Engebretson 10 years ago
parent
commit
7ec7f41c5b

+ 24 - 4
Script/AtomicEditor/ui/frames/inspector/AttributeInfoEdit.ts

@@ -596,6 +596,7 @@ class ColorAttributeEdit extends NumberArrayAttributeEdit {
 class ResourceRefAttributeEdit extends AttributeInfoEdit {
 
     refListIndex: number;
+    editField: Atomic.UIEditField;
 
     constructor(refListIndex: number = -1) {
 
@@ -605,7 +606,27 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
 
     }
 
-    editField: Atomic.UIEditField;
+    onResourceChanged(resource: Atomic.Resource) {
+
+        var parent = this.parent;
+
+        while (parent) {
+
+            if (parent.typeName == "UISection") {
+                break;
+            }
+
+            parent = parent.parent;
+
+        }
+
+        if (parent) {
+
+          parent.sendEvent("AttributeEditResourceChanged", { attrInfoEdit: this, resource: resource});
+
+        }
+
+    }
 
     initialize(editType: SerializableEditType, attrInfo: Atomic.AttributeInfo): boolean {
 
@@ -676,9 +697,6 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
 
         this.editWidget = layout;
 
-        // stuff editfield in so can be reference
-        layout["editField"] = o.editField;
-
         var selectButton = o.selectButton;
 
         var resourceTypeName = this.attrInfo.resourceTypeName;
@@ -690,6 +708,7 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
 
                 var resource = asset.getResource(resourceTypeName);
                 this.editType.onAttributeInfoEdited(this.attrInfo, resource, this.refListIndex);
+                this.onResourceChanged(resource);
                 this.refresh();
 
             }.bind(this));
@@ -720,6 +739,7 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
                     var resource = asset.getResource(resourceTypeName);
 
                     this.editType.onAttributeInfoEdited(this.attrInfo, resource, this.refListIndex);
+                    this.onResourceChanged(resource);
                     this.refresh();
 
 

+ 39 - 1
Script/AtomicEditor/ui/frames/inspector/SelectionInspector.ts

@@ -88,6 +88,41 @@ class SceneSection extends SelectionSection {
 
 }
 
+interface AttributeEditResourceChangedEvent {
+
+    attrInfoEdit: AttributeInfoEdit;
+    resource: Atomic.Resource;
+
+}
+
+class JSComponentSection extends ComponentSection {
+
+    constructor(editType: SerializableEditType, inspector: SelectionInspector) {
+
+        super(editType, inspector);
+
+        this.subscribeToEvent(this, "AttributeEditResourceChanged", (ev) => this.handleAttributeEditResourceChanged(ev));
+
+    }
+
+    private handleAttributeEditResourceChanged(ev: AttributeEditResourceChangedEvent) {
+
+        var jsc = <Atomic.JSComponent>this.editType.getFirstObject();
+
+        if (!jsc)
+            return;
+
+        var attrInfos = jsc.getAttributes();
+
+        this.updateDynamicAttrInfos(attrInfos);
+
+        //console.log("Resource Changed:", this.editType.typeName, ev.attrInfoEdit.attrInfo.name, ev.resource.name);
+
+    }
+
+}
+
+
 // Node Inspector + Component Inspectors
 
 class SelectionInspector extends ScriptWidget {
@@ -237,7 +272,10 @@ class SelectionInspector extends ScriptWidget {
 
             section = new SceneSection(editType);
 
-        } else {
+        } else if (editType.typeName == "JSComponent") {
+            section = new JSComponentSection(editType, this);
+        }
+        else {
 
             section = new ComponentSection(editType, this);
 

+ 67 - 2
Script/AtomicEditor/ui/frames/inspector/SelectionSection.ts

@@ -10,7 +10,7 @@ abstract class SelectionSection extends Atomic.UISection {
     editType: SerializableEditType;
     attrLayout: Atomic.UILayout;
     suppressed: boolean = false;
-    customUI:SelectionSectionUI;
+    customUI: SelectionSectionUI;
 
     attrEdits: { [name: string]: AttributeInfoEdit } = {};
 
@@ -35,7 +35,7 @@ abstract class SelectionSection extends Atomic.UISection {
         }
 
         if (this.customUI)
-          this.customUI.refresh();
+            this.customUI.refresh();
 
     }
 
@@ -54,6 +54,71 @@ abstract class SelectionSection extends Atomic.UISection {
 
     }
 
+    updateDynamicAttrInfos(attrInfos: Atomic.AttributeInfo[]) {
+
+        Atomic.ui.blockChangedEvents = true;
+
+        this.editType.attrInfos = attrInfos;
+
+        var attrEdit: AttributeInfoEdit;
+        var remove: AttributeInfoEdit[] = [];
+
+        var addWidget: Atomic.UIWidget;
+
+        for (var name in this.attrEdits) {
+
+            attrEdit = this.attrEdits[name];
+
+            if (attrEdit.attrInfo.dynamic) {
+                remove.push(attrEdit);
+            } else {
+                addWidget = attrEdit;
+            }
+
+        }
+
+        for (var i in remove) {
+
+            var attrEdit = remove[i];
+            attrEdit.remove();
+            delete this.attrEdits[attrEdit.attrInfo.name];
+
+        }
+
+        for (var i in attrInfos) {
+
+            var attr = attrInfos[i];
+
+            if (!attr.dynamic) {
+                continue;
+            }
+
+            if (attr.mode & Atomic.AM_NOEDIT)
+                continue;
+
+            var attrEdit = AttributeInfoEdit.createAttrEdit(this.editType, attr);
+
+            if (!attrEdit)
+                continue;
+
+            this.attrEdits[attr.name] = attrEdit;
+
+            if (!addWidget) {
+                this.attrLayout.addChild(attrEdit);
+                addWidget = attrEdit;
+            } else {
+                this.attrLayout.addChildAfter(attrEdit, addWidget);
+                addWidget = attrEdit;
+            }
+
+        }
+
+        this.refresh();
+
+        Atomic.ui.blockChangedEvents = false;
+
+    }
+
     createUI() {
 
         var attrLayout = this.attrLayout = new Atomic.UILayout(Atomic.UI_AXIS_Y);

+ 0 - 1
Script/AtomicEditor/ui/frames/inspector/SerializableEditType.ts

@@ -134,7 +134,6 @@ class SerializableEditType {
     }
 
     typeName: string;
-    typeWidget: Atomic.UIWidget;
     attrInfos: Atomic.AttributeInfo[];
 
     nodes: Atomic.Node[] = [];

+ 1 - 0
Script/TypeScript/AtomicWork.d.ts

@@ -208,6 +208,7 @@ declare module Atomic {
         defaultValue: string;
         enumNames: string[];
         resourceTypeName: string;
+        dynamic:boolean;
 
     }
 

+ 2 - 2
Source/AtomicJS/Javascript/JSSceneSerializable.cpp

@@ -279,7 +279,7 @@ static void GetDynamicAttributes(duk_context* ctx, unsigned& count, const Varian
             duk_put_prop_string(ctx, -2, "defaultValue");
 
             duk_push_boolean(ctx, 1);
-            duk_put_prop_string(ctx, -2, "field");
+            duk_put_prop_string(ctx, -2, "dynamic");
 
             duk_push_array(ctx);
 
@@ -390,7 +390,7 @@ static int Serializable_GetAttributes(duk_context* ctx)
             duk_put_prop_string(ctx, -2, "defaultValue");
 
             duk_push_boolean(ctx, 0);
-            duk_put_prop_string(ctx, -2, "field");
+            duk_put_prop_string(ctx, -2, "dynamic");
 
             duk_push_array(ctx);