1
0
mirror of synced 2024-12-05 02:57:57 +01:00
WACVR/Assets/Script/Configuration/ConfigManager.cs

201 lines
7.0 KiB
C#
Raw Normal View History

2022-10-03 02:04:54 +02:00
using System.Collections;
using System;
using UnityEngine;
using WindowsInput.Native;
using TMPro;
using UnityEngine.UI;
using System.IO;
using Newtonsoft.Json;
2022-11-05 01:32:17 +01:00
using System.Collections.Generic;
2022-10-03 02:04:54 +02:00
public class ConfigManager : MonoBehaviour
{
public static Config config;
private static bool hasInitialized = false;
public static event Action onConfigChanged;
2022-10-05 22:47:49 +02:00
private static float saverTimer = 0;
private static bool isSavingConfig = false;
private float saverDelay = 1.5f;
2022-11-05 01:32:17 +01:00
public List<GameObject> Tabs;
[SerializeField]
public static List<ConfigPanelComponent> ConfigPanelComponents;
2022-10-03 02:04:54 +02:00
void Awake()
{
onConfigChanged += EnsureInitialization;
onConfigChanged += SaveFile;
2022-10-03 02:04:54 +02:00
}
void Start()
{
EnsureInitialization();
2022-11-05 01:32:17 +01:00
AddListenerToWidget(ConfigPanelComponents);
2022-10-03 02:04:54 +02:00
onConfigChanged?.Invoke();
}
public static void EnsureInitialization()
{
if (hasInitialized)
return;
LoadFile();
ConfigPanelComponents = GetConfigPanelComponentsStatic();
2022-11-05 01:32:17 +01:00
UpdateConfigPanelFromConfig(ref ConfigPanelComponents);
2022-10-03 02:04:54 +02:00
hasInitialized = true;
}
private static void LoadFile()
{
Debug.Log("Loading config file");
if (File.Exists(GetFileName()))
{
Debug.Log("Config file exists");
config = JsonConvert.DeserializeObject<Config>(File.ReadAllText(GetFileName()));
}
else
{
Debug.Log("Config file does not exist");
config = new Config();
SaveFile();
Debug.Log("Config file created");
}
}
public static string GetFileName()
{
return Application.dataPath + "/../config.json";
}
public static void SaveFile()
{
2022-10-05 22:47:49 +02:00
isSavingConfig = true;
saverTimer = 0;
//Debug.Log("Saving config file");
2022-10-03 02:04:54 +02:00
}
2022-10-05 22:47:49 +02:00
public void saveFileWait()
2022-10-03 02:04:54 +02:00
{
File.WriteAllText(GetFileName(), JsonConvert.SerializeObject(config, Formatting.Indented));
Debug.Log("Config file saved");
}
2022-10-05 22:47:49 +02:00
void Update()
{
if (isSavingConfig)
{
saverTimer += Time.deltaTime;
if (saverTimer >= saverDelay)
{
isSavingConfig = false;
saverTimer = 0;
saveFileWait();
}
}
}
2022-10-03 02:04:54 +02:00
2022-11-05 01:32:17 +01:00
public static GameObject GetConfigPanelWidget(string configKeyName)
2022-10-03 02:04:54 +02:00
{
EnsureInitialization();
2022-11-05 01:32:17 +01:00
foreach (var item in ConfigPanelComponents)
{
if (item.ConfigKeyName == configKeyName)
{
return item.Widget;
}
}
return null;
2022-10-03 02:04:54 +02:00
}
2022-11-05 01:32:17 +01:00
private List<ConfigPanelComponent> GetConfigPanelComponents()
2022-10-03 02:04:54 +02:00
{
2022-11-05 01:32:17 +01:00
var _configPanelComponents = new List<ConfigPanelComponent>();
foreach (var tab in Tabs)
{
var _configPanelComponentsInTab = tab.GetComponentsInChildren<ConfigPanelComponent>();
_configPanelComponents.AddRange(_configPanelComponentsInTab);
}
return _configPanelComponents;
2022-10-03 02:04:54 +02:00
}
2022-11-05 01:32:17 +01:00
private static List<ConfigPanelComponent> GetConfigPanelComponentsStatic()
{
var _configPanelComponents = new List<ConfigPanelComponent>();
_configPanelComponents = GameObject.FindObjectOfType<ConfigManager>().GetConfigPanelComponents();
return _configPanelComponents;
}
2022-11-05 01:32:17 +01:00
private void AddListenerToWidget(List<ConfigPanelComponent> _configPanelComponents)
2022-10-03 02:04:54 +02:00
{
2022-11-05 01:32:17 +01:00
foreach (var configPanelComponent in _configPanelComponents)
{
var widget = configPanelComponent.Widget;
if (widget.GetComponent<TMP_Dropdown>() != null)
{
var dropdown = widget.GetComponent<TMP_Dropdown>();
// add listener to dropdown to update config by key name
dropdown.onValueChanged.AddListener(delegate
{
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
field.SetValue(config, dropdown.value);
onConfigChanged?.Invoke();
});
}
else if (widget.GetComponent<Toggle>() != null)
{
var toggle = widget.GetComponent<Toggle>();
toggle.onValueChanged.AddListener(delegate
{
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
field.SetValue(config, toggle.isOn);
onConfigChanged?.Invoke();
});
}
else if (widget.GetComponent<Slider>() != null)
{
var slider = widget.GetComponent<Slider>();
slider.onValueChanged.AddListener(delegate
{
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
field.SetValue(config, slider.value);
onConfigChanged?.Invoke();
});
}
else if (widget.GetComponent<ValueManager>() != null)
{
var valueManager = widget.GetComponent<ValueManager>();
valueManager.onValueChanged.AddListener(delegate
{
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
field.SetValue(config, valueManager.value);
2022-11-05 01:32:17 +01:00
onConfigChanged?.Invoke();
});
}
}
2022-10-03 02:04:54 +02:00
}
2022-11-05 01:32:17 +01:00
private static void UpdateConfigPanelFromConfig(ref List<ConfigPanelComponent> _configPanelComponents)
2022-10-03 02:04:54 +02:00
{
2022-11-05 01:32:17 +01:00
foreach (var configPanelComponent in _configPanelComponents)
{
var componentObject = configPanelComponent.Widget;
if (componentObject.GetComponent<TMP_Dropdown>() != null)
{
var dropdown = componentObject.GetComponent<TMP_Dropdown>();
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
dropdown.value = (int)field.GetValue(config);
}
else if (componentObject.GetComponent<Toggle>() != null)
{
var toggle = componentObject.GetComponent<Toggle>();
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
toggle.isOn = (bool)field.GetValue(config);
}
else if (componentObject.GetComponent<Slider>() != null)
{
var slider = componentObject.GetComponent<Slider>();
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
slider.value = (float)field.GetValue(config);
}
else if (componentObject.GetComponent<ValueManager>() != null)
{
var valueManager = componentObject.GetComponent<ValueManager>();
var field = config.GetType().GetField(configPanelComponent.ConfigKeyName);
valueManager.value = (float)field.GetValue(config);
2022-11-05 01:32:17 +01:00
}
}
2022-10-03 02:04:54 +02:00
}
}