浏览代码

Support creation from Project frame create button as well as context menu, adding Script resource creation

Josh Engebretson 10 年之前
父节点
当前提交
b4fba728b6

+ 40 - 0
Script/AtomicEditor/resources/ResourceOps.ts

@@ -75,6 +75,46 @@ export function CreateNewComponent(resourcePath: string, componentName: string,
 
 }
 
+export function CreateNewScript(resourcePath: string, scriptName: string, reportError: boolean = true): boolean {
+
+    var title = "New Script Error";
+
+    var fs = Atomic.fileSystem;
+
+    if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
+        if (reportError)
+            resourceOps.sendEvent(EditorEvents.ModalError, { title: title, message: "Already exists: " + resourcePath });
+        return false;
+
+    }
+
+    var templateFilename = "AtomicEditor/templates/template_script.js";
+    var file = Atomic.cache.getFile(templateFilename);
+
+    if (!file) {
+
+        if (reportError)
+            resourceOps.sendEvent(EditorEvents.ModalError, { title: title, message: "Failed to open template: " + templateFilename });
+        return false;
+
+    }
+
+    var out = new Atomic.File(resourcePath, Atomic.FILE_WRITE);
+    var success = out.copy(file);
+    out.close();
+
+    if (!success) {
+        if (reportError)
+            resourceOps.sendEvent(EditorEvents.ModalError, { title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
+        return false;
+    }
+
+    ToolCore.assetDatabase.scan();
+
+    return true;
+
+}
+
 export function CreateNewScene(resourcePath: string, sceneName: string, reportError: boolean = true): boolean {
 
     var title = "New Scene Error";

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

@@ -140,7 +140,7 @@ class ProjectFrame extends ScriptWidget {
             if (id == "menu create") {
 
                 var src = MenuItemSources.getMenuItemSource("project create items");
-                var menu = new Atomic.UIMenuWindow(data.target, "create popup");
+                var menu = new Atomic.UIMenuWindow(data.target, "asset context menu");
                 menu.show(src);
                 return true;
 

+ 23 - 27
Script/AtomicEditor/ui/ProjectFrameMenu.ts

@@ -22,32 +22,44 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
     handleAssetContextMenu(target: Atomic.UIWidget, refid: string) {
 
-        if (target.id == "asset context menu") {
+        if (target.id == "asset context menu" || target.id == "create popup") {
 
+            var path;
             var asset = <ToolCore.Asset> target['asset'];
 
+            if (asset) {
+                path = asset.path;
+            } else {
+                path = this.contentFolder;
+            }
+
             if (refid == "delete_asset") {
                 EditorUI.getModelOps().showResourceDelete(asset);
                 return true;
             }
 
             if (refid == "create_folder") {
-                EditorUI.getModelOps().showCreateFolder(asset.path);
+                EditorUI.getModelOps().showCreateFolder(path);
                 return true;
             }
 
             if (refid == "create_component") {
-                EditorUI.getModelOps().showCreateComponent(asset.path);
+                EditorUI.getModelOps().showCreateComponent(path);
+                return true;
+            }
+
+            if (refid == "create_script") {
+                EditorUI.getModelOps().showCreateScript(path);
                 return true;
             }
 
             if (refid == "create_scene") {
-                EditorUI.getModelOps().showCreateScene(asset.path);
+                EditorUI.getModelOps().showCreateScene(path);
                 return true;
             }
 
             if (refid == "create_material") {
-                EditorUI.getModelOps().showCreateMaterial(asset.path);
+                EditorUI.getModelOps().showCreateMaterial(path);
                 return true;
             }
 
@@ -88,24 +100,6 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
         }
 
-        if (target.id == "create popup") {
-
-            if (refid == "create_folder") {
-
-                EditorUI.getModelOps().showCreateFolder(this.contentFolder);
-
-                return true;
-
-            }
-
-            if (refid == "create_script") {
-
-                return true;
-
-            }
-
-        }
-
         return false;
 
     }
@@ -128,6 +122,7 @@ var assetGeneralContextItems = {
 var assetFolderContextItems = {
     "Create Folder": ["create_folder", undefined, "Folder.icon"],
     "Create Component": ["create_component", undefined, "ComponentBitmap"],
+    "Create Script": ["create_script", undefined, "ComponentBitmap"],
     "Create Material": ["create_material", undefined, "ComponentBitmap"],
     "Create Scene": ["create_scene", undefined, "ComponentBitmap"],
     "-1": null,
@@ -137,8 +132,9 @@ var assetFolderContextItems = {
 };
 
 var createItems = {
-  "Create Folder": ["create_folder", undefined, "Folder.icon"],
-  "Create Component": ["create_component", undefined, "ComponentBitmap"],
-  "Create Material": ["create_material", undefined, "ComponentBitmap"],
-  "Create Scene": ["create_scene", undefined, "ComponentBitmap"],
+    "Create Folder": ["create_folder", undefined, "Folder.icon"],
+    "Create Component": ["create_component", undefined, "ComponentBitmap"],
+    "Create Script": ["create_script", undefined, "ComponentBitmap"],
+    "Create Material": ["create_material", undefined, "ComponentBitmap"],
+    "Create Scene": ["create_scene", undefined, "ComponentBitmap"],
 };

+ 10 - 0
Script/AtomicEditor/ui/modal/ModalOps.ts

@@ -51,6 +51,16 @@ class ModalOps extends Atomic.ScriptObject {
 
     }
 
+    showCreateScript(resourcePath:string) {
+
+      if (this.show()) {
+
+          this.opWindow = new UIResourceOps.CreateScript(resourcePath);
+
+      }
+
+    }
+
     showCreateScene(resourcePath:string) {
 
       if (this.show()) {

+ 53 - 0
Script/AtomicEditor/ui/modal/UIResourceOps.ts

@@ -155,6 +155,59 @@ export class CreateComponent extends ModalWindow {
 
 }
 
+export class CreateScript extends ModalWindow {
+
+    constructor(resourcePath: string) {
+
+        super();
+
+        this.resourcePath = resourcePath;
+        this.init("New Script", "AtomicEditor/editor/ui/resourcecreatecomponent.tb.txt");
+        this.nameField = <Atomic.UIEditField> this.getWidget("component_name");
+    }
+
+    handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
+
+        if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
+
+            var id = ev.target.id;
+
+            if (id == "create") {
+
+                var scriptName = this.nameField.text;
+                var outputFile = Atomic.addTrailingSlash(this.resourcePath) + scriptName;
+
+                if (outputFile.indexOf(".js") == -1) outputFile += ".js";
+
+
+                if (ResourceOps.CreateNewScript(outputFile, scriptName)) {
+
+                    this.hide();
+
+                    this.sendEvent(EditorEvents.EditResource, { path:outputFile});
+
+                }
+
+                return true;
+
+            }
+
+            if (id == "cancel") {
+
+                this.hide();
+
+                return true;
+            }
+
+        }
+
+    }
+
+    resourcePath: string;
+    nameField: Atomic.UIEditField;
+
+}
+
 export class CreateScene extends ModalWindow {
 
     constructor(resourcePath: string) {