From 4e9a6b54f392b71a1862bfdcf65315b2bd5e950b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sat, 9 Mar 2024 20:33:26 +0100 Subject: [PATCH] Friendship ended with VISUAL STUDIO, Now RIDER is my best friend --- GlitchyEditor/src/CodeEditors/IIdeAdapter.bf | 11 +++ .../src/CodeEditors/RiderIdeAdapter.bf | 38 +++++++ .../VisualStudioIdeAdapter.bf} | 4 +- .../src/EditWindows/ContentBrowserWindow.bf | 5 +- GlitchyEditor/src/EditWindows/LogWindow.bf | 3 +- GlitchyEditor/src/EditorSettings.bf | 15 ++- GlitchyEditor/src/SettingsWindow.bf | 99 ++++++++++++++++++- 7 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 GlitchyEditor/src/CodeEditors/IIdeAdapter.bf create mode 100644 GlitchyEditor/src/CodeEditors/RiderIdeAdapter.bf rename GlitchyEditor/src/{VisualStudioUtility.bf => CodeEditors/VisualStudioIdeAdapter.bf} (94%) diff --git a/GlitchyEditor/src/CodeEditors/IIdeAdapter.bf b/GlitchyEditor/src/CodeEditors/IIdeAdapter.bf new file mode 100644 index 0000000..196f1cf --- /dev/null +++ b/GlitchyEditor/src/CodeEditors/IIdeAdapter.bf @@ -0,0 +1,11 @@ +using System; +namespace GlitchyEditor.CodeEditors; + +interface IIdeAdapter +{ + static void OpenScript(StringView fileName); + + static void OpenScript(StringView fileName, int lineNumber); + + static void OpenScriptProject(); +} diff --git a/GlitchyEditor/src/CodeEditors/RiderIdeAdapter.bf b/GlitchyEditor/src/CodeEditors/RiderIdeAdapter.bf new file mode 100644 index 0000000..9c7e1a3 --- /dev/null +++ b/GlitchyEditor/src/CodeEditors/RiderIdeAdapter.bf @@ -0,0 +1,38 @@ +using System; +using System.Diagnostics; +using GlitchyEngine; +using System.Collections; + +namespace GlitchyEditor.CodeEditors; + +class RiderIdeAdapter : IIdeAdapter +{ + public static void OpenScript(StringView fileName) + { + OpenScript(fileName, 0); + } + + public static void OpenScript(StringView fileName, int lineNumber) + { + String solutionPath = scope .(); + Editor.Instance.CurrentProject.PathInProject(solutionPath, scope $"{Editor.Instance.CurrentProject.Name}.sln"); + + ProcessStartInfo startInfo = scope .(); + startInfo.SetFileName(Application.Instance.Settings.ScriptSettings.RiderPath); + startInfo.SetArguments(scope $"{solutionPath} --line {lineNumber} {fileName}"); + + scope SpawnedProcess().Start(startInfo); + } + + public static void OpenScriptProject() + { + String solutionPath = scope .(); + Editor.Instance.CurrentProject.PathInProject(solutionPath, scope $"{Editor.Instance.CurrentProject.Name}.sln"); + + ProcessStartInfo startInfo = scope .(); + startInfo.SetFileName(Application.Instance.Settings.ScriptSettings.RiderPath); + startInfo.SetArguments(solutionPath); + + scope SpawnedProcess().Start(startInfo); + } +} diff --git a/GlitchyEditor/src/VisualStudioUtility.bf b/GlitchyEditor/src/CodeEditors/VisualStudioIdeAdapter.bf similarity index 94% rename from GlitchyEditor/src/VisualStudioUtility.bf rename to GlitchyEditor/src/CodeEditors/VisualStudioIdeAdapter.bf index 5fa33d5..0ac7456 100644 --- a/GlitchyEditor/src/VisualStudioUtility.bf +++ b/GlitchyEditor/src/CodeEditors/VisualStudioIdeAdapter.bf @@ -3,9 +3,9 @@ using System.Diagnostics; using GlitchyEngine; using System.Collections; -namespace GlitchyEditor; +namespace GlitchyEditor.CodeEditors; -class VisualStudioUtility +class VisualStudioIdeAdapter : IIdeAdapter { public static bool IsRunning() { diff --git a/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf b/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf index bdf5271..ec0c3ef 100644 --- a/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf +++ b/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf @@ -10,6 +10,7 @@ using GlitchyEngine.Content; using GlitchyEngine; using GlitchyEditor.Assets; using System.Diagnostics; +using GlitchyEditor.CodeEditors; namespace GlitchyEditor.EditWindows { @@ -242,7 +243,7 @@ namespace GlitchyEditor.EditWindows if (ImGui.MenuItem("Open C# Project...")) { - VisualStudioUtility.OpenScriptProject(); + RiderIdeAdapter.OpenScriptProject(); } ImGui.AttachTooltip("Opens the C# Solution of this project."); @@ -865,7 +866,7 @@ namespace GlitchyEditor.EditWindows if (entry->Path.EndsWith(".cs")) { // Obviously windows only - VisualStudioUtility.OpenScript(entry->Path); + RiderIdeAdapter.OpenScript(entry->Path); } else if (Path.OpenFolder(entry->Path) case .Err) Log.EngineLogger.Error("Failed to open file."); diff --git a/GlitchyEditor/src/EditWindows/LogWindow.bf b/GlitchyEditor/src/EditWindows/LogWindow.bf index b312c93..d03cc80 100644 --- a/GlitchyEditor/src/EditWindows/LogWindow.bf +++ b/GlitchyEditor/src/EditWindows/LogWindow.bf @@ -7,6 +7,7 @@ using GlitchLog; using GlitchyEngine.Scripting; using GlitchyEngine.Renderer; using GlitchyEngine; +using GlitchyEditor.CodeEditors; namespace GlitchyEditor.EditWindows; @@ -315,7 +316,7 @@ class LogWindow : EditorWindow { if (message.Source.MessageOrigin != null) { - VisualStudioUtility.OpenScript(message.Source.MessageOrigin.FileName); + RiderIdeAdapter.OpenScript(message.Source.MessageOrigin.FileName); } } diff --git a/GlitchyEditor/src/EditorSettings.bf b/GlitchyEditor/src/EditorSettings.bf index 4919d90..77741be 100644 --- a/GlitchyEditor/src/EditorSettings.bf +++ b/GlitchyEditor/src/EditorSettings.bf @@ -26,12 +26,25 @@ namespace GlitchyEngine namespace GlitchyEditor; +[Reflect] +enum ScriptIde +{ + Rider, + VisualStudio +} + [Reflect] class ScriptSettings { - [Setting("Script", "Visual Studio path", "The path of the Visual Studio devenv.exe"), BonInclude] + [Setting("Tools", "Visual Studio path", "The path of Visual Studio's \"devenv.exe\""), BonInclude] public String VisualStudioPath ~ delete _; + [Setting("Tools", "Rider path", "The path to JetBrains Rider IDE (rider64.exe)"), BonInclude] + public String RiderPath ~ delete _; + + [Setting("Tools", "IDE", "The IDE that will be used to open scripts for editing."), BonInclude] + public ScriptIde SelectedIde; + public void Apply() { if (String.IsNullOrWhiteSpace(VisualStudioPath)) diff --git a/GlitchyEditor/src/SettingsWindow.bf b/GlitchyEditor/src/SettingsWindow.bf index 7452c3a..95d89b8 100644 --- a/GlitchyEditor/src/SettingsWindow.bf +++ b/GlitchyEditor/src/SettingsWindow.bf @@ -264,15 +264,110 @@ namespace GlitchyEditor char8[256] buffer = .(); - value.CopyTo(buffer); + value?.CopyTo(buffer); if (ImGui.InputText(scope $"##{setting.Name}", &buffer, buffer.Count)) { - value..Clear().Append(&buffer); + if (value != null) + value..Clear().Append(&buffer); + else + SetSettingValue!(new String(&buffer)); _settingsChanged = true; } } + + /*if (fieldInfo.FieldType.IsEnum) + { + uint64 enumValue = 0; + + fieldInfo.GetValueReference(setting.SettingsObject); + + // Assign value + switch (fieldInfo.FieldType.Size) + { + case 1: enumValue = *(uint8*)&enumValue; + case 2: *(uint16*)&enumValue = *(uint16*)&enumValue; + case 4: *(uint32*)&enumValue = *(uint32*)&enumValue; + case 8: *(uint64*)&enumValue = *(uint64*)&enumValue; + } + + bool found = false; + for (var field in valType.GetFields()) + { + if (field.[Friend]mFieldData.mFlags.HasFlag(.EnumCase) && + *(int64*)&field.[Friend]mFieldData.[Friend]mData == valueData) + { + writer.Enum(field.Name); + found = true; + break; + } + } + + // Find field on enum + bool found = false; + for (var field in valType.GetFields()) + if (field.[Friend]mFieldData.mFlags.HasFlag(.EnumCase) + && name == field.Name) + { + // Add value of enum case to current enum value + enumValue |= *(int64*)&field.[Friend]mFieldData.[Friend]mData; + found = true; + break; + } + + if (!found) + Error!("Enum case not found", reader, valType); + + + uint64 value = 0; + StringView selectedValue; + + for (FieldInfo enumField in fieldInfo.FieldType.GetFields()) + { + if (enumField.[Friend]mFieldData.mFlags.HasFlag(.EnumCase)) + { + hasCaseData = true; + + if (name == enumField.Name) + { + unionPayload = ValueView(enumField.FieldType, val.dataPtr); + + foundCase = true; + break; + } + + unionDiscrIndex++; + } + else if (enumField.[Friend]mFieldData.mFlags.HasFlag(.EnumDiscriminator)) + { + let discrType = enumField.FieldType; + Debug.Assert(discrType.IsInteger); + discrVal = ValueView(discrType, (uint8*)val.dataPtr + enumField.[Friend]mFieldData.mData); + } + } + + ImGui.BeginCombo(scope $"##{setting.Name}", null); + + for (var v in Enum.GetValues(fieldInfo.FieldType)) + { + + } + + ImGui.EndCombo(); + + /*// Find field on enum + bool found = false; + for (var field in valType.GetFields()) + if (field.[Friend]mFieldData.mFlags.HasFlag(.EnumCase) + && name == field.Name) + { + // Add value of enum case to current enum value + enumValue |= *(int64*)&field.[Friend]mFieldData.[Friend]mData; + found = true; + break; + }*/ + }*/ } ImGui.EndTable();