From 37ff25ba70802e22c28bac1f8b31d374eeb7be27 Mon Sep 17 00:00:00 2001 From: Cinka Date: Wed, 29 Jan 2025 12:32:42 +0300 Subject: [PATCH] - tweak: Favorite button --- .idea/.idea.Nebula/.idea/avalonia.xml | 1 + Nebula.Launcher/Assets/svg/star.svg | 3 ++ Nebula.Launcher/Assets/svg/starfull.svg | 3 ++ Nebula.Launcher/Nebula.Launcher.csproj | 4 ++ Nebula.Launcher/ViewModels/MainViewModel.cs | 22 +++------ .../ViewModels/Pages/AccountInfoViewModel.cs | 7 ++- .../Pages/ContentBrowserViewModel.cs | 6 ++- .../Pages/FavoriteServerListViewModel.cs | 17 ------- .../ViewModels/Pages/IViewModelPage.cs | 6 +++ .../Pages/ServerListViewModel.Favorite.cs | 30 +++++++++--- .../ViewModels/Pages/ServerListViewModel.cs | 32 ++++++++++--- .../ViewModels/Popup/AddFavoriteViewModel.cs | 47 +++++++++++++++++++ .../ViewModels/ServerEntryModelView.cs | 18 +++++-- .../Views/Pages/ServerListView.axaml | 40 ++++++++-------- .../Views/Popup/AddFavoriteView.axaml | 28 +++++++++++ .../Views/Popup/AddFavoriteView.axaml.cs | 18 +++++++ Nebula.Launcher/Views/ServerEntryView.axaml | 24 +++++++++- Nebula.Shared/Models/ListItemTemplate.cs | 2 +- 18 files changed, 233 insertions(+), 75 deletions(-) create mode 100644 Nebula.Launcher/Assets/svg/star.svg create mode 100644 Nebula.Launcher/Assets/svg/starfull.svg delete mode 100644 Nebula.Launcher/ViewModels/Pages/FavoriteServerListViewModel.cs create mode 100644 Nebula.Launcher/ViewModels/Pages/IViewModelPage.cs create mode 100644 Nebula.Launcher/ViewModels/Popup/AddFavoriteViewModel.cs create mode 100644 Nebula.Launcher/Views/Popup/AddFavoriteView.axaml create mode 100644 Nebula.Launcher/Views/Popup/AddFavoriteView.axaml.cs 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"> - + + + + + +