From d9161f837b9a5eeb708248b0d596438d6e11e2cb Mon Sep 17 00:00:00 2001 From: Cinka Date: Sat, 21 Dec 2024 15:15:04 +0300 Subject: [PATCH] - add: menu --- .idea/.idea.Nebula/.idea/avalonia.xml | 3 + Nebula.Launcher/App.axaml | 7 +++ .../ServiceCollectionExtensions.cs | 3 +- .../ViewHelper/ViewRegisterAttribute.cs | 13 ++++ Nebula.Launcher/ViewLocator.cs | 9 +-- .../ViewModels/AccountInfoViewModel.cs | 9 ++- Nebula.Launcher/ViewModels/MainViewModel.cs | 33 ++++++---- .../ViewModels/ServerListViewModel.cs | 13 ++++ Nebula.Launcher/ViewModels/ViewModelBase.cs | 34 +++++++++- Nebula.Launcher/Views/MainView.axaml | 63 +++++++++++-------- ...ntInfoPage.axaml => AccountInfoView.axaml} | 6 +- ...Page.axaml.cs => AccountInfoView.axaml.cs} | 6 +- .../Views/Pages/ServerListPage.axaml.cs | 11 ---- ...verListPage.axaml => ServerListView.axaml} | 6 +- .../Views/Pages/ServerListView.axaml.cs | 20 ++++++ 15 files changed, 174 insertions(+), 62 deletions(-) create mode 100644 Nebula.Launcher/ViewHelper/ViewRegisterAttribute.cs create mode 100644 Nebula.Launcher/ViewModels/ServerListViewModel.cs rename Nebula.Launcher/Views/Pages/{AccountInfoPage.axaml => AccountInfoView.axaml} (91%) rename Nebula.Launcher/Views/Pages/{AccountInfoPage.axaml.cs => AccountInfoView.axaml.cs} (61%) delete mode 100644 Nebula.Launcher/Views/Pages/ServerListPage.axaml.cs rename Nebula.Launcher/Views/Pages/{ServerListPage.axaml => ServerListView.axaml} (87%) create mode 100644 Nebula.Launcher/Views/Pages/ServerListView.axaml.cs diff --git a/.idea/.idea.Nebula/.idea/avalonia.xml b/.idea/.idea.Nebula/.idea/avalonia.xml index 8ae03a6..a803b03 100644 --- a/.idea/.idea.Nebula/.idea/avalonia.xml +++ b/.idea/.idea.Nebula/.idea/avalonia.xml @@ -10,6 +10,9 @@ + + + diff --git a/Nebula.Launcher/App.axaml b/Nebula.Launcher/App.axaml index d65d93c..64f399e 100644 --- a/Nebula.Launcher/App.axaml +++ b/Nebula.Launcher/App.axaml @@ -56,5 +56,12 @@ + + \ No newline at end of file diff --git a/Nebula.Launcher/ServiceCollectionExtensions.cs b/Nebula.Launcher/ServiceCollectionExtensions.cs index 8f7e5d7..8b23bb7 100644 --- a/Nebula.Launcher/ServiceCollectionExtensions.cs +++ b/Nebula.Launcher/ServiceCollectionExtensions.cs @@ -39,7 +39,8 @@ public static class ServiceCollectionExtensions { services.AddTransient(); services.AddView(); - services.AddView(); + services.AddView(); + services.AddView(); } private static void AddView(this IServiceCollection services) diff --git a/Nebula.Launcher/ViewHelper/ViewRegisterAttribute.cs b/Nebula.Launcher/ViewHelper/ViewRegisterAttribute.cs new file mode 100644 index 0000000..7ca0bd0 --- /dev/null +++ b/Nebula.Launcher/ViewHelper/ViewRegisterAttribute.cs @@ -0,0 +1,13 @@ +using System; + +namespace Nebula.Launcher.ViewHelper; + +public class ViewRegisterAttribute : Attribute +{ + public Type Type { get; } + + public ViewRegisterAttribute(Type type) + { + Type = type; + } +} \ No newline at end of file diff --git a/Nebula.Launcher/ViewLocator.cs b/Nebula.Launcher/ViewLocator.cs index 91d6a95..3d9999c 100644 --- a/Nebula.Launcher/ViewLocator.cs +++ b/Nebula.Launcher/ViewLocator.cs @@ -1,6 +1,8 @@ using System; +using System.Reflection; using Avalonia.Controls; using Avalonia.Controls.Templates; +using Nebula.Launcher.ViewHelper; using Nebula.Launcher.ViewModels; namespace Nebula.Launcher; @@ -11,16 +13,15 @@ public class ViewLocator : IDataTemplate { if (param is null) return null; - - var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal); - var type = Type.GetType(name); + + var type = param.GetType().GetCustomAttribute()?.Type; if (type != null) { return (Control)Activator.CreateInstance(type)!; } - return new TextBlock { Text = "Not Found: " + name }; + return new TextBlock { Text = "Not Found: " + param.GetType()}; } public bool Match(object? data) diff --git a/Nebula.Launcher/ViewModels/AccountInfoViewModel.cs b/Nebula.Launcher/ViewModels/AccountInfoViewModel.cs index 347fe8b..5d0f9fd 100644 --- a/Nebula.Launcher/ViewModels/AccountInfoViewModel.cs +++ b/Nebula.Launcher/ViewModels/AccountInfoViewModel.cs @@ -1,8 +1,13 @@ +using System; +using Nebula.Launcher.ViewHelper; using Nebula.Launcher.Views.Pages; namespace Nebula.Launcher.ViewModels; -public class AccountInfoViewModel : ViewModelBase, ITab +[ViewRegister(typeof(AccountInfoView))] +public class AccountInfoViewModel : ViewModelBase { - + public AccountInfoViewModel(IServiceProvider serviceProvider) : base(serviceProvider) + { + } } diff --git a/Nebula.Launcher/ViewModels/MainViewModel.cs b/Nebula.Launcher/ViewModels/MainViewModel.cs index e01db28..dd7e572 100644 --- a/Nebula.Launcher/ViewModels/MainViewModel.cs +++ b/Nebula.Launcher/ViewModels/MainViewModel.cs @@ -8,16 +8,27 @@ using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using Nebula.Launcher.Models; +using Nebula.Launcher.ViewHelper; +using Nebula.Launcher.Views; +using Nebula.Launcher.Views.Pages; namespace Nebula.Launcher.ViewModels; - +[ViewRegister(typeof(MainView))] public partial class MainViewModel : ViewModelBase { - public MainViewModel(AccountInfoViewModel accountInfoViewModel, IServiceProvider serviceProvider) + public MainViewModel() + { + TryGetViewModel(typeof(AccountInfoViewModel), out var model); + _currentPage = model!; + Items = new ObservableCollection(_templates); + + SelectedListItem = Items.First(vm => vm.ModelType == typeof(AccountInfoViewModel)); + } + + public MainViewModel(AccountInfoViewModel accountInfoViewModel, IServiceProvider serviceProvider): base(serviceProvider) { _currentPage = accountInfoViewModel; - _serviceProvider = serviceProvider; Items = new ObservableCollection(_templates); SelectedListItem = Items.First(vm => vm.ModelType == typeof(AccountInfoViewModel)); @@ -26,6 +37,7 @@ public partial class MainViewModel : ViewModelBase private readonly List _templates = [ new ListItemTemplate(typeof(AccountInfoViewModel), "HomeRegular", "Account"), + new ListItemTemplate(typeof(ServerListViewModel), "List", "Servers") ]; [ObservableProperty] @@ -34,21 +46,20 @@ public partial class MainViewModel : ViewModelBase [ObservableProperty] private ViewModelBase _currentPage; - private readonly IServiceProvider _serviceProvider; - [ObservableProperty] private ListItemTemplate? _selectedListItem; partial void OnSelectedListItemChanged(ListItemTemplate? value) { + Console.WriteLine("FUCKED " + value?.ModelType); if (value is null) return; - var vm = Design.IsDesignMode - ? Activator.CreateInstance(value.ModelType) - : _serviceProvider.GetService(value.ModelType); - - if (vm is not ViewModelBase vmb) return; - + if(!TryGetViewModel(value.ModelType, out var vmb)) + { + Console.WriteLine("FUCKCCC"); + return; + } + CurrentPage = vmb; } diff --git a/Nebula.Launcher/ViewModels/ServerListViewModel.cs b/Nebula.Launcher/ViewModels/ServerListViewModel.cs new file mode 100644 index 0000000..f350747 --- /dev/null +++ b/Nebula.Launcher/ViewModels/ServerListViewModel.cs @@ -0,0 +1,13 @@ +using System; +using Nebula.Launcher.ViewHelper; +using Nebula.Launcher.Views.Pages; + +namespace Nebula.Launcher.ViewModels; + +[ViewRegister(typeof(ServerListView))] +public class ServerListViewModel : ViewModelBase +{ + public ServerListViewModel(IServiceProvider serviceProvider) : base(serviceProvider) + { + } +} \ No newline at end of file diff --git a/Nebula.Launcher/ViewModels/ViewModelBase.cs b/Nebula.Launcher/ViewModels/ViewModelBase.cs index 9590019..0875b7b 100644 --- a/Nebula.Launcher/ViewModels/ViewModelBase.cs +++ b/Nebula.Launcher/ViewModels/ViewModelBase.cs @@ -1,8 +1,40 @@ -using Avalonia.Controls; +using System; +using System.Diagnostics.CodeAnalysis; +using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; namespace Nebula.Launcher.ViewModels; public abstract class ViewModelBase : ObservableObject { + private readonly IServiceProvider _serviceProvider; + public ViewModelBase() + { + AssertDesignMode(); + _serviceProvider = default!; + } + public ViewModelBase(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public bool TryGetViewModel(Type type,[NotNullWhen(true)] out ViewModelBase? viewModelBase) + { + viewModelBase = null; + var vm = Design.IsDesignMode + ? Activator.CreateInstance(type) + : _serviceProvider.GetService(type); + + Console.WriteLine(vm?.ToString()); + + if (vm is not ViewModelBase vmb) return false; + + viewModelBase = vmb; + return true; + } + + public void AssertDesignMode() + { + if (!Design.IsDesignMode) throw new Exception(); + } } \ No newline at end of file diff --git a/Nebula.Launcher/Views/MainView.axaml b/Nebula.Launcher/Views/MainView.axaml index cb1cef9..24481ef 100644 --- a/Nebula.Launcher/Views/MainView.axaml +++ b/Nebula.Launcher/Views/MainView.axaml @@ -11,12 +11,23 @@ xmlns:models="clr-namespace:Nebula.Launcher.Models" xmlns:viewModels="clr-namespace:Nebula.Launcher.ViewModels" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:viewModels="clr-namespace:Nebula.Launcher.ViewModels"> + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:pages="clr-namespace:Nebula.Launcher.Views.Pages"> diff --git a/Nebula.Launcher/Views/Pages/ServerListView.axaml.cs b/Nebula.Launcher/Views/Pages/ServerListView.axaml.cs new file mode 100644 index 0000000..d19f897 --- /dev/null +++ b/Nebula.Launcher/Views/Pages/ServerListView.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia.Controls; +using Nebula.Launcher.ViewModels; + +namespace Nebula.Launcher.Views.Pages; + +public partial class ServerListView : UserControl +{ + // This constructor is used when the view is created by the XAML Previewer + public ServerListView() + { + InitializeComponent(); + } + + // This constructor is used when the view is created via dependency injection + public ServerListView(ServerListViewModel viewModel) + : this() + { + DataContext = viewModel; + } +} \ No newline at end of file