From 39308fc3162d2f1e525db79411573c1c863943c1 Mon Sep 17 00:00:00 2001 From: Cinka Date: Sat, 10 May 2025 19:19:30 +0300 Subject: [PATCH] - add: Settings, start --- Nebula.Launcher/ViewModels/MainViewModel.cs | 3 +- .../Pages/ConfigurationViewModel.cs | 142 ++++++++++++++++++ .../Config/StringConfigurationView.axaml | 17 +++ .../Config/StringConfigurationView.axaml.cs | 20 +++ .../Views/Pages/ConfigurationView.axaml | 40 +++++ .../Views/Pages/ConfigurationView.axaml.cs | 20 +++ .../Services/ConfigurationService.cs | 8 + Nebula.sln.DotSettings.user | 1 + 8 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs create mode 100644 Nebula.Launcher/Views/Config/StringConfigurationView.axaml create mode 100644 Nebula.Launcher/Views/Config/StringConfigurationView.axaml.cs create mode 100644 Nebula.Launcher/Views/Pages/ConfigurationView.axaml create mode 100644 Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs diff --git a/Nebula.Launcher/ViewModels/MainViewModel.cs b/Nebula.Launcher/ViewModels/MainViewModel.cs index 5f7ce58..df733f8 100644 --- a/Nebula.Launcher/ViewModels/MainViewModel.cs +++ b/Nebula.Launcher/ViewModels/MainViewModel.cs @@ -25,7 +25,8 @@ public partial class MainViewModel : ViewModelBase new ListItemTemplate(typeof(AccountInfoViewModel), "user", "Account", null), new ListItemTemplate(typeof(ServerListViewModel), "file", "Servers", false), new ListItemTemplate(typeof(ServerListViewModel), "star", "Favorites", true), - new ListItemTemplate(typeof(ContentBrowserViewModel), "folder", "Content", null) + new ListItemTemplate(typeof(ContentBrowserViewModel), "folder", "Content", null), + new ListItemTemplate(typeof(ConfigurationViewModel), "settings", "Settings", null) ]; private readonly List _viewQueue = new(); diff --git a/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs new file mode 100644 index 0000000..1fa4c9d --- /dev/null +++ b/Nebula.Launcher/ViewModels/Pages/ConfigurationViewModel.cs @@ -0,0 +1,142 @@ +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 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() + { + } +} \ No newline at end of file diff --git a/Nebula.Launcher/Views/Config/StringConfigurationView.axaml b/Nebula.Launcher/Views/Config/StringConfigurationView.axaml new file mode 100644 index 0000000..8074c38 --- /dev/null +++ b/Nebula.Launcher/Views/Config/StringConfigurationView.axaml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/Nebula.Launcher/Views/Config/StringConfigurationView.axaml.cs b/Nebula.Launcher/Views/Config/StringConfigurationView.axaml.cs new file mode 100644 index 0000000..8f4570a --- /dev/null +++ b/Nebula.Launcher/Views/Config/StringConfigurationView.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Nebula.Launcher.ViewModels.Pages; + +namespace Nebula.Launcher.Views.Config; + +public partial class StringConfigurationView : UserControl +{ + public StringConfigurationView() + { + InitializeComponent(); + } + + public StringConfigurationView(StringConfigurationViewModel viewModel) + : this() + { + DataContext = viewModel; + } +} \ No newline at end of file diff --git a/Nebula.Launcher/Views/Pages/ConfigurationView.axaml b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml new file mode 100644 index 0000000..4b7b84c --- /dev/null +++ b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs new file mode 100644 index 0000000..bba8734 --- /dev/null +++ b/Nebula.Launcher/Views/Pages/ConfigurationView.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Nebula.Launcher.ViewModels.Pages; + +namespace Nebula.Launcher.Views.Pages; + +public partial class ConfigurationView : UserControl +{ + public ConfigurationView() + { + InitializeComponent(); + } + + public ConfigurationView(ConfigurationViewModel viewModel) + : this() + { + DataContext = viewModel; + } +} \ No newline at end of file diff --git a/Nebula.Shared/Services/ConfigurationService.cs b/Nebula.Shared/Services/ConfigurationService.cs index 7bbd5c8..7d8c52b 100644 --- a/Nebula.Shared/Services/ConfigurationService.cs +++ b/Nebula.Shared/Services/ConfigurationService.cs @@ -33,7 +33,10 @@ public static class ConVarBuilder [ServiceRegister] public class ConfigurationService { + public delegate void OnConfigurationChangedDelegate(T value); + public IReadWriteFileApi ConfigurationApi { get; init; } + private readonly ILogger _logger; public ConfigurationService(FileService fileService, DebugService debugService) @@ -42,6 +45,11 @@ public class ConfigurationService ConfigurationApi = fileService.CreateFileApi("config"); } + private void SubscribeVarChanged(ConVar convar, OnConfigurationChangedDelegate @delegate) + { + + } + public T? GetConfigValue(ConVar conVar) { diff --git a/Nebula.sln.DotSettings.user b/Nebula.sln.DotSettings.user index d0524b3..f3c5a5c 100644 --- a/Nebula.sln.DotSettings.user +++ b/Nebula.sln.DotSettings.user @@ -11,6 +11,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded