Browse Source

Support dropping component scripts on JSComponent script inspector field

Josh Engebretson 10 years ago
parent
commit
4ab6d4ff09

+ 2 - 2
Script/AtomicEditor/ui/ProjectFrame.ts

@@ -38,7 +38,7 @@ class ProjectFrame extends ScriptWidget {
 
 
         // events
         // events
         this.subscribeToEvent("ProjectLoaded", (data) => this.handleProjectLoaded(data));
         this.subscribeToEvent("ProjectLoaded", (data) => this.handleProjectLoaded(data));
-        this.subscribeToEvent("DragEnded", (data) => this.handleDragEnded(data));
+        this.subscribeToEvent("DragEnded", (data:Atomic.DragEndedEvent) => this.handleDragEnded(data));
 
 
         this.subscribeToEvent("ResourceAdded", (ev: ToolCore.ResourceAddedEvent) => this.handleResourceAdded(ev));
         this.subscribeToEvent("ResourceAdded", (ev: ToolCore.ResourceAddedEvent) => this.handleResourceAdded(ev));
         this.subscribeToEvent("ResourceRemoved", (ev: ToolCore.ResourceRemovedEvent) => this.handleResourceRemoved(ev));
         this.subscribeToEvent("ResourceRemoved", (ev: ToolCore.ResourceRemovedEvent) => this.handleResourceRemoved(ev));
@@ -252,7 +252,7 @@ class ProjectFrame extends ScriptWidget {
         if (!asset || !asset.isFolder)
         if (!asset || !asset.isFolder)
             return;
             return;
 
 
-        var dragObject = <Atomic.UIDragObject> data.dragObject;
+        var dragObject = data.dragObject;
         if (dragObject.object && dragObject.object.typeName == "Node") {
         if (dragObject.object && dragObject.object.typeName == "Node") {
 
 
             var node = <Atomic.Node> dragObject.object;
             var node = <Atomic.Node> dragObject.object;

+ 97 - 67
Script/AtomicEditor/ui/inspector/ComponentInspector.ts

@@ -103,16 +103,16 @@ class ComponentInspector extends Atomic.UISection {
 
 
         if (component.getTypeName() == "PrefabComponent") {
         if (component.getTypeName() == "PrefabComponent") {
 
 
-          this.addPrefabUI(attrsVerticalLayout);
+            this.addPrefabUI(attrsVerticalLayout);
 
 
         }
         }
 
 
         if (component.getTypeName() == "Light") {
         if (component.getTypeName() == "Light") {
-          this.addLightCascadeParametersUI(attrsVerticalLayout);
+            this.addLightCascadeParametersUI(attrsVerticalLayout);
         }
         }
 
 
         if (component.getTypeName() == "JSComponent") {
         if (component.getTypeName() == "JSComponent") {
-          this.addJSComponentUI(attrsVerticalLayout);
+            this.addJSComponentUI(attrsVerticalLayout);
         }
         }
 
 
 
 
@@ -143,110 +143,140 @@ class ComponentInspector extends Atomic.UISection {
 
 
     // Move these to a mixing class
     // Move these to a mixing class
 
 
-    addPrefabUI(layout:Atomic.UILayout) {
+    addPrefabUI(layout: Atomic.UILayout) {
 
 
-      // expand prefab
-      this.value = 1;
+        // expand prefab
+        this.value = 1;
 
 
-      var fd = new Atomic.UIFontDescription();
-      fd.id = "Vera";
-      fd.size = 11;
+        var fd = new Atomic.UIFontDescription();
+        fd.id = "Vera";
+        fd.size = 11;
 
 
-      var selectButton = new Atomic.UIButton();
-      selectButton.text = "Select Prefab";
-      selectButton.fontDescription = fd;
+        var selectButton = new Atomic.UIButton();
+        selectButton.text = "Select Prefab";
+        selectButton.fontDescription = fd;
 
 
-      selectButton.onClick = () => {
+        selectButton.onClick = () => {
 
 
-          var node = (<Atomic.PrefabComponent> this.component).getPrefabNode();
+            var node = (<Atomic.PrefabComponent> this.component).getPrefabNode();
 
 
-          this.sendEvent("EditorActiveNodeChange", { node: node });
+            this.sendEvent("EditorActiveNodeChange", { node: node });
 
 
-          return true;
+            return true;
 
 
-      }
+        }
 
 
-      layout.addChild(selectButton);
+        layout.addChild(selectButton);
 
 
     }
     }
 
 
-    addJSComponentUI(layout:Atomic.UILayout) {
+    addJSComponentUI(layout: Atomic.UILayout) {
+
+        var js = <Atomic.JSComponent> this.component;
+
+        // expand prefab
+        this.value = 1;
+
+        var fd = new Atomic.UIFontDescription();
+        fd.id = "Vera";
+        fd.size = 11;
+
+        var selectButton = new Atomic.UIButton();
+        selectButton.text = "Select Script";
+        selectButton.fontDescription = fd;
 
 
-      var js = <Atomic.JSComponent> this.component;
+        selectButton.onClick = () => {
 
 
-      // expand prefab
-      this.value = 1;
+            return true;
+        }
+
+        var field = InspectorUtils.createAttrEditField("Script", layout);
+        field.readOnly = true;
+        field.text = js.componentFile ? js.componentFile.name : "";
+
+        // handle dropping of component on field
+        field.subscribeToEvent(field, "DragEnded", (ev: Atomic.DragEndedEvent) => {
+
+            if (ev.target == field) {
+
+                var dragObject = ev.dragObject;
+
+                if (dragObject.object && dragObject.object.typeName == "Asset") {
 
 
-      var fd = new Atomic.UIFontDescription();
-      fd.id = "Vera";
-      fd.size = 11;
+                    var asset = <ToolCore.Asset> dragObject.object;
 
 
-      var selectButton = new Atomic.UIButton();
-      selectButton.text = "Select Script";
-      selectButton.fontDescription = fd;
+                    if (asset.importerTypeName == "JavascriptImporter") {
 
 
-      selectButton.onClick = () => {
+                        var jsImporter = <ToolCore.JavascriptImporter> asset.importer;
+                        if (jsImporter.isComponentFile()) {
 
 
-          return true;
-      }
+                            js.componentFile = <Atomic.JSComponentFile> Atomic.cache.getResource("JSComponentFile", asset.path);
+                            if (js.componentFile)
+                                ev.target.text = js.componentFile.name;
 
 
-      var field = InspectorUtils.createAttrEditField("Script", layout);
-      field.readOnly = true;
-      field.text = js.componentFile ? js.componentFile.name : "";
+                        }
 
 
-      layout.addChild(selectButton);
+                    }
+
+                }
+
+            }
+
+        });
+
+        layout.addChild(selectButton);
 
 
     }
     }
 
 
 
 
-    addLightCascadeParametersUI(layout:Atomic.UILayout) {
+    addLightCascadeParametersUI(layout: Atomic.UILayout) {
 
 
-      var light = <Atomic.Light> this.component;
+        var light = <Atomic.Light> this.component;
 
 
-      var cascadeInfo = light.getShadowCascade();
+        var cascadeInfo = light.getShadowCascade();
 
 
-      var container = InspectorUtils.createContainer();
-      container.gravity = Atomic.UI_GRAVITY_ALL;
-      layout.addChild(container);
+        var container = InspectorUtils.createContainer();
+        container.gravity = Atomic.UI_GRAVITY_ALL;
+        layout.addChild(container);
 
 
-      var panel = new Atomic.UILayout();
-      panel.axis = Atomic.UI_AXIS_Y;
-      panel.layoutSize = Atomic.UI_LAYOUT_SIZE_PREFERRED;
-      panel.layoutPosition = Atomic.UI_LAYOUT_POSITION_LEFT_TOP;
-      container.addChild(panel);
+        var panel = new Atomic.UILayout();
+        panel.axis = Atomic.UI_AXIS_Y;
+        panel.layoutSize = Atomic.UI_LAYOUT_SIZE_PREFERRED;
+        panel.layoutPosition = Atomic.UI_LAYOUT_POSITION_LEFT_TOP;
+        container.addChild(panel);
 
 
-      var label = InspectorUtils.createAttrName("CSM Splits:");
-      panel.addChild(label);
+        var label = InspectorUtils.createAttrName("CSM Splits:");
+        panel.addChild(label);
 
 
-      function createHandler(index, light, field) {
+        function createHandler(index, light, field) {
 
 
-        return function(data:Atomic.UIWidgetEvent) {
+            return function(data: Atomic.UIWidgetEvent) {
 
 
-          if (data.type == Atomic.UI_EVENT_TYPE_CHANGED) {
+                if (data.type == Atomic.UI_EVENT_TYPE_CHANGED) {
 
 
-            this.light.setShadowCascadeParameter(this.index, Number(this.field.text));
+                    this.light.setShadowCascadeParameter(this.index, Number(this.field.text));
 
 
-          }
+                }
 
 
-        }.bind({index:index, light:light, field:field});
+            }.bind({ index: index, light: light, field: field });
 
 
-      }
+        }
 
 
-      var field = InspectorUtils.createAttrEditField("Split 0", panel);
-      field.text = cascadeInfo[0].toString();
-      field.subscribeToEvent(field, "WidgetEvent", createHandler(0, light, field));
+        var field = InspectorUtils.createAttrEditField("Split 0", panel);
+        field.text = cascadeInfo[0].toString();
+        field.subscribeToEvent(field, "WidgetEvent", createHandler(0, light, field));
 
 
-      field = InspectorUtils.createAttrEditField("Split 1", panel);
-      field.text = cascadeInfo[1].toString();
-      field.subscribeToEvent(field, "WidgetEvent", createHandler(1, light, field));
+        field = InspectorUtils.createAttrEditField("Split 1", panel);
+        field.text = cascadeInfo[1].toString();
+        field.subscribeToEvent(field, "WidgetEvent", createHandler(1, light, field));
 
 
-      field = InspectorUtils.createAttrEditField("Split 2", panel);
-      field.text = cascadeInfo[2].toString();
-      field.subscribeToEvent(field, "WidgetEvent", createHandler(2, light, field));
+        field = InspectorUtils.createAttrEditField("Split 2", panel);
+        field.text = cascadeInfo[2].toString();
+        field.subscribeToEvent(field, "WidgetEvent", createHandler(2, light, field));
 
 
-      field = InspectorUtils.createAttrEditField("Split 3", panel);
-      field.text = cascadeInfo[3].toString();
-      field.subscribeToEvent(field, "WidgetEvent", createHandler(3, light, field));
+        field = InspectorUtils.createAttrEditField("Split 3", panel);
+        field.text = cascadeInfo[3].toString();
+        field.subscribeToEvent(field, "WidgetEvent", createHandler(3, light, field));
 
 
     }
     }
 
 

+ 1 - 1
Script/TypeScript/Atomic.d.ts

@@ -8057,7 +8057,7 @@ declare module Atomic {
       getUpdateEventMask(): number;
       getUpdateEventMask(): number;
       // Return whether the DelayedStart() function has been called.
       // Return whether the DelayedStart() function has been called.
       isDelayedStartCalled(): boolean;
       isDelayedStartCalled(): boolean;
-      setComponentFile(cfile: JSComponentFile, loading?: boolean): void;
+      setComponentFile(cfile: JSComponentFile): void;
       setDestroyed(): void;
       setDestroyed(): void;
       initInstance(hasArgs?: boolean, argIdx?: number): void;
       initInstance(hasArgs?: boolean, argIdx?: number): void;
 
 

+ 11 - 0
Script/TypeScript/ToolCore.d.ts

@@ -300,6 +300,17 @@ declare module ToolCore {
 
 
    }
    }
 
 
+   export class JavascriptImporter extends AssetImporter {
+
+      // Construct.
+      constructor(asset: Asset);
+
+      setDefaults(): void;
+      isComponentFile(): boolean;
+      import(guid: string): boolean;
+
+   }
+
    export class MaterialImporter extends AssetImporter {
    export class MaterialImporter extends AssetImporter {
 
 
       // Construct.
       // Construct.

+ 1 - 1
Source/Atomic/UI/UIDragDrop.cpp

@@ -79,7 +79,7 @@ void UIDragDrop::DragEnd()
     VariantMap dropData;
     VariantMap dropData;
     dropData[DragEnded::P_TARGET] = currentTargetWidget;
     dropData[DragEnded::P_TARGET] = currentTargetWidget;
     dropData[DragEnded::P_DRAGOBJECT] = dragObject;
     dropData[DragEnded::P_DRAGOBJECT] = dragObject;
-    dragObject->SendEvent(E_DRAGENDED, dropData);
+    currentTargetWidget->SendEvent(E_DRAGENDED, dropData);
 }
 }
 
 
 void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)
 void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData)

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

@@ -544,7 +544,7 @@ bool JSComponent::LoadXML(const XMLElement& source, bool setInstanceDefault)
     return success;
     return success;
 }
 }
 
 
-void JSComponent::SetComponentFile(JSComponentFile* cfile, bool loading)
+void JSComponent::SetComponentFile(JSComponentFile* cfile)
 {
 {
     componentFile_ = cfile;
     componentFile_ = cfile;
 }
 }
@@ -557,7 +557,7 @@ ResourceRef JSComponent::GetScriptAttr() const
 void JSComponent::SetScriptAttr(const ResourceRef& value)
 void JSComponent::SetScriptAttr(const ResourceRef& value)
 {
 {
     ResourceCache* cache = GetSubsystem<ResourceCache>();
     ResourceCache* cache = GetSubsystem<ResourceCache>();
-    SetComponentFile(cache->GetResource<JSComponentFile>(value.name_), loading_);
+    SetComponentFile(cache->GetResource<JSComponentFile>(value.name_));
 }
 }
 
 
 }
 }

