diff --git a/src/Core/Config/ConfigElement.cs b/src/Core/Config/ConfigElement.cs index b3510cc..d92a465 100644 --- a/src/Core/Config/ConfigElement.cs +++ b/src/Core/Config/ConfigElement.cs @@ -18,6 +18,10 @@ namespace UnityExplorer.Core.Config public object DefaultValue { get; } + public ConfigHandler Handler => IsInternal + ? ConfigManager.InternalHandler + : ConfigManager.Handler; + public T Value { get => m_value; @@ -51,19 +55,19 @@ namespace UnityExplorer.Core.Config m_value = value; - ConfigManager.Handler.SetConfigValue(this, value); + Handler.SetConfigValue(this, value); OnValueChanged?.Invoke(value); OnValueChangedNotify?.Invoke(); - ConfigManager.Handler.OnAnyConfigChanged(); + Handler.OnAnyConfigChanged(); } object IConfigElement.GetLoaderConfigValue() => GetLoaderConfigValue(); public T GetLoaderConfigValue() { - return ConfigManager.Handler.GetConfigValue(this); + return Handler.GetConfigValue(this); } public void RevertToDefaultValue() diff --git a/src/Core/Config/ConfigManager.cs b/src/Core/Config/ConfigManager.cs index c487c36..7382af2 100644 --- a/src/Core/Config/ConfigManager.cs +++ b/src/Core/Config/ConfigManager.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using UnityEngine; +using UnityExplorer.UI; namespace UnityExplorer.Core.Config { @@ -24,34 +25,45 @@ namespace UnityExplorer.Core.Config public static ConfigElement Hide_On_Startup; public static ConfigElement Startup_Delay_Time; - public static ConfigElement Last_Window_Anchors; - public static ConfigElement Last_Window_Position; - public static ConfigElement Last_DebugConsole_State; - public static ConfigElement Last_SceneExplorer_State; + // internal configs + internal static InternalConfigHandler InternalHandler { get; private set; } + + public static ConfigElement SceneExplorerData; + public static ConfigElement GameObjectInspectorData; + public static ConfigElement MainWindowData; + public static ConfigElement DebugConsoleData; internal static readonly Dictionary ConfigElements = new Dictionary(); + internal static readonly Dictionary InternalConfigs = new Dictionary(); public static void Init(ConfigHandler configHandler) { Handler = configHandler; Handler.Init(); + InternalHandler = new InternalConfigHandler(); + InternalHandler.Init(); + CreateConfigElements(); Handler.LoadConfig(); + InternalHandler.LoadConfig(); - //SceneExplorer.OnToggleShow += SceneExplorer_OnToggleShow; - //PanelDragger.OnFinishResize += PanelDragger_OnFinishResize; - //PanelDragger.OnFinishDrag += PanelDragger_OnFinishDrag; - //DebugConsole.OnToggleShow += DebugConsole_OnToggleShow; - - InitConsoleCallback(); + //InitConsoleCallback(); } internal static void RegisterConfigElement(ConfigElement configElement) { - Handler.RegisterConfigElement(configElement); - ConfigElements.Add(configElement.Name, configElement); + if (!configElement.IsInternal) + { + Handler.RegisterConfigElement(configElement); + ConfigElements.Add(configElement.Name, configElement); + } + else + { + InternalHandler.RegisterConfigElement(configElement); + InternalConfigs.Add(configElement.Name, configElement); + } } private static void CreateConfigElements() @@ -90,154 +102,10 @@ namespace UnityExplorer.Core.Config // Internal configs - Last_Window_Anchors = new ConfigElement("Last_Window_Anchors", - "For internal use, the last anchors of the UnityExplorer window.", - DEFAULT_WINDOW_ANCHORS, - true); - - Last_Window_Position = new ConfigElement("Last_Window_Position", - "For internal use, the last position of the UnityExplorer window.", - DEFAULT_WINDOW_POSITION, - true); - - Last_DebugConsole_State = new ConfigElement("Last_DebugConsole_State", - "For internal use, the collapsed state of the Debug Console.", - true, - true); - - Last_SceneExplorer_State = new ConfigElement("Last_SceneExplorer_State", - "For internal use, the collapsed state of the Scene Explorer.", - true, - true); + SceneExplorerData = new ConfigElement("SceneExplorer", "", "", true); + GameObjectInspectorData = new ConfigElement("GameObjectInspector", "", "", true); + MainWindowData = new ConfigElement("MainWindow", "", "", true); + DebugConsoleData = new ConfigElement("DebugConsole", "", "", true); } - - // Internal config callback listeners - - private static void PanelDragger_OnFinishResize(RectTransform rect) - { - Last_Window_Anchors.Value = rect.RectAnchorsToString(); - PanelDragger_OnFinishDrag(rect); - } - - private static void PanelDragger_OnFinishDrag(RectTransform rect) - { - Last_Window_Position.Value = rect.RectPositionToString(); - } - - private static void DebugConsole_OnToggleShow(bool showing) - { - Last_DebugConsole_State.Value = showing; - } - - private static void SceneExplorer_OnToggleShow(bool showing) - { - Last_SceneExplorer_State.Value = showing; - } - - #region CONSOLE ONEXIT CALLBACK - - internal static void InitConsoleCallback() - { - handler = new ConsoleEventDelegate(ConsoleEventCallback); - SetConsoleCtrlHandler(handler, true); - } - - static bool ConsoleEventCallback(int eventType) - { - // 2 is Console Quit - if (eventType == 2) - Handler.SaveConfig(); - - return false; - } - - static ConsoleEventDelegate handler; - private delegate bool ConsoleEventDelegate(int eventType); - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add); - - #endregion - - #region WINDOW ANCHORS / POSITION HELPERS - - // Window Anchors helpers - - private const string DEFAULT_WINDOW_ANCHORS = "0.25,0.10,0.78,0.95"; - private const string DEFAULT_WINDOW_POSITION = "0,0"; - - internal static CultureInfo _enCulture = new CultureInfo("en-US"); - - internal static string RectAnchorsToString(this RectTransform rect) - { - try - { - return string.Format(_enCulture, "{0},{1},{2},{3}", new object[] - { - rect.anchorMin.x, - rect.anchorMin.y, - rect.anchorMax.x, - rect.anchorMax.y - }); - } - catch - { - return DEFAULT_WINDOW_ANCHORS; - } - } - - internal static void SetAnchorsFromString(this RectTransform panel, string stringAnchors) - { - Vector4 anchors; - try - { - var split = stringAnchors.Split(','); - - if (split.Length != 4) - throw new Exception(); - - anchors.x = float.Parse(split[0], _enCulture); - anchors.y = float.Parse(split[1], _enCulture); - anchors.z = float.Parse(split[2], _enCulture); - anchors.w = float.Parse(split[3], _enCulture); - } - catch - { - anchors = new Vector4(0.25f, 0.1f, 0.78f, 0.95f); - } - - panel.anchorMin = new Vector2(anchors.x, anchors.y); - panel.anchorMax = new Vector2(anchors.z, anchors.w); - } - - internal static string RectPositionToString(this RectTransform rect) - { - return string.Format(_enCulture, "{0},{1}", new object[] - { - rect.localPosition.x, rect.localPosition.y - }); - } - - internal static void SetPositionFromString(this RectTransform rect, string stringPosition) - { - try - { - var split = stringPosition.Split(','); - - if (split.Length != 2) - throw new Exception(); - - Vector3 vector = rect.localPosition; - vector.x = float.Parse(split[0], _enCulture); - vector.y = float.Parse(split[1], _enCulture); - rect.localPosition = vector; - } - catch //(Exception ex) - { - //ExplorerCore.LogWarning("Exception setting window position: " + ex); - } - } - - #endregion } } diff --git a/src/Core/Config/InternalConfigHandler.cs b/src/Core/Config/InternalConfigHandler.cs new file mode 100644 index 0000000..18cdcba --- /dev/null +++ b/src/Core/Config/InternalConfigHandler.cs @@ -0,0 +1,104 @@ +using IniParser.Parser; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace UnityExplorer.Core.Config +{ + public class InternalConfigHandler : ConfigHandler + { + internal static IniDataParser _parser; + internal static string INI_PATH; + + public override void Init() + { + INI_PATH = Path.Combine(ExplorerCore.Loader.ExplorerFolder, "config.ini"); + _parser = new IniDataParser(); + _parser.Configuration.CommentString = "#"; + } + + public override void LoadConfig() + { + if (!TryLoadConfig()) + SaveConfig(); + } + + public override void RegisterConfigElement(ConfigElement element) + { + // Not necessary + } + + public override void SetConfigValue(ConfigElement element, T value) + { + // Not necessary, just save. + SaveConfig(); + } + + public override T GetConfigValue(ConfigElement element) + { + // Not necessary, just return the value. + return element.Value; + } + + public bool TryLoadConfig() + { + try + { + if (!File.Exists(INI_PATH)) + return false; + + string ini = File.ReadAllText(INI_PATH); + + var data = _parser.Parse(ini); + + foreach (var config in data.Sections["Config"]) + { + if (ConfigManager.InternalConfigs.TryGetValue(config.KeyName, out IConfigElement configElement)) + configElement.BoxedValue = StringToConfigValue(config.Value, configElement.ElementType); + } + + return true; + } + catch + { + return false; + } + } + + public object StringToConfigValue(string value, Type elementType) + { + if (elementType.IsEnum) + return Enum.Parse(elementType, value); + else if (elementType == typeof(bool)) + return bool.Parse(value); + else if (elementType == typeof(int)) + return int.Parse(value); + else + return value; + } + + public override void OnAnyConfigChanged() + { + SaveConfig(); + } + + public override void SaveConfig() + { + var data = new IniParser.Model.IniData(); + + data.Sections.AddSection("Config"); + var sec = data.Sections["Config"]; + + foreach (var entry in ConfigManager.InternalConfigs) + sec.AddKey(entry.Key, entry.Value.BoxedValue.ToString()); + + if (!Directory.Exists(ExplorerCore.Loader.ConfigFolder)) + Directory.CreateDirectory(ExplorerCore.Loader.ConfigFolder); + + File.WriteAllText(INI_PATH, data.ToString()); + } + } +} diff --git a/src/ILRepack.targets b/src/ILRepack.targets index c1e668f..607abe2 100644 --- a/src/ILRepack.targets +++ b/src/ILRepack.targets @@ -5,7 +5,7 @@ - +