diff --git a/.idea/.idea.Nebula/.idea/avalonia.xml b/.idea/.idea.Nebula/.idea/avalonia.xml
index 73e960c..6c38c66 100644
--- a/.idea/.idea.Nebula/.idea/avalonia.xml
+++ b/.idea/.idea.Nebula/.idea/avalonia.xml
@@ -15,6 +15,7 @@
+
diff --git a/Nebula.Launcher/Assets/svg/star.svg b/Nebula.Launcher/Assets/svg/star.svg
new file mode 100644
index 0000000..b3f9d94
--- /dev/null
+++ b/Nebula.Launcher/Assets/svg/star.svg
@@ -0,0 +1,3 @@
+
diff --git a/Nebula.Launcher/Assets/svg/starfull.svg b/Nebula.Launcher/Assets/svg/starfull.svg
new file mode 100644
index 0000000..72ebc63
--- /dev/null
+++ b/Nebula.Launcher/Assets/svg/starfull.svg
@@ -0,0 +1,3 @@
+
diff --git a/Nebula.Launcher/Nebula.Launcher.csproj b/Nebula.Launcher/Nebula.Launcher.csproj
index 5179039..b442ed9 100644
--- a/Nebula.Launcher/Nebula.Launcher.csproj
+++ b/Nebula.Launcher/Nebula.Launcher.csproj
@@ -36,6 +36,10 @@
ServerListTab.axaml
Code
+
+ AddFavoriteView.axaml
+ Code
+
diff --git a/Nebula.Launcher/ViewModels/MainViewModel.cs b/Nebula.Launcher/ViewModels/MainViewModel.cs
index 10a8cf1..86b1671 100644
--- a/Nebula.Launcher/ViewModels/MainViewModel.cs
+++ b/Nebula.Launcher/ViewModels/MainViewModel.cs
@@ -20,26 +20,21 @@ public partial class MainViewModel : ViewModelBase
{
private readonly List _templates =
[
- new ListItemTemplate(typeof(AccountInfoViewModel), "user", "Account"),
- new ListItemTemplate(typeof(ServerListViewModel), "file", "Servers"),
- new ListItemTemplate(typeof(ContentBrowserViewModel), "folder", "Content")
+ 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)
];
private readonly List _viewQueue = new();
[ObservableProperty] private ViewModelBase _currentPage;
-
[ObservableProperty] private PopupViewModelBase? _currentPopup;
-
[ObservableProperty] private string _currentTitle = "Default";
-
[ObservableProperty] private bool _isEnabled = true;
-
[ObservableProperty] private bool _isPaneOpen;
-
[ObservableProperty] private bool _isPopupClosable = true;
[ObservableProperty] private bool _popup;
-
[ObservableProperty] private ListItemTemplate? _selectedListItem;
[GenerateProperty] private DebugService DebugService { get; } = default!;
@@ -57,22 +52,19 @@ public partial class MainViewModel : ViewModelBase
protected override void Initialise()
{
- CurrentPage = ViewHelperService.GetViewModel();
-
- Items = new ObservableCollection(_templates);
+ InitialiseInDesignMode();
PopupMessageService.OnPopupRequired += OnPopupRequired;
PopupMessageService.OnCloseRequired += OnPopupCloseRequired;
-
- SelectedListItem = Items.First(vm => vm.ModelType == typeof(AccountInfoViewModel));
}
partial void OnSelectedListItemChanged(ListItemTemplate? value)
{
if (value is null) return;
- if (!ViewHelperService.TryGetViewModel(value.ModelType, out var vmb)) return;
+ if (!ViewHelperService.TryGetViewModel(value.ModelType, out var vmb) || vmb is not IViewModelPage viewModelPage) return;
+ viewModelPage.OnPageOpen(value.args);
CurrentPage = vmb;
}
diff --git a/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs b/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs
index d269df6..87ca87b 100644
--- a/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs
+++ b/Nebula.Launcher/ViewModels/Pages/AccountInfoViewModel.cs
@@ -16,7 +16,7 @@ namespace Nebula.Launcher.ViewModels.Pages;
[ViewModelRegister(typeof(AccountInfoView))]
[ConstructGenerator]
-public partial class AccountInfoViewModel : ViewModelBase
+public partial class AccountInfoViewModel : ViewModelBase, IViewModelPage
{
[ObservableProperty] private bool _authMenuExpand;
@@ -190,6 +190,11 @@ public partial class AccountInfoViewModel : ViewModelBase
ConfigurationService.SetConfigValue(CurrentConVar.AuthProfiles,
Accounts.Select(a => (AuthLoginPassword)a).ToArray());
}
+
+ public void OnPageOpen(object? args)
+ {
+
+ }
}
public record AuthLoginPasswordModel(
diff --git a/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs
index 7c9ad37..f680e81 100644
--- a/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs
+++ b/Nebula.Launcher/ViewModels/Pages/ContentBrowserViewModel.cs
@@ -22,7 +22,7 @@ namespace Nebula.Launcher.ViewModels.Pages;
[ViewModelRegister(typeof(ContentBrowserView))]
[ConstructGenerator]
-public sealed partial class ContentBrowserViewModel : ViewModelBase
+public sealed partial class ContentBrowserViewModel : ViewModelBase , IViewModelPage
{
private readonly List _root = new();
@@ -204,6 +204,10 @@ public sealed partial class ContentBrowserViewModel : ViewModelBase
_history.RemoveAt(0);
return h;
}
+
+ public void OnPageOpen(object? args)
+ {
+ }
}
public class ContentEntry
diff --git a/Nebula.Launcher/ViewModels/Pages/FavoriteServerListViewModel.cs b/Nebula.Launcher/ViewModels/Pages/FavoriteServerListViewModel.cs
deleted file mode 100644
index 3fea05b..0000000
--- a/Nebula.Launcher/ViewModels/Pages/FavoriteServerListViewModel.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System.Collections.ObjectModel;
-using Nebula.Shared.Models;
-
-namespace Nebula.Launcher.ViewModels.Pages;
-
-public class FavoriteServerListViewModel : ViewModelBase
-{
- public ObservableCollection Servers = new();
-
- protected override void Initialise()
- {
- }
-
- protected override void InitialiseInDesignMode()
- {
- }
-}
\ No newline at end of file
diff --git a/Nebula.Launcher/ViewModels/Pages/IViewModelPage.cs b/Nebula.Launcher/ViewModels/Pages/IViewModelPage.cs
new file mode 100644
index 0000000..f2f473f
--- /dev/null
+++ b/Nebula.Launcher/ViewModels/Pages/IViewModelPage.cs
@@ -0,0 +1,6 @@
+namespace Nebula.Launcher.ViewModels.Pages;
+
+public interface IViewModelPage
+{
+ public void OnPageOpen(object? args);
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs
index e1f5394..a5d5213 100644
--- a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs
+++ b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.Favorite.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
@@ -32,6 +33,7 @@ public partial class ServerListViewModel
{
var model = ViewHelperService.GetViewModel().WithData(server.Item1, server.Item2);
model.OnFavoriteToggle += ()=> RemoveFavorite(model);
+ model.IsFavorite = true;
return model;
}
@@ -51,23 +53,37 @@ public partial class ServerListViewModel
foreach (var server in servers)
{
var uri = server.ToRobustUrl();
- var serverInfo = await RestService.GetAsync(uri.StatusUri, CancellationToken.None);
- if (serverInfo.Value is null)
+ try
{
- continue;
- }
+ var serverInfo = await RestService.GetAsync(uri.StatusUri, CancellationToken.None);
+ if (serverInfo.Value is null)
+ {
+ throw new Exception("Server info is null");
+ }
- FavoriteServers.Add((uri, serverInfo.Value));
+ FavoriteServers.Add((uri, serverInfo.Value));
+ }
+ catch (Exception e)
+ {
+ FavoriteServers.Add((uri, new ServerStatus("ErrorLand",$"ERROR: {e.Message}",[],"",-1,-1,-1,false,DateTime.Now, -1)));
+ }
}
SortFavorite();
}
public void AddFavorite(ServerEntryModelView entryModelView)
+ {
+ entryModelView.IsFavorite = true;
+ AddFavorite(entryModelView.Address);
+ }
+
+ public void AddFavorite(RobustUrl robustUrl)
{
var servers = (ConfigurationService.GetConfigValue(CurrentConVar.Favorites) ?? []).ToList();
- servers.Add(entryModelView.Address.ToString());
+ servers.Add(robustUrl.ToString());
ConfigurationService.SetConfigValue(CurrentConVar.Favorites, servers.ToArray());
+ FetchFavorite();
}
public void RemoveFavorite(ServerEntryModelView entryModelView)
@@ -75,5 +91,7 @@ public partial class ServerListViewModel
var servers = (ConfigurationService.GetConfigValue(CurrentConVar.Favorites) ?? []).ToList();
servers.Remove(entryModelView.Address.ToString());
ConfigurationService.SetConfigValue(CurrentConVar.Favorites, servers.ToArray());
+ entryModelView.IsFavorite = false;
+ FetchFavorite();
}
}
\ No newline at end of file
diff --git a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs
index 831b6a6..f59508d 100644
--- a/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs
+++ b/Nebula.Launcher/ViewModels/Pages/ServerListViewModel.cs
@@ -6,6 +6,7 @@ using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using Nebula.Launcher.Services;
+using Nebula.Launcher.ViewModels.Popup;
using Nebula.Launcher.Views.Pages;
using Nebula.Shared.Models;
using Nebula.Shared.Services;
@@ -15,14 +16,17 @@ namespace Nebula.Launcher.ViewModels.Pages;
[ViewModelRegister(typeof(ServerListView))]
[ConstructGenerator]
-public partial class ServerListViewModel : ViewModelBase
+public partial class ServerListViewModel : ViewModelBase, IViewModelPage
{
[ObservableProperty] private string _searchText = string.Empty;
+ [ObservableProperty] private bool _isFavoriteMode;
+
public Action? OnSearchChange;
[GenerateProperty] private HubService HubService { get; } = default!;
+ [GenerateProperty] private PopupMessageService PopupMessageService { get; }
[GenerateProperty, DesignConstruct] private ViewHelperService ViewHelperService { get; } = default!;
- public ObservableCollection ServerInfos { get; } = new();
+ public ObservableCollection SortedServers { get; } = new();
private List UnsortedServers { get; } = new();
//Design think
@@ -31,11 +35,11 @@ public partial class ServerListViewModel : ViewModelBase
FavoriteVisible = true;
SortedFavoriteServers.Add(GetServerEntryModelView(("ss14://localhost".ToRobustUrl(),
new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20))));
- ServerInfos.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
+ SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), [])));
- ServerInfos.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
+ SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), [])));
- ServerInfos.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
+ SortedServers.Add(CreateServerView(new ServerHubInfo("ss14://localhost",
new ServerStatus("Nebula", "TestCraft", ["16+", "RU"], "super", 12, 55, 1, false, DateTime.Now, 20), [])));
}
@@ -74,9 +78,9 @@ public partial class ServerListViewModel : ViewModelBase
{
Task.Run(() =>
{
- ServerInfos.Clear();
+ SortedServers.Clear();
UnsortedServers.Sort(new ServerComparer());
- foreach (var server in UnsortedServers.Where(a => CheckServerThink(a.StatusData))) ServerInfos.Add(CreateServerView(server));
+ foreach (var server in UnsortedServers.Where(a => CheckServerThink(a.StatusData))) SortedServers.Add(CreateServerView(server));
});
}
@@ -97,10 +101,24 @@ public partial class ServerListViewModel : ViewModelBase
{
}
+ public void AddFavoriteRequired()
+ {
+ var p = ViewHelperService.GetViewModel();
+ PopupMessageService.Popup(p);
+ }
+
public void UpdateRequired()
{
Task.Run(HubService.UpdateHub);
}
+
+ public void OnPageOpen(object? args)
+ {
+ if (args is bool fav)
+ {
+ IsFavoriteMode = fav;
+ }
+ }
}
public class ServerComparer : IComparer, IComparer, IComparer<(RobustUrl,ServerStatus)>
diff --git a/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs b/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs
new file mode 100644
index 0000000..ec05790
--- /dev/null
+++ b/Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs
@@ -0,0 +1,47 @@
+using System;
+using CommunityToolkit.Mvvm.ComponentModel;
+using Nebula.Launcher.ViewModels.Pages;
+using Nebula.Launcher.Views.Pages;
+using Nebula.Shared.Services;
+using Nebula.Shared.Utils;
+using AddFavoriteView = Nebula.Launcher.Views.Popup.AddFavoriteView;
+
+namespace Nebula.Launcher.ViewModels.Popup;
+
+[ViewModelRegister(typeof(AddFavoriteView), false)]
+[ConstructGenerator]
+public partial class AddFavoriteViewModel : PopupViewModelBase
+{
+ protected override void InitialiseInDesignMode()
+ {
+ }
+
+ protected override void Initialise()
+ {
+ }
+
+ [GenerateProperty]
+ public override PopupMessageService PopupMessageService { get; }
+ [GenerateProperty] private ServerListViewModel ServerListViewModel { get; }
+ [GenerateProperty] private DebugService DebugService { get; }
+ public override string Title => "Add to favorite";
+ public override bool IsClosable => true;
+
+ [ObservableProperty] private string _ipInput;
+ [ObservableProperty] private string _error = "";
+
+ public void OnEnter()
+ {
+ try
+ {
+ var uri = IpInput.ToRobustUrl();
+ ServerListViewModel.AddFavorite(uri);
+ Dispose();
+ }
+ catch (Exception e)
+ {
+ Error = e.Message;
+ DebugService.Error(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/ViewModels/ServerEntryModelView.cs b/Nebula.Launcher/ViewModels/ServerEntryModelView.cs
index 100977e..2a59f1a 100644
--- a/Nebula.Launcher/ViewModels/ServerEntryModelView.cs
+++ b/Nebula.Launcher/ViewModels/ServerEntryModelView.cs
@@ -38,6 +38,7 @@ public partial class ServerEntryModelView : ViewModelBase
[ObservableProperty] private string _description = "Fetching info...";
[ObservableProperty] private bool _expandInfo = false;
[ObservableProperty] private bool _tagDataVisible = false;
+ [ObservableProperty] private bool _isFavorite = false;
public ServerStatus Status { get; set; } =
new("", "", [], "", -1, -1, -1, false, DateTime.Now, -1);
@@ -51,10 +52,18 @@ public partial class ServerEntryModelView : ViewModelBase
{
if (_serverInfo == null)
{
- var result =
- await RestService.GetAsync(Address.InfoUri, CancellationService.Token);
- if (result.Value == null) return null;
- _serverInfo = result.Value;
+ try
+ {
+ var result =
+ await RestService.GetAsync(Address.InfoUri, CancellationService.Token);
+ if (result.Value == null) return null;
+ _serverInfo = result.Value;
+ }
+ catch (Exception e)
+ {
+ Description = e.Message;
+ DebugService.Error(e);
+ }
}
return _serverInfo;
@@ -248,7 +257,6 @@ public partial class ServerEntryModelView : ViewModelBase
var info = await GetServerInfo();
if (info == null)
{
- Description = "Error think!";
return;
}
diff --git a/Nebula.Launcher/Views/Pages/ServerListView.axaml b/Nebula.Launcher/Views/Pages/ServerListView.axaml
index e0c9b74..b23d122 100644
--- a/Nebula.Launcher/Views/Pages/ServerListView.axaml
+++ b/Nebula.Launcher/Views/Pages/ServerListView.axaml
@@ -22,24 +22,16 @@
Grid.RowSpan="2"
Margin="0,0,0,10"
Padding="0,0,10,0">
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -60,14 +52,20 @@
VerticalAlignment="Center"
Watermark="Server name..." />
+
diff --git a/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml
new file mode 100644
index 0000000..7075235
--- /dev/null
+++ b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs
new file mode 100644
index 0000000..b6e51f1
--- /dev/null
+++ b/Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs
@@ -0,0 +1,18 @@
+using Avalonia.Controls;
+using Nebula.Launcher.ViewModels.Popup;
+
+namespace Nebula.Launcher.Views.Popup;
+
+public partial class AddFavoriteView : UserControl
+{
+ public AddFavoriteView()
+ {
+ InitializeComponent();
+ }
+
+ public AddFavoriteView(AddFavoriteViewModel viewModel)
+ : this()
+ {
+ DataContext = viewModel;
+ }
+}
\ No newline at end of file
diff --git a/Nebula.Launcher/Views/ServerEntryView.axaml b/Nebula.Launcher/Views/ServerEntryView.axaml
index 3c7f21b..d2c4d7f 100644
--- a/Nebula.Launcher/Views/ServerEntryView.axaml
+++ b/Nebula.Launcher/Views/ServerEntryView.axaml
@@ -23,7 +23,7 @@
BoxShadow="-2 0 5 -1 #121212"
CornerRadius="10"
Margin="5">
-
+
+
+
+
+
+