From 6d46e02d6f61bba10895c43bd8f743a6187f641b Mon Sep 17 00:00:00 2001 From: Cinka Date: Sat, 11 Jan 2025 20:39:58 +0300 Subject: [PATCH] - add: ContentView think --- Nebula.Launcher/Assets/back.png | Bin 0 -> 19611 bytes Nebula.Launcher/Assets/dir.png | Bin 0 -> 11353 bytes Nebula.Launcher/Assets/file.png | Bin 0 -> 13500 bytes Nebula.Launcher/Assets/go.png | Bin 0 -> 12655 bytes .../ViewModels/ContentBrowserViewModel.cs | 321 +++++++++++++++++- Nebula.Launcher/ViewModels/MainViewModel.cs | 3 +- .../ViewModels/ServerListViewModel.cs | 8 +- .../Views/Pages/ContentBrowserView.axaml | 64 +++- .../Views/Pages/ServerListView.axaml | 32 +- Nebula.Shared/Services/HubService.cs | 2 + 10 files changed, 388 insertions(+), 42 deletions(-) create mode 100644 Nebula.Launcher/Assets/back.png create mode 100644 Nebula.Launcher/Assets/dir.png create mode 100644 Nebula.Launcher/Assets/file.png create mode 100644 Nebula.Launcher/Assets/go.png diff --git a/Nebula.Launcher/Assets/back.png b/Nebula.Launcher/Assets/back.png new file mode 100644 index 0000000000000000000000000000000000000000..f8911f5388c70ddcddcefe77c52d16b7dab8c04c GIT binary patch literal 19611 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 TsD}S432brpaJs*VcH+MP*7Vnz literal 0 HcmV?d00001 diff --git a/Nebula.Launcher/Assets/go.png b/Nebula.Launcher/Assets/go.png new file mode 100644 index 0000000000000000000000000000000000000000..b869536d0c2fedd21eeec80c9657c0282ca77a5c GIT binary patch literal 12655 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 Qf26>i>|9nA*)os)AEW{`djJ3c literal 0 HcmV?d00001 diff --git a/Nebula.Launcher/ViewModels/ContentBrowserViewModel.cs b/Nebula.Launcher/ViewModels/ContentBrowserViewModel.cs index ea6a951..bce3d68 100644 --- a/Nebula.Launcher/ViewModels/ContentBrowserViewModel.cs +++ b/Nebula.Launcher/ViewModels/ContentBrowserViewModel.cs @@ -1,48 +1,351 @@ using System; +using System.Collections.Frozen; +using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Threading.Tasks; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.Extensions.DependencyInjection; using Nebula.Launcher.ViewHelper; using Nebula.Launcher.Views.Pages; +using Nebula.Shared; using Nebula.Shared.Models; +using Nebula.Shared.Services; +using Nebula.Shared.Utils; namespace Nebula.Launcher.ViewModels; [ViewModelRegister(typeof(ContentBrowserView))] public sealed partial class ContentBrowserViewModel : ViewModelBase { - public ObservableCollection Entries = new(); + private readonly IServiceProvider _provider; + private readonly ContentService _contentService; + private readonly CancellationService _cancellationService; + private readonly DebugService _debugService; + private readonly PopupMessageService _popupService; + public ObservableCollection Entries { get; } = new(); + private readonly List _root = new(); + + private List _history = new(); [ObservableProperty] private string _message = ""; [ObservableProperty] private string _searchText = ""; + private ContentEntry? _selectedEntry; + + public ContentEntry? SelectedEntry + { + get => _selectedEntry; + set + { + _selectedEntry = value; + Entries.Clear(); + + Console.WriteLine("Entries clear!"); + + if(value == null) return; + + foreach (var (_,entryCh) in value.Childs) + { + Entries.Add(entryCh); + } + } + } + public ContentBrowserViewModel() : base() { - + var a = new ContentEntry(this, "A:", ""); + var b = new ContentEntry(this, "B", ""); + a.TryAddChild(b); + Entries.Add(a); } - public ContentBrowserViewModel(IServiceProvider provider) : base(provider) + public ContentBrowserViewModel(IServiceProvider provider, ContentService contentService, CancellationService cancellationService, + FileService fileService, HubService hubService, DebugService debugService, PopupMessageService popupService) : base(provider) { + _provider = provider; + _contentService = contentService; + _cancellationService = cancellationService; + _debugService = debugService; + _popupService = popupService; + + hubService.HubServerChangedEventArgs += HubServerChangedEventArgs; + hubService.HubServerLoaded += GoHome; + } + + private void GoHome() + { + SelectedEntry = null; + foreach (var entry in _root) + { + Entries.Add(entry); + } + } + + private void HubServerChangedEventArgs(HubServerChangedEventArgs obj) + { + if(obj.Action == HubServerChangeAction.Clear) _root.Clear(); + if (obj.Action == HubServerChangeAction.Add) + { + foreach (var info in obj.Items) + { + _root.Add(new ContentEntry(this, ToContentUrl(info.Address.ToRobustUrl()),info.Address)); + } + }; + } + + public async void Go(ContentPath path) + { + if (path.Pathes.Count == 0) + { + SearchText = ""; + GoHome(); + return; + } + + if (path.Pathes[0] != "content:" || path.Pathes.Count < 3) + { + return; + } + + SearchText = path.Path; + + path.Pathes.RemoveAt(0); + path.Pathes.RemoveAt(0); + + var serverUrl = path.Pathes[0]; + path.Pathes.RemoveAt(0); + + _debugService.Debug(path.Path + " " + serverUrl +" "+ SelectedEntry?.ServerName); + + try + { + ContentEntry entry; + if (serverUrl == SelectedEntry?.ServerName) + entry = SelectedEntry.GetRoot(); + else + entry = await CreateEntry(serverUrl); + + if (!entry.TryGetEntry(path, out var centry)) + { + throw new Exception("Not found!"); + } + + SelectedEntry = centry; + + } + catch (Exception e) + { + Console.WriteLine(e); + _popupService.Popup(e); + //throw; + } } public void OnBackEnter() { - + Go(new ContentPath(GetHistory())); } public void OnGoEnter() { + Go(new ContentPath(SearchText)); + } + + private async Task CreateEntry(string serverUrl) + { + var rurl = serverUrl.ToRobustUrl(); + var info = await _contentService.GetBuildInfo(rurl, _cancellationService.Token); + var loading = _provider.GetService()!; + loading.LoadingName = "Loading entry"; + _popupService.Popup(loading); + var items = await _contentService.EnsureItems(info.RobustManifestInfo, loading, + _cancellationService.Token); + + var rootEntry = new ContentEntry(this,ToContentUrl(rurl), serverUrl); + + foreach (var item in items) + { + var path = new ContentPath(item.Path); + rootEntry.CreateItem(path, item); + } + loading.Dispose(); + + return rootEntry; + } + + private void AppendHistory(string str) + { + if(_history.Count >= 10) _history.RemoveAt(9); + _history.Insert(0, str); + } + + private string GetHistory() + { + if (_history.Count == 0) return ""; + var h = _history[0]; + _history.RemoveAt(0); + return h; + } + + private string ToContentUrl(RobustUrl serverUrl) + { + var port = serverUrl.Uri.Port != -1 ? (":"+serverUrl.Uri.Port) : ""; + return "content://" + serverUrl.Uri.Host + port; } } -public sealed class ContentEntry +public class ContentEntry { - + private readonly ContentBrowserViewModel _viewModel; + + public static IImage DirImage = new Bitmap(AssetLoader.Open(new Uri("avares://Nebula.Launcher/Assets/dir.png"))); + public static IImage IconImage = new Bitmap(AssetLoader.Open(new Uri("avares://Nebula.Launcher/Assets/file.png"))); + + public RobustManifestItem? Item; + public bool IsDirectory => Item == null; + + public string Name { get; private set; } + public string ServerName { get; private set; } + public IImage IconPath { get; set; } = DirImage; + + public ContentEntry? Parent { get; private set; } + public bool IsRoot => Parent == null; + + private readonly Dictionary _childs = new(); + + public IReadOnlyDictionary Childs => _childs.ToFrozenDictionary(); + + public bool TryGetChild(string name,[NotNullWhen(true)] out ContentEntry? child) + { + return _childs.TryGetValue(name, out child); + } + + public bool TryAddChild(ContentEntry contentEntry) + { + if(_childs.TryAdd(contentEntry.Name, contentEntry)) + { + contentEntry.Parent = this; + return true; + } + + return false; + } + + internal ContentEntry(ContentBrowserViewModel viewModel, string name, string serverName) + { + Name = name; + ServerName = serverName; + _viewModel = viewModel; + } + + public ContentPath GetPath() + { + if (Parent != null) + { + var path = Parent.GetPath(); + path.Pathes.Add(Name); + return path; + } + return new ContentPath(Name); + } + + public ContentEntry GetOrCreateDirectory(ContentPath rootPath) + { + if (rootPath.Pathes.Count == 0) return this; + + var fName = rootPath.Pathes[0]; + rootPath.Pathes.RemoveAt(0); + + if(!TryGetChild(fName, out var child)) + { + child = new ContentEntry(_viewModel, fName, ServerName); + TryAddChild(child); + } + + return child.GetOrCreateDirectory(rootPath); + } + + public ContentEntry GetRoot() + { + if (Parent == null) return this; + return Parent.GetRoot(); + } + + public ContentEntry CreateItem(ContentPath path, RobustManifestItem item) + { + var dir = path.GetDirectory(); + var dirEntry = GetOrCreateDirectory(dir); + + var entry = new ContentEntry(_viewModel, path.GetName(), ServerName) + { + Item = item + }; + + dirEntry.TryAddChild(entry); + entry.IconPath = IconImage; + return entry; + } + + public bool TryGetEntry(ContentPath path, out ContentEntry? entry) + { + entry = null; + + if (path.Pathes.Count == 0) + { + entry = this; + return true; + } + + var fName = path.Pathes[0]; + path.Pathes.RemoveAt(0); + + if(!TryGetChild(fName, out var child)) + { + return false; + } + + return child.TryGetEntry(path, out entry); + } + + public void OnPathGo() + { + _viewModel.Go(GetPath()); + } } -public sealed class ContentPath +public struct ContentPath { - public RobustUrl ServerUrl; -} \ No newline at end of file + public List Pathes; + + public ContentPath(List pathes) + { + Pathes = pathes; + } + + public ContentPath(string path) + { + Pathes = path.Split("/").ToList(); + } + + public ContentPath GetDirectory() + { + var p = Pathes.ToList(); + p.RemoveAt(Pathes.Count - 1); + return new ContentPath(p); + } + + public string GetName() + { + return Pathes.Last(); + } + + public string Path => string.Join("/", Pathes); +} diff --git a/Nebula.Launcher/ViewModels/MainViewModel.cs b/Nebula.Launcher/ViewModels/MainViewModel.cs index 90684a9..6f0547a 100644 --- a/Nebula.Launcher/ViewModels/MainViewModel.cs +++ b/Nebula.Launcher/ViewModels/MainViewModel.cs @@ -45,7 +45,8 @@ public partial class MainViewModel : ViewModelBase private readonly List _templates = [ new ListItemTemplate(typeof(AccountInfoViewModel), "Account", "Account"), - new ListItemTemplate(typeof(ServerListViewModel), "HomeRegular", "Servers") + new ListItemTemplate(typeof(ServerListViewModel), "HomeRegular", "Servers"), + new ListItemTemplate(typeof(ContentBrowserViewModel), "HomeRegular", "Content") ]; [ObservableProperty] diff --git a/Nebula.Launcher/ViewModels/ServerListViewModel.cs b/Nebula.Launcher/ViewModels/ServerListViewModel.cs index 0e07e15..afe00c5 100644 --- a/Nebula.Launcher/ViewModels/ServerListViewModel.cs +++ b/Nebula.Launcher/ViewModels/ServerListViewModel.cs @@ -34,9 +34,15 @@ public partial class ServerListViewModel : ViewModelBase _serviceProvider = serviceProvider; _hubService = hubService; hubService.HubServerChangedEventArgs += HubServerChangedEventArgs; + hubService.HubServerLoaded += HubServerLoaded; OnSearchChange += OnChangeSearch; } + private void HubServerLoaded() + { + SortServers(); + } + private void OnChangeSearch() { SortServers(); @@ -62,8 +68,6 @@ public partial class ServerListViewModel : ViewModelBase { UnsortedServers.Clear(); } - - SortServers(); } private void SortServers() diff --git a/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml b/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml index ca5d0d7..96520db 100644 --- a/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml +++ b/Nebula.Launcher/Views/Pages/ContentBrowserView.axaml @@ -1,39 +1,69 @@ - + - - - + + + + Watermark="Path..." /> + + + + + + + + + diff --git a/Nebula.Launcher/Views/Pages/ServerListView.axaml b/Nebula.Launcher/Views/Pages/ServerListView.axaml index cee5c84..9b5531d 100644 --- a/Nebula.Launcher/Views/Pages/ServerListView.axaml +++ b/Nebula.Launcher/Views/Pages/ServerListView.axaml @@ -15,7 +15,10 @@ - + - -