diff --git a/Nerfed.Editor/Editor/EditorGui.cs b/Nerfed.Editor/Editor/EditorGui.cs index cb14a5d..39045b0 100644 --- a/Nerfed.Editor/Editor/EditorGui.cs +++ b/Nerfed.Editor/Editor/EditorGui.cs @@ -1,4 +1,5 @@ using ImGuiNET; +using Nerfed.Editor.Project; using Nerfed.Runtime; using Nerfed.Runtime.Graphics; using Nerfed.Runtime.Gui; @@ -56,6 +57,7 @@ private static void UpdateMainMenu() } ImGui.EndMenu(); } + ImGui.EndMainMenuBar(); } } @@ -66,6 +68,8 @@ private static void HandleOnGui() UpdateDock(); ImGui.ShowDemoWindow(); + + ProjectGui.OnGui(); } } } \ No newline at end of file diff --git a/Nerfed.Editor/Project/Project.cs b/Nerfed.Editor/Project/Project.cs new file mode 100644 index 0000000..82fc30b --- /dev/null +++ b/Nerfed.Editor/Project/Project.cs @@ -0,0 +1,198 @@ +using Nerfed.Runtime; +using System.Reflection; +using System.Text.Json; + +namespace Nerfed.Editor.Project; + +public class ProjectConfig +{ + public string Name { get; set; } + public uint Version { get; set; } + public string RuntimeProject { get; set; } +} + +internal static class Project +{ + private const string projectFileName = ".project"; + + internal static ProjectConfig LoadedConfig { get; private set; } + internal static string ProjectDirectory { get; private set; } + internal static string ProjectContentDirectory { get; private set; } + internal static string ProjectTempDirectory { get; private set; } + + internal static bool Create(string path, string projectName) + { + // Check if folder is empty. + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + if(Directory.GetFiles(path).Length != 0) + { + Log.Error($"Directory {path} is not empty!"); + return false; + } + + // Create project file. + ProjectConfig projectConfig = new ProjectConfig + { + Name = projectName, + Version = /*Nerfed.Runtime.Verion*/ 1, + }; + + // Create solution. + if (!GenerateCSProjectFiles(path, projectConfig)) + { + Log.Error($"Generating cs project files failed!"); + return false; + } + + string projectFilePath = Path.Combine(path, projectFileName); + SaveProject(projectFilePath, projectConfig); + + // Open the project. + Open(projectFilePath); + + Log.Info($"Succesfully created project."); + return true; + } + + internal static bool Open(string path) + { + string projectFilePath = path; + + if (!File.Exists(projectFilePath)) { + projectFilePath = Path.Combine(path, projectFileName); + if (!File.Exists(projectFilePath)) + { + Log.Error($"Project file not found at {path} or {projectFilePath}"); + return false; + } + } + + // Load from file. + string jsonString = File.ReadAllText(projectFilePath); + ProjectConfig projectConfig = JsonSerializer.Deserialize(jsonString); + + // Check version. + if(projectConfig.Version != /*Nerfed.Runtime.Verion*/ 1) + { + Log.Error($"Project runtime version does not match editor runtime verion!"); + return false; + } + + LoadedConfig = projectConfig; + SetupDefaultFolders(Path.GetDirectoryName(projectFilePath)); + Log.Info($"Opened project: {projectConfig.Name}"); + + return true; + } + + internal static bool SaveProject(string path, ProjectConfig projectConfig) + { + JsonSerializerOptions options = new JsonSerializerOptions(JsonSerializerOptions.Default) + { + WriteIndented = true, + }; + + string jsonString = JsonSerializer.Serialize(projectConfig, options); + + File.WriteAllText(path, jsonString); + + return true; + } + + // Compile the project using the builder. + internal static bool CompileProject() + { + return false; + } + + // Inspirered by https://github.com/ProwlEngine/Prowl/blob/main/Prowl.Editor/Project.cs + // Maybe the builder should do this? + // When compiling the 'runtimeAssembly.Location' needs to be updated to where ever the one is that is being used. + private static bool GenerateCSProjectFiles(string path, ProjectConfig projectConfig) + { + Log.Info("Generating CS project files"); + + Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + Assembly runtimeAssembly = loadedAssemblies.FirstOrDefault(assembly => assembly.GetName().Name == "Nerfed.Runtime") ?? throw new Exception("Failed to find Runtime Assembly!"); + + string propertyGroup = + $@" + + net8.0 + enable + disable + true + true + true + false + false + Debug;Test;Release + x64 + + + + TRACE;LOG_INFO;PROFILING + + + + TRACE;LOG_ERROR;PROFILING + true + + + + TRACE;LOG_ERROR + true + + "; + + string runtimeProject = + $@" + + {propertyGroup} + + + + {runtimeAssembly.Location} + false + + + + "; + + string runtimeProjectName = projectConfig.Name + ".Runtime.csproj"; + string filePath = Path.Combine(path, runtimeProjectName); + + File.WriteAllText(filePath, runtimeProject); + + projectConfig.RuntimeProject = runtimeProjectName; + Log.Info($"Generated runtime at {filePath}"); + + // TODO: Editor project. + + + return true; + } + + private static void SetupDefaultFolders(string path) + { + ProjectDirectory = path; + + string contentPath = Path.Combine(path, "Content"); + if (!Directory.Exists(contentPath)) + { + Directory.CreateDirectory(contentPath); + } + ProjectContentDirectory = contentPath; + + string tempPath = Path.Combine(path, "Temp"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + ProjectTempDirectory = tempPath; + } +} \ No newline at end of file diff --git a/Nerfed.Editor/Project/ProjectGui.cs b/Nerfed.Editor/Project/ProjectGui.cs new file mode 100644 index 0000000..395ed24 --- /dev/null +++ b/Nerfed.Editor/Project/ProjectGui.cs @@ -0,0 +1,42 @@ +using ImGuiNET; + +namespace Nerfed.Editor.Project +{ + internal static class ProjectGui + { + private static string projectDirectory = string.Empty; + private static string projectName = string.Empty; + + internal static void OnGui() + { + ImGui.Begin("Project"); + + ImGui.InputText("Project Directory", ref projectDirectory, 512); + ImGui.InputText("Project Name", ref projectName, 512); + + if (ImGui.Button("Create Project")) + { + Project.Create(projectDirectory, projectName); + } + + if(ImGui.Button("Open Project")) + { + Project.Open(projectDirectory); + } + + ImGui.Text("Loaded project: "); + if(Project.LoadedConfig != null) + { + ImGui.Text(Project.LoadedConfig.Name); + ImGui.Text(Project.LoadedConfig.Version.ToString()); + ImGui.Text(Project.LoadedConfig.RuntimeProject); + } + else + { + ImGui.Text("None"); + } + + ImGui.End(); + } + } +} \ No newline at end of file diff --git a/Nerfed.Runtime/Nerfed.Runtime.csproj b/Nerfed.Runtime/Nerfed.Runtime.csproj index 01615fb..3c9a9ce 100644 --- a/Nerfed.Runtime/Nerfed.Runtime.csproj +++ b/Nerfed.Runtime/Nerfed.Runtime.csproj @@ -32,12 +32,12 @@ - - - - - - + + + + + + \ No newline at end of file