using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using CommunityToolkit.Mvvm.ComponentModel; using Microsoft.Extensions.DependencyInjection; using Nebula.Launcher.Views.Config; using Nebula.Launcher.Views.Pages; using Nebula.Shared.Services; using BindingFlags = System.Reflection.BindingFlags; namespace Nebula.Launcher.ViewModels.Pages; [ViewModelRegister(typeof(ConfigurationView))] [ConstructGenerator] public partial class ConfigurationViewModel : ViewModelBase, IConfigContext { public ObservableCollection ConfigurationVerbose { get; } = new(); [GenerateProperty] private ConfigurationService ConfigurationService { get; } = default!; [GenerateProperty] private IServiceProvider ServiceProvider { get; } = default!; public void AddConfiguration(ConVar convar) where T1: ViewModelBase, IConfigurationVerbose { var configurationVerbose = ServiceProvider.GetService()!; configurationVerbose.Context = new ConfigContext(convar, this); configurationVerbose.InitializeConfig(); ConfigurationVerbose.Add(configurationVerbose); } public void InvokeUpdateConfiguration() { foreach (var verbose in ConfigurationVerbose) { if(verbose is not IUpdateInvoker invoker) continue; invoker.UpdateConfiguration(); } } protected override void InitialiseInDesignMode() { AddConfiguration(LauncherConVar.ILSpyUrl); } protected override void Initialise() { InitialiseInDesignMode(); } public void SetValue(ConVar conVar, T value) { ConfigurationService.SetConfigValue(conVar, value); } public T? GetValue(ConVar convar) { return ConfigurationService.GetConfigValue(convar); } } public interface IConfigContext { public void SetValue(ConVar conVar, T value); public T? GetValue(ConVar convar); } public class ConfigContext : IConfigContext { public ConfigContext(ConVar conVar, IConfigContext parent) { ConVar = conVar; Parent = parent; } public ConVar ConVar { get; } public IConfigContext Parent { get; } public T? GetValue() { return GetValue(ConVar); } public void SetValue(T? value) { SetValue(ConVar!, value); } public void SetValue(ConVar conVar, T1 value) { Parent.SetValue(conVar, value); } public T1? GetValue(ConVar convar) { return Parent.GetValue(convar); } } public interface IConfigurationVerbose { public ConfigContext Context { get; set; } public void InitializeConfig(); } public interface IUpdateInvoker { public void UpdateConfiguration(); } [ViewModelRegister(typeof(StringConfigurationView))] public partial class StringConfigurationViewModel : ViewModelBase , IConfigurationVerbose, IUpdateInvoker { [ObservableProperty] private string _configText = string.Empty; [ObservableProperty] private string? _configName = string.Empty; private string _oldText = string.Empty; public required ConfigContext Context { get; set; } public void InitializeConfig() { ConfigName = Context.ConVar.Name; _oldText = Context.GetValue() ?? string.Empty; ConfigText = _oldText; } public void UpdateConfiguration() { if (_oldText == ConfigText) return; Context.SetValue(ConfigText); } protected override void InitialiseInDesignMode() { } protected override void Initialise() { } }