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