Workshop - Added library view models

This commit is contained in:
Robert committed 2023-08-31 22:04:57 +02:00
1 parent c75e839756
commit e545d2f3da
18 files changed
+272 -41

No files matched your search

@@ -0,0 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.Workshop.Library.Tabs.LibraryInstalledView">
Installed entries management here 🫡
</UserControl>
@@ -0,0 +1,14 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
namespace Artemis.UI.Screens.Workshop.Library.Tabs;
public partial class LibraryInstalledView : ReactiveUserControl<LibraryInstalledViewModel>
{
public LibraryInstalledView()
{
InitializeComponent();
}
}
@@ -0,0 +1,8 @@
using Artemis.UI.Shared;
namespace Artemis.UI.Screens.Workshop.Library.Tabs;
public class LibraryInstalledViewModel : ActivatableViewModelBase
{
}
@@ -0,0 +1,8 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.Workshop.Library.Tabs.LibrarySubmissionsView">
Submission management here 😗
</UserControl>
@@ -0,0 +1,14 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.ReactiveUI;
namespace Artemis.UI.Screens.Workshop.Library.Tabs;
public partial class LibrarySubmissionsView : ReactiveUserControl<LibrarySubmissionsViewModel>
{
public LibrarySubmissionsView()
{
InitializeComponent();
}
}
@@ -0,0 +1,8 @@
using Artemis.UI.Shared;
namespace Artemis.UI.Screens.Workshop.Library.Tabs;
public class LibrarySubmissionsViewModel : ActivatableViewModelBase
{
}
@@ -0,0 +1,27 @@
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:library="clr-namespace:Artemis.UI.Screens.Workshop.Library"
xmlns:routing="clr-namespace:Artemis.UI.Routing"
xmlns:ui1="clr-namespace:Artemis.UI"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Artemis.UI.Screens.Workshop.Library.WorkshopLibraryView"
x:DataType="library:WorkshopLibraryViewModel">
<ui:NavigationView PaneDisplayMode="Top" MenuItemsSource="{CompiledBinding Tabs}" SelectedItem="{CompiledBinding SelectedTab}">
<ui:NavigationView.Styles>
<Styles>
<Style Selector="ui|NavigationView:topnavminimal /template/ SplitView Border#ContentGridBorder">
<Setter Property="CornerRadius" Value="8 0 0 0" />
</Style>
</Styles>
</ui:NavigationView.Styles>
<ui:Frame Name="TabFrame" IsNavigationStackEnabled="False" CacheSize="0">
<ui:Frame.NavigationPageFactory>
<ui1:PageFactory/>
</ui:Frame.NavigationPageFactory>
</ui:Frame>
</ui:NavigationView>
</UserControl>
@@ -0,0 +1,37 @@
using System;
using System.Reactive.Disposables;
using Artemis.UI.Shared;
using Avalonia.ReactiveUI;
using Avalonia.Threading;
using FluentAvalonia.UI.Media.Animation;
using FluentAvalonia.UI.Navigation;
using ReactiveUI;
namespace Artemis.UI.Screens.Workshop.Library;
public partial class WorkshopLibraryView : ReactiveUserControl<WorkshopLibraryViewModel>
{
private int _lastIndex;
public WorkshopLibraryView()
{
InitializeComponent();
this.WhenActivated(d => { ViewModel.WhenAnyValue(vm => vm.Screen).WhereNotNull().Subscribe(Navigate).DisposeWith(d); });
}
private void Navigate(ViewModelBase viewModel)
{
Dispatcher.UIThread.Invoke(() =>
{
if (ViewModel == null)
return;
SlideNavigationTransitionInfo transitionInfo = new()
{
Effect = ViewModel.Tabs.IndexOf(ViewModel.SelectedTab) > _lastIndex ? SlideNavigationTransitionEffect.FromRight : SlideNavigationTransitionEffect.FromLeft
};
TabFrame.NavigateFromObject(viewModel, new FrameNavigationOptions {TransitionInfoOverride = transitionInfo});
_lastIndex = ViewModel.Tabs.IndexOf(ViewModel.SelectedTab);
});
}
}
@@ -0,0 +1,50 @@
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive.Disposables;
using System.Threading;
using System.Threading.Tasks;
using Artemis.UI.Routing;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Routing;
using Artemis.WebClient.Workshop;
using ReactiveUI;
using System;
namespace Artemis.UI.Screens.Workshop.Library;
public class WorkshopLibraryViewModel : RoutableScreen<ActivatableViewModelBase>, IWorkshopViewModel
{
private RouteViewModel? _selectedTab;
/// <inheritdoc />
public WorkshopLibraryViewModel(IRouter router)
{
Tabs = new ObservableCollection<RouteViewModel>
{
new("workshop/library/installed", "Installed"),
new("workshop/library/submissions", "Submissions")
};
// Navigate on tab change
this.WhenActivated(d => this.WhenAnyValue(vm => vm.SelectedTab)
.WhereNotNull()
.Subscribe(s => router.Navigate(s.Path, new RouterNavigationOptions {IgnoreOnPartialMatch = true}))
.DisposeWith(d));
}
public EntryType? EntryType => null;
public ObservableCollection<RouteViewModel> Tabs { get; }
public RouteViewModel? SelectedTab
{
get => _selectedTab;
set => RaiseAndSetIfChanged(ref _selectedTab, value);
}
public override async Task OnNavigating(NavigationArguments args, CancellationToken cancellationToken)
{
SelectedTab = Tabs.FirstOrDefault(t => t.Matches(args.Path));
if (SelectedTab == null)
await args.Router.Navigate(Tabs.First().Path);
}
}