+ 1 - 1
Source/AtomicJS/Javascript/JSComponent.h

@@ -83,7 +83,7 @@ public:
 
 
     /// Set script attribute.
     /// Set script attribute.
     void SetScriptAttr(const ResourceRef& value);
     void SetScriptAttr(const ResourceRef& value);
-    void SetComponentFile(JSComponentFile* cfile, bool loading = false);
+    void SetComponentFile(JSComponentFile* cfile);
 
 
     void SetDestroyed() { destroyed_ = true; }
     void SetDestroyed() { destroyed_ = true; }
 
 

+ 1 - 1
Source/AtomicJS/Packages/ToolCore/ToolCore.json

@@ -5,7 +5,7 @@
 	"classes" : ["ToolEnvironment", "ToolSystem", "Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
 	"classes" : ["ToolEnvironment", "ToolSystem", "Project", "ProjectFile", "Platform", "PlatformMac", "PlatformWeb",
 							 "PlatformWindows", "Command", "PlayCmd", "OpenAssetImporter",
 							 "PlatformWindows", "Command", "PlayCmd", "OpenAssetImporter",
 							 "Asset", "AssetDatabase", "AssetImporter", "ModelImporter", "MaterialImporter", "AnimationImportInfo",
 							 "Asset", "AssetDatabase", "AssetImporter", "ModelImporter", "MaterialImporter", "AnimationImportInfo",
-							 "PrefabImporter", "LicenseSystem"],
+							 "PrefabImporter", "JavascriptImporter", "LicenseSystem"],
 	"typescript_decl" : {
 	"typescript_decl" : {
 
 
 		"AssetDatabase" : [
 		"AssetDatabase" : [

+ 1 - 1
Source/ToolCore/Assets/JavascriptImporter.h

@@ -17,7 +17,7 @@ public:
 
 
     virtual void SetDefaults();
     virtual void SetDefaults();
 
 
-    bool IsComponentFile();
+    bool IsComponentFile() { return isComponentFile_; }
 
 
     bool Import(const String& guid);
     bool Import(const String& guid);