From 2ea36a90861044ed370e9489f621c7261125cd77 Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Tue, 3 Dec 2024 18:35:25 +0100 Subject: [PATCH] Backup --- .idea/.idea.PSCHelpdesk/.idea/workspace.xml | 733 +-- FastBill/ViewModels/CustomerViewModel.cs | 1 + HetznerServer/Service/ServerService.cs | 6 +- HetznerServer/ViewModels/ServerViewModel.cs | 51 +- HetznerServer/Views/ServerView.axaml | 6 +- Nextcloud/ViewModels/NotesViewModel.cs | 1 + PSCHelpdesk.sln.DotSettings.user | 9 + PSCHelpdesk/PSCHelpdesk/App.axaml | 13 +- PSCHelpdesk/PSCHelpdesk/App.axaml.cs | 3 - .../PSCHelpdesk/Events/OpenEventArg.cs | 6 +- PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj | 10 +- PSCHelpdesk/PSCHelpdesk/Startup.cs | 9 - .../PSCHelpdesk/ViewModels/DockFactory.cs | 86 + .../ViewModels/MainDockWindowViewModel.cs | 61 +- .../ViewModels/PluginListViewModel.cs | 2 +- .../ViewModels/TestTemplateViewModel.cs | 8 - .../PSCHelpdesk/ViewModels/TestViewModel.cs | 8 - .../PSCHelpdesk/Views/MainDockWindow.axaml | 22 +- .../PSCHelpdesk/Views/MainDockWindow.axaml.cs | 76 +- .../PSCHelpdesk/Views/TestListView.axaml | 10 - .../PSCHelpdesk/Views/TestListView.axaml.cs | 13 - .../PSCHelpdesk/Views/TestTemplateView.axaml | 16 - .../Views/TestTemplateView.axaml.cs | 9 - Shared/Model/LayoutItem.cs | 11 + Shared/Setting/SettingsManager.cs | 20 + Shared/Shared.csproj | 2 +- Shared/ViewModels/ViewModelBase.cs | 5 +- _dist/hetzner/HetznerServer.deps.json | 85 +- _dist/hetzner/HetznerServer.dll | Bin 72704 -> 74752 bytes _dist/hetzner/HetznerServer.pdb | Bin 27524 -> 28612 bytes _dist/nextcloud/CommunityToolkit.Mvvm.pdb | Bin 47124 -> 0 bytes _dist/nextcloud/CommunityToolkit.Mvvm.xml | 4490 ----------------- _dist/nextcloud/Nextcloud.deps.json | 118 +- _dist/nextcloud/Nextcloud.dll | Bin 37888 -> 37888 bytes _dist/nextcloud/Nextcloud.pdb | Bin 19652 -> 19992 bytes 35 files changed, 440 insertions(+), 5450 deletions(-) create mode 100644 PSCHelpdesk/PSCHelpdesk/ViewModels/DockFactory.cs delete mode 100644 PSCHelpdesk/PSCHelpdesk/ViewModels/TestTemplateViewModel.cs delete mode 100644 PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs delete mode 100644 PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml delete mode 100644 PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml.cs delete mode 100644 PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml delete mode 100644 PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml.cs create mode 100644 Shared/Model/LayoutItem.cs delete mode 100755 _dist/nextcloud/CommunityToolkit.Mvvm.pdb delete mode 100755 _dist/nextcloud/CommunityToolkit.Mvvm.xml diff --git a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml index 42d0573..54edc83 100644 --- a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml +++ b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml @@ -11,612 +11,37 @@ - + + + + - + + + - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -636,15 +61,26 @@ + + + + + + + + + + + @@ -849,7 +285,10 @@ - + + + + - @@ -896,9 +343,9 @@ @@ -1001,95 +448,17 @@ diff --git a/FastBill/ViewModels/CustomerViewModel.cs b/FastBill/ViewModels/CustomerViewModel.cs index dd95c73..17a19f4 100644 --- a/FastBill/ViewModels/CustomerViewModel.cs +++ b/FastBill/ViewModels/CustomerViewModel.cs @@ -36,6 +36,7 @@ public class CustomerViewModel: ViewModelBase, IViewModelBase public CustomerViewModel(CustomerService customerService) { + Title = "Kunden"; Term = ""; _customerService = customerService; SearchCustomer = ReactiveCommand.Create(searchTerm); diff --git a/HetznerServer/Service/ServerService.cs b/HetznerServer/Service/ServerService.cs index 19da153..c4407fc 100644 --- a/HetznerServer/Service/ServerService.cs +++ b/HetznerServer/Service/ServerService.cs @@ -37,8 +37,8 @@ public class ServerService: IServerService }; _reloadTimer.Interval = TimeSpan.FromMinutes(10); _reloadTimer.Start(); - - this.reloadServer(); + + reloadServer(); } private async Task reloadServer() @@ -61,7 +61,7 @@ public class ServerService: IServerService } } - Task.Run(async () => await this.reloadServerStatus()); + await Task.Run(async () => await this.reloadServerStatus()); } private async Task reloadServerStatus() diff --git a/HetznerServer/ViewModels/ServerViewModel.cs b/HetznerServer/ViewModels/ServerViewModel.cs index b388f0d..286c3d0 100644 --- a/HetznerServer/ViewModels/ServerViewModel.cs +++ b/HetznerServer/ViewModels/ServerViewModel.cs @@ -7,6 +7,7 @@ using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.Input; using DynamicData; using DynamicData.Binding; +using Newtonsoft.Json; using PSCHelpdesk.Plugins.HetznerServer.Models; using PSCHelpdesk.Plugins.HetznerServer.Service; using PSCHelpdesk.Plugins.HetznerServer.Views; @@ -17,6 +18,24 @@ using ReactiveUI; namespace PSCHelpdesk.Plugins.HetznerServer.ViewModels; +public class Domain +{ + public string DomainName { get; set; } = string.Empty; +} + +public class Customer +{ + public string Ip4 { get; set; } = string.Empty; + public string ApiKey { get; set; } = string.Empty; + public string Name { get; set; } = string.Empty; + public List Domains { get; set; } = new List(); +} + +public class Customers +{ + public List Data { get; set; } = new List(); +} + public partial class ServerViewModel : ViewModelBase, IViewModelBase { public readonly ServerService ServerService; @@ -29,6 +48,7 @@ public partial class ServerViewModel : ViewModelBase, IViewModelBase private SettingsManager _settingsManager; public ServerViewModel() { + Title = "Server"; ServerService = new ServerService(); SelectedServer = new Server(1,"","","","",""); SelectionChanged = ReactiveCommand.Create(selectionChanged); @@ -69,12 +89,36 @@ public partial class ServerViewModel : ViewModelBase, IViewModelBase set => SetAndRaisePropertyChanged(ref _selectedServer, value); } - + private string _json; + public string Json + { + get => _json; + set => SetAndRaisePropertyChanged(ref _json, value); + } void selectionChanged(SelectionChangedEventArgs args) { this.SelectedServer = (args.Source as DataGrid).SelectedItem as Server; IsPagePaneOpen = true; + + var data = new Customers(); + foreach (var server in _server) + { + var customer = new Customer(); + customer.Name = server.Name; + customer.Ip4 = server.Ipv4; + customer.ApiKey = server.PscApiKey; + foreach (var domain in server.Domains) + { + customer.Domains.Add(new Domain() + { + DomainName = domain.Name + }); + } + data.Data.Add(customer); + } + + Json = JsonConvert.SerializeObject(data); } public void SSH(Server server) @@ -88,11 +132,6 @@ public partial class ServerViewModel : ViewModelBase, IViewModelBase Process.Start(_settingsManager.CoreSettings.SCPClientExecutable,string.Format(_settingsManager.CoreSettings.SCPClientExecutableArgs, server.Ipv4, _settingsManager.CoreSettings.PrivateSSHKeyPath, server.Name)); } - - public UserControl GetViewControl() - { - return new ServerView(); - } void saveServerSettings() { diff --git a/HetznerServer/Views/ServerView.axaml b/HetznerServer/Views/ServerView.axaml index b06163d..bb63366 100644 --- a/HetznerServer/Views/ServerView.axaml +++ b/HetznerServer/Views/ServerView.axaml @@ -18,12 +18,13 @@ - + Suchtext - + + diff --git a/Nextcloud/ViewModels/NotesViewModel.cs b/Nextcloud/ViewModels/NotesViewModel.cs index 93db0c6..2432fa7 100644 --- a/Nextcloud/ViewModels/NotesViewModel.cs +++ b/Nextcloud/ViewModels/NotesViewModel.cs @@ -31,6 +31,7 @@ public partial class NotesViewModel: ViewModelBase, IViewModelBase public NotesViewModel(NotesService notesService) { + Title = "Notes"; SelectedNote = new Note(); Notes = new List(); _notesService = notesService; diff --git a/PSCHelpdesk.sln.DotSettings.user b/PSCHelpdesk.sln.DotSettings.user index 288e94e..34e8340 100644 --- a/PSCHelpdesk.sln.DotSettings.user +++ b/PSCHelpdesk.sln.DotSettings.user @@ -1,6 +1,7 @@  ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -21,10 +22,13 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -33,6 +37,8 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -43,6 +49,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -58,6 +65,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded @@ -91,6 +99,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded True <AssemblyExplorer> diff --git a/PSCHelpdesk/PSCHelpdesk/App.axaml b/PSCHelpdesk/PSCHelpdesk/App.axaml index 335f8a1..0f63236 100644 --- a/PSCHelpdesk/PSCHelpdesk/App.axaml +++ b/PSCHelpdesk/PSCHelpdesk/App.axaml @@ -10,13 +10,14 @@ + + + + + - - - - \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/App.axaml.cs b/PSCHelpdesk/PSCHelpdesk/App.axaml.cs index d9819f9..5ff09c0 100644 --- a/PSCHelpdesk/PSCHelpdesk/App.axaml.cs +++ b/PSCHelpdesk/PSCHelpdesk/App.axaml.cs @@ -1,10 +1,7 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; -using CommunityToolkit.Mvvm.DependencyInjection; -using NP.Ava.UniDockService; using PSCHelpdesk.ViewModels; using PSCHelpdesk.Views; diff --git a/PSCHelpdesk/PSCHelpdesk/Events/OpenEventArg.cs b/PSCHelpdesk/PSCHelpdesk/Events/OpenEventArg.cs index 6ff738f..c703d91 100644 --- a/PSCHelpdesk/PSCHelpdesk/Events/OpenEventArg.cs +++ b/PSCHelpdesk/PSCHelpdesk/Events/OpenEventArg.cs @@ -1,8 +1,6 @@ -using NP.Ava.UniDockService; - -namespace PSCHelpdesk.Events; +namespace PSCHelpdesk.Events; public class OpenEventArg { - public DockItemViewModelBase Sender; + public string Sender; } \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj index 115596d..3088cf0 100644 --- a/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj +++ b/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.csproj @@ -19,10 +19,12 @@ + + + - @@ -49,10 +51,6 @@ MenuItem.axaml Code - - TestTemplateControl.axaml - Code - @@ -61,5 +59,7 @@ + + diff --git a/PSCHelpdesk/PSCHelpdesk/Startup.cs b/PSCHelpdesk/PSCHelpdesk/Startup.cs index a07b974..18ea4e9 100644 --- a/PSCHelpdesk/PSCHelpdesk/Startup.cs +++ b/PSCHelpdesk/PSCHelpdesk/Startup.cs @@ -1,8 +1,5 @@ using CommunityToolkit.Mvvm.DependencyInjection; using Microsoft.Extensions.DependencyInjection; -using NP.Ava.UniDock; -using NP.Ava.UniDock.Factories; -using NP.Ava.UniDockService; using PSCHelpdesk.Services; using PSCHelpdesk.Shared.Service; using PSCHelpdesk.Shared.Setting; @@ -16,9 +13,6 @@ namespace PSCHelpdesk; class Startup { - - public static DockManager TheDockManager { get; } = new DockManager(); - public static void RegisterServices() { var menuService = new MenuService(); @@ -33,12 +27,9 @@ class Startup .AddSingleton(settingsManager) .AddSingleton(settingsService) .AddSingleton(taskManager) - .AddSingleton() .AddSingleton(menuService) .AddSingleton(new TestService()) .AddSingleton() - .AddSingleton(TheDockManager) - .AddSingleton(TheDockManager) .AddSingleton(toastManager) .AddTransient(); diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/DockFactory.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/DockFactory.cs new file mode 100644 index 0000000..206b21a --- /dev/null +++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/DockFactory.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Dock.Avalonia.Controls; +using Dock.Model.Controls; +using Dock.Model.Core; +using Dock.Model.Mvvm; +using Dock.Model.Mvvm.Controls; + +namespace PSCHelpdesk.ViewModels; + +public class DockFactory : Factory +{ + private IRootDock? _rootDock; + private IDocumentDock? _documentDock; + private ITool? _findTool; + private ITool? _replaceTool; + + public override IDocumentDock CreateDocumentDock() => new DocumentDock(); + + public override IRootDock CreateLayout() + { + + var pluginViewModel = new PluginListViewModel() + { + Title = "Plugins", + }; + + var documentDock = new DocumentDock() + { + Id = "Files", + Title = "Files", + IsCollapsable = false, + //ActiveDockable = pluginViewModel, + Proportion = double.NaN, + VisibleDockables = CreateList + ( + //pluginViewModel + ), + CanCreateDocument = false + }; + + var windowLayout = CreateRootDock(); + windowLayout.Title = "Default"; + var windowLayoutContent = new ProportionalDock + { + Orientation = Orientation.Horizontal, + IsCollapsable = false, + VisibleDockables = CreateList + ( + documentDock + ) + }; + windowLayout.IsCollapsable = false; + windowLayout.VisibleDockables = CreateList(windowLayoutContent); + windowLayout.ActiveDockable = windowLayoutContent; + + var rootDock = CreateRootDock(); + + rootDock.IsCollapsable = false; + rootDock.VisibleDockables = CreateList(windowLayout); + rootDock.ActiveDockable = windowLayout; + rootDock.DefaultDockable = windowLayout; + + _documentDock = documentDock; + _rootDock = rootDock; + + return rootDock; + } + + public override void InitLayout(IDockable layout) + { + DockableLocator = new Dictionary> + { + ["Root"] = () => _rootDock, + ["Files"] = () => _documentDock, + }; + + HostWindowLocator = new Dictionary> + { + [nameof(IDockWindow)] = () => new HostWindow() + }; + + base.InitLayout(layout); + } +} \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainDockWindowViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainDockWindowViewModel.cs index 0eb36b6..bde6ca5 100644 --- a/PSCHelpdesk/PSCHelpdesk/ViewModels/MainDockWindowViewModel.cs +++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/MainDockWindowViewModel.cs @@ -1,26 +1,28 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Linq; using System.Reactive; -using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.DependencyInjection; -using NP.Ava.UniDock; -using NP.Ava.UniDockService; +using Dock.Model.Controls; +using Dock.Model.Core; using PSCHelpdesk.Events; using PSCHelpdesk.Services; using PSCHelpdesk.Shared.Menu; using PSCHelpdesk.Shared.Service; -using PSCHelpdesk.Shared.Tasks; using PSCHelpdesk.Shared.ViewModels; -using PSCHelpdesk.Tasks; -using PSCHelpdesk.Toasts.Display; using ReactiveUI; namespace PSCHelpdesk.ViewModels; public class MainDockWindowViewModel : ViewModelBase, IViewModelBase { + private readonly IFactory? _factory; + private IRootDock? _layout; + public IRootDock? Layout + { + get => _layout; + set => SetAndRaisePropertyChanged(ref _layout, value); + } private MenuService MenuService; @@ -70,46 +72,49 @@ public class MainDockWindowViewModel : ViewModelBase, IViewModelBase } }; + _factory = new DockFactory(); this.InitializeClient(); } private void InitializeClient() { + Layout = _factory?.CreateLayout(); + if (Layout is { }) + { + _factory?.InitLayout(Layout); + } + this.MenuService.CreateMenu(); } public void SelectMenu(string parameter) { - var obj = this.MenuService.MenuItems.FirstOrDefault(menuItem => menuItem.Header == parameter.ToString(), null); + var obj = MenuItems.FirstOrDefault(menuItem => menuItem.Header == parameter.ToString(), null); if (obj != null) { - this.openTab?.Invoke(this, new OpenEventArg() + var files = _factory?.GetDockable("Files"); + if (Layout is { } && files is { }) { - Sender = new DockItemViewModelBase() - { - DockId = obj.Header, - Header = obj.Header, - DefaultDockGroupId = "Tabs", - Content = obj.CommandParameter - } - - }); + _factory?.AddDockable(files, (IDocument)obj.CommandParameter); + _factory?.SetActiveDockable((IDocument)obj.CommandParameter); + _factory?.SetFocusedDockable(Layout, (IDocument)obj.CommandParameter); + } } } void openPlugins() { - this.openTab?.Invoke(this, new OpenEventArg() + var pluginM = new PluginListViewModel() { - Sender = new DockItemViewModelBase() - { - DockId = "plugins", - Header = "Plugins", - DefaultDockGroupId = "Tabs", - Content = new PluginListViewModel() - } - - }); + Title = "Plugins", + }; + var files = _factory?.GetDockable("Files"); + if (Layout is { } && files is { }) + { + _factory?.AddDockable(files, pluginM); + _factory?.SetActiveDockable(pluginM); + _factory?.SetFocusedDockable(Layout, pluginM); + } } void loadLayout() diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/PluginListViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/PluginListViewModel.cs index 3668465..092bf78 100644 --- a/PSCHelpdesk/PSCHelpdesk/ViewModels/PluginListViewModel.cs +++ b/PSCHelpdesk/PSCHelpdesk/ViewModels/PluginListViewModel.cs @@ -2,7 +2,6 @@ using Avalonia.Collections; using Avalonia.Controls; using CommunityToolkit.Mvvm.DependencyInjection; using CommunityToolkit.Mvvm.Input; -using NP.Ava.UniDockService; using PSCHelpdesk.Services; using PSCHelpdesk.Shared.ViewModels; @@ -18,6 +17,7 @@ public class PluginListViewModel : ViewModelBase, IViewModelBase public PluginListViewModel() { + Title = "Plugin List"; var pluginService = Ioc.Default.GetService(); this.Plugins = new AvaloniaList(); diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestTemplateViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/TestTemplateViewModel.cs deleted file mode 100644 index c143fb6..0000000 --- a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestTemplateViewModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -using PSCHelpdesk.Shared.ViewModels; - -namespace PSCHelpdesk.ViewModels; - -public class TestTemplateViewModel: ViewModelBase, IViewModelBase -{ - -} \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs b/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs deleted file mode 100644 index 7974de0..0000000 --- a/PSCHelpdesk/PSCHelpdesk/ViewModels/TestViewModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -using PSCHelpdesk.Shared.ViewModels; - -namespace PSCHelpdesk.ViewModels; - -public class TestViewModel: ViewModelBase, IViewModelBase -{ - -} \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml b/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml index 82ab6e2..713a03c 100644 --- a/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml +++ b/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml @@ -10,19 +10,10 @@ x:Class="PSCHelpdesk.Views.MainDockWindow" Icon="/Assets/avalonia-logo.ico" xmlns:np="https://np.com/visuals" - xmlns:uniDockService="clr-namespace:NP.Ava.UniDockService;assembly=NP.Ava.UniDockService" - np:DockAttachedProperties.TheDockManager="{DynamicResource TheDockManager}" x:DataType="vm:MainDockWindowViewModel" Title="PSCHelpdesk" x:Name="MainWindowView"> - - - - - - - @@ -46,17 +37,6 @@ - - - - - - - - + diff --git a/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml.cs index 3af7119..5598bf4 100644 --- a/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml.cs +++ b/PSCHelpdesk/PSCHelpdesk/Views/MainDockWindow.axaml.cs @@ -1,16 +1,11 @@ -using System; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using Avalonia; +using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; using CommunityToolkit.Mvvm.DependencyInjection; -using DynamicData; -using NP.Ava.UniDock; -using NP.Ava.UniDockService; -using NP.Utilities; +using Dock.Avalonia.Controls; +using Dock.Model; +using Dock.Model.Core; +using Dock.Serializer; using PSCHelpdesk.Shared.Service; using PSCHelpdesk.Shared.Setting; using PSCHelpdesk.ViewModels; @@ -19,60 +14,57 @@ namespace PSCHelpdesk.Views; public partial class MainDockWindow : Window { - private DockManager _dockManager; - public IUniDockService _uniDockService; + + private readonly IDockState _dockState; + private readonly IDockSerializer _serializer; + public MainDockWindow() { + _serializer = new DockSerializer(typeof(AvaloniaList<>)); this.DataContext = new MainDockWindowViewModel(); InitializeComponent(); - _dockManager = (DockManager) this.FindResource("TheDockManager")!; - _uniDockService = (IUniDockService)_dockManager!; - - _uniDockService.DockItemsViewModels = - new ObservableCollection(); + + _dockState = new DockState(); + if (Dock is { }) + { + var layout = Dock.Layout; + if (layout is { }) + { + _dockState.Save(layout); + } + } + (this.DataContext as MainDockWindowViewModel).openTab += (_, e) => { - _uniDockService.DockItemsViewModels.Add - ( - e.Sender as DockItemViewModelBase - ); + }; (this.DataContext as MainDockWindowViewModel).SaveHandler += (_, __) => { var settingsManager = (SettingsManager)Ioc.Default.GetService(); - _uniDockService.SaveToFile(Path.Combine(settingsManager.DataRoot, "DockSerialization.xml")); - - - foreach (var docItem in _uniDockService.DockItemsViewModels) + var dock = this.FindControl("Dock"); + if (dock?.Layout is { }) { - + settingsManager.SaveLayoutModels(_serializer.Serialize(dock.Layout)); } - - //_uniDockService.SaveViewModelsToFile(Path.Combine(settingsManager.DataRoot, "DockVMSerialization.xml")); }; (this.DataContext as MainDockWindowViewModel).LoadHandler += (_, __) => { var settingsManager = (SettingsManager)Ioc.Default.GetService(); - //_uniDockService.DockItemsViewModels = null; - - _dockManager.RestoreFromFile(Path.Combine(settingsManager.DataRoot, "DockSerialization.xml")); - var viewLocator = new ViewLocator(); - foreach (var docItem in _dockManager.ConnectedGroups.NullToEmpty().Where(e => e is DockItem)) + var dock = this.FindControl("Dock"); + if (dock is { }) { - Console.WriteLine(docItem); + var layout = _serializer.Deserialize(settingsManager.LoadLayoutModels()); + + if (layout is { }) + { + dock.Layout = layout; + _dockState.Restore(layout); + } } - _dockManager.DockItemsViewModels.Add(new DockItemViewModelBase() - { - DockId = "plugins", - Header = "Plugins", - DefaultDockGroupId = "Tabs", - Content = new PluginListViewModel() - }); - _dockManager.DockItemsViewModels?.OfType().FirstOrDefault()?.Select(); }; } diff --git a/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml b/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml deleted file mode 100644 index 4f62d85..0000000 --- a/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml +++ /dev/null @@ -1,10 +0,0 @@ - - Welcome to Avalonia! - diff --git a/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml.cs deleted file mode 100644 index 014ee2e..0000000 --- a/PSCHelpdesk/PSCHelpdesk/Views/TestListView.axaml.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; - -namespace PSCHelpdesk.Views; - -public partial class TestListView : UserControl -{ - public TestListView() - { - InitializeComponent(); - } -} \ No newline at end of file diff --git a/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml b/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml deleted file mode 100644 index 36091bf..0000000 --- a/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - diff --git a/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml.cs b/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml.cs deleted file mode 100644 index ba5ab37..0000000 --- a/PSCHelpdesk/PSCHelpdesk/Views/TestTemplateView.axaml.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Controls.Primitives; - -namespace PSCHelpdesk.Views; - -public class TestTemplateView : TemplatedControl -{ -} \ No newline at end of file diff --git a/Shared/Model/LayoutItem.cs b/Shared/Model/LayoutItem.cs new file mode 100644 index 0000000..6440e12 --- /dev/null +++ b/Shared/Model/LayoutItem.cs @@ -0,0 +1,11 @@ +using System; + +namespace PSCHelpdesk.Shared.Model; + +public class LayoutItem +{ + public string DockId { get; set; } + public string Header { get; set; } + public string DefaultDockGroupId { get; set; } + public string Content { get; set; } +} \ No newline at end of file diff --git a/Shared/Setting/SettingsManager.cs b/Shared/Setting/SettingsManager.cs index ebc3452..4bd3a16 100644 --- a/Shared/Setting/SettingsManager.cs +++ b/Shared/Setting/SettingsManager.cs @@ -1,4 +1,6 @@ +using Dock.Model.Core; using Newtonsoft.Json; +using PSCHelpdesk.Shared.Model; using PSCHelpdesk.Shared.Service; namespace PSCHelpdesk.Shared.Setting; @@ -86,4 +88,22 @@ public class SettingsManager: ISettingsManager serializer.Serialize(file, settingsObject); } } + + public void SaveLayoutModels(string data) + { + var settingsPath = Path.Combine(this.DataRoot, "layout_settings.json"); + + using (StreamWriter file = File.CreateText(settingsPath)) + { + file.Write(data); + } + } + + public string LoadLayoutModels() + { + var settingsPath = Path.Combine(this.DataRoot, "layout_settings.json"); + var layoutModels = File.ReadAllText(settingsPath); + + return layoutModels; + } } diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index 3d820e1..bcd6c86 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -27,7 +27,7 @@ - + diff --git a/Shared/ViewModels/ViewModelBase.cs b/Shared/ViewModels/ViewModelBase.cs index ae3445c..630db5f 100644 --- a/Shared/ViewModels/ViewModelBase.cs +++ b/Shared/ViewModels/ViewModelBase.cs @@ -1,12 +1,11 @@ using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; -using NP.Ava.UniDockService; -using NP.Utilities; +using Dock.Model.Mvvm.Controls; namespace PSCHelpdesk.Shared.ViewModels; -public class ViewModelBase : INotifyPropertyChanged +public class ViewModelBase : Document, INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; diff --git a/_dist/hetzner/HetznerServer.deps.json b/_dist/hetzner/HetznerServer.deps.json index d9eb5a1..a0d31b1 100644 --- a/_dist/hetzner/HetznerServer.deps.json +++ b/_dist/hetzner/HetznerServer.deps.json @@ -77,6 +77,14 @@ } }, "Avalonia.BuildServices/0.0.29": {}, + "Avalonia.Controls.Recycling.Model/11.2.0": { + "runtime": { + "lib/net8.0/Avalonia.Controls.Recycling.Model.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, "Avalonia.ReactiveUI/11.2.0": { "dependencies": { "Avalonia": "11.2.0", @@ -202,6 +210,29 @@ } } }, + "Dock.Model/11.2.0": { + "dependencies": { + "Avalonia.Controls.Recycling.Model": "11.2.0" + }, + "runtime": { + "lib/net8.0/Dock.Model.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, + "Dock.Model.Mvvm/11.2.0": { + "dependencies": { + "CommunityToolkit.Mvvm": "8.3.2", + "Dock.Model": "11.2.0" + }, + "runtime": { + "lib/net8.0/Dock.Model.Mvvm.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, "DynamicData/8.4.1": { "dependencies": { "System.Reactive": "6.0.1" @@ -279,25 +310,6 @@ } } }, - "NP.Ava.UniDockService/1.0.6": { - "dependencies": { - "NP.Utilities": "1.0.30" - }, - "runtime": { - "lib/net8.0/NP.Ava.UniDockService.dll": { - "assemblyVersion": "1.0.6.0", - "fileVersion": "1.0.6.0" - } - } - }, - "NP.Utilities/1.0.30": { - "runtime": { - "lib/net8.0/NP.Utilities.dll": { - "assemblyVersion": "1.0.30.0", - "fileVersion": "1.0.30.0" - } - } - }, "ReactiveUI/20.1.1": { "dependencies": { "DynamicData": "8.4.1", @@ -358,6 +370,13 @@ "path": "avalonia.buildservices/0.0.29", "hashPath": "avalonia.buildservices.0.0.29.nupkg.sha512" }, + "Avalonia.Controls.Recycling.Model/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QSvLVBhBWGZvmX4dZu5gNaTHfOkh+CtwT2fvM1WnroG2zKdpev00M3U+/x+o9wuWR+FDFodqfIsDHU/s3w6Q1A==", + "path": "avalonia.controls.recycling.model/11.2.0", + "hashPath": "avalonia.controls.recycling.model.11.2.0.nupkg.sha512" + }, "Avalonia.ReactiveUI/11.2.0": { "type": "package", "serviceable": true, @@ -435,6 +454,20 @@ "path": "communitytoolkit.mvvm/8.3.2", "hashPath": "communitytoolkit.mvvm.8.3.2.nupkg.sha512" }, + "Dock.Model/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vvgwgCr3IXq3LQQTXiaEeoWPkze31HJxTdEWw8cv84VECHIgH4TiPN1l3P+6u8fKT+4V8cgC1rD8Z4nHUQFkcA==", + "path": "dock.model/11.2.0", + "hashPath": "dock.model.11.2.0.nupkg.sha512" + }, + "Dock.Model.Mvvm/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-XbE5W4Dm+YcN5xfKW3V9NyHNiwev3WYlmWdskx5sO2oFMUuVizyWvwz6JyyqjXadI86tVxi+a9DlsyuPkHCNuA==", + "path": "dock.model.mvvm/11.2.0", + "hashPath": "dock.model.mvvm.11.2.0.nupkg.sha512" + }, "DynamicData/8.4.1": { "type": "package", "serviceable": true, @@ -491,20 +524,6 @@ "path": "newtonsoft.json/13.0.3", "hashPath": "newtonsoft.json.13.0.3.nupkg.sha512" }, - "NP.Ava.UniDockService/1.0.6": { - "type": "package", - "serviceable": true, - "sha512": "sha512-GHS67athB7fd/qvHJOEbYJUtJjKjjqf0sVcF1iB0CxqNrKgG5LPGzGyCdynYsy+gi7SqO29S+eqQK+3E9D7Mrw==", - "path": "np.ava.unidockservice/1.0.6", - "hashPath": "np.ava.unidockservice.1.0.6.nupkg.sha512" - }, - "NP.Utilities/1.0.30": { - "type": "package", - "serviceable": true, - "sha512": "sha512-yNvPMvlhuh8oYt9qYOoGC650uhe/lSleKI6RV7hEOyLWiah8NgPXwdj2GquR9ySCtWefjPkHYwTUDRwP0hw0ZQ==", - "path": "np.utilities/1.0.30", - "hashPath": "np.utilities.1.0.30.nupkg.sha512" - }, "ReactiveUI/20.1.1": { "type": "package", "serviceable": true, diff --git a/_dist/hetzner/HetznerServer.dll b/_dist/hetzner/HetznerServer.dll index 914aae57d3c42b722c538dcb116116559d8bd182..22965a461d5d0989022679c0e5e4af51ffc40cd4 100644 GIT binary patch literal 74752 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 LubcZnL4p4PfK$Is literal 72704 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 b{|7$Su^_2q!&1jM=KijZVFQuc-4gi!(!bim delta 5882 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 )-JI^0ZY|iLnAmI$$!aF>)vz{QR44KPWOytXD>9 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 LOJ$w1i#m6Z&4Q{frdaAFn_{-pCg7kel*`Q( zK0_6qQL;nEa|?XUdcN>xs!l84DTJFqCA6Y^yMcWwu>mbGQZ>=8C_0O{@oWC;bzmfO zsqcU5Hd`AMIU~{?PdL|I_)Bc>Y&6!VJu|HA>lqsal8z9U?YKgaj!_0gEJ56QStI!Y zBN@^}4Vi3uUS~AZxmH0Yim_Bu>nKU-yj6+szk)Fr+c7FOoW@zX4t9A?dACzqd5yF2 zGFSwUL@1)Qx|T%g(xo50snx*UtYM9x+Twbn_%1ZXfBi{xqj&;2)_aL9VnK&(8NGFr zz2fcwn|BjuY*#J*F)Dy+@rYW6`X`O$M_E*7lx+zVF=~`u#$1aeIH{qLLcw%x`$glB zLIfRv-{~_?Q)_p-x4MUpodR2FyOA+lekoggKMS?77>Nl!>^)Dhg}L|!3QP`I?HU?L z8rUaHXDmpu6@a>Er&TXD_KvXEi;ANd&rUoRiKPg(+G#&rZs8sz0dOpRyG51ItV_Re zRXYj}V{mMkXx)pN2CMl?#SackB)x@RM8dXQ+xBb5rF~*RZ!he~_9JQdz5Ut>JBz#F zO36-!3rEdPwigx|0{d7e7@KAJj7`ez|9p>m#OHE$co%zFxjUpOhfPUlEb;*pizyK? z>wh?Wfd8?lLbBKYMbMIz`u>-;>BfNnW%3tR!Th(Hb*%D#cU;G0A@f{toYJv+)&HAj z@w}(_ZSW#QTlNz~NAbHxxL5q%ph2uv0Wnt&v9>jUSgRjY0i|(mFV`5inoqACO4VG2 z?zII2npit43SF=Nmj4r1mN_G(-Rt^qF*~uBwSzq%zE3|eebmjl+GgeV>mtv*i@W$*+BK6wyQ=QDR_TXxwt{hUg#U$q`7FPGXlD;U8+4s; z{nx{;bF#U4Z(pAg1z0r}_f!fsdoINuk8v2kBspV@sGNJixt;6}KZP^y)^Nk_{sheb z%>TjL~E(gnc0+8AMU%x1>D=>#{Iv`vZ?#5*7lpk zpdR_S9=L!3+2vxC#h6`sAj)VSy#^uaLAsp;%Srwhe$;k7MA)F}77OGCYBZ-Mgkk<4 z5a|Du_x)#OeJ`ntbL)NE<^QAaqL@W_>M%nk9Ft1Ki>DiO%ofksv8lL(K?&%oa-bU} zpyx|KubBQs3vVB%an-BE-KOAm#l1a3)>zzU*R93yBPrJ5nKSyu1 z_(Zc;;~i#}v;G&KRb+K!85lD}{MyDA7oqBWF>78x z=cBI#=iQv2^M9+NjTvgUrWC}j0eAYp7eMP`-v36{0v1JoKy`y*`SglAWopjhm@9z4Hh&Ng}2}U diff --git a/_dist/nextcloud/CommunityToolkit.Mvvm.xml b/_dist/nextcloud/CommunityToolkit.Mvvm.xml deleted file mode 100755 index 63cfd9d..0000000 --- a/_dist/nextcloud/CommunityToolkit.Mvvm.xml +++ /dev/null @@ -1,4490 +0,0 @@ - - - - CommunityToolkit.Mvvm - - - - - A helper type for the type. - - - - - The cached for - - - - - An interface for a grouped collection of items. - - - - - Gets the key for the current collection. - - - - - Gets the number of items currently in the grouped collection. - - - - - Gets the element at the specified index in the current collection. - - The zero-based index of the element to get. - The element at the specified index in the read-only list. - Thrown if the index is out of range. - - - - An interface for a grouped collection of items. - - The type of the group key. - The type of elements in the group. - - - - Gets the element at the specified index in the current collection. - - The zero-based index of the element to get. - The element at the specified index in the read-only list. - Thrown if the index is out of range. - - - - An interface for a grouped collection of items. - - The type of the group key. - - - - Gets the key for the current collection. - - - - - The extensions methods to simplify the usage of . - - - - - Returns the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to query. - The first group matching . - Thrown if or are . - The target group does not exist. - - - - Returns the first group with key or if not found. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to query. - The first group matching or . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The added . - Thrown if or are . - - - - Adds a key-collection item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The added . - Thrown if or are . - - - - Adds a key-collection item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The collection to add. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The added . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The added . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The collection to add. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The instance to insert at the right position. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The instance to insert at the right position. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The instance to insert at the right position. - The collection to add. - The added . - Thrown if , , or are . - - - - Add into the first group with key. - If the group does not exist, it will be added. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where the should be added. - The item to add. - The instance of the which will receive the value. It will either be an existing group or a new group. - Thrown if or are . - - - - Insert into the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where to insert . - The item to add. - The instance of the which will receive the value. - Thrown if or are . - - - - Insert into the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where to insert . - The instance to compare keys. - The item to add. - The instance to compare elements. - The instance of the which will receive the value. - Thrown if , , or are . - - - - Remove the first occurrence of the group with from the grouped collection. - It will not do anything if the group does not exist. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to remove. - Thrown if or are . - - - - Remove the first from the first group with from the grouped collection. - It will not do anything if the group or the item does not exist. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where the should be removed. - The item to remove. - If true (default value), the group will be removed once it becomes empty. - Thrown if or are . - - - - An observable list of observable groups. - - The type of the group keys. - The type of elements in the collection. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The initial data to add in the grouped collection. - Thrown if is . - - - - - - - Tries to get the underlying instance, if present. - - The resulting , if one was in use. - Whether or not a instance has been found. - - - - - - - - - - An observable group. - It associates a to an . - - The type of the group key. - The type of elements in the group. - - - - Initializes a new instance of the class. - - The key for the group. - Thrown if is . - - - - Initializes a new instance of the class. - - The grouping to fill the group. - Thrown if is . - - - - Initializes a new instance of the class. - - The key for the group. - The initial collection of data to add to the group. - Thrown if or are . - - - - Gets or sets the key of the group. - - Thrown if is . - - - - Tries to get the underlying instance, if present. - - The resulting , if one was in use. - Whether or not a instance has been found. - - - - - - - - - - A read-only list of groups. - - The type of the group keys. - The type of elements in the collection. - - - - Initializes a new instance of the class. - - The source collection to wrap. - Thrown if is . - - - - Initializes a new instance of the class. - - The source collection to wrap. - Thrown if is . - - - - - - - - - - - - - Forwards the event whenever it is raised by the wrapped collection. - - The wrapped collection (an of instance). - The arguments. - Thrown if a range operation is requested. - - - - Returns the first group with key or if not found. - - The key of the group to query (assumed not to be ). - The first group matching . - - - - A read-only observable group. It associates a to a . - - The type of the group key. - The type of elements in the group. - - - - Initializes a new instance of the class. - - The key of the group. - The collection of items to add in the group. - Thrown if or are . - - - - Initializes a new instance of the class. - - The to wrap. - Thrown if is . - - - - - - - - - - - - - An attribute that indicates that a given type should implement the interface and - have minimal built-in functionality to support it. This includes exposing the necessary event and having two methods - to raise it that mirror and - . For more extensive support, use . - - This attribute can be used as follows: - - [INotifyPropertyChanged] - partial class MyViewModel : SomeOtherClass - { - // Other members here... - } - - - - - - - Gets or sets a value indicating whether or not to also generate all the additional helper methods that are found - in as well (eg. . - If set to , only the event and - the two overloads will be generated. - The default value is . - - - - - An attribute that can be used to support properties in generated properties. When this attribute is - used, the generated property setter will also call for the properties specified - in the attribute data, causing the validation logic for the command to be executed again. This can be useful to keep the code compact - when there are one or more dependent commands that should also be notified when a property is updated. If this attribute is used in - a field without , it is ignored (just like ). - - In order to use this attribute, the target property has to implement the interface. - - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - [NotifyCanExecuteChangedFor(nameof(GreetUserCommand))] - private string name; - - public IRelayCommand GreetUserCommand { get; } - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set - { - if (SetProperty(ref name, value)) - { - GreetUserCommand.NotifyCanExecuteChanged(); - } - } - } - } - - - - - - Initializes a new instance of the class. - - The name of the command to also notify when the annotated property changes. - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - The other command names to also notify when the annotated property changes. This parameter can optionally - be used to indicate a series of dependent commands from the same attribute, to keep the code more compact. - - - - - Gets the command names to also notify when the annotated property changes. - - - - - An attribute that can be used to support in generated properties, when applied to - fields contained in a type that is inheriting from and using any validation attributes. - When this attribute is used, the generated property setter will also call . - This allows generated properties to opt-in into validation behavior without having to fallback into a full explicit observable property. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableValidator - { - [ObservableProperty] - [NotifyDataErrorInfo] - [Required] - [MinLength(2)] - private string username; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - [Required] - [MinLength(2)] - public string Username - { - get => username; - set => SetProperty(ref username, value, validate: true); - } - } - - - - - - An attribute that can be used to support in generated properties. When this attribute is - used, the generated property setter will also call (or the equivalent - method in the target class) for the properties specified in the attribute data. This can be useful to keep the code compact when - there are one or more dependent properties that should also be reported as updated when the value of the annotated observable - property is changed. If this attribute is used in a field without , it is ignored. - - In order to use this attribute, the containing type has to implement the interface - and expose a method with the same signature as . If the containing - type also implements the interface and exposes a method with the same signature as - , then this method will be invoked as well by the property setter. - - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FullName))] - private string name; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FullName))] - private string surname; - - public string FullName => $"{Name} {Surname}"; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set - { - if (!EqualityComparer<string>.Default.Equals(name, value)) - { - OnPropertyChanging(nameof(Name)); - OnPropertyChanged(nameof(FullName)); - - name = value; - - OnPropertyChanged(nameof(Name)); - OnPropertyChanged(nameof(FullName)); - } - } - } - - public string Surname - { - get => surname; - set - { - if (!EqualityComparer<string>.Default.Equals(name, value)) - { - OnPropertyChanging(nameof(Surname)); - OnPropertyChanged(nameof(FullName)); - - surname = value; - - OnPropertyChanged(nameof(Surname)); - OnPropertyChanged(nameof(FullName)); - } - } - } - } - - - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - The other property names to also notify when the annotated property changes. This parameter can optionally - be used to indicate a series of dependent properties from the same attribute, to keep the code more compact. - - - - - Gets the property names to also notify when the annotated property changes. - - - - - An attribute that can be used to support in generated properties, when applied to fields - contained in a type that is either inheriting from , or annotated with . - When this attribute is used, the generated property setter will also call . - This allows generated properties to opt-in into broadcasting behavior without having to fallback into a full explicit observable property. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableRecipient - { - [ObservableProperty] - [NotifyPropertyChangedRecipients] - private string username; - } - - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Username - { - get => username; - set => SetProperty(ref username, value, broadcast: true); - } - } - - - - This attribute can also be added to a class, and if so it will affect all generated properties in that type and inherited types. - - - - - - An attribute that indicates that a given type should have all the members from - generated into it, as well as the and - interfaces. This can be useful when you want the same functionality from into a class - that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger - the source generator to just create the same APIs directly into the decorated class. - - This attribute can be used as follows: - - [ObservableObject] - partial class MyViewModel : SomeOtherClass - { - // Other members here... - } - - - And with this, the same APIs from will be available on this type as well. - - - - - An attribute that indicates that a given field should be wrapped by a generated observable property. - In order to use this attribute, the containing type has to inherit from , or it - must be using or . - If the containing type also implements the (that is, if it either inherits from - or is using ), then the generated code will - also invoke to signal that event. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - private string name; - - [ObservableProperty] - private bool isEnabled; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set => SetProperty(ref name, value); - } - - public bool IsEnabled - { - get => isEnabled; - set => SetProperty(ref isEnabled, value); - } - } - - - - The generated properties will automatically use the UpperCamelCase format for their names, - which will be derived from the field names. The generator can also recognize fields using either - the _lowerCamel or m_lowerCamel naming scheme. Otherwise, the first character in the - source field name will be converted to uppercase (eg. isEnabled to IsEnabled). - - - - - An attribute that indicates that a given type should have all the members from - generated into it. This can be useful when you want the same functionality from into - a class that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger - the source generator to just create the same APIs directly into the decorated class. For instance, this attribute can be - used to easily combine the functionality from both and , - by using as the base class and adding this attribute to the declared type. - - This attribute can be used as follows: - - [ObservableRecipient] - partial class MyViewModel : ObservableValidator - { - // Other members here... - } - - - And with this, the same APIs from will be available on this type as well. - - To avoid conflicts with other APIs in types where the new members are being generated, constructors are only generated when the annotated - type doesn't have any explicit constructors being declared. If that is the case, the same constructors from - are emitted, with the accessibility adapted to that of the annotated type. Otherwise, they are skipped, so the type being annotated has the - responsibility of properly initializing the property. Additionally, if the annotated type inherits - from , the overloads will be skipped - as well, as they would conflict with the methods. - - - - In order to work, needs to be applied to a type that inherits from - (either directly or indirectly), or to one decorated with . - This is because the methods rely on some of the inherited members to work. - If this condition is not met, the code will fail to build. - - - - - A base class for objects of which the properties must be observable. - - - - - - - - - - - Raises the event. - - The input instance. - Thrown if is . - - - - Raises the event. - - The input instance. - Thrown if is . - - - - Raises the event. - - (optional) The name of the property that changed. - - - - Raises the event. - - (optional) The name of the property that changed. - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - This overload is much less efficient than and it - should only be used when the former is not viable (eg. when the target property being - updated does not directly expose a backing field that can be passed by reference). - For performance reasons, it is recommended to use a stateful callback if possible through - the whenever possible - instead of this overload, as that will allow the C# compiler to cache the input callback and - reduce the memory allocations. More info on that overload are available in the related XML - docs. This overload is here for completeness and in cases where that is not applicable. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. This type is useful when creating wrapping, bindable objects that operate over - models that lack support for notification (eg. for CRUD operations). - Suppose we have this model (eg. for a database row in a table): - - public class Person - { - public string Name { get; set; } - } - - We can then use a property to wrap instances of this type into our observable model (which supports - notifications), injecting the notification to the properties of that model, like so: - - public class BindablePerson : ObservableObject - { - public Model { get; } - - public BindablePerson(Person model) - { - Model = model; - } - - public string Name - { - get => Model.Name; - set => Set(Model.Name, value, Model, (model, name) => model.Name = name); - } - } - - This way we can then use the wrapping object in our application, and all those "proxy" properties will - also raise notifications when changed. Note that this method is not meant to be a replacement for - , and it should only be used when relaying properties to a model that - doesn't support notifications, and only if you can't implement notifications to that model directly (eg. by having - it inherit from ). The syntax relies on passing the target model and a stateless callback - to allow the C# compiler to cache the function, which results in much better performance and no memory usage. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model containing the property being updated. - The callback to invoke to set the target property value, if a change has occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not - raised if the current and new value for the target property are the same. - - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. See additional notes about this overload in . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model containing the property being updated. - The callback to invoke to set the target property value, if a change has occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - The behavior mirrors that of , with the difference being that - this method will also monitor the new value of the property (a generic ) and will also - raise the again for the target property when it completes. - This can be used to update bindings observing that or any of its properties. - This method and its overload specifically rely on the type, which needs - to be used in the backing field for the target property. The field doesn't need to be - initialized, as this method will take care of doing that automatically. The - type also includes an implicit operator, so it can be assigned to any instance directly. - Here is a sample property declaration using this method: - - private TaskNotifier myTask; - - public Task MyTask - { - get => myTask; - private set => SetAndNotifyOnCompletion(ref myTask, value); - } - - - The field notifier to modify. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised if the current - and new value for the target property are the same. The return value being only - indicates that the new value being assigned to is different than the previous one, - and it does not mean the new instance passed as argument is in any particular state. - - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - This method is just like , - with the difference being an extra parameter with a callback being invoked - either immediately, if the new task has already completed or is , or upon completion. - - The field notifier to modify. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - The behavior mirrors that of , with the difference being that - this method will also monitor the new value of the property (a generic ) and will also - raise the again for the target property when it completes. - This can be used to update bindings observing that or any of its properties. - This method and its overload specifically rely on the type, which needs - to be used in the backing field for the target property. The field doesn't need to be - initialized, as this method will take care of doing that automatically. The - type also includes an implicit operator, so it can be assigned to any instance directly. - Here is a sample property declaration using this method: - - private TaskNotifier<int> myTask; - - public Task<int> MyTask - { - get => myTask; - private set => SetAndNotifyOnCompletion(ref myTask, value); - } - - - The type of result for the to set and monitor. - The field notifier to modify. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised if the current - and new value for the target property are the same. The return value being only - indicates that the new value being assigned to is different than the previous one, - and it does not mean the new instance passed as argument is in any particular state. - - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - This method is just like , - with the difference being an extra parameter with a callback being invoked - either immediately, if the new task has already completed or is , or upon completion. - - The type of result for the to set and monitor. - The field notifier to modify. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Implements the notification logic for the related methods. - - The type of to set and monitor. - The field notifier. - The property's value after the change occurred. - (optional) A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - - - An interface for task notifiers of a specified type. - - The type of value to store. - - - - Gets or sets the wrapped value. - - - - - A wrapping class that can hold a value. - - - - - Initializes a new instance of the class. - - - - - - - - Unwraps the value stored in the current instance. - - The input instance. - - - - A wrapping class that can hold a value. - - The type of value for the wrapped instance. - - - - Initializes a new instance of the class. - - - - - - - - Unwraps the value stored in the current instance. - - The input instance. - - - - A base class for observable objects that also acts as recipients for messages. This class is an extension of - which also provides built-in support to use the type. - - - - - Initializes a new instance of the class. - - - This constructor will produce an instance that will use the instance - to perform requested operations. It will also be available locally through the property. - - - - - Initializes a new instance of the class. - - The instance to use to send messages. - Thrown if is . - - - - Gets the instance in use. - - - - - Gets or sets a value indicating whether the current view model is currently active. - - - - - Invoked whenever the property is set to . - Use this method to register to messages and do other initialization for this instance. - - - The base implementation registers all messages for this recipients that have been declared - explicitly through the interface, using the default channel. - For more details on how this works, see the method. - If you need more fine tuned control, want to register messages individually or just prefer - the lambda-style syntax for message registration, override this method and register manually. - - - - - Invoked whenever the property is set to . - Use this method to unregister from messages and do general cleanup for this instance. - - - The base implementation unregisters all messages for this recipient. It does so by - invoking , which removes all registered - handlers for a given subscriber, regardless of what token was used to register them. - That is, all registered handlers across all subscription channels will be removed. - - - - - Broadcasts a with the specified - parameters, without using any particular token (so using the default channel). - - The type of the property that changed. - The value of the property before it changed. - The value of the property after it changed. - The name of the property that changed. - - You should override this method if you wish to customize the channel being - used to send the message (eg. if you need to use a specific token for the channel). - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. Similarly to - the method, this overload should only be - used when can't be used directly. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , with the difference being that this - method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - A base class for objects implementing the interface. This class - also inherits from , so it can be used for observable items too. - - - - - The instance used to track compiled delegates to validate entities. - - - - - The instance used to track display names for properties to validate. - - - This is necessary because we want to reuse the same instance for all validations, but - with the same behavior with respect to formatted names that new instances would have provided. The issue is that the - property is not refreshed when we set , - so we need to replicate the same logic to retrieve the right display name for properties to validate and update that - property manually right before passing the context to and proceed with the normal functionality. - - - - - The cached for . - - - - - The instance currently in use. - - - - - The instance used to store previous validation results. - - - - - Indicates the total number of properties with errors (not total errors). - This is used to allow to operate in O(1) time, as it can just - check whether this value is not 0 instead of having to traverse . - - - - - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance - and no additional services or validation properties and settings. - - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance. - - A set of key/value pairs to make available to consumers. - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance. - - An instance to make available during validation. - A set of key/value pairs to make available to consumers. - - - - Initializes a new instance of the class. - This constructor will store the input instance, - and it will use it to validate all properties for the current viewmodel. - - - The instance to use to validate properties. - - This instance will be passed to all - calls executed by the current viewmodel, and its property will be updated every time - before the call is made to set the name of the property being validated. The property name will not be reset after that, so the - value of will always indicate the name of the last property that was validated, if any. - - - Thrown if is . - - - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. If that is set to , the new value will be - validated and will be raised if needed. Following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. Similarly to - the method, this overload should only be - used when can't be used directly. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if or are . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , with the difference being that this - method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if is . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , , or are . - - - - Clears the validation errors for a specified property or for the entire entity. - - - The name of the property to clear validation errors for. - If a or empty name is used, all entity-level errors will be cleared. - - - - - - - - - - - Validates all the properties in the current instance and updates all the tracked errors. - If any changes are detected, the event will be raised. - - - Only public instance properties (excluding custom indexers) that have at least one - applied to them will be validated. All other - members in the current instance will be ignored. None of the processed properties - will be modified - they will only be used to retrieve their values and validate them. - - - - - Validates a property with a specified name and a given input value. - If any changes are detected, the event will be raised. - - The value to test for the specified property. - The name of the property to validate. - Thrown when is . - - - - Tries to validate a property with a specified name and a given input value, and returns - the computed errors, if any. If the property is valid, it is assumed that its value is - about to be set in the current object. Otherwise, no observable local state is modified. - - The value to test for the specified property. - The name of the property to validate. - The resulting validation errors, if any. - - - - Clears all the current errors for the entire entity. - - - - - Clears all the current errors for a target property. - - The name of the property to clear errors for. - - - - Gets the display name for a given property. It could be a custom name or just the property name. - - The target property name being validated. - The display name for the property. - - - - An internal helper to support the source generator APIs related to . - This type is not intended to be used directly by user code. - - - - - Invokes externally on a target instance. - - The target instance. - The value to test for the specified property. - The name of the property to validate. - - - - An internal helper used to support and generated code from its template. - This type is not intended to be used directly by user code. - - - - - Gets an awaitable object that skips end validation. - - The input to get the awaitable for. - A object wrapping . - - - - A custom task awaitable object that skips end validation. - - - - - The wrapped instance to create an awaiter for. - - - - - Creates a new instance with the specified parameters. - - The wrapped instance to create an awaiter for. - - - - Gets an instance for the current underlying task. - - An instance for the current underlying task. - - - - An awaiter object for . - - - - - The underlying instance. - - - - - Creates a new instance with the specified parameters. - - The wrapped instance to create an awaiter for. - - - - Gets whether the operation has completed or not. - - This property is intended for compiler user rather than use directly in code. - - - - Ends the await operation. - - This method is intended for compiler user rather than use directly in code. - - - - - - - - - - A type that facilitates the use of the type. - The provides the ability to configure services in a singleton, thread-safe - service provider instance, which can then be used to resolve service instances. - The first step to use this feature is to declare some services, for instance: - - public interface ILogger - { - void Log(string text); - } - - - public class ConsoleLogger : ILogger - { - void Log(string text) => Console.WriteLine(text); - } - - Then the services configuration should then be done at startup, by calling the - method and passing an instance with the services to use. That instance can - be from any library offering dependency injection functionality, such as Microsoft.Extensions.DependencyInjection. - For instance, using that library, can be used as follows in this example: - - Ioc.Default.ConfigureServices( - new ServiceCollection() - .AddSingleton<ILogger, Logger>() - .BuildServiceProvider()); - - Finally, you can use the instance (which implements ) - to retrieve the service instances from anywhere in your application, by doing as follows: - - Ioc.Default.GetService<ILogger>().Log("Hello world!"); - - - - - - Gets the default instance. - - - - - The instance to use, if initialized. - - - - - - - - Tries to resolve an instance of a specified service type. - - The type of service to resolve. - An instance of the specified service, or . - Thrown if the current instance has not been initialized. - - - - Resolves an instance of a specified service type. - - The type of service to resolve. - An instance of the specified service, or . - - Thrown if the current instance has not been initialized, or if the - requested service type was not registered in the service provider currently in use. - - - - - Initializes the shared instance. - - The input instance to use. - Thrown if is . - - - - Throws an when the property is used before initialization. - - - - - Throws an when the property is missing a type registration. - - - - - Throws an when a configuration is attempted more than once. - - - - - A command that mirrors the functionality of , with the addition of - accepting a returning a as the execute - action, and providing an property that notifies changes when - is invoked and when the returned completes. - - - - - The cached for . - - - - - The cached for . - - - - - The cached for . - - - - - The cached for . - - - - - The to invoke when is used. - - - - - The cancelable to invoke when is used. - - Only one between this and is not . - - - - The optional action to invoke when is used. - - - - - The options being set for the current command. - - - - - The instance to use to cancel . - - This is only used when is not . - - - - - - - - - - Initializes a new instance of the class. - - The execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The options to use to configure the async command. - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The options to use to configure the async command. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - Thrown if or are . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - The options to use to configure the async command. - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - The options to use to configure the async command. - Thrown if or are . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Awaits an input and throws an exception on the calling context, if the task fails. - - The input instance to await. - - - - Options to customize the behavior of and instances. - - - - - No option is specified. The and types will use their default behavior: - - Concurrent execution is disallowed: a command is disabled if there is a pending asynchronous execution running. - - - Exceptions are thrown on the calling context: calling will await the - returned for the operation, and propagate the exception on the calling context. - - This behavior is consistent with synchronous commands, where exceptions in behave the same. - - - - - - - Concurrent executions are allowed. This option makes it so that the same command can be invoked concurrently multiple times. - - Note that additional considerations should be taken into account in this case: - - If the command supports cancellation, previous invocations will automatically be canceled if a new one is started. - The property will always represent the operation that was started last. - - - - - - - Exceptions are not thrown on the calling context, and are propagated to instead. - - This affects how calls to behave. When this option is used, if an operation fails, that exception will not - be rethrown on the calling context (as it is not awaited there). Instead, it will flow to . - - - This option enables more advanced scenarios, where the property can be used to inspect the state of an operation - that was queued. That is, even if the operation failed or was canceled, the details of that can be retrieved at a later time by accessing this property. - - - - - - A generic command that provides a more specific version of . - - The type of parameter being passed as input to the callbacks. - - - - The to invoke when is used. - - - - - The cancelable to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - The options being set for the current command. - - - - - The instance to use to cancel . - - - - - - - - - - - Initializes a new instance of the class. - - The execution logic. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The options to use to configure the async command. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The options to use to configure the async command. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - The options to use to configure the async command. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - The options to use to configure the async command. - See notes in . - Thrown if or are . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - An attribute that can be used to automatically generate properties from declared methods. When this attribute - is used to decorate a method, a generator will create a command property with the corresponding interface - depending on the signature of the method. If an invalid method signature is used, the generator will report an error. - - In order to use this attribute, the containing type doesn't need to implement any interfaces. The generated properties will be lazily - assigned but their value will never change, so there is no need to support property change notifications or other additional functionality. - - - This attribute can be used as follows: - - partial class MyViewModel - { - [RelayCommand] - private void GreetUser(User? user) - { - Console.WriteLine($"Hello {user.Name}!"); - } - } - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - private RelayCommand? greetUserCommand; - - public IRelayCommand GreetUserCommand => greetUserCommand ??= new RelayCommand(GreetUser); - } - - - - The following signatures are supported for annotated methods: - - void Method(); - - Will generate an property (using a instance). - - void Method(T?); - - Will generate an property (using a instance). - - Task Method(); - Task Method(CancellationToken); - Task<T> Method(); - Task<T> Method(CancellationToken); - - Will both generate an property (using an instance). - - Task Method(T?); - Task Method(T?, CancellationToken); - Task<T> Method(T?); - Task<T> Method(T?, CancellationToken); - - Will both generate an property (using an instance). - - - - - - Gets or sets the name of the property or method that will be invoked to check whether the - generated command can be executed at any given time. The referenced member needs to return - a value, and has to have a signature compatible with the target command. - - - - - Gets or sets a value indicating whether or not to allow concurrent executions for an asynchronous command. - - When set for an attribute used on a method that would result in an or an - property to be generated, this will modify the behavior of these commands - when an execution is invoked while a previous one is still running. It is the same as creating an instance of - these command types with a constructor such as - and using the value. - - - Using this property is not valid if the target command doesn't map to an asynchronous command. - - - - Gets or sets a value indicating whether or not to exceptions should be propagated to . - - When set for an attribute used on a method that would result in an or an - property to be generated, this will modify the behavior of these commands - in case an exception is thrown by the underlying operation. It is the same as creating an instance of - these command types with a constructor such as - and using the value. - - - Using this property is not valid if the target command doesn't map to an asynchronous command. - - - - Gets or sets a value indicating whether a cancel command should also be generated for an asynchronous command. - - When set to , this additional code will be generated: - - partial class MyViewModel - { - private ICommand? loginUserCancelCommand; - - public ICommand LoginUserCancelCommand => loginUserCancelCommand ??= LoginUserCommand.CreateCancelCommand(); - } - - Where LoginUserCommand is an defined in the class (or generated by this attribute as well). - - - Using this property is not valid if the target command doesn't map to a cancellable asynchronous command. - - - - Extensions for the type. - - - - - Creates an instance that can be used to cancel execution on the input command. - The returned command will also notify when it can be executed based on the state of the wrapped command. - - The input instance to create a cancellation command for. - An instance that can be used to monitor and signal cancellation for . - The returned instance is not guaranteed to be unique across multiple invocations with the same arguments. - Thrown if is . - - - - An interface expanding to support asynchronous operations. - - - - - Gets the last scheduled , if available. - This property notifies a change when the completes. - - - - - Gets a value indicating whether a running operation for this command can currently be canceled. - - - The exact sequence of events that types implementing this interface should raise is as follows: - - - The command is initially not running: , - and are . - - - The command starts running: and switch to - . is set to . - - - If the operation is canceled: switches to - and switches to . - - - The operation completes: and switch - to . The state of is undefined. - - - This only applies if the underlying logic for the command actually supports cancelation. If that is - not the case, then and will always remain - regardless of the current state of the command. - - - - - Gets a value indicating whether a cancelation request has been issued for the current operation. - - - - - Gets a value indicating whether the command currently has a pending operation being executed. - - - - - Provides a more specific version of , - also returning the representing the async operation being executed. - - The input parameter. - The representing the async operation being executed. - Thrown if is incompatible with the underlying command implementation. - - - - Communicates a request for cancelation. - - - If the underlying command is not running, or if it does not support cancelation, this method will perform no action. - Note that even with a successful cancelation, the completion of the current operation might not be immediate. - - - - - A generic interface representing a more specific version of . - - The type used as argument for the interface methods. - This interface is needed to solve the diamond problem with base classes. - - - - Provides a strongly-typed variant of . - - The input parameter. - The representing the async operation being executed. - - - - An interface expanding with the ability to raise - the event externally. - - - - - Notifies that the property has changed. - - - - - A generic interface representing a more specific version of . - - The type used as argument for the interface methods. - - - - Provides a strongly-typed variant of . - - The input parameter. - Whether or not the current command can be executed. - Use this overload to avoid boxing, if is a value type. - - - - Provides a strongly-typed variant of . - - The input parameter. - Use this overload to avoid boxing, if is a value type. - - - - A implementation wrapping to support cancellation. - - - - - The wrapped instance. - - - - - Creates a new instance. - - The instance to wrap. - - - - - - - - - - - - - - - - A reusable instance that is always disabled. - - - - - - - - Gets a shared, reusable instance. - - - This instance can safely be used across multiple objects without having - to worry about this static keeping others alive, as the event uses a - custom accessor that just discards items (as the event is known to never - be raised). As such, this instance will never act as root for other objects. - - - - - - - - - - - An interface for commands that know whether they support cancellation or not. - - - - - Gets whether or not the current command supports cancellation. - - - - - A command whose sole purpose is to relay its functionality to other - objects by invoking delegates. The default return value for the - method is . This type does not allow you to accept command parameters - in the and callback methods. - - - - - The to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - - - - Initializes a new instance of the class that can always execute. - - The execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - Thrown if or are . - - - - - - - - - - - - - A generic command whose sole purpose is to relay its functionality to other - objects by invoking delegates. The default return value for the CanExecute - method is . This class allows you to accept command parameters - in the and callback methods. - - The type of parameter being passed as input to the callbacks. - - - - The to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - - - - Initializes a new instance of the class that can always execute. - - The execution logic. - - Due to the fact that the interface exposes methods that accept a - nullable parameter, it is recommended that if is a reference type, - you should always declare it as nullable, and to always perform checks within . - - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - - - - - - - - - - - - - - - - Tries to get a command argument of compatible type from an input . - - The input parameter. - The resulting value, if any. - Whether or not a compatible command argument could be retrieved. - - - - Throws an if an invalid command argument is used. - - The input parameter. - Thrown with an error message to give info on the invalid parameter. - - - - An interface for a type providing the ability to exchange messages between different objects. - This can be useful to decouple different modules of an application without having to keep strong - references to types being referenced. It is also possible to send messages to specific channels, uniquely - identified by a token, and to have different messengers in different sections of an applications. - In order to use the functionalities, first define a message type, like so: - - public sealed class LoginCompletedMessage { } - - Then, register your a recipient for this message: - - Messenger.Default.Register<MyRecipientType, LoginCompletedMessage>(this, (r, m) => - { - // Handle the message here... - }); - - The message handler here is a lambda expression taking two parameters: the recipient and the message. - This is done to avoid the allocations for the closures that would've been generated if the expression - had captured the current instance. The recipient type parameter is used so that the recipient can be - directly accessed within the handler without the need to manually perform type casts. This allows the - code to be less verbose and more reliable, as all the checks are done just at build time. If the handler - is defined within the same type as the recipient, it is also possible to directly access private members. - This allows the message handler to be a static method, which enables the C# compiler to perform a number - of additional memory optimizations (such as caching the delegate, avoiding unnecessary memory allocations). - Finally, send a message when needed, like so: - - Messenger.Default.Send<LoginCompletedMessage>(); - - Additionally, the method group syntax can also be used to specify the message handler - to invoke when receiving a message, if a method with the right signature is available - in the current scope. This is helpful to keep the registration and handling logic separate. - Following up from the previous example, consider a class having this method: - - private static void Receive(MyRecipientType recipient, LoginCompletedMessage message) - { - // Handle the message there - } - - The registration can then be performed in a single line like so: - - Messenger.Default.Register(this, Receive); - - The C# compiler will automatically convert that expression to a instance - compatible with . - This will also work if multiple overloads of that method are available, each handling a different - message type: the C# compiler will automatically pick the right one for the current message type. - It is also possible to register message handlers explicitly using the interface. - To do so, the recipient just needs to implement the interface and then call the - extension, which will automatically register - all the handlers that are declared by the recipient type. Registration for individual handlers is supported as well. - - - - - Checks whether or not a given recipient has already been registered for a message. - - The type of message to check for the given recipient. - The type of token to check the channel for. - The target recipient to check the registration for. - The token used to identify the target channel to check. - Whether or not has already been registered for the specified message. - Thrown if or are . - - - - Registers a recipient for a given type of message. - - The type of recipient for the message. - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The to invoke when a message is received. - Thrown if , or are . - Thrown when trying to register the same message twice. - - - - Unregisters a recipient from all registered messages. - - The recipient to unregister. - - This method will unregister the target recipient across all channels. - Use this method as an easy way to lose all references to a target recipient. - If the recipient has no registered handler, this method does nothing. - - Thrown if is . - - - - Unregisters a recipient from all messages on a specific channel. - - The type of token to identify what channel to unregister from. - The recipient to unregister. - The token to use to identify which handlers to unregister. - If the recipient has no registered handler, this method does nothing. - Thrown if or are . - - - - Unregisters a recipient from messages of a given type. - - The type of message to stop receiving. - The type of token to identify what channel to unregister from. - The recipient to unregister. - The token to use to identify which handlers to unregister. - If the recipient has no registered handler, this method does nothing. - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The type of token to identify what channel to use to send the message. - The message to send. - The token indicating what channel to use. - The message that was sent (ie. ). - Thrown if or are . - - - - Performs a cleanup on the current messenger. - Invoking this method does not unregister any of the currently registered - recipient, and it can be used to perform cleanup operations such as - trimming the internal data structures of a messenger implementation. - - - - - Resets the instance and unregisters all the existing recipients. - - - - - Extensions for the type. - - - - - - A class that acts as a container to load the instance linked to - the method. - This class is needed to avoid forcing the initialization code in the static constructor to run as soon as - the type is referenced, even if that is done just to use methods - that do not actually require this instance to be available. - We're effectively using this type to leverage the lazy loading of static constructors done by the runtime. - - - - - The instance associated with . - - - - - A non-generic version of . - - - - - The instance used to track the preloaded registration action for each recipient. - - - - - A class that acts as a static container to associate a instance to each - type in use. This is done because we can only use a single type as key, but we need to track - associations of each recipient type also across different communication channels, each identified by a token. - Since the token is actually a compile-time parameter, we can use a wrapping class to let the runtime handle a different - instance for each generic type instantiation. This lets us only worry about the recipient type being inspected. - - The token indicating what channel to use. - - - - The instance used to track the preloaded registration action for each recipient. - - - - - Checks whether or not a given recipient has already been registered for a message. - - The type of message to check for the given recipient. - The instance to use to check the registration. - The target recipient to check the registration for. - Whether or not has already been registered for the specified message. - This method will use the default channel to check for the requested registration. - Thrown if or are . - - - - Registers all declared message handlers for a given recipient, using the default channel. - - The instance to use to register the recipient. - The recipient that will receive the messages. - See notes for for more info. - Thrown if or are . - - - - Registers all declared message handlers for a given recipient. - - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - The recipient that will receive the messages. - The token indicating what channel to use. - - This method will register all messages corresponding to the interfaces - being implemented by . If none are present, this method will do nothing. - Note that unlike all other extensions, this method will use reflection to find the handlers to register. - Once the registration is complete though, the performance will be exactly the same as with handlers - registered directly through any of the other generic extensions for the interface. - - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - The recipient that will receive the messages. - The token indicating what channel to use. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of recipient for the message. - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - Thrown if , or are . - - - - Unregisters a recipient from messages of a given type. - - The type of message to stop receiving. - The instance to use to unregister the recipient. - The recipient to unregister. - - This method will unregister the target recipient only from the default channel. - If the recipient has no registered handler, this method does nothing. - - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The instance to use to send the message. - The message that has been sent. - - This method is a shorthand for when the - message type exposes a parameterless constructor: it will automatically create - a new instance and send that to its recipients. - - Thrown if is . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The instance to use to send the message. - The message to send. - The message that was sent (ie. ). - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The type of token to identify what channel to use to send the message. - The instance to use to send the message. - The token indicating what channel to use. - The message that has been sen. - - This method will automatically create a new instance - just like , and then send it to the right recipients. - - Thrown if or are . - - - - Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. - - The type of message to use to receive notification for through the resulting instance. - The instance to use to register the recipient. - An instance to receive notifications for messages being broadcast. - Thrown if is . - - - - Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. - - The type of message to use to receive notification for through the resulting instance. - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - A token used to determine the receiving channel to use. - An instance to receive notifications for messages being broadcast. - Thrown if or are . - - - - An implementations for a given message type. - - The type of messages to listen to. - - - - The instance to use to register the recipient. - - - - - Creates a new instance with the given parameters. - - The instance to use to register the recipient. - - - - - - - An implementation for . - - - - - The instance to use to register the recipient. - - - - - The target instance currently in use. - - - - - Creates a new instance with the specified parameters. - - The instance to use to register the recipient. - The instance to use to create the recipient for. - - - - - - - - - - An implementations for a given pair of message and token types. - - The type of messages to listen to. - The type of token to identify what channel to use to receive messages. - - - - The instance to use to register the recipient. - - - - - The token used to determine the receiving channel to use. - - - - - Creates a new instance with the given parameters. - - The instance to use to register the recipient. - A token used to determine the receiving channel to use. - - - - - - - An implementation for . - - - - - The instance to use to register the recipient. - - - - - The target instance currently in use. - - - - - The token used to determine the receiving channel to use. - - - - - Creates a new instance with the specified parameters. - - The instance to use to register the recipient. - The instance to use to create the recipient for. - A token used to determine the receiving channel to use. - - - - - - - - - - A simple buffer writer implementation using pooled arrays. - - The type of items to store in the list. - - This type is a to avoid the object allocation and to - enable the pattern-based support. We aren't worried with consumers not - using this type correctly since it's private and only accessible within the parent type. - - - - - The default buffer size to use to expand empty arrays. - - - - - The underlying array. - - - - - The span mapping to . - - All writes are done through this to avoid covariance checks. - - - - The starting offset within . - - - - - Creates a new instance of the struct. - - A new instance. - - - - Gets a with the current items. - - - - - Adds a new item to the current collection. - - The item to add. - - - - Resets the underlying array and the stored items. - - - - - Resizes when there is no space left for new items, then adds one - - The item to add. - - - - - - - A dispatcher type that invokes a given callback. - - - This type is used to avoid type aliasing with when the generic - arguments are not known. Additionally, this is an abstract class and not an interface so that when - is called, virtual dispatch will be used instead of interface - stub dispatch, which is much slower and with more indirections. - - - - - Invokes the current callback on a target recipient, with a specified message. - - The target recipient for the message. - The message being broadcast. - - - - A generic version of . - - The type of recipient for the message. - The type of message to receive. - - - - The underlying callback to invoke. - - - - - Initializes a new instance of the class. - - The input instance. - - - - - - - A simple type representing an immutable pair of types. - - - This type replaces a simple as it's faster in its - and methods, and because - unlike a value tuple it exposes its fields as immutable. Additionally, the - and fields provide additional clarity reading - the code compared to and . - - - - - The type of registered message. - - - - - The type of registration token. - - - - - Initializes a new instance of the struct. - - The type of registered message. - The type of registration token. - - - - - - - - - - - - - An empty type representing a generic token with no specific value. - - - - - - - - - - - - - - An interface for a recipient that declares a registration for a specific message type. - - The type of message to receive. - - - - Receives a given message instance. - - The message being received. - - - - A used to represent actions to invoke when a message is received. - The recipient is given as an input argument to allow message registrations to avoid creating - closures: if an instance method on a recipient needs to be invoked it is possible to just - cast the recipient to the right type and then access the local method from that instance. - - The type of recipient for the message. - The type of message to receive. - The recipient that is receiving the message. - The message being received. - - - - A for request messages that can receive multiple replies, which can either be used directly or through derived classes. - - The type of request to make. - - - - The collection of received replies. We accept both instance, representing already running - operations that can be executed in parallel, or instances, which can be used so that multiple - asynchronous operations are only started sequentially from and do not overlap in time. - - - - - The instance used to link the token passed to - and the one passed to all subscribers to the message. - - - - - Gets the instance that will be linked to the - one used to asynchronously enumerate the received responses. This can be used to cancel asynchronous - replies that are still being processed, if no new items are needed from this request message. - Consider the following example, where we define a message to retrieve the currently opened documents: - - public class OpenDocumentsRequestMessage : AsyncCollectionRequestMessage<XmlDocument> { } - - We can then request and enumerate the results like so: - - await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>()) - { - // Process each document here... - } - - If we also want to control the cancellation of the token passed to each subscriber to the message, - we can do so by passing a token we control to the returned message before starting the enumeration - (). - The previous snippet with this additional change looks as follows: - - await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>().WithCancellation(cts.Token)) - { - // Process each document here... - } - - When no more new items are needed (or for any other reason depending on the situation), the token - passed to the enumerator can be canceled (by calling ), - and that will also notify the remaining tasks in the request message. The token exposed by the message - itself will automatically be linked and canceled with the one passed to the enumerator. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - - - - Gets the collection of received response items. - - A value to stop the operation. - The collection of received response items. - - - - - - - A for async request messages, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message response. - - Thrown when is . - - - - Gets a value indicating whether a response has already been assigned to this instance. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if has already been set. - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - Thrown if has already been set. - - - - - - - Throws an when a response is not available. - - - - - Throws an when or are called twice. - - - - - A for request messages that can receive multiple replies, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message responses. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - - - - - - - - - - A message used to broadcast property changes in observable objects. - - The type of the property to broadcast the change for. - - - - Initializes a new instance of the class. - - The original sender of the broadcast message. - The name of the property that changed. - The value that the property had before the change. - The value that the property has after the change. - Thrown if is . - - - - Gets the original sender of the broadcast message. - - - - - Gets the name of the property that changed. - - - - - Gets the value that the property had before the change. - - - - - Gets the value that the property has after the change. - - - - - A for request messages, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message response. - - Thrown when is . - - - - Gets a value indicating whether a response has already been assigned to this instance. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if has already been set. - - - - Implicitly gets the response from a given instance. - - The input instance. - Thrown if is . - Thrown when is . - - - - Throws an when a response is not available. - - - - - Throws an when is called twice. - - - - - A base message that signals whenever a specific value has changed. - - The type of value that has changed. - - - - Initializes a new instance of the class. - - The value that has changed. - - - - Gets the value that has changed. - - - - - A class providing a reference implementation for the interface. - - - This implementation uses strong references to track the registered - recipients, so it is necessary to manually unregister them when they're no longer needed. - - - - - The collection of currently registered recipients, with a link to their linked message receivers. - - - This collection is used to allow reflection-free access to all the existing - registered recipients from and other methods in this type, - so that all the existing handlers can be removed without having to dynamically create - the generic types for the containers of the various dictionaries mapping the handlers. - - - - - The and instance for types combination. - - - The values are just of type as we don't know the type parameters in advance. - Each method relies on to get the type-safe instance of the - or class for each pair of generic arguments in use. - - - - - Gets the default instance. - - - - - - - - - - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The input instance to register, or null. - Thrown when trying to register the same message twice. - - - - - - - - - - - - - - - - - - - - - - Tries to get the instance of currently - registered recipients for the input type. - - The type of message to send. - The resulting instance, if found. - Whether or not the required instance was found. - - - - Tries to get the instance of currently registered recipients - for the combination of types and . - - The type of message to send. - The type of token to identify what channel to use to send the message. - The resulting instance, if found. - Whether or not the required instance was found. - - - - Gets the instance of currently - registered recipients for the input type. - - The type of message to send. - A instance with the requested type arguments. - - - - Gets the instance of currently registered recipients - for the combination of types and . - - The type of message to send. - The type of token to identify what channel to use to send the message. - A instance with the requested type arguments. - - - - A mapping type representing a link to recipients and their view of handlers per communication channel. - - - This type is a specialization of for tokens. - - - - - Initializes a new instance of the class. - - The message type being used. - - - - Creates a new instance of the class. - - The type of message to receive. - A new instance. - - - - - - - A mapping type representing a link to recipients and their view of handlers per communication channel. - - The type of token to use to pick the messages to receive. - - This type is defined for simplicity and as a workaround for the lack of support for using type aliases - over open generic types in C# (using type aliases can only be used for concrete, closed types). - - - - - Initializes a new instance of the class. - - The message type being used. - - - - Creates a new instance of the class. - - The type of message to receive. - A new instance. - - - - - - - An interface for the and types which allows to retrieve - the type arguments from a given generic instance without having any prior knowledge about those arguments. - - - - - Gets the instance representing the current type arguments. - - - - - A simple type representing a recipient. - - - This type is used to enable fast indexing in each mapping dictionary, - since it acts as an external override for the and - methods for arbitrary objects, removing both - the virtual call and preventing instances overriding those methods in this context. - Using this type guarantees that all the equality operations are always only done - based on reference equality for each registered recipient, regardless of its type. - - - - - The registered recipient. - - - - - Initializes a new instance of the struct. - - The target recipient instance. - - - - - - - - - - - - - Throws an when trying to add a duplicate handler. - - - - - A class providing a reference implementation for the interface. - - - - This implementation uses weak references to track the registered - recipients, so it is not necessary to manually unregister them when they're no longer needed. - - - The type will automatically perform internal trimming when - full GC collections are invoked, so calling manually is not necessary to - ensure that on average the internal data structures are as trimmed and compact as possible. - - - - - - The map of currently registered recipients for all message types. - - - - - Initializes a new instance of the class. - - - - - Gets the default instance. - - - - - - - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - Thrown when trying to register the same message twice. - - This method is a variation of - that is specialized for recipients implementing . See more comments at the top of this type, as well as - within and in the types. - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The input instance to register, or null. - Thrown when trying to register the same message twice. - - - - - - - - - - - - - - - - Implements the broadcasting logic for . - - - - - - - This method is not a local function to avoid triggering multiple compilations due to TToken - potentially being a value type, which results in specialized code due to reified generics. This is - necessary to work around a Roslyn limitation that causes unnecessary type parameters in local - functions not to be discarded in the synthesized methods. Additionally, keeping this loop outside - of the EH block (the block) can help result in slightly better codegen. - - - - - - - - - - - Executes a cleanup without locking the current instance. This method has to be - invoked when a lock on has already been acquired. - - - - - Executes a cleanup without locking the current instance. This method has to be - invoked when a lock on has already been acquired. - - - - - Throws an when trying to add a duplicate handler. - - - - - A container for all shared configuration switches for the MVVM Toolkit. - - - - This type uses a very specific setup for configuration switches to ensure ILLink can work the best. - This mirrors the architecture of feature switches in the runtime as well, and it's needed so that - no static constructor is generated for the type. - - - For more info, see . - - - - - - The configuration property name for . - - - - - The backing field for . - - - - - Gets a value indicating whether or not support for should be enabled (defaults to ). - - - - - Gets a configuration value for a specified property. - - The property name to retrieve the value for. - The cached result for the target configuration value. - The default value for the feature switch, if not set. - The value of the specified configuration setting. - - - - Internal polyfill for . - - - - - Throws an if is . - - The reference type argument to validate as non-. - The name of the parameter with which corresponds. - - - - A specialized version for generic values. - - The type of values to check. - - This type is needed because if there had been a generic overload with a generic parameter, all calls - would have just been bound by that by the compiler instead of the overload. - - - - - Throws an if is . - - The reference type argument to validate as non-. - The name of the parameter with which corresponds. - - - - Throws an . - - The name of the parameter that failed validation. - - - - A specialized implementation to be used with messenger types. - - The type of keys in the dictionary. - The type of values in the dictionary. - - - - The index indicating the start of a free linked list. - - - - - The array of 1-based indices for the items stored in . - - - - - The array of currently stored key-value pairs (ie. the lists for each hash group). - - - - - A coefficient used to speed up retrieving the target bucket when doing lookups. - - - - - The current number of items stored in the map. - - - - - The 1-based index for the start of the free list within . - - - - - The total number of empty items. - - - - - Initializes a new instance of the class. - - - - - - - - - - - - - - Checks whether or not the dictionary contains a pair with a specified key. - - The key to look for. - Whether or not the key was present in the dictionary. - - - - Gets the value if present for the specified key. - - The key to look for. - The value found, otherwise . - Whether or not the key was present. - - - - - - - Gets the value for the specified key, or, if the key is not present, - adds an entry and returns the value by ref. This makes it possible to - add or update a value in a single look up operation. - - Key to look for. - Reference to the new or existing value. - - - - - - - Enumerator for . - - - - - The entries being enumerated. - - - - - The current enumeration index. - - - - - The current dictionary count. - - - - - Creates a new instance. - - The input dictionary to enumerate. - - - - - - - Gets the current key. - - - - - Gets the current value. - - - - - Gets the value for the specified key, or. - - Key to look for. - Reference to the existing value. - - - - Initializes the current instance. - - The target capacity. - - - - - Resizes the current dictionary to reduce the number of collisions - - - - - Gets a reference to a target bucket from an input hashcode. - - The input hashcode. - A reference to the target bucket. - - - - A type representing a map entry, ie. a node in a given list. - - - - - The cached hashcode for ; - - - - - 0-based index of next entry in chain: -1 means end of chain - also encodes whether this entry this.itself_ is part of the free list by changing sign and subtracting 3, - so -2 means end of free list, -3 means index 0 but on free list, -4 means index 1 but on free list, etc. - - - - - The key for the value in the current node. - - - - - The value in the current node, if present. - - - - - Throws an when trying to load an element with a missing key. - - - - - A helper class for . - - - - - Maximum prime smaller than the maximum array length. - - - - - An arbitrary prime factor used in . - - - - - Table of prime numbers to use as hash table sizes. - - - - - Checks whether a value is a prime. - - The value to check. - Whether or not is a prime. - - - - Gets the smallest prime bigger than a specified value. - - The target minimum value. - The new prime that was found. - - - - Returns size of hashtable to grow to. - - The previous table size. - The expanded table size. - - - - Returns approximate reciprocal of the divisor: ceil(2**64 / divisor). - - This should only be used on 64-bit. - - - - Performs a mod operation using the multiplier pre-computed with . - - This should only be used on 64-bit. - - - - A base interface masking instances and exposing non-generic functionalities. - - - - - Gets the count of entries in the dictionary. - - - - - Clears the current dictionary. - - - - - An interface providing key type contravariant and value type covariant access - to a instance. - - The contravariant type of keys in the dictionary. - The covariant type of values in the dictionary. - - - - Gets the value with the specified key. - - The key to look for. - The returned value. - Thrown if the key wasn't present. - - - - An interface providing key type contravariant access to a instance. - - The contravariant type of keys in the dictionary. - - - - Tries to remove a value with a specified key, if present. - - The key of the value to remove. - Whether or not the key was present. - - - - Schedules a callback roughly every gen 2 GC (you may see a Gen 0 an Gen 1 but only once). - Ported from https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Gen2GcCallback.cs. - - - - - The callback to invoke at each GC. - - - - - A weak to the target object to pass to . - - - - - Initializes a new instance of the class. - - The callback to invoke at each GC. - The target object to pass as argument to . - - - - Schedules a callback to be called on each GC until the target is collected. - - The callback to invoke at each GC. - The target object to pass as argument to . - - - - Finalizes an instance of the class. - This finalizer is re-registered with as long as - the target object is alive, which means it will be executed again every time a generation 2 - collection is triggered (as the instance itself would be moved to - that generation after surviving the generation 0 and 1 collections the first time). - - - - - A custom instance that is specifically optimized to be used - by . In particular, it offers zero-allocation enumeration of stored items. - - Tke key of items to store in the table. - The values to store in the table. - - - - Initial length of the table. Must be a power of two. - - - - - This lock protects all mutation of data in the table. Readers do not take this lock. - - - - - The actual storage for the table; swapped out as the table grows. - - - - - Initializes a new instance of the class. - - - - - - - - Tries to add a new pair to the table. - - The key to add. - The value to associate with key. - - - - - - - - - - Implements the functionality for under a lock. - - The input key. - The callback to use to create a new item. - The new item to store. - - - - - - - Provides an enumerator for the current instance. - - - - - Parent table, set to null when disposed. - - - - - Last index in the container that should be enumerated. - - - - - The current index into the container. - - - - - The current key, if available. - - - - - The current value, if available. - - - - - Initializes a new instance of the class. - - The input instance being enumerated. - - - - - - - - - - Gets the current key. - - - - - Gets the current value. - - - - - Worker for adding a new key/value pair. Will resize the container if it is full. - - The key for the new entry. - The value for the new entry. - - - - A single entry within a instance. - - - - - Holds key and value using a weak reference for the key and a strong reference for the - value that is traversed only if the key is reachable without going through the value. - - - - - Cached copy of key's hashcode. - - - - - Index of next entry, -1 if last. - - - - - Container holds the actual data for the table. A given instance of Container always has the same capacity. When we need - more capacity, we create a new Container, copy the old one into the new one, and discard the old one. This helps enable - lock-free reads from the table, as readers never need to deal with motion of entries due to rehashing. - - - - - The with which this container is associated. - - - - - buckets[hashcode & (buckets.Length - 1)] contains index of the first entry in bucket (-1 if empty). - - - - - The table entries containing the stored dependency handles - - - - - firstFreeEntry < entries.Length => table has capacity, entries grow from the bottom of the table. - - - - - Flag detects if OOM or other background exception threw us out of the lock. - - - - - Set to true when initially finalized - - - - - Used to ensure the next allocated container isn't finalized until this one is GC'd. - - - - - Initializes a new instance of the class. - - The input object associated with the current instance. - - - - Initializes a new instance of the class. - - The input object associated with the current instance. - The array of buckets. - The array of entries. - The index of the first free entry. - - - - Gets the capacity of the current container. - - - - - Gets the index of the first free entry. - - - - - Worker for adding a new key/value pair. Container must NOT be full. - - - - - Worker for finding a key/value pair. Must hold lock. - - - - - Returns -1 if not found (if key expires during FindEntry, this can be treated as "not found."). - Must hold lock, or be prepared to retry the search while holding lock. - - This method requires to be on the stack to be properly tracked. - - - - Gets the entry at the specified entry index. - - - - - Removes the specified key from the table, if it exists. - - - - - Removes a given entry at a specified index. - - The index of the entry to remove. - - - - Resize, and scrub expired keys off bucket lists. Must hold . - - - is less than entries.Length on exit, that is, the table has at least one free entry. - - - - - Creates a new of a specified size with the current items. - - The new requested size. - The new instance with the requested size. - - - - Verifies that the current instance is valid. - - Thrown if the current instance is invalid. - - - - Finalizes the current instance. - - - - diff --git a/_dist/nextcloud/Nextcloud.deps.json b/_dist/nextcloud/Nextcloud.deps.json index e3eb6c8..575dce6 100644 --- a/_dist/nextcloud/Nextcloud.deps.json +++ b/_dist/nextcloud/Nextcloud.deps.json @@ -15,8 +15,7 @@ "Markdown.Avalonia": "11.0.2", "Newtonsoft.Json": "13.0.3", "RestSharp": "112.1.0", - "Shared": "1.0.0", - "CommunityToolkit.Mvvm": "8.3.0.0" + "Shared": "1.0.0" }, "runtime": { "Nextcloud.dll": {} @@ -88,6 +87,14 @@ } }, "Avalonia.BuildServices/0.0.29": {}, + "Avalonia.Controls.Recycling.Model/11.2.0": { + "runtime": { + "lib/net8.0/Avalonia.Controls.Recycling.Model.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, "Avalonia.ReactiveUI/11.2.0": { "dependencies": { "Avalonia": "11.2.0", @@ -228,6 +235,37 @@ } } }, + "CommunityToolkit.Mvvm/8.0.0": { + "runtime": { + "lib/net6.0/CommunityToolkit.Mvvm.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.0.1" + } + } + }, + "Dock.Model/11.2.0": { + "dependencies": { + "Avalonia.Controls.Recycling.Model": "11.2.0" + }, + "runtime": { + "lib/net8.0/Dock.Model.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, + "Dock.Model.Mvvm/11.2.0": { + "dependencies": { + "CommunityToolkit.Mvvm": "8.0.0", + "Dock.Model": "11.2.0" + }, + "runtime": { + "lib/net8.0/Dock.Model.Mvvm.dll": { + "assemblyVersion": "11.2.0.0", + "fileVersion": "11.2.0.0" + } + } + }, "DynamicData/8.4.1": { "dependencies": { "System.Reactive": "6.0.1" @@ -347,25 +385,6 @@ } } }, - "NP.Ava.UniDockService/1.0.6": { - "dependencies": { - "NP.Utilities": "1.0.30" - }, - "runtime": { - "lib/net8.0/NP.Ava.UniDockService.dll": { - "assemblyVersion": "1.0.6.0", - "fileVersion": "1.0.6.0" - } - } - }, - "NP.Utilities/1.0.30": { - "runtime": { - "lib/net8.0/NP.Utilities.dll": { - "assemblyVersion": "1.0.30.0", - "fileVersion": "1.0.30.0" - } - } - }, "ReactiveUI/20.1.1": { "dependencies": { "DynamicData": "8.4.1", @@ -531,15 +550,7 @@ "System.Runtime": "4.3.0" } }, - "System.ValueTuple/4.5.0": {}, - "CommunityToolkit.Mvvm/8.3.0.0": { - "runtime": { - "CommunityToolkit.Mvvm.dll": { - "assemblyVersion": "8.3.0.0", - "fileVersion": "8.3.2.1" - } - } - } + "System.ValueTuple/4.5.0": {} } }, "libraries": { @@ -569,6 +580,13 @@ "path": "avalonia.buildservices/0.0.29", "hashPath": "avalonia.buildservices.0.0.29.nupkg.sha512" }, + "Avalonia.Controls.Recycling.Model/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QSvLVBhBWGZvmX4dZu5gNaTHfOkh+CtwT2fvM1WnroG2zKdpev00M3U+/x+o9wuWR+FDFodqfIsDHU/s3w6Q1A==", + "path": "avalonia.controls.recycling.model/11.2.0", + "hashPath": "avalonia.controls.recycling.model.11.2.0.nupkg.sha512" + }, "Avalonia.ReactiveUI/11.2.0": { "type": "package", "serviceable": true, @@ -653,6 +671,27 @@ "path": "colortextblock.avalonia/11.0.2", "hashPath": "colortextblock.avalonia.11.0.2.nupkg.sha512" }, + "CommunityToolkit.Mvvm/8.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Jiu2g5WUdXRwzhJkHB+B4JBKP5A5+fp8xKiW/ZQo5PI+DruI7MbPEcK9K/Aw0YzTiWRuG6CBluzYIWN5Eo7BkQ==", + "path": "communitytoolkit.mvvm/8.0.0", + "hashPath": "communitytoolkit.mvvm.8.0.0.nupkg.sha512" + }, + "Dock.Model/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vvgwgCr3IXq3LQQTXiaEeoWPkze31HJxTdEWw8cv84VECHIgH4TiPN1l3P+6u8fKT+4V8cgC1rD8Z4nHUQFkcA==", + "path": "dock.model/11.2.0", + "hashPath": "dock.model.11.2.0.nupkg.sha512" + }, + "Dock.Model.Mvvm/11.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-XbE5W4Dm+YcN5xfKW3V9NyHNiwev3WYlmWdskx5sO2oFMUuVizyWvwz6JyyqjXadI86tVxi+a9DlsyuPkHCNuA==", + "path": "dock.model.mvvm/11.2.0", + "hashPath": "dock.model.mvvm.11.2.0.nupkg.sha512" + }, "DynamicData/8.4.1": { "type": "package", "serviceable": true, @@ -744,20 +783,6 @@ "path": "newtonsoft.json/13.0.3", "hashPath": "newtonsoft.json.13.0.3.nupkg.sha512" }, - "NP.Ava.UniDockService/1.0.6": { - "type": "package", - "serviceable": true, - "sha512": "sha512-GHS67athB7fd/qvHJOEbYJUtJjKjjqf0sVcF1iB0CxqNrKgG5LPGzGyCdynYsy+gi7SqO29S+eqQK+3E9D7Mrw==", - "path": "np.ava.unidockservice/1.0.6", - "hashPath": "np.ava.unidockservice.1.0.6.nupkg.sha512" - }, - "NP.Utilities/1.0.30": { - "type": "package", - "serviceable": true, - "sha512": "sha512-yNvPMvlhuh8oYt9qYOoGC650uhe/lSleKI6RV7hEOyLWiah8NgPXwdj2GquR9ySCtWefjPkHYwTUDRwP0hw0ZQ==", - "path": "np.utilities/1.0.30", - "hashPath": "np.utilities.1.0.30.nupkg.sha512" - }, "ReactiveUI/20.1.1": { "type": "package", "serviceable": true, @@ -918,11 +943,6 @@ "sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==", "path": "system.valuetuple/4.5.0", "hashPath": "system.valuetuple.4.5.0.nupkg.sha512" - }, - "CommunityToolkit.Mvvm/8.3.0.0": { - "type": "reference", - "serviceable": false, - "sha512": "" } } } \ No newline at end of file diff --git a/_dist/nextcloud/Nextcloud.dll b/_dist/nextcloud/Nextcloud.dll index 3ba7c3ea5316f84eb5bb9c6b3f994fa199c1edfe..a608a670a44ab1fed6eabcabdecb440ade71466b 100644 GIT binary patch delta 9988 zcmb_id0-S((y#Zrr>CbUnaRv#CNq<3CPN_MOhO`rOTx7T2!g19f=dWdkt3J{6hfRN z90~#w8(dIO!l6c3gbf~mD11g2R9qq;a;$<86=W4e5mr~fsyB@!uHS#(VE?*)RrRXg ztM~f#5vyL{RWI=6kIH4Qe^6JuB!N9sTR+;Cw;AA0z~5eg8B%S~6?GaQ3i)j>;-Tj) z?Wm7s?bt@WnuUW^=uE%CcyKU*TmUd)JOC3~lpBJ)B(_79L3!F!02;cM1~GWrS|Yrx zAApk976IjF^p`wstk0q$Z5={+h5m^rk<~T)>@hRj2Go>nM6fzp+9uuM?e3U|xwt!3 ztHky)YM;~Z^ghI%(GPoj^nM;aE3;6~D+rUd`_o>a2=xdM(eYoDu9&!t5|-fjuIo!S z>qC5gwnZ=YwP#x!mistMdI`-|bMA*U7GBWkA3)M)RerU-ya`juj)(U6WD8def(m!OV3W2&vxrO6EfKz z{p*BO9EKy&>wE*#-<^||b z@)p{uLyh{f!~*t?ekw7A{aybx(aZMh-lRV4fId1Yi@mEaPAcv59{RS&vAHrhjKp&s zfP+`OkJ=?ZfcRWm11)%aUU3j@xoJXuQ16l4-Ti?G;mTlOMlJn##UcHX26JWysJIt+<46HppIb9wBb57GX-s*W|6_y3ol`#f>e&3Dnf?w2j18eysl~ zWj#BppHFGSzSZraq3pbVS15yB(3gbT5B+TlMX$<G7}cEJxHZR9A*TNK-y)!Pn&ibKcGh{FS$Y|spLmI zVY$pOLBhh}DC5hnqDoUrAIFU$Ic;fu!^$?7`RHq?R7!KA@CsgvI}j_0C~#g|D|-K4 z(H|9YqDiW!G#^Q6C)zxxVei(LT+=^ocmMy@qj^S;68@`4v(ql~qW|w6l}36b#`$!l z)A~O;c-S@liw<`;4DR?b?=wFcAoMW6MLbu9P##rYI(hoNWmsI8(I4OtuEo&pqoD5y z0K6jY$g~8YqdeP6awe-{jTc8)b^3LA7IUP=gN*`DI&MaLUzA8ysZ~k^)}!uk@UPS3}|_~G5?tQ0@w21qkiBh5oz(#)_> z%H@bz@O=DdssaUJG0J{+Dpy+zjZ$ZXSDjR@;n-_G?66askoyy}0^OP7S70Jm!UI>$ z^Ib_`Pu%G8Lvo54OFB6|JKh7gFv1nlgyT`8z*gHrhX;}a^IaZrAtu2Q2es#4MPlHF%xS(L{wU^DOt@2~#}9 zF-|yOCQS+!Rsol4jrYScZ#70(qgLCTFh>;pN<3+j;s_^ss>5h7Id1p)!LE@iSK!mw zzz;k?;bv+dVzQKYl0R?~p0yFyV;S$p#EY>uU*Kdp;geX>OL5EnDRAC&ERY2=W9P;8>aVN18pNh$SUtE@T0$=l3aZNb! z8o}%6jFp^rYZRye8!Ipy*FhEx#soH~L0N(C#pU;By!sVbhXs6rCkUA={eaB>6zeuJwH1~T7l>4Y@Z`F z=3f7CmWVe8hMSrv=3aesb~?MLAI)wTNVm4}r}93~L)bR?+W1Y-5Bduh@009$LXNlR z>+!WQCb$Lv(eJ3GC9CtcWbd}}938CHOLE$UuX=EMgmJiK(l+?6i&_-H6v6Hg?TcU< zdH@{3O_yvD_L5-5P>P;E#(s;q)pr>(VSMtB;D9OSpRj1Bd|z-Zn*BWDA*~q8`)=%g zh^Ks0B?hnHD+CKePmU)z0cB`t>2xeM7n^+ z4oIZ$BIFSQM@wWq0WLYxAqICk;uQw#Rl+Vxyb^@4Zt9LC=qo@}thXaJDr0f!pYrA5 z9@H5%t-BS`kd-<#5HX(TBc6ca=pQfQ1buVOL2$dPP=5t$qrk)R0+g4#7o$(hK|UIm zXq1mi<8d{f@=@aJ=E;VJ!Siq#%iEJv7f--+l|iQIUBrw4jboyT@Fjt73!E)*AmWW^ zcUf?2#0jD-bFnK=14Zl1!{rtRNBL~TANa$FK8f%IJcbR{CFNk}iUPS<{3=(m#^7Fo zPsUHy6u8Yk4K+DxIm*u`(lCaG$g{VY?+VMSDAxtZ=V6K39>EpRTJzVyv@jap2$JEw zWNLiLGuX=DOxyyi2STout>h5_T!pv+ZcztdJ?=BudzR_QP8;k(!WYPT2g!4xH#&}N zgIlpRf>pz8yMr+Zd+8Ygs^Na55=;`sGS_0B|AVzAG(uwsV?4fcb!2-%Vd!`XgE zi2-j8b*37keA98983qek7by;yVX!5TYIeeGWSGAim&hU|wpH=nFkiUNgM6Gr_wQ_L zge@|M?p71yhW$5D`bgD0Fs_?mzHNNwtA`_DxHe9{%l`uwvdRqncwo31V z!QCln#M9Tx(+3~tiiGOT@%Sjqiw&z`r7tLAvk5QrD1tGgy5n6IV63hYFuBVXAH`p6-|AXw}Kx#LL{Uh!$vV=jzA{Sl=G6Y*L zw(bxN7VLVI`wT`=!Xdbt-!e=a{9bk=On1SqhoJ|#W3l-003STQJ@cedULeGFewQKPrJIn<$5vlgxXTfbGGd2?pCnEPNd9@Fr6 z0FO%i%rcYv@qsNK-;I-CEl(=4%r^TEj~JKGZey|fo+Hf9sBT&yV&t@7{3$FR6hlaX!d}>JZQ!Qv*A&n znXQIS!Du!co<_MIt%G4Z6l)>29m0V$wi7iuY@cX#0P$JYB;;y=35Xqef_Oejh&-P# zFRtALT+k1~ap4oTu+vB!>}N+WenzO;z#Mrf&t%bYBY7^fILD%XrFR0)V{>GDjAbzx z;y8?Q-ouZ>Ptnu(InnAIJP<17W3d%&h4hFsmOTr z#CRvSE;;x$X|>b~ay(lk+>=dvr0rlb?L)aw@-dWuaGpXOjET>Qr->k^2oP3)|IZmV; zCz7S}Bgu>92l$uLa(NPT#q^o{&)PaUlNURlmo2cxHURHO6uFug%Uk6|JUWb{ujUPb z9rA2+dPAOy^*AW6#xzIebY5rPBh~X6uCsDE>O1msF_-0HF3ZI%?i3x`$^Ye8#dh+Y z<{Z;bei2K(&(OOq55gs0nbONtE+%C)EcOmEStP1~PkPD{9)`ppH`3|5@#5VIvlxf|RM`o1I)0Uc=gtbt_nG15tW_SSQwWi64 zn@n>>Et_~!{1(%3;dzEI3{AYVv%yp?)urslKGNLRiV&-%4z{s;wRGBa#$;iIp|4Dr zU|PyW#J{C{Wx9sfh^Ev_UcB3E7yjF&gL0~}59QuUlSFsq`C_3RN6iMloh4bGRF;U< zb_Sob>lKImfmCb`2jv{kbhA&Uh2xX^;4;aSsW`cEns22!Q{HV~gIH+afEW%;hdjAh zd&!)KavIB%SJ`)&3%Mg@jhZem2$aGKu_o4tHIXONGF&58hDFX#8Lu9fqSRDuOG`3O zrX`slmfuVHNX-{1H{z9jMcpW_?2WL>ZnBI;{Xt71;z`SDL|lgQ{0EUOt;}9V&NQt5rMBzzLKyRj^M_5LA%DA@$Tv~X;{Vw*l64*K8I${9jIv&+#_9p zH}Uc-}NE#r7kSjz(V&|d&;U^jSKJLsTZiRui8%|BQ> z!%6cmh|T6UVN`u>?u2;RJO%M5^BhD;U4Up+pFnh}q>mREQs0Rhh~ZB22_kfnfutz{ z7k`{h63L2%&pe@7AmloMn*{C?_?EDS-xlOF9EP6kG@OLTS+g*l6?#Cn2|vnwje3bu z0-4chOo*p>P+*ABC__T-FXaA0E)xFLLY^n&b?h))T+Q+KO{b)JydiB@$&vq5O~@-U5W zFQ@VC6Na~hp;3f8BLX!G4UGz* zWYRFXIV=xQ`U)~Y-i@QIMm){y1TquJ0n=glNC}vzXhEUrYof+^LY^SxLLr|)^y23k zs$5^?Fzhw=RjAbjlwIlsL#DQM3Ps+Fo?#rfAZG*y%%ZVbBrucH1R)m+x!O$Qt3#|% z_X_0PiTHwdR(;VjOq;81)jrooSl8<>=ZC^09NGBvd0Zt7DTH2Y zCo}%h%GVX~n$`<(h9&vi6;5K+wM;MP6KF{MA$ar3gTbfzasvm2z?xW zYk+RT=U579asqZMs)pMgh)ZMrh;Jp6;c(pNC?hsJIHW%dKg)dZ9Be>*0av#VUWDfn zw?IAOR`@I8Hh2l~Z_t3a171aZ0}dkYg(il7t$>p(9uC1j5kG`a5syGK+XzjN%KP!B z`9Z!(dPORbr^w~--UfrsmS0$$wtM%1tv_;yR+S^*dnrCg$hYl-9 zw~9Z8T5*fK{?lN&pJaR;`0dAFzP@jmtM~UpiBIsq{anCZL|S|Ax04Pl{@X7Bw(5=o zSD#sb;2kGEH@EJ?Tzn@1+(~crt1~>~(1#bak-EVyeP%&BcPYMM{66tXeS3kccVGN4 z{Ci8b@NOAUgB7API7=-c6_5GKKs>ralhO|UY_5fJb31t4d>4D!+!bu+1A>t zVbFxbj)u6>rl^>k({CHI;-kjFi{Ht};JtU8)vrF>MIAN%*iUn&UUD_G4bN6QKky`Q zR9|yD2eKq^JFEZ0xU+`oFE6-E(fv`nZ95vBav#jFDnc=MZk4akms0qsG)eB=` z(7_D)j~LZ|aPia`ll0vSS4Nu@GgmP)btR~ef27Ku&fLya=Io0L%me!x1;JBlA0WS!J}=%zv*joox?cBjSk4n=B(-MtjTlM3^WHg zvpH(=MIUQMdSjS`g^3pJu}IFEv6#S7lN)nG8|h5UZ)uFgu^Ruq$~nxWQNaqWqC44( zZa2>sqpsAKFG?G|fF-B_oQE0`0P8l>SyL?RGbJ-qr2wd=0CRyVr9pz4Ml&{&C79B% zSF;6H5>{OjCJG{yGj;o7Z+HEJ z3@pJGnYY#Wk)F|21a@j%$8Dmk&YDeB^|fZe#k0v~i!oEN>Tg)dtxpS%mvQUnF(P}5 zcri4#mI?IF7k6emb=PALr4<(DW)^2;War+Ko84_<_N49^UAs-pD#HJYyXNL}D=wbc zE%Tm9IT?DxV|^#RdFqKRzzRmtmVtk>hZkPNV+jo*@}uF<1y5hG{hRSv8qr@zvEvvd z4{f)O8Zc_`lgr%sAIR*R?gtZQt=8A;W0n+W{a#6lor9hk`KL?2o*nWZ>t82h@aw;2 zBnN7P9$vM%HW;Tnmo90rE&Gt)Qixw1a`BH&#gKvjvQfSVk8J1$6A>ptchq(jEDQf| oH4zAlQIiWfs4d2S6Y-phttO!+L+?_1oUiNI;CSL&R-0k|U%`mziU0rr delta 9958 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 U=soIMd1mh>>#DC=U8eDW0e6xK2LJ#7 diff --git a/_dist/nextcloud/Nextcloud.pdb b/_dist/nextcloud/Nextcloud.pdb index 3614b580312b7652790410f94c0e9084b8779729..28ccad7e9e31a578babe8a1f02dc2d929da51f84 100644 GIT binary patch delta 2060 zcmZvc3s6*57{|YJ_wI|mEANN427&T0dCRg0`ve38bQCR19U&lO;-xSsjS8u$%``}! z8B$Q$Ff+{AW%s7x1V~meT0WXcD|1`}#bRPc$E;~A`|b^$wb`Bd{l9bm_k7=Z+`Z?E z17!a}(zZg~Zvlv~RMox$0B!G-WHxj0641o6ke4Wd)rl;$B`e@~G7Czr0%mHxpjIb= zH*_q_O;dm|jRi}(0+y$HK}CiHnle}@)JtHUo`o9*3EVZXpfO1x$;84WMq*}RuUP^| zF%rIb` zZtG;2Cx?o3Ip)Y=W`^)g0Ua3%@YO3I1PMhVkyvDbUI{J8ZsZ5Vg)~o~Od<0PLb4K; z8kF$Dbh~0YZWf~#_!)&UkAGgU<4NBO4vB3Q6q!`;GE#y#k3Sra2hrB9Tax=vA3xFwR4sN9K#(U$jde+dP^Og*gPrF|d{~;Tt50#i+9r8*$NR zlCPkyNOPfcHpvAtxQ;4^TS-8qa6QF}>e5p9Lz~IF;bX7Rl!44 z4*YdP=v+@JmPmoqyI2{7HygsFQqZHyz=A4=#ReBTR#X)nL*?M4AxtKNI-^M@g-xh( z*lM(5o1&^2T^77KA(yGduinzksvhu39vZ^XP*!-Ta&wv%+4(STM zywj1pZ+GVH_JC@Z-^*=cn@g?7Cxws4baedN(=pLYyT@-JEYf}^y*0O8q(W9dRuAT z!p+`p`Hne`dHf#>eMqXO3Xb=P<1}%cC5}U$N}Pq%ka0KIt)O$t zdC&Q$^AYdQFXI>KgBgv-!v9sBq)oBx5f@__7Ft-?`lBe}m~G zq4K;FL4j**Zbvc%CN&a3zsy@7;%V3Ta3jrLoaQ<22Hm%~M(ZI@Vy>%HED=8VxYGLn zPifvh1m;~-o4+c;L+bP?+BP>TI^SC|%5W}=|RIT2*BNI-=!%r=X2 z!RbGPotqj7qK1SR*K0X(jDWJ}BD#OJM5mjX);MRfhy$bB5@)jKPF(8JCZF%~ywAPQ z^S;k}eeZBLxp;(ht}(Rv0WAK8rWycP(Y3iGbk$13uT}<9@@TN+F|e*c13L>C_@Ph( zcM6lB$Vo$)lYt4R2Gqq2B)K$@=}H2dn+D#^fYC!ku7`mWUK-AL8My7EVamtADUOD7 z90MzO8fth32&ilXj@b!Zwd2}AL1`WZ^`U%uKtpXI1^tB#{E3`&$gvkc3I_ihQ}9Ib zRZ#C#LDZ|Utu+^f~)Qr!@|9g$E;ETc+DynRH$k&cw-o;Mb$w)svg?BW|oBl zAIGX-391@6UoZMqs5;o-12z8TP<8M%sva)++A-2?uhy#I7rt7nhTr*K^j-d5tq#gi z^|00tjZH0e&C(UkR+>130)3ryL*K|`{QazLLcRnKr23w|q3wae4{aaJ8$A<{22<+j zO%K3m4rUteQl+_D#PO0IAA2_Ei0Km{)3_m&jsl0zbH5~&jUm$c1{%a1&WJd$j#WKxuYhrED>!g=V0d6`;L^ZN$t3Oeq*GZ53qP+a2~nRdzMVl)n((csUf$tQ zj!@|@OI+sw8EVJ92*ZAV;#~|4OKBx66~D;vV`=`I86zm#pE;-Ui`_G_`7EK<)6kV&EY>UzEvN|pb>hC|p|ECI zUPYqXqgBe0;(12o6-K(q=r;M2k)M_<8-qzP#hJ-g9NFcoK`6YanUqGjvCN`d2<@jq z{&Wzlzy{`;=DC!?0xf|QN~6KayOe-K-~%R7AZ!S1h;RGc{&SxR-v%}&Y|L8v`y+=qN9qmG-|Je9$9YD{pip$fEh}K~05xC9Sp1 z#+MSufcGIK!mj1(ED2Jlj}fOFBq%+?