Browse Source

Work on AtomicNET project creation

Josh Engebretson 9 years ago
parent
commit
ad41349f8f

+ 1 - 0
.gitignore

@@ -21,3 +21,4 @@ node_modules/*
 Script/TypeScript/**/*.d.ts
 !Script/TypeScript/**/*Work.d.ts
 Script/Haxe/*
+**/.vscode

+ 62 - 0
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/MainActivity.cs

@@ -0,0 +1,62 @@
+using Android.App;
+using Android.Content.PM;
+using Android.Widget;
+using Android.OS;
+using Android.Views;
+using AtomicEngine;
+
+namespace AtomicPlayer
+{
+	[Activity(Label = "AtomicPlayer", MainLauncher = true,
+		Icon = "@drawable/icon", Theme = "@android:style/Theme.NoTitleBar.Fullscreen",
+		ConfigurationChanges = ConfigChanges.KeyboardHidden | ConfigChanges.Orientation,
+		ScreenOrientation = ScreenOrientation.Landscape)]
+	public class MainActivity : Activity
+	{
+		protected override void OnCreate(Bundle bundle)
+		{
+			base.OnCreate(bundle);
+			var mLayout = new AbsoluteLayout(this);
+            var surface = AndroidSDLSurface.CreateSurface(this, false, typeof(AtomicMain));
+			mLayout.AddView(surface);
+			SetContentView(mLayout);
+		}
+
+		protected override void OnResume()
+		{
+            AndroidSDLSurface.OnResume();
+			base.OnResume();
+		}
+
+		protected override void OnPause()
+		{
+            AndroidSDLSurface.OnPause();
+			base.OnPause();
+		}
+
+		public override void OnLowMemory()
+		{
+            AndroidSDLSurface.OnLowMemory();
+			base.OnLowMemory();
+		}
+
+		protected override void OnDestroy()
+		{
+            AndroidSDLSurface.OnDestroy();
+			base.OnDestroy();
+		}
+
+		public override bool DispatchKeyEvent(KeyEvent e)
+		{
+			if (!AndroidSDLSurface.DispatchKeyEvent(e))
+				return false;
+			return base.DispatchKeyEvent(e);
+		}
+
+		public override void OnWindowFocusChanged(bool hasFocus)
+		{
+            AndroidSDLSurface.OnWindowFocusChanged(hasFocus);
+			base.OnWindowFocusChanged(hasFocus);
+		}
+	}
+}

+ 5 - 0
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/Properties/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="$$APPLICATION_NAME$$.$$APPLICATION_NAME$$" android:versionCode="1" android:versionName="1.0">
+	<uses-sdk android:minSdkVersion="16" />
+	<application android:label="$$APPLICATION_NAME$$"></application>
+</manifest>

+ 30 - 0
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/Properties/AssemblyInfo.cs

@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using Android.App;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("$$APPLICATION_NAME$$")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("$$APPLICATION_NAME$$")]
+[assembly: AssemblyCopyright("Copyright © 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: ComVisible(false)]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 80 - 0
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/Resources/Resource.Designer.cs

@@ -0,0 +1,80 @@
+#pragma warning disable 1591
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+[assembly: global::Android.Runtime.ResourceDesignerAttribute("Application.Resource", IsApplication=true)]
+
+namespace Application
+{
+	
+	
+	[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
+	public partial class Resource
+	{
+		
+		static Resource()
+		{
+			global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+		}
+		
+		public static void UpdateIdValues()
+		{
+		}
+		
+		public partial class Attribute
+		{
+			
+			static Attribute()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Attribute()
+			{
+			}
+		}
+		
+		public partial class Drawable
+		{
+			
+			// aapt resource value: 0x7f020000
+			public const int icon = 2130837504;
+			
+			static Drawable()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private Drawable()
+			{
+			}
+		}
+		
+		public partial class String
+		{
+			
+			// aapt resource value: 0x7f030001
+			public const int ApplicationName = 2130903041;
+			
+			// aapt resource value: 0x7f030000
+			public const int app_name = 2130903040;
+			
+			static String()
+			{
+				global::Android.Runtime.ResourceIdManager.UpdateIdValues();
+			}
+			
+			private String()
+			{
+			}
+		}
+	}
+}
+#pragma warning restore 1591

BIN
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/Resources/drawable/icon.png


+ 4 - 0
Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Android/Resources/values/Strings.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="ApplicationName">$$APPLICATION_NAME$$</string>
+</resources>

+ 0 - 0
Data/AtomicEditor/ProjectTemplates/EmptyProject/CSharp/Project/AtomicNET/Platforms/Desktop/Program.cs → Data/AtomicEditor/AtomicNET/ProjectTemplate/Platforms/Desktop/Program.cs


+ 0 - 17
Data/AtomicEditor/ProjectTemplates/Project2D/CSharp/Project/AtomicNET/Platforms/Desktop/Program.cs

@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Linq;
-
-using AtomicEngine;
-
-namespace AtomicPlayer
-{
-    public class Program
-    {
-        public static void Main(string[] args)
-        {
-            Application.Run<AtomicMain>(args);
-        }
-    }
-}

+ 0 - 17
Data/AtomicEditor/ProjectTemplates/Project3D/CSharp/Project/AtomicNET/Platforms/Desktop/Program.cs

@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Linq;
-
-using AtomicEngine;
-
-namespace AtomicPlayer
-{
-    public class Program
-    {
-        public static void Main(string[] args)
-        {
-            Application.Run<AtomicMain>(args);
-        }
-    }
-}

+ 13 - 11
Resources/EditorData/AtomicEditor/editor/ui/createproject.tb.txt

@@ -1,18 +1,20 @@
 TBLayout: axis: y, distribution: gravity, position: left
     TBLayout: distribution: gravity, axis: y
         TBLayout: distribution: gravity
-            TBTextField: text: "Project Name:"
+            TBLayout: distribution: gravity, axis: y
+                TBLayout: distribution: gravity
+                    TBTextField: text: "Project Name:"
+                    TBLayout: gravity: left right, distribution-position: right bottom
+                        TBEditField: id: project_name, text: "MyGame"
+                            lp: min-width: 240
+                TBLayout: distribution: gravity
+                    TBTextField: text: "App ID:"
+                    TBLayout: gravity: left right, distribution-position: right bottom
+                        TBEditField: id: app_id, text: "com.companyname.mygame"
+                            lp: min-width: 240
             TBLayout: gravity: left right, distribution-position: right bottom
-                TBEditField: id: project_name, text: "MyGame"
-                    lp: min-width: 240
-        TBLayout: distribution: gravity
-            TBTextField: text: "App ID:"
-            TBLayout: gravity: left right, distribution-position: right bottom
-                TBEditField: id: app_id, text: "com.companyname.mygame"
-                    lp: min-width: 240
-        TBLayout: gravity: left right, distribution-position: right bottom
-            TBImageWidget: id: project_image
-                lp: width: 128, height: 96
+                TBImageWidget: id: project_image
+                    lp: width: 128, height: 96
     TBSeparator: gravity: left right, skin: AESeparator
     TBTextField: text: "Platforms:"
     TBLayout: id: platformcontainer

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

@@ -112,3 +112,168 @@ export function GetNewFileTemplateDefinitions(fileTemplateType: string) : Editor
     const templates = JSON.parse(file.readText());
     return templates[fileTemplateType] || [];
 }
+
+// AtomicNET
+
+export interface AtomicNETProjectInfo {
+    name: string;
+    platforms: string[];
+    projectFolder: string;
+}
+
+var atomicNETProjectInfo:AtomicNETProjectInfo;
+
+/**
+ * Processes an AtomicNET template, replacing strings with settings
+ * @param  {string} filename
+ * @param  {string} templateFilename
+ * @return {boolean}
+ */
+function processAtomicNETTemplate(filename:string, templateFilename:string) : boolean {
+
+    let file = new Atomic.File(templateFilename, Atomic.FILE_READ);
+
+    if (!file.isOpen()) {
+        console.log("Failed to open: ", templateFilename);
+        return false;
+    }
+
+    let text = file.readText();
+
+    text = text.split("$$APPLICATION_NAME$$").join(atomicNETProjectInfo.name);
+
+    let fileOut = new Atomic.File(filename, Atomic.FILE_WRITE);
+
+    if (!fileOut.isOpen()) {
+        console.log("Failed to open for write: ", filename);
+        return false;
+    }
+
+    fileOut.writeString(text);
+
+    file.close();
+    
+    return true;
+}
+
+/**
+ * Generates the Android portion of an AtomicNET project
+ * @return {boolean}
+ */
+function generateAtomicNETAndroidProject():boolean {
+    
+    let env = ToolCore.toolEnvironment;
+    let utils = new Editor.FileUtils();
+    let templateFolder = env.toolDataDir + "AtomicNET/ProjectTemplate/";
+    let androidFolder = Atomic.addTrailingSlash(atomicNETProjectInfo.projectFolder) + "Project/AtomicNET/Platforms/Android/";
+
+    let fileSystem = Atomic.fileSystem;
+
+    // Create necessary folders
+    let folders = ["Properties", "Resources/drawable", "Resources/values"];
+    for (var i = 0; i < folders.length; i++) {
+
+        let folder = androidFolder + folders[i];
+
+        if (!fileSystem.dirExists(folder)) {
+
+            if (!utils.createDirs(folder))
+                return false;
+        }        
+
+    }
+
+    let textFiles = [".cs", ".xml"];
+
+    let files = ["MainActivity.cs", "Resources/Resource.Designer.cs", "Resources/drawable/icon.png",
+                 "Resources/values/Strings.xml", "Properties/AndroidManifest.xml", "Properties/AssemblyInfo.cs"];
+
+    for (var i = 0; i < files.length; i++) {
+
+        let templateName = templateFolder + "Platforms/Android/" + files[i];
+        let filename = androidFolder + files[i];
+
+        if (textFiles.indexOf(Atomic.getExtension(templateName)) == -1) {
+
+            if (!fileSystem.copy(templateName, filename)) {
+
+                console.log("Failed to copy: ", templateName, " to ",  filename);
+                return false;
+            }
+
+        } else {
+
+            if (!processAtomicNETTemplate(filename, templateName)) {
+                return false;
+            }
+
+        }
+
+    }
+                 
+    return true;
+}
+
+/**
+ * Generates the Desktop portion of an AtomicNET project
+ * @return {boolean}
+ */
+function generateAtomicNETDesktopProject():boolean {
+    
+    let env = ToolCore.toolEnvironment;
+    let utils = new Editor.FileUtils();
+    let templateFolder = env.toolDataDir + "AtomicNET/ProjectTemplate/";
+    let desktopFolder = Atomic.addTrailingSlash(atomicNETProjectInfo.projectFolder) + "Project/AtomicNET/Platforms/Desktop/";
+
+    let fileSystem = Atomic.fileSystem;
+
+    if (!fileSystem.dirExists(desktopFolder)) {
+
+        if (!utils.createDirs(desktopFolder))
+            return false;
+    }
+
+    if (!fileSystem.copy(templateFolder + "Platforms/Desktop/Program.cs", desktopFolder + "Program.cs")) {
+        return false;
+    }
+
+    return true;
+}
+
+
+/**
+ * Generates an AtomicNET project from templates
+ * @param  {AtomicNETProjectInfo} projectInfo
+ * @return {boolean}
+ */
+export function generateAtomicNETProject(projectInfo:AtomicNETProjectInfo):boolean {
+
+    atomicNETProjectInfo = projectInfo;
+
+    let env = ToolCore.toolEnvironment;
+    let templateFolder = env.toolDataDir + "AtomicNET/ProjectTemplate/";
+    let platformsFolder = Atomic.addTrailingSlash(projectInfo.projectFolder) + "Project/AtomicNET/Platforms/";
+
+    let utils = new Editor.FileUtils();
+    let fileSystem = Atomic.fileSystem;
+
+    if (!fileSystem.dirExists(platformsFolder)) {
+
+        if (!utils.createDirs(platformsFolder))
+            return false;
+    }
+
+    if (!generateAtomicNETDesktopProject()) {
+        return false;
+    }
+
+    if (projectInfo.platforms.indexOf("android") != -1) {
+
+        if (!generateAtomicNETAndroidProject()) {
+            return false;
+        }
+
+    }
+
+    return true;
+}

+ 40 - 0
Script/AtomicEditor/ui/modal/CreateProject.ts

@@ -163,8 +163,10 @@ class CreateProject extends ModalWindow {
             let selectedLanguage = this.projectLanguageField.text;
 
             // Check whether we have a required IDE installed for C# projects
+            var atomicNET = false;
             if (selectedLanguage == "CSharp" || selectedLanguage == "C#") {
 
+                atomicNET = true;
                 if (!ToolCore.netProjectSystem.getIDEAvailable()) {
                     this.hide();
                     EditorUI.getModelOps().showAtomicNETWindow();
@@ -191,6 +193,7 @@ class CreateProject extends ModalWindow {
                 var utils = new Editor.FileUtils();
 
                 utils.createDirs(folder + "Cache");
+                utils.createDirs(folder + "Settings");
 
                 if (!fileSystem.dirExists(folder)) {
                     var message = "Unable to create folder: " + folder + "\n\nPlease choose a different root folder or project name";
@@ -214,6 +217,43 @@ class CreateProject extends ModalWindow {
                     fileSystem.rename(folder + fileResults[0], folder + name + ".userprefs");
                 }
 
+                // create project settings
+
+                var platforms = ["desktop"];
+
+                if (this.androidButton.value == 1) {
+                    platforms.push("android");
+                }
+                
+                if (this.iosButton.value == 1) {
+                    platforms.push("ios");
+                }
+
+                var projectSettings = {
+                    name : name,
+                    platforms : platforms
+                }
+
+                var jsonFile = new Atomic.File(folder + "Settings/Project.json", Atomic.FILE_WRITE);
+                if (jsonFile.isOpen()) {
+                    jsonFile.writeString(JSON.stringify(projectSettings, null, 2));
+                    jsonFile.flush();
+                    jsonFile.close();
+                }
+
+                // Generate AtomicNET project if necessary
+                if (atomicNET) {
+                    if (!ProjectTemplates.generateAtomicNETProject({
+                        name: name,
+                        platforms : platforms,
+                        projectFolder : folder
+                    })) {
+                        var message = "Unable to generate AtomicNET project: " + folder;
+                        EditorUI.showModalError("New Project Editor Error", message);
+                        return false;
+                    }
+                }
+
                 this.hide();
 
                 this.sendEvent(EditorEvents.LoadProject, { path: folder });