diff --git a/src/Artemis.UI.Shared/Styles/BrokenState.axaml b/src/Artemis.UI.Shared/Styles/BrokenState.axaml
index 65ef465c0..c28d4bca2 100644
--- a/src/Artemis.UI.Shared/Styles/BrokenState.axaml
+++ b/src/Artemis.UI.Shared/Styles/BrokenState.axaml
@@ -3,18 +3,17 @@
xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia">
-
-
+
-
+
-
-
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Styles/Button.axaml b/src/Artemis.UI.Shared/Styles/Button.axaml
index 12863d150..41b7529c0 100644
--- a/src/Artemis.UI.Shared/Styles/Button.axaml
+++ b/src/Artemis.UI.Shared/Styles/Button.axaml
@@ -25,14 +25,14 @@
HyperlinkButton.icon-button
-
+
-
+
HyperlinkButton.icon-button icon-button-small
-
+
-
+
Button.window-button
@@ -93,7 +93,7 @@
-
@@ -113,24 +113,24 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml b/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml
index 18df7201a..d4cd0f731 100644
--- a/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml
+++ b/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml
@@ -51,7 +51,7 @@
RowDefinitions="*,*">
Welcome to the data model picker
Select a value from the data model below
- Learn more
+ Learn more
diff --git a/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml b/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml
index 50f2d0dc2..a84b7d6ed 100644
--- a/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml
+++ b/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml
@@ -17,7 +17,7 @@
Synchronized scrolling
-
These performance stats are rather basic, for advanced performance profiling check out the wiki.
-
+
JetBrains Profiling Guide
-
+
diff --git a/src/Artemis.UI/Screens/Device/Tabs/Layout/DeviceLayoutTabView.axaml b/src/Artemis.UI/Screens/Device/Tabs/Layout/DeviceLayoutTabView.axaml
index 5b4ffc40f..cf1a9027c 100644
--- a/src/Artemis.UI/Screens/Device/Tabs/Layout/DeviceLayoutTabView.axaml
+++ b/src/Artemis.UI/Screens/Device/Tabs/Layout/DeviceLayoutTabView.axaml
@@ -104,7 +104,7 @@
- Plugins you can find your currently installed plugins, these default plugins are created by Artemis developers. We're also keeping track of a list of third-party plugins on our wiki.
-
-
+
+
-
+
Get more plugins
-
+
@@ -68,30 +67,30 @@
-
+
GitHub
-
-
+
+
Website
-
-
+
+
Discord
-
-
+
+
E-mail
-
+
@@ -106,7 +105,7 @@
-
@@ -114,7 +113,7 @@
Donate
-
+
-
-
-
+
-
-
+
-
+
-
-
-
-
+
-
-
+
-
-
+
-
+
-
Learn more about adaption hints
-
+
Add hints below to help decide where to place this layer when the profile is imported.
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml
index a29cd584d..9ec7e488c 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml
@@ -9,14 +9,14 @@
x:Class="Artemis.UI.Screens.ProfileEditor.ProfileTree.FolderTreeItemView"
x:DataType="profileTree:FolderTreeItemViewModel">
-
-
+
-
-
+
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml
index 097ca69a0..7ea182b5f 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml
@@ -42,11 +42,11 @@
When you enable data bindings you can no longer use keyframes or normal values for this property.
-
Learn more
-
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml b/src/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml
index 70b2bc390..f81713c04 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml
@@ -25,15 +25,15 @@
-
+
-
-
+
+
-
-
+
+
-
+
-
PolyForm Noncommercial License 1.0.0
-
+
@@ -65,9 +65,9 @@
Project owner, main contributor
-
+
-
+
@@ -86,9 +86,9 @@
RGB.NET, main contributor
-
+
-
+
@@ -107,9 +107,9 @@
Main contributor
-
+
-
+
@@ -128,9 +128,9 @@
Graphics design
-
+
-
+
@@ -185,39 +185,39 @@
SQLite
-
+
https://avaloniaui.net/
-
-
+
+
https://github.com/dadhi/DryIoc
-
-
+
+
https://learn.microsoft.com/en-us/ef/core/
-
-
+
+
https://github.com/amwx/FluentAvalonia
-
-
+
+
https://unosquare.github.io/embedio/
-
-
+
+
https://github.com/Humanizr/Humanizer
-
-
+
+
https://github.com/natemcmaster/DotNetCorePlugins
-
-
+
+
https://github.com/DarthAffe/RGB.NET
-
-
+
+
https://serilog.net/
-
-
+
+
https://github.com/mono/SkiaSharp
-
-
+
+
https://www.sqlite.org/
-
+
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml b/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml
index 38c86d765..b9377f61b 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml
@@ -17,9 +17,9 @@
-
+
Get more plugins
-
+
diff --git a/src/Artemis.UI/Screens/Settings/Tabs/ReleasesTabView.axaml b/src/Artemis.UI/Screens/Settings/Tabs/ReleasesTabView.axaml
index e03339283..c4ff90b0c 100644
--- a/src/Artemis.UI/Screens/Settings/Tabs/ReleasesTabView.axaml
+++ b/src/Artemis.UI/Screens/Settings/Tabs/ReleasesTabView.axaml
@@ -29,10 +29,10 @@
TextWrapping="Wrap"
Text="{CompiledBinding Channel, StringFormat='Found no releases for the \'{0}\' channel.'}">
-
Learn more about channels on the wiki
-
+
diff --git a/src/Artemis.UI/Screens/Sidebar/SidebarView.axaml b/src/Artemis.UI/Screens/Sidebar/SidebarView.axaml
index c02ad3d60..454becd6b 100644
--- a/src/Artemis.UI/Screens/Sidebar/SidebarView.axaml
+++ b/src/Artemis.UI/Screens/Sidebar/SidebarView.axaml
@@ -54,7 +54,7 @@
-
-
-
+
-
-
+
-
-
+
-
-
+
-
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStep.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStep.axaml
index 1e80427c2..419e96112 100644
--- a/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStep.axaml
+++ b/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStep.axaml
@@ -33,18 +33,18 @@
Discord
-
+
https://wiki.artemis-rgb.com/
-
-
+
+
https://wiki.artemis-rgb.com/en/guides/user/introduction
-
-
+
+
https://github.com/Artemis-RGB/Artemis
-
-
+
+
https://discord.gg/S3MVaC9
-
+
diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStep.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStep.axaml
index 52e5802dd..6baaee4f4 100644
--- a/src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStep.axaml
+++ b/src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStep.axaml
@@ -16,15 +16,15 @@
-
+
-
-
+
+
-
-
+
+
-
+
-
PolyForm Noncommercial License 1.0.0
-
+
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml b/src/Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml
index 8be42a735..82a8787ae 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml
+++ b/src/Artemis.UI/Screens/VisualScripting/NodeScriptWindowView.axaml
@@ -169,13 +169,13 @@
-
Learn more about visual scripts
-
+
diff --git a/src/Artemis.UI/Screens/VisualScripting/NodeView.axaml b/src/Artemis.UI/Screens/VisualScripting/NodeView.axaml
index ea4dc37ad..00b1402bb 100644
--- a/src/Artemis.UI/Screens/VisualScripting/NodeView.axaml
+++ b/src/Artemis.UI/Screens/VisualScripting/NodeView.axaml
@@ -39,18 +39,18 @@
Background="{DynamicResource ContentDialogBackground}">
-
-
+
-
-
+
diff --git a/src/Artemis.UI/Screens/Workshop/CurrentUser/CurrentUserView.axaml b/src/Artemis.UI/Screens/Workshop/CurrentUser/CurrentUserView.axaml
index eafe6dd46..eea731a15 100644
--- a/src/Artemis.UI/Screens/Workshop/CurrentUser/CurrentUserView.axaml
+++ b/src/Artemis.UI/Screens/Workshop/CurrentUser/CurrentUserView.axaml
@@ -43,7 +43,7 @@
-
Manage account
-
-
+
Sign out
-
+
diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml
new file mode 100644
index 000000000..c68bddd9d
--- /dev/null
+++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml.cs b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml.cs
new file mode 100644
index 000000000..9068394b0
--- /dev/null
+++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalView.axaml.cs
@@ -0,0 +1,14 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Artemis.UI.Screens.Workshop.Entries.List;
+
+public partial class EntryListItemVerticalView : ReactiveUserControl
+{
+ public EntryListItemVerticalView()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalViewModel.cs
new file mode 100644
index 000000000..20e50bca4
--- /dev/null
+++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListItemVerticalViewModel.cs
@@ -0,0 +1,13 @@
+using Artemis.UI.Shared.Routing;
+using Artemis.WebClient.Workshop;
+using Artemis.WebClient.Workshop.Services;
+
+namespace Artemis.UI.Screens.Workshop.Entries.List;
+
+public class EntryListItemVerticalViewModel : EntryListItemViewModel
+{
+ ///
+ public EntryListItemVerticalViewModel(IEntrySummary entry, IRouter router, IWorkshopService workshopService) : base(entry, router, workshopService)
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeView.axaml b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeView.axaml
index 4d535f0ba..d9cadbe3e 100644
--- a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeView.axaml
+++ b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeView.axaml
@@ -10,7 +10,7 @@
-
+
-
+
-
+
-
+
-
+
diff --git a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs
index 265087ab5..888929fd5 100644
--- a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs
+++ b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs
@@ -1,33 +1,70 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Linq;
using System.Reactive;
using System.Threading;
using System.Threading.Tasks;
using Artemis.UI.Extensions;
+using Artemis.UI.Screens.Workshop.Entries.List;
using Artemis.UI.Screens.Workshop.SubmissionWizard;
using Artemis.UI.Shared.Routing;
using Artemis.UI.Shared.Services;
+using Artemis.WebClient.Workshop;
using Artemis.WebClient.Workshop.Services;
+using DynamicData;
using PropertyChanged.SourceGenerator;
using ReactiveUI;
+using StrawberryShake;
namespace Artemis.UI.Screens.Workshop.Home;
public partial class WorkshopHomeViewModel : RoutableScreen
{
private readonly IWindowService _windowService;
+
[Notify(Setter.Private)] private bool _workshopReachable;
- public WorkshopHomeViewModel(IRouter router, IWindowService windowService, IWorkshopService workshopService)
+ public WorkshopHomeViewModel(IRouter router, IWindowService windowService, IWorkshopService workshopService, IWorkshopClient client,
+ Func getEntryListItemViewModel)
{
_windowService = windowService;
+ SourceList latest = new();
+ SourceList popular = new();
+
+ latest.Connect().Transform(getEntryListItemViewModel).Bind(out ReadOnlyObservableCollection latestEntries).Subscribe();
+ popular.Connect().Transform(getEntryListItemViewModel).Bind(out ReadOnlyObservableCollection popularEntries).Subscribe();
AddSubmission = ReactiveCommand.CreateFromTask(ExecuteAddSubmission, this.WhenAnyValue(vm => vm.WorkshopReachable));
Navigate = ReactiveCommand.CreateFromTask(async r => await router.Navigate(r), this.WhenAnyValue(vm => vm.WorkshopReachable));
+ PopularEntries = popularEntries;
+ LatestEntries = latestEntries;
- this.WhenActivatedAsync(async d => WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken()));
+ this.WhenActivatedAsync(async d =>
+ {
+ WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken());
+
+ IOperationResult popularResult = await client.GetPopularEntries.ExecuteAsync();
+ popular.Edit(p =>
+ {
+ p.Clear();
+ if (popularResult.Data?.PopularEntries != null)
+ p.AddRange(popularResult.Data.PopularEntries);
+ });
+
+ IOperationResult latestResult = await client.GetEntriesv2.ExecuteAsync(null, null, [new EntrySortInput {CreatedAt = SortEnumType.Desc}], 25, null);
+ latest.Edit(l =>
+ {
+ l.Clear();
+ if (latestResult.Data?.EntriesV2?.Edges != null)
+ l.AddRange(latestResult.Data.EntriesV2.Edges.Select(e => e.Node));
+ });
+ });
}
-
+
public ReactiveCommand AddSubmission { get; }
public ReactiveCommand Navigate { get; }
+ public ReadOnlyObservableCollection PopularEntries { get; }
+ public ReadOnlyObservableCollection LatestEntries { get; }
private async Task ExecuteAddSubmission(CancellationToken arg)
{
diff --git a/src/Artemis.UI/Screens/Workshop/Library/SubmissionManagementView.axaml b/src/Artemis.UI/Screens/Workshop/Library/SubmissionManagementView.axaml
index 8c7710dc1..6fdc6f158 100644
--- a/src/Artemis.UI/Screens/Workshop/Library/SubmissionManagementView.axaml
+++ b/src/Artemis.UI/Screens/Workshop/Library/SubmissionManagementView.axaml
@@ -70,9 +70,9 @@
-
+
View workshop page
-
+
diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/ReleaseWizardView.axaml b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/ReleaseWizardView.axaml
index 522bd4d33..5b441addb 100644
--- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/ReleaseWizardView.axaml
+++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/ReleaseWizardView.axaml
@@ -21,9 +21,9 @@
-
+
-
+
-
Learn about physical layouts
-
+
-
Learn more about adaption hints
-
+
-
+
-
+
-