Browse Source

Modified the New Project and the Create project based off example to support multiple languages. These are configured in the json files that describe the project templates. Modified the signature of the ModalOp that launches the CreateProject dialog to accept a ProjectTemplateDefinition that fully describes the project to create.

Shaddock Heath 10 years ago
parent
commit
bf5bfeb9bd

+ 75 - 0
Script/AtomicEditor/resources/ProjectTemplates.ts

@@ -0,0 +1,75 @@
+import EditorUI = require("../ui/EditorUI");
+/**
+ * Interface around a project template
+ */
+export interface ProjectTemplateDefinition {
+    name: string;
+    desc: string;
+    screenshot: string;
+    templates: [ProjectTemplateDetail];
+    folder: string;
+    module: string;
+}
+
+/**
+ * Inner details of the project template.
+ */
+export interface ProjectTemplateDetail {
+    language: string;
+    folder: string;
+}
+
+/**
+ * Returns the structured template definition for the provided project type.
+ * Note that the path to the templates folder will be fully resolved
+ * @param  {string} projectType A template type.  One of project_empty, project_2d, project_3d
+ * @return {ProjectTemplateDefinition}              the template definition for the proved project type
+ */
+export function getNewProjectTemplateDefinition(projectType: string): ProjectTemplateDefinition {
+    var env = ToolCore.toolEnvironment;
+    var projectTemplateFolder = env.toolDataDir + "ProjectTemplates/";
+    var projectTemplateJsonFile = projectTemplateFolder + "ProjectTemplates.json";
+    let jsonFile = new Atomic.File(projectTemplateJsonFile, Atomic.FILE_READ);
+
+    if (!jsonFile.isOpen()) {
+        return null;
+    }
+    // Update all the paths to a more fully qualified path
+    let json = JSON.parse(jsonFile.readText());
+    let projectTemplate = <ProjectTemplateDefinition>json[projectType];
+    if (projectTemplate) {
+        projectTemplate.templates.forEach(template => {
+            template.folder = projectTemplateFolder + template.folder + "/";
+        });
+    }
+
+    return projectTemplate;
+}
+
+/**
+ * Return an array of all of the example project definitions.
+ * Note that the paths in both screenshot and folder will be fully resolved.
+ * @return {[ProjectTemplateDefinition]} Array of example project definitions.
+ */
+export function getExampleProjectTemplateDefinitions(): [ProjectTemplateDefinition] {
+    let env = ToolCore.toolEnvironment;
+    let exampleInfoDir = env.toolDataDir + "ExampleInfo/";
+    let exampleJsonFile = exampleInfoDir + "Examples.json";
+    let jsonFile = new Atomic.File(exampleJsonFile, Atomic.FILE_READ);
+
+    if (!jsonFile.isOpen()) {
+        return;
+    }
+
+    let exampleJson = JSON.parse(jsonFile.readText());
+    let examples = <[ProjectTemplateDefinition]>exampleJson.examples;
+
+    // Update all the paths to a more fully qualified path
+    examples.forEach(example => {
+        example.screenshot = exampleInfoDir + example.screenshot;
+        example.templates.forEach(template => {
+            template.folder = env.toolDataDir + "AtomicExamples/" + template.folder + "/";
+        });
+    });
+    return exampleJson.examples;
+}

+ 9 - 39
Script/AtomicEditor/ui/frames/WelcomeFrame.ts

@@ -9,6 +9,7 @@ import EditorEvents = require("editor/EditorEvents");
 import EditorUI = require("ui/EditorUI");
 import EditorUI = require("ui/EditorUI");
 import ScriptWidget = require("ui/ScriptWidget");
 import ScriptWidget = require("ui/ScriptWidget");
 import Preferences = require("editor/Preferences");
 import Preferences = require("editor/Preferences");
+import ProjectTemplates = require("resources/ProjectTemplates");
 
 
 class WelcomeFrame extends ScriptWidget {
 class WelcomeFrame extends ScriptWidget {
 
 
@@ -40,15 +41,14 @@ class WelcomeFrame extends ScriptWidget {
 
 
     }
     }
 
 
-    handleClickedExample(example: ExampleFormat) {
+    handleClickedExample(example: ProjectTemplates.ProjectTemplateDefinition) {
 
 
       var ops = EditorUI.getModelOps();
       var ops = EditorUI.getModelOps();
       var env = ToolCore.toolEnvironment;
       var env = ToolCore.toolEnvironment;
-      ops.showCreateProject(env.toolDataDir + "AtomicExamples/" + example.folder + "/", this.exampleInfoDir + example.screenshot);
-
+      ops.showCreateProject(example);
     }
     }
 
 
-    addExample(example: ExampleFormat) {
+    addExample(example: ProjectTemplates.ProjectTemplateDefinition) {
 
 
         var exlayout = <Atomic.UILayout>this.getWidget("examples_layout");
         var exlayout = <Atomic.UILayout>this.getWidget("examples_layout");
 
 
@@ -79,9 +79,9 @@ class WelcomeFrame extends ScriptWidget {
 
 
           this.handleClickedExample(example);
           this.handleClickedExample(example);
 
 
-        }
+        };
 
 
-        image.image = this.exampleInfoDir + example.screenshot;
+        image.image = example.screenshot;
         image.skinBg = "ImageFrame";
         image.skinBg = "ImageFrame";
         var rect = [0, 0, image.imageWidth / 2, image.imageHeight / 2];
         var rect = [0, 0, image.imageWidth / 2, image.imageHeight / 2];
         image.rect = rect;
         image.rect = rect;
@@ -144,24 +144,10 @@ class WelcomeFrame extends ScriptWidget {
     }
     }
 
 
     initExampleBrowser() {
     initExampleBrowser() {
-
-        var env = ToolCore.toolEnvironment;
-
-        this.exampleInfoDir =env.toolDataDir + "ExampleInfo/";
-
-        var exampleJsonFile = this.exampleInfoDir + "Examples.json";
-
-        var jsonFile = new Atomic.File(exampleJsonFile, Atomic.FILE_READ);
-        if (!jsonFile.isOpen())
-            return;
-
-        var examples = <ExamplesFormat>JSON.parse(jsonFile.readText());
-
-        for (var i in examples.examples) {
-
-            this.addExample(examples.examples[i]);
+        let examples = ProjectTemplates.getExampleProjectTemplateDefinitions();
+        for (var i = 0; i < examples.length; i++) {
+            this.addExample(examples[i]);
         }
         }
-
     }
     }
 
 
     handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
     handleWidgetEvent(ev: Atomic.UIWidgetEvent) {
@@ -235,28 +221,12 @@ class WelcomeFrame extends ScriptWidget {
     }
     }
 
 
     // examples
     // examples
-    exampleInfoDir: string;
     exampleCount = 0;
     exampleCount = 0;
     currentExampleLayout: Atomic.UILayout;
     currentExampleLayout: Atomic.UILayout;
-    exampleInfos:[ExampleFormat];
 
 
     recent: string[] = [];
     recent: string[] = [];
     recentList: Atomic.UIListView;
     recentList: Atomic.UIListView;
 
 
 }
 }
 
 
-class ExamplesFormat {
-
-    examples: [ExampleFormat];
-
-}
-
-class ExampleFormat {
-    name: string;
-    desc: string;
-    screenshot: string;
-    folder: string;
-    module: string;
-}
-
 export = WelcomeFrame;
 export = WelcomeFrame;

+ 30 - 18
Script/AtomicEditor/ui/modal/CreateProject.ts

@@ -9,13 +9,15 @@ import EditorEvents = require("../../editor/EditorEvents");
 import EditorUI = require("../EditorUI");
 import EditorUI = require("../EditorUI");
 import ModalWindow = require("./ModalWindow");
 import ModalWindow = require("./ModalWindow");
 
 
+import ProjectTemplates = require("../resources/ProjectTemplates");
+
 class CreateProject extends ModalWindow {
 class CreateProject extends ModalWindow {
 
 
-    constructor(templateSourceDir: string, imagePath: string = "") {
+    constructor(projectTemplate: ProjectTemplates.ProjectTemplateDefinition) {
 
 
         super();
         super();
 
 
-        this.templateSourceDir = templateSourceDir;
+        this.projectTemplate = projectTemplate;
 
 
         this.init("Create Project", "AtomicEditor/editor/ui/createproject.tb.txt");
         this.init("Create Project", "AtomicEditor/editor/ui/createproject.tb.txt");
 
 
@@ -24,10 +26,10 @@ class CreateProject extends ModalWindow {
         this.projectLanguageField = <Atomic.UISelectDropdown> this.getWidget("project_language");
         this.projectLanguageField = <Atomic.UISelectDropdown> this.getWidget("project_language");
         this.image = <Atomic.UIImageWidget> this.getWidget("project_image");
         this.image = <Atomic.UIImageWidget> this.getWidget("project_image");
 
 
-        if (!imagePath)
+        if (!projectTemplate.screenshot)
             this.image.visibility = Atomic.UI_WIDGET_VISIBILITY_GONE;
             this.image.visibility = Atomic.UI_WIDGET_VISIBILITY_GONE;
         else
         else
-            this.image.image = imagePath;
+            this.image.image = projectTemplate.screenshot;
 
 
 
 
         var fileSystem = Atomic.getFileSystem();
         var fileSystem = Atomic.getFileSystem();
@@ -98,17 +100,31 @@ class CreateProject extends ModalWindow {
         }
         }
 
 
         // Do the creation!
         // Do the creation!
+        let templateDetail : ProjectTemplates.ProjectTemplateDetail;
+        let selectedLanguage = this.projectLanguageField.text;
+
+        for (let i = 0; i < this.projectTemplate.templates.length; i++) {
+          if (this.projectTemplate.templates[i].language === selectedLanguage) {
+            templateDetail = this.projectTemplate.templates[i];
+            break;
+          }
+        }
+
+        if (templateDetail) {
 
 
-        fileSystem.copyDir(this.templateSourceDir + "Resources", folder + "Resources");
+          fileSystem.copyDir(templateDetail.folder + "Resources", folder + "Resources");
 
 
-        var file = new Atomic.File(folder + name + ".atomic", Atomic.FILE_WRITE);
-        file.close();
+          var file = new Atomic.File(folder + name + ".atomic", Atomic.FILE_WRITE);
+          file.close();
 
 
-        this.hide();
+          this.hide();
 
 
-        this.sendEvent(EditorEvents.LoadProject, { path: folder });
+          this.sendEvent(EditorEvents.LoadProject, { path: folder });
 
 
-        return true;
+          return true;
+        } else {
+          return false;
+        }
 
 
     }
     }
 
 
@@ -147,16 +163,12 @@ class CreateProject extends ModalWindow {
      */
      */
     populateLanguageSelectionList() {
     populateLanguageSelectionList() {
       this.projectLanguageFieldSource.clear();
       this.projectLanguageFieldSource.clear();
-      var languages: string[] = ["JavaScript", "TypeScript", "CSharp"];
 
 
-      for (var i in languages) {
-          this.projectLanguageFieldSource.addItem(new Atomic.UISelectItem(languages[i]));
-      }
+      this.projectTemplate.templates.forEach(templateDetail => {
+          this.projectLanguageFieldSource.addItem(new Atomic.UISelectItem(templateDetail.language));
+      });
 
 
       this.projectLanguageField.source = this.projectLanguageFieldSource;
       this.projectLanguageField.source = this.projectLanguageFieldSource;
-
-      // force a refresh
-      this.projectLanguageField.value = -1;
       this.projectLanguageField.value = 0;
       this.projectLanguageField.value = 0;
     }
     }
 
 
@@ -166,7 +178,7 @@ class CreateProject extends ModalWindow {
     projectLanguageFieldSource: Atomic.UISelectItemSource = new Atomic.UISelectItemSource();
     projectLanguageFieldSource: Atomic.UISelectItemSource = new Atomic.UISelectItemSource();
     image: Atomic.UIImageWidget;
     image: Atomic.UIImageWidget;
 
 
-    templateSourceDir: string;
+    projectTemplate: ProjectTemplates.ProjectTemplateDefinition;
 }
 }
 
 
 
 

+ 5 - 2
Script/AtomicEditor/ui/modal/ModalOps.ts

@@ -28,6 +28,9 @@ import UIResourceOps = require("./UIResourceOps");
 
 
 import SnapSettingsWindow = require("./SnapSettingsWindow");
 import SnapSettingsWindow = require("./SnapSettingsWindow");
 
 
+import ProjectTemplates = require("../../resources/ProjectTemplates");
+
+
 class ModalOps extends Atomic.ScriptObject {
 class ModalOps extends Atomic.ScriptObject {
 
 
     constructor() {
     constructor() {
@@ -38,11 +41,11 @@ class ModalOps extends Atomic.ScriptObject {
 
 
     }
     }
 
 
-    showCreateProject(projectTemplateFolder: string, imagePath: string = "") {
+    showCreateProject(projectTemplateDefinition : ProjectTemplates.ProjectTemplateDefinition) {
 
 
         if (this.show()) {
         if (this.show()) {
 
 
-            this.opWindow = new CreateProject(projectTemplateFolder, imagePath);
+            this.opWindow = new CreateProject(projectTemplateDefinition);
 
 
         }
         }
 
 

+ 8 - 23
Script/AtomicEditor/ui/modal/NewProject.ts

@@ -7,6 +7,7 @@
 
 
 import EditorUI = require("../EditorUI");
 import EditorUI = require("../EditorUI");
 import ModalWindow = require("./ModalWindow");
 import ModalWindow = require("./ModalWindow");
+import ProjectTemplates = require("../../resources/ProjectTemplates");
 
 
 class NewProject extends ModalWindow {
 class NewProject extends ModalWindow {
 
 
@@ -22,38 +23,22 @@ class NewProject extends ModalWindow {
 
 
         if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
         if (ev.type == Atomic.UI_EVENT_TYPE_CLICK) {
 
 
-            var id = ev.target.id;
+            let id = ev.target.id;
 
 
             if (id == "cancel") {
             if (id == "cancel") {
                 this.hide();
                 this.hide();
                 return true;
                 return true;
             }
             }
+            let projectDefinition = ProjectTemplates.getNewProjectTemplateDefinition(id);
 
 
-            var projectType = "";
-
-            if (id == "project_empty") {
-                projectType = "EmptyProject/";
-            }
-            else if (id == "project_2d") {
-                projectType = "Project2D/";
-            }
-            else if (id == "project_3d") {
-                projectType = "Project3D/";
-            }
-
-            if (projectType) {
-
-                var env = ToolCore.toolEnvironment;
-                var projectTemplateFolder = env.toolDataDir + "ProjectTemplates/" + projectType;
-
+            if (projectDefinition) {
                 this.hide();
                 this.hide();
 
 
-                var ops = EditorUI.getModelOps();
-                ops.showCreateProject(projectTemplateFolder);
-
-
+                let ops = EditorUI.getModelOps();
+                ops.showCreateProject(projectDefinition);
+            } else {
+              EditorUI.showModalError("New Project Error", `Could not create new project of type: ${id}`);
             }
             }
-
         }
         }
     }
     }
 }
 }

+ 1 - 0
Script/tsconfig.json

@@ -25,6 +25,7 @@
         "./AtomicEditor/editor/EditorLicense.ts",
         "./AtomicEditor/editor/EditorLicense.ts",
         "./AtomicEditor/editor/Preferences.ts",
         "./AtomicEditor/editor/Preferences.ts",
         "./AtomicEditor/main.ts",
         "./AtomicEditor/main.ts",
+        "./AtomicEditor/resources/ProjectTemplates.ts",
         "./AtomicEditor/resources/ResourceOps.ts",
         "./AtomicEditor/resources/ResourceOps.ts",
         "./AtomicEditor/ui/EditorStrings.ts",
         "./AtomicEditor/ui/EditorStrings.ts",
         "./AtomicEditor/ui/EditorUI.ts",
         "./AtomicEditor/ui/EditorUI.ts",