From 20fb6b766228b8f0ce3360ffbc8e20f406fd46a1 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 19 Aug 2025 09:01:21 +0200 Subject: [PATCH 01/19] Add default entries wizard step --- .../Steps/DefaultEntriesStepView.axaml | 32 +++++ .../Steps/DefaultEntriesStepView.axaml.cs | 14 +++ .../Steps/DefaultEntriesStepViewModel.cs | 115 ++++++++++++++++++ .../Steps/DevicesStepViewModel.cs | 2 +- .../Steps/SurfaceStepViewModel.cs | 4 +- .../Queries/GetEntries.graphql | 16 +++ 6 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml.cs create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml new file mode 100644 index 000000000..2317f1da8 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -0,0 +1,32 @@ + + + + + + Installing default plugins and profiles, these will provide you with a basic setup to get started with Artemis. + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml.cs new file mode 100644 index 000000000..1050a6b30 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml.cs @@ -0,0 +1,14 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Avalonia.ReactiveUI; + +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public partial class DefaultEntriesStepView : ReactiveUserControl +{ + public DefaultEntriesStepView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs new file mode 100644 index 000000000..d9226057a --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Artemis.Core.Services; +using Artemis.UI.Extensions; +using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Utilities; +using Artemis.WebClient.Workshop; +using Artemis.WebClient.Workshop.Handlers.InstallationHandlers; +using Artemis.WebClient.Workshop.Services; +using PropertyChanged.SourceGenerator; +using ReactiveUI; +using StrawberryShake; + +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public partial class DefaultEntriesStepViewModel : WizardStepViewModel +{ + [Notify] private bool _workshopReachable; + [Notify] private bool _fetchingDefaultEntries; + [Notify] private int _totalEntries; + [Notify] private int _installedEntries; + [Notify] private int _installProgress; + [Notify] private IEntrySummary? _currentEntry; + + private readonly IWorkshopService _workshopService; + private readonly IWorkshopClient _client; + private readonly IWindowService _windowService; + private readonly Progress _currentEntryProgress = new(); + + + public DefaultEntriesStepViewModel(IWorkshopService workshopService, IDeviceService deviceService, IWorkshopClient client, IWindowService windowService) + { + _workshopService = workshopService; + _client = client; + _windowService = windowService; + _currentEntryProgress.ProgressChanged += (_, f) => InstallProgress = f.ProgressPercentage; + + Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); + GoBack = ReactiveCommand.Create(() => + { + if (deviceService.EnabledDevices.Count == 0) + Wizard.ChangeScreen(); + else + Wizard.ChangeScreen(); + }); + + this.WhenActivatedAsync(async d => + { + WorkshopReachable = await _workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); + if (WorkshopReachable) + { + await InstallDefaultEntries(d.AsCancellationToken()); + } + }); + } + + public async Task InstallDefaultEntries(CancellationToken cancellationToken) + { + FetchingDefaultEntries = true; + TotalEntries = 0; + InstalledEntries = 0; + + if (!WorkshopReachable) + return false; + + IOperationResult result = await _client.GetDefaultEntries.ExecuteAsync(100, null, cancellationToken); + List entries = result.Data?.EntriesV2?.Edges?.Select(e => e.Node).Cast().ToList() ?? []; + while (result.Data?.EntriesV2?.PageInfo is {HasNextPage: true}) + { + result = await _client.GetDefaultEntries.ExecuteAsync(100, result.Data.EntriesV2.PageInfo.EndCursor, cancellationToken); + if (result.Data?.EntriesV2?.Edges != null) + entries.AddRange(result.Data.EntriesV2.Edges.Select(e => e.Node)); + } + + await Task.Delay(1000); + FetchingDefaultEntries = false; + TotalEntries = entries.Count; + + if (entries.Count == 0) + return false; + + foreach (IEntrySummary entry in entries) + { + if (cancellationToken.IsCancellationRequested) + return false; + + CurrentEntry = entry; + + // Skip entries without a release and entries that are already installed + if (entry.LatestRelease == null || _workshopService.GetInstalledEntry(entry.Id) != null) + { + InstalledEntries++; + continue; + } + + EntryInstallResult installResult = await _workshopService.InstallEntry(entry, entry.LatestRelease, _currentEntryProgress, cancellationToken); + + // Unlikely as default entries do nothing fancy + if (!installResult.IsSuccess) + { + await _windowService.CreateContentDialog().WithTitle("Failed to install entry") + .WithContent($"Failed to install entry '{entry.Name}' ({entry.Id}): {installResult.Message}") + .WithCloseButtonText("Skip and continue") + .ShowAsync(); + } + + InstalledEntries++; + } + + return true; + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs index ed2f364d9..1a3e15768 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs @@ -22,7 +22,7 @@ public class DevicesStepViewModel : WizardStepViewModel Continue = ReactiveCommand.Create(() => { if (deviceService.EnabledDevices.Count == 0) - Wizard.ChangeScreen(); + Wizard.ChangeScreen(); else Wizard.ChangeScreen(); }); diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs index 04989be43..3ddc71021 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs @@ -19,7 +19,7 @@ public class SurfaceStepViewModel : WizardStepViewModel _deviceService = deviceService; SelectLayout = ReactiveCommand.Create(ExecuteSelectLayout); - Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); + Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); GoBack = ReactiveCommand.Create(() => Wizard.ChangeScreen()); } @@ -30,6 +30,6 @@ public class SurfaceStepViewModel : WizardStepViewModel // TODO: Implement the layout _deviceService.AutoArrangeDevices(); - Wizard.ChangeScreen(); + Wizard.ChangeScreen(); } } \ No newline at end of file diff --git a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql index ce6eedddc..3827be7ea 100644 --- a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql +++ b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql @@ -18,4 +18,20 @@ query GetPopularEntries { popularEntries { ...entrySummary } +} + +query GetDefaultEntries($first: Int $after: String) { + entriesV2(where: {isDefault: {eq: true}} first: $first after: $after) { + totalCount + pageInfo { + hasNextPage + endCursor + } + edges { + cursor + node { + ...entrySummary + } + } + } } \ No newline at end of file From b351f685f7f32b90fb44128bdc79be077f20c5d7 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 15 Nov 2025 15:07:54 +0100 Subject: [PATCH 02/19] Add AXAML hot reload (debug only) Major progress on default entries too I guess lmao --- src/Artemis.Core/Constants.cs | 5 + .../Routing/Router/Router.cs | 8 +- src/Artemis.UI.Windows/App.axaml.cs | 5 +- src/Artemis.UI/Artemis.UI.csproj | 36 - src/Artemis.UI/Screens/Home/HomeView.axaml | 2 +- .../Steps/DefaultEntriesStepView.axaml | 60 +- .../Steps/DefaultEntriesStepViewModel.cs | 125 +- .../Steps/DefaultEntryItemView.axaml | 72 ++ .../Steps/DefaultEntryItemView.axaml.cs | 11 + .../Steps/DefaultEntryItemViewModel.cs | 86 ++ .../Details/EntrySpecificationsView.axaml | 16 +- .../Details/EntrySpecificationsViewModel.cs | 2 + .../Library/SubmissionDetailsViewModel.cs | 31 +- .../Models/SubmissionWizardState.cs | 2 + .../Steps/SpecificationsStepViewModel.cs | 4 + .../Steps/UploadStepViewModel.cs | 9 +- .../Queries/Fragments.graphql | 16 +- .../Queries/GetEntries.graphql | 8 +- .../WorkshopConstants.cs | 8 +- .../graphql.config.yml | 2 +- src/Artemis.WebClient.Workshop/schema.graphql | 1120 +++++++++-------- src/Artemis.sln | 1 + src/Directory.Build.targets | 12 + src/Directory.Packages.props | 4 + 24 files changed, 963 insertions(+), 682 deletions(-) create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml.cs create mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs create mode 100644 src/Directory.Build.targets diff --git a/src/Artemis.Core/Constants.cs b/src/Artemis.Core/Constants.cs index dfa7791c5..a05acf32c 100644 --- a/src/Artemis.Core/Constants.cs +++ b/src/Artemis.Core/Constants.cs @@ -140,6 +140,11 @@ public static class Constants /// Gets the startup arguments provided to the application /// public static ReadOnlyCollection StartupArguments { get; set; } = null!; + + public static string? GetStartupRoute() + { + return StartupArguments.FirstOrDefault(a => a.StartsWith("--route=artemis://"))?.Split("--route=artemis://")[1]; + } internal static readonly CorePluginFeature CorePluginFeature = new() {Plugin = CorePlugin, Profiler = CorePlugin.GetProfiler("Feature - Core")}; internal static readonly EffectPlaceholderPlugin EffectPlaceholderPlugin = new() {Plugin = CorePlugin, Profiler = CorePlugin.GetProfiler("Feature - Effect Placeholder")}; diff --git a/src/Artemis.UI.Shared/Routing/Router/Router.cs b/src/Artemis.UI.Shared/Routing/Router/Router.cs index caa95b3e1..3eae340c9 100644 --- a/src/Artemis.UI.Shared/Routing/Router/Router.cs +++ b/src/Artemis.UI.Shared/Routing/Router/Router.cs @@ -251,7 +251,13 @@ internal class Router : CorePropertyChanged, IRouter, IDisposable if (_previousWindowRoute != null && _currentRouteSubject.Value == "blank") Dispatcher.UIThread.InvokeAsync(async () => await Navigate(_previousWindowRoute, new RouterNavigationOptions {AddToHistory = false, EnableLogging = false})); else if (_currentRouteSubject.Value == null || _currentRouteSubject.Value == "blank") - Dispatcher.UIThread.InvokeAsync(async () => await Navigate("home", new RouterNavigationOptions {AddToHistory = false, EnableLogging = true})); + { + string? startupRoute = Constants.GetStartupRoute(); + if (startupRoute != null) + Dispatcher.UIThread.InvokeAsync(async () => await Navigate(startupRoute, new RouterNavigationOptions {AddToHistory = false, EnableLogging = true})); + else + Dispatcher.UIThread.InvokeAsync(async () => await Navigate("home", new RouterNavigationOptions {AddToHistory = false, EnableLogging = true})); + } } private void MainWindowServiceOnMainWindowClosed(object? sender, EventArgs e) diff --git a/src/Artemis.UI.Windows/App.axaml.cs b/src/Artemis.UI.Windows/App.axaml.cs index 593a9ea2a..824c8a9c4 100644 --- a/src/Artemis.UI.Windows/App.axaml.cs +++ b/src/Artemis.UI.Windows/App.axaml.cs @@ -16,6 +16,7 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using DryIoc; +using HotAvalonia; using ReactiveUI; namespace Artemis.UI.Windows; @@ -27,6 +28,8 @@ public class App : Application public override void Initialize() { + this.EnableHotReload(); + // If Artemis is already running, bring it to foreground and stop this process if (FocusExistingInstance()) { @@ -89,7 +92,7 @@ public class App : Application try { CancellationTokenSource cts = new(); - cts.CancelAfter(2000); + cts.CancelAfter(5000); HttpResponseMessage httpResponseMessage = client.Send(new HttpRequestMessage(HttpMethod.Post, url + "remote/bring-to-foreground") {Content = new StringContent(route ?? "")}, cts.Token); httpResponseMessage.EnsureSuccessStatusCode(); diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index 268327347..bddd938b2 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -35,40 +35,4 @@ - - - - DeviceProviderPickerDialogView.axaml - Code - - - DeviceSelectionDialogView.axaml - Code - - - LayoutListView.axaml - Code - - - LayoutListView.axaml - Code - - - LayoutListView.axaml - Code - - - EntryReleasesView.axaml - Code - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Home/HomeView.axaml b/src/Artemis.UI/Screens/Home/HomeView.axaml index b40dec73b..9af3fb2e5 100644 --- a/src/Artemis.UI/Screens/Home/HomeView.axaml +++ b/src/Artemis.UI/Screens/Home/HomeView.axaml @@ -22,7 +22,7 @@ Foreground="White" FontSize="32" Margin="30" - Text=" Welcome to Artemis, the unified RGB platform."> + Text="Welcome to Artemis, the unified RGB platform."> diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml index 2317f1da8..7133784ca 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -7,26 +7,52 @@ x:Class="Artemis.UI.Screens.StartupWizard.Steps.DefaultEntriesStepView" x:DataType="steps:DefaultEntriesStepViewModel"> - - + + + - Installing default plugins and profiles, these will provide you with a basic setup to get started with Artemis. + Below is a list of default features that can be installed to get you started with Artemis. You can always install or uninstall features later via the Workshop. - - - - - - - - + + Device providers + + + + + + + + - - - - + + Essentials + + + + + + + + + + + Other features + + + + + + + + - - + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs index d9226057a..1d0224a5f 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -8,7 +9,6 @@ using Artemis.UI.Extensions; using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Utilities; using Artemis.WebClient.Workshop; -using Artemis.WebClient.Workshop.Handlers.InstallationHandlers; using Artemis.WebClient.Workshop.Services; using PropertyChanged.SourceGenerator; using ReactiveUI; @@ -20,25 +20,31 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel { [Notify] private bool _workshopReachable; [Notify] private bool _fetchingDefaultEntries; - [Notify] private int _totalEntries; - [Notify] private int _installedEntries; - [Notify] private int _installProgress; - [Notify] private IEntrySummary? _currentEntry; + [Notify] private bool _installed; + [Notify] private int _currentEntries; + [Notify] private int _totalEntries = 1; - private readonly IWorkshopService _workshopService; private readonly IWorkshopClient _client; - private readonly IWindowService _windowService; - private readonly Progress _currentEntryProgress = new(); + private readonly Func _getDefaultEntryItemViewModel; + public ObservableCollection DeviceProviderEntryViewModels { get; } = []; + public ObservableCollection EssentialEntryViewModels { get; } = []; + public ObservableCollection OtherEntryViewModels { get; } = []; - public DefaultEntriesStepViewModel(IWorkshopService workshopService, IDeviceService deviceService, IWorkshopClient client, IWindowService windowService) + public DefaultEntriesStepViewModel(IWorkshopService workshopService, IDeviceService deviceService, IWorkshopClient client, + Func getDefaultEntryItemViewModel) { - _workshopService = workshopService; _client = client; - _windowService = windowService; - _currentEntryProgress.ProgressChanged += (_, f) => InstallProgress = f.ProgressPercentage; + _getDefaultEntryItemViewModel = getDefaultEntryItemViewModel; - Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); + ContinueText = "Install selected entries"; + Continue = ReactiveCommand.CreateFromTask(async ct => + { + if (Installed) + Wizard.ChangeScreen(); + else + await Install(ct); + }); GoBack = ReactiveCommand.Create(() => { if (deviceService.EnabledDevices.Count == 0) @@ -49,22 +55,57 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel this.WhenActivatedAsync(async d => { - WorkshopReachable = await _workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); + WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); if (WorkshopReachable) { - await InstallDefaultEntries(d.AsCancellationToken()); + await GetDefaultEntries(d.AsCancellationToken()); } }); } - public async Task InstallDefaultEntries(CancellationToken cancellationToken) + private async Task Install(CancellationToken cancellationToken) { - FetchingDefaultEntries = true; - TotalEntries = 0; - InstalledEntries = 0; + // Remove entries that aren't to be installed + RemoveUnselectedEntries(DeviceProviderEntryViewModels); + RemoveUnselectedEntries(EssentialEntryViewModels); + RemoveUnselectedEntries(OtherEntryViewModels); + + TotalEntries = DeviceProviderEntryViewModels.Count + EssentialEntryViewModels.Count + OtherEntryViewModels.Count; + CurrentEntries = 0; + // Install entries one by one, removing them from the list as we go + List entries = [..DeviceProviderEntryViewModels, ..EssentialEntryViewModels, ..OtherEntryViewModels]; + foreach (DefaultEntryItemViewModel defaultEntryItemViewModel in entries) + { + cancellationToken.ThrowIfCancellationRequested(); + bool removeFromList = await defaultEntryItemViewModel.InstallEntry(cancellationToken); + if (!removeFromList) + break; + + DeviceProviderEntryViewModels.Remove(defaultEntryItemViewModel); + EssentialEntryViewModels.Remove(defaultEntryItemViewModel); + OtherEntryViewModels.Remove(defaultEntryItemViewModel); + CurrentEntries++; + } + + Installed = true; + ContinueText = "Continue"; + } + + private void RemoveUnselectedEntries(ObservableCollection entryViewModels) + { + List toRemove = entryViewModels.Where(e => !e.ShouldInstall).ToList(); + foreach (DefaultEntryItemViewModel defaultEntryItemViewModel in toRemove) + entryViewModels.Remove(defaultEntryItemViewModel); + + } + + private async Task GetDefaultEntries(CancellationToken cancellationToken) + { if (!WorkshopReachable) - return false; + return; + + FetchingDefaultEntries = true; IOperationResult result = await _client.GetDefaultEntries.ExecuteAsync(100, null, cancellationToken); List entries = result.Data?.EntriesV2?.Edges?.Select(e => e.Node).Cast().ToList() ?? []; @@ -75,41 +116,25 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel entries.AddRange(result.Data.EntriesV2.Edges.Select(e => e.Node)); } - await Task.Delay(1000); - FetchingDefaultEntries = false; - TotalEntries = entries.Count; - - if (entries.Count == 0) - return false; - + DeviceProviderEntryViewModels.Clear(); + EssentialEntryViewModels.Clear(); + OtherEntryViewModels.Clear(); foreach (IEntrySummary entry in entries) { - if (cancellationToken.IsCancellationRequested) - return false; - - CurrentEntry = entry; - - // Skip entries without a release and entries that are already installed - if (entry.LatestRelease == null || _workshopService.GetInstalledEntry(entry.Id) != null) - { - InstalledEntries++; + if (entry.DefaultEntryInfo == null) continue; - } - EntryInstallResult installResult = await _workshopService.InstallEntry(entry, entry.LatestRelease, _currentEntryProgress, cancellationToken); - - // Unlikely as default entries do nothing fancy - if (!installResult.IsSuccess) - { - await _windowService.CreateContentDialog().WithTitle("Failed to install entry") - .WithContent($"Failed to install entry '{entry.Name}' ({entry.Id}): {installResult.Message}") - .WithCloseButtonText("Skip and continue") - .ShowAsync(); - } - - InstalledEntries++; + DefaultEntryItemViewModel viewModel = _getDefaultEntryItemViewModel(entry); + viewModel.ShouldInstall = entry.DefaultEntryInfo.IsEssential; + + if (entry.DefaultEntryInfo.IsDeviceProvider) + DeviceProviderEntryViewModels.Add(viewModel); + else if (entry.DefaultEntryInfo.IsEssential) + EssentialEntryViewModels.Add(viewModel); + else + OtherEntryViewModels.Add(viewModel); } - return true; + FetchingDefaultEntries = false; } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml new file mode 100644 index 000000000..5c5fc7f8a --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Install + + + + + Already installed + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml.cs new file mode 100644 index 000000000..a19ca2816 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemView.axaml.cs @@ -0,0 +1,11 @@ +using Avalonia.ReactiveUI; + +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public partial class DefaultEntryItemView : ReactiveUserControl +{ + public DefaultEntryItemView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs new file mode 100644 index 000000000..3568f3d08 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using System.Reactive.Disposables; +using System.Threading; +using System.Threading.Tasks; +using Artemis.Core; +using Artemis.Core.Services; +using Artemis.UI.DryIoc.Factories; +using Artemis.UI.Screens.Plugins; +using Artemis.UI.Shared; +using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Utilities; +using Artemis.WebClient.Workshop; +using Artemis.WebClient.Workshop.Handlers.InstallationHandlers; +using Artemis.WebClient.Workshop.Models; +using Artemis.WebClient.Workshop.Services; +using PropertyChanged.SourceGenerator; +using ReactiveUI; +using StrawberryShake; + +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public partial class DefaultEntryItemViewModel : ActivatableViewModelBase +{ + private readonly IWorkshopService _workshopService; + private readonly IWindowService _windowService; + private readonly IPluginManagementService _pluginManagementService; + private readonly ISettingsVmFactory _settingsVmFactory; + private readonly Progress _progress = new(); + + [Notify] private bool _isInstalled; + [Notify] private bool _shouldInstall; + + public DefaultEntryItemViewModel(IEntrySummary entry, IWorkshopService workshopService, IWindowService windowService, IPluginManagementService pluginManagementService, ISettingsVmFactory settingsVmFactory) + { + _workshopService = workshopService; + _windowService = windowService; + _pluginManagementService = pluginManagementService; + _settingsVmFactory = settingsVmFactory; + Entry = entry; + + this.WhenActivated((CompositeDisposable _) => { IsInstalled = workshopService.GetInstalledEntry(entry.Id) != null; }); + } + + public IEntrySummary Entry { get; } + + public async Task InstallEntry(CancellationToken cancellationToken) + { + if (IsInstalled || !ShouldInstall || Entry.LatestRelease == null) + return true; + + // Most entries install so quick it looks broken without a small delay + Task minimumDelay = Task.Delay(100, cancellationToken); + EntryInstallResult result = await _workshopService.InstallEntry(Entry, Entry.LatestRelease, _progress, cancellationToken); + await minimumDelay; + + if (!result.IsSuccess) + { + await _windowService.CreateContentDialog().WithTitle("Failed to install entry") + .WithContent($"Failed to install entry '{Entry.Name}' ({Entry.Id}): {result.Message}") + .WithCloseButtonText("Skip and continue") + .ShowAsync(); + } + // If the entry is a plugin, enable the plugin + else if (result.Entry?.EntryType == EntryType.Plugin) + { + await EnablePlugin(result.Entry); + } + + return result.IsSuccess; + } + + private async Task EnablePlugin(InstalledEntry entry) + { + if (!entry.TryGetMetadata("PluginId", out Guid pluginId)) + throw new InvalidOperationException("Plugin entry does not contain a PluginId metadata value."); + + Plugin? plugin = _pluginManagementService.GetAllPlugins().FirstOrDefault(p => p.Guid == pluginId); + if (plugin == null) + throw new InvalidOperationException($"Plugin with id '{pluginId}' does not exist."); + + // There's quite a bit of UI involved in enabling a plugin, borrowing the PluginSettingsViewModel for this + PluginViewModel pluginViewModel = _settingsVmFactory.PluginViewModel(plugin, ReactiveCommand.Create(() => { })); + await pluginViewModel.UpdateEnabled(true); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsView.axaml b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsView.axaml index dda4ba091..14790c176 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsView.axaml +++ b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsView.axaml @@ -63,8 +63,12 @@ - - Download by default (admin only) + + + Download by default (admin only) + Essential + Device provider + @@ -93,10 +97,10 @@ - - - - + + diff --git a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs index bea16889d..4ea3ed070 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs @@ -36,6 +36,8 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase [Notify] private string _summary = string.Empty; [Notify] private string _description = string.Empty; [Notify] private bool _isDefault; + [Notify] private bool _isEssential; + [Notify] private bool _isDeviceProvider; [Notify] private Bitmap? _iconBitmap; [Notify(Setter.Private)] private bool _iconChanged; diff --git a/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs b/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs index da3216050..bcef82f2c 100644 --- a/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs @@ -105,7 +105,9 @@ public partial class SubmissionDetailsViewModel : RoutableScreen specificationsViewModel.Name = Entry.Name; specificationsViewModel.Summary = Entry.Summary; specificationsViewModel.Description = Entry.Description; - specificationsViewModel.IsDefault = Entry.IsDefault; + specificationsViewModel.IsDefault = Entry.DefaultEntryInfo != null; + specificationsViewModel.IsEssential = Entry.DefaultEntryInfo?.IsEssential ?? false; + specificationsViewModel.IsDeviceProvider = Entry.DefaultEntryInfo?.IsDeviceProvider ?? false; specificationsViewModel.PreselectedCategories = Entry.Categories.Select(c => c.Id).ToList(); specificationsViewModel.Tags.Clear(); @@ -170,14 +172,29 @@ public partial class SubmissionDetailsViewModel : RoutableScreen HasChanges = EntrySpecificationsViewModel.Name != Entry.Name || EntrySpecificationsViewModel.Description != Entry.Description || EntrySpecificationsViewModel.Summary != Entry.Summary || - EntrySpecificationsViewModel.IsDefault != Entry.IsDefault || EntrySpecificationsViewModel.IconChanged || + HasAdminChanges() || !tags.SequenceEqual(Entry.Tags.Select(t => t.Name).OrderBy(t => t)) || !categories.SequenceEqual(Entry.Categories.Select(c => c.Id).OrderBy(c => c)) || Images.Any(i => i.HasChanges) || _removedImages.Any(); } + private bool HasAdminChanges() + { + if (EntrySpecificationsViewModel == null || Entry == null) + return false; + + bool isDefault = Entry.DefaultEntryInfo != null; + bool isEssential = Entry.DefaultEntryInfo?.IsEssential ?? false; + bool isDeviceProvider = Entry.DefaultEntryInfo?.IsDeviceProvider ?? false; + + return EntrySpecificationsViewModel.IsDefault != isDefault || + (EntrySpecificationsViewModel.IsDefault && ( + EntrySpecificationsViewModel.IsEssential != isEssential || + EntrySpecificationsViewModel.IsDeviceProvider != isDeviceProvider)); + } + private async Task ExecuteDiscardChanges() { await ApplyDetailsFromEntry(CancellationToken.None); @@ -194,9 +211,15 @@ public partial class SubmissionDetailsViewModel : RoutableScreen Name = EntrySpecificationsViewModel.Name, Summary = EntrySpecificationsViewModel.Summary, Description = EntrySpecificationsViewModel.Description, - IsDefault = EntrySpecificationsViewModel.IsDefault, Categories = EntrySpecificationsViewModel.SelectedCategories, - Tags = EntrySpecificationsViewModel.Tags + Tags = EntrySpecificationsViewModel.Tags, + DefaultEntryInfo = EntrySpecificationsViewModel.IsDefault + ? new DefaultEntryInfoInput + { + IsEssential = EntrySpecificationsViewModel.IsEssential, + IsDeviceProvider = EntrySpecificationsViewModel.IsDeviceProvider + } + : null }; IOperationResult result = await _client.UpdateEntry.ExecuteAsync(input, cancellationToken); diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Models/SubmissionWizardState.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Models/SubmissionWizardState.cs index 5e6927690..d64e7f691 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Models/SubmissionWizardState.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Models/SubmissionWizardState.cs @@ -33,6 +33,8 @@ public class SubmissionWizardState : IDisposable public string Summary { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public bool IsDefault { get; set; } + public bool IsEssential { get; set; } + public bool IsDeviceProvider { get; set; } public List Categories { get; set; } = new(); public List Tags { get; set; } = new(); diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs index 01a5c19fc..be4f864b9 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs @@ -66,6 +66,8 @@ public partial class SpecificationsStepViewModel : SubmissionViewModel viewModel.Summary = State.Summary; viewModel.Description = State.Description; viewModel.IsDefault = State.IsDefault; + viewModel.IsEssential = State.IsEssential; + viewModel.IsDeviceProvider = State.IsDeviceProvider; // Tags viewModel.Tags.Clear(); @@ -95,6 +97,8 @@ public partial class SpecificationsStepViewModel : SubmissionViewModel State.Summary = EntrySpecificationsViewModel.Summary; State.Description = EntrySpecificationsViewModel.Description; State.IsDefault = EntrySpecificationsViewModel.IsDefault; + State.IsEssential = EntrySpecificationsViewModel.IsEssential; + State.IsDeviceProvider = EntrySpecificationsViewModel.IsDeviceProvider; // Categories and tasks State.Categories = EntrySpecificationsViewModel.Categories.Where(c => c.IsSelected).Select(c => c.Id).ToList(); diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/UploadStepViewModel.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/UploadStepViewModel.cs index c205e24aa..ffb7cdd87 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/UploadStepViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/UploadStepViewModel.cs @@ -105,7 +105,14 @@ public partial class UploadStepViewModel : SubmissionViewModel Summary = State.Summary, Description = State.Description, Categories = State.Categories, - Tags = State.Tags + Tags = State.Tags, + DefaultEntryInfo = State.IsDefault + ? new DefaultEntryInfoInput + { + IsEssential = State.IsEssential, + IsDeviceProvider = State.IsDeviceProvider + } + : null }, cancellationToken); result.EnsureNoErrors(); diff --git a/src/Artemis.WebClient.Workshop/Queries/Fragments.graphql b/src/Artemis.WebClient.Workshop/Queries/Fragments.graphql index a1f8eb669..f1c94bfa2 100644 --- a/src/Artemis.WebClient.Workshop/Queries/Fragments.graphql +++ b/src/Artemis.WebClient.Workshop/Queries/Fragments.graphql @@ -6,7 +6,7 @@ fragment category on Category { fragment image on Image { id name - description + description } fragment layoutInfo on LayoutInfo { @@ -26,7 +26,9 @@ fragment submittedEntry on Entry { entryType downloads createdAt - isDefault + defaultEntryInfo { + ...defaultEntryInfo + } latestRelease { ...release } @@ -48,6 +50,9 @@ fragment entrySummary on Entry { categories { ...category } + defaultEntryInfo { + ...defaultEntryInfo + } } fragment entryDetails on Entry { @@ -77,7 +82,7 @@ fragment release on Release { downloadSize md5Hash createdAt -} +} fragment releaseDetails on Release { ...release @@ -95,4 +100,9 @@ fragment pluginInfo on PluginInfo { supportsWindows supportsLinux supportsOSX +} + +fragment defaultEntryInfo on DefaultEntryInfo { + isEssential + isDeviceProvider } \ No newline at end of file diff --git a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql index 3827be7ea..782faa984 100644 --- a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql +++ b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql @@ -20,8 +20,12 @@ query GetPopularEntries { } } -query GetDefaultEntries($first: Int $after: String) { - entriesV2(where: {isDefault: {eq: true}} first: $first after: $after) { +query GetDefaultEntries($first: Int, $after: String) { + entriesV2( + where: { defaultEntryInfo: { entryId: { gt: 0 } } } + first: $first + after: $after + ) { totalCount pageInfo { hasNextPage diff --git a/src/Artemis.WebClient.Workshop/WorkshopConstants.cs b/src/Artemis.WebClient.Workshop/WorkshopConstants.cs index 10807064c..907ddb843 100644 --- a/src/Artemis.WebClient.Workshop/WorkshopConstants.cs +++ b/src/Artemis.WebClient.Workshop/WorkshopConstants.cs @@ -2,10 +2,10 @@ namespace Artemis.WebClient.Workshop; public static class WorkshopConstants { - // public const string AUTHORITY_URL = "https://localhost:5001"; - // public const string WORKSHOP_URL = "https://localhost:7281"; - public const string AUTHORITY_URL = "https://identity.artemis-rgb.com"; - public const string WORKSHOP_URL = "https://workshop.artemis-rgb.com"; + public const string AUTHORITY_URL = "https://localhost:5001"; + public const string WORKSHOP_URL = "https://localhost:7281"; + // public const string AUTHORITY_URL = "https://identity.artemis-rgb.com"; + // public const string WORKSHOP_URL = "https://workshop.artemis-rgb.com"; public const string IDENTITY_CLIENT_NAME = "IdentityApiClient"; public const string WORKSHOP_CLIENT_NAME = "WorkshopApiClient"; } \ No newline at end of file diff --git a/src/Artemis.WebClient.Workshop/graphql.config.yml b/src/Artemis.WebClient.Workshop/graphql.config.yml index 9662a514f..4e6e409e5 100644 --- a/src/Artemis.WebClient.Workshop/graphql.config.yml +++ b/src/Artemis.WebClient.Workshop/graphql.config.yml @@ -2,7 +2,7 @@ schema: schema.graphql extensions: endpoints: Default GraphQL Endpoint: - url: https://workshop.artemis-rgb.com/graphql + url: https://localhost:7281/graphql/ headers: user-agent: JS GraphQL introspect: true diff --git a/src/Artemis.WebClient.Workshop/schema.graphql b/src/Artemis.WebClient.Workshop/schema.graphql index f07aef9e7..17190a026 100644 --- a/src/Artemis.WebClient.Workshop/schema.graphql +++ b/src/Artemis.WebClient.Workshop/schema.graphql @@ -1,631 +1,641 @@ # This file was generated. Do not edit manually. schema { - query: Query - mutation: Mutation + query: Query + mutation: Mutation } type Category { - icon: String! - id: Long! - name: String! + id: Long! + name: String! + icon: String! } "Information about the offset pagination." type CollectionSegmentInfo { - "Indicates whether more items exist following the set defined by the clients arguments." - hasNextPage: Boolean! - "Indicates whether more items exist prior the set defined by the clients arguments." - hasPreviousPage: Boolean! + "Indicates whether more items exist following the set defined by the clients arguments." + hasNextPage: Boolean! + "Indicates whether more items exist prior the set defined by the clients arguments." + hasPreviousPage: Boolean! +} + +type DefaultEntryInfo { + entryId: Long! + isEssential: Boolean! + isDeviceProvider: Boolean! } "A segment of a collection." type EntriesCollectionSegment { - "A flattened list of the items." - items: [Entry!] - "Information to aid in pagination." - pageInfo: CollectionSegmentInfo! - totalCount: Int! + "Information to aid in pagination." + pageInfo: CollectionSegmentInfo! + "A flattened list of the items." + items: [Entry!] + totalCount: Int! @cost(weight: "10") } "A connection to a list of items." type EntriesV2Connection { - "A list of edges." - edges: [EntriesV2Edge!] - "A flattened list of the nodes." - nodes: [Entry!] - "Information to aid in pagination." - pageInfo: PageInfo! - "Identifies the total count of items in the connection." - totalCount: Int! + "Information to aid in pagination." + pageInfo: PageInfo! + "A list of edges." + edges: [EntriesV2Edge!] + "A flattened list of the nodes." + nodes: [Entry!] + "Identifies the total count of items in the connection." + totalCount: Int! @cost(weight: "10") } "An edge in a connection." type EntriesV2Edge { - "A cursor for use in pagination." - cursor: String! - "The item at the end of the edge." - node: Entry! + "A cursor for use in pagination." + cursor: String! + "The item at the end of the edge." + node: Entry! } type Entry { - author: String! - authorId: UUID! - categories: [Category!]! - createdAt: DateTime! - dependantReleases: [Release!]! - description: String! - downloads: Long! - entryType: EntryType! - icon: Image - iconId: UUID - id: Long! - images: [Image!]! - isDefault: Boolean! - isOfficial: Boolean! - latestRelease: Release - latestReleaseId: Long - layoutInfo: [LayoutInfo!]! - name: String! - pluginInfo: PluginInfo - popularityScore: Float! - releases: [Release!]! - summary: String! - tags: [Tag!]! + id: Long! + entryType: EntryType! + createdAt: DateTime! + authorId: UUID! + author: String! + isOfficial: Boolean! + name: String! + summary: String! + description: String! + downloads: Long! + iconId: UUID + icon: Image + latestReleaseId: Long + latestRelease: Release + pluginInfo: PluginInfo + layoutInfo: [LayoutInfo!]! + defaultEntryInfo: DefaultEntryInfo + categories: [Category!]! + tags: [Tag!]! + images: [Image!]! + releases: [Release!]! + dependantReleases: [Release!]! } type Image { - description: String - entry: Entry - entryId: Long - height: Int! - id: UUID! - mimeType: String! - name: String! - size: Long! - width: Int! + id: UUID! + name: String! + description: String + width: Int! + height: Int! + size: Long! + mimeType: String! + entry: Entry + entryId: Long } type LayoutInfo { - deviceProvider: UUID! - deviceType: RGBDeviceType! - entry: Entry! - entryId: Long! - id: Long! - logicalLayout: String - model: String! - physicalLayout: KeyboardLayoutType - vendor: String! + id: Long! + deviceProvider: UUID! + deviceType: RGBDeviceType! + vendor: String! + model: String! + physicalLayout: KeyboardLayoutType + logicalLayout: String + entryId: Long! + entry: Entry! } type Mutation { - addEntry(input: CreateEntryInput!): Entry - addLayoutInfo(input: CreateLayoutInfoInput!): LayoutInfo - removeEntry(id: Long!): Entry - removeLayoutInfo(id: Long!): LayoutInfo! - removeRelease(id: Long!): Release! - setLayoutInfo(input: SetLayoutInfoInput!): [LayoutInfo!]! - updateEntry(input: UpdateEntryInput!): Entry - updateEntryImage(input: UpdateEntryImageInput!): Image - updateRelease(input: UpdateReleaseInput!): Release + addEntry(input: CreateEntryInput!): Entry @authorize @cost(weight: "10") + updateEntry(input: UpdateEntryInput!): Entry @authorize @cost(weight: "10") + removeEntry(id: Long!): Entry @authorize @cost(weight: "10") + updateEntryImage(input: UpdateEntryImageInput!): Image @authorize @cost(weight: "10") + setLayoutInfo(input: SetLayoutInfoInput!): [LayoutInfo!]! @authorize @cost(weight: "10") + addLayoutInfo(input: CreateLayoutInfoInput!): LayoutInfo @authorize @cost(weight: "10") + removeLayoutInfo(id: Long!): LayoutInfo! @authorize @cost(weight: "10") + updateRelease(input: UpdateReleaseInput!): Release @authorize @cost(weight: "10") + removeRelease(id: Long!): Release! @authorize @cost(weight: "10") } "Information about pagination in a connection." type PageInfo { - "When paginating forwards, the cursor to continue." - endCursor: String - "Indicates whether more edges exist following the set defined by the clients arguments." - hasNextPage: Boolean! - "Indicates whether more edges exist prior the set defined by the clients arguments." - hasPreviousPage: Boolean! - "When paginating backwards, the cursor to continue." - startCursor: String + "Indicates whether more edges exist following the set defined by the clients arguments." + hasNextPage: Boolean! + "Indicates whether more edges exist prior the set defined by the clients arguments." + hasPreviousPage: Boolean! + "When paginating backwards, the cursor to continue." + startCursor: String + "When paginating forwards, the cursor to continue." + endCursor: String } type PluginInfo { - api: Int - entry: Entry! - entryId: Long! - helpPage: String - minmumVersion: String - pluginGuid: UUID! - repository: String - requiresAdmin: Boolean! - supportsLinux: Boolean! - supportsOSX: Boolean! - supportsWindows: Boolean! - website: String + entryId: Long! + entry: Entry! + pluginGuid: UUID! + api: Int + minmumVersion: String + website: String + helpPage: String + repository: String + requiresAdmin: Boolean! + supportsWindows: Boolean! + supportsLinux: Boolean! + supportsOSX: Boolean! } "A segment of a collection." type PluginInfosCollectionSegment { - "A flattened list of the items." - items: [PluginInfo!] - "Information to aid in pagination." - pageInfo: CollectionSegmentInfo! - totalCount: Int! + "Information to aid in pagination." + pageInfo: CollectionSegmentInfo! + "A flattened list of the items." + items: [PluginInfo!] + totalCount: Int! @cost(weight: "10") } type Query { - categories(order: [CategorySortInput!], where: CategoryFilterInput): [Category!]! - entries(order: [EntrySortInput!], popular: Boolean, search: String, skip: Int, take: Int, where: EntryFilterInput): EntriesCollectionSegment - entriesV2( - "Returns the elements in the list that come after the specified cursor." - after: String, - "Returns the elements in the list that come before the specified cursor." - before: String, - "Returns the first _n_ elements from the list." - first: Int, - "Returns the last _n_ elements from the list." - last: Int, - order: [EntrySortInput!], - popular: Boolean, - search: String, - where: EntryFilterInput - ): EntriesV2Connection - entry(id: Long!): Entry - pluginInfo(pluginGuid: UUID!): PluginInfo - pluginInfos(order: [PluginInfoSortInput!], skip: Int, take: Int, where: PluginInfoFilterInput): PluginInfosCollectionSegment - popularEntries(where: EntryFilterInput): [Entry!]! - release(id: Long!): Release - searchEntries(input: String!, order: [EntrySortInput!], type: EntryType, where: EntryFilterInput): [Entry!]! - searchKeyboardLayout(deviceProvider: UUID!, logicalLayout: String, model: String!, physicalLayout: KeyboardLayoutType!, vendor: String!): LayoutInfo - searchLayout(deviceProvider: UUID!, deviceType: RGBDeviceType!, model: String!, vendor: String!): LayoutInfo - submittedEntries(order: [EntrySortInput!], where: EntryFilterInput): [Entry!]! + categories(order: [CategorySortInput!] @cost(weight: "10") where: CategoryFilterInput @cost(weight: "10")): [Category!]! @cost(weight: "10") + entries(skip: Int take: Int search: String popular: Boolean order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): EntriesCollectionSegment @listSize(assumedSize: 100, slicingArguments: [ "take" ], slicingArgumentDefaultValue: 10, sizedFields: [ "items" ], requireOneSlicingArgument: false) @cost(weight: "10") + entriesV2(search: String popular: Boolean "Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): EntriesV2Connection @listSize(assumedSize: 100, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) @cost(weight: "10") + entry(id: Long!): Entry @cost(weight: "10") + submittedEntries(order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): [Entry!]! @authorize @cost(weight: "10") + popularEntries(where: EntryFilterInput @cost(weight: "10")): [Entry!]! @cost(weight: "10") + searchEntries(input: String! type: EntryType order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): [Entry!]! @cost(weight: "10") + searchLayout(deviceProvider: UUID! deviceType: RGBDeviceType! vendor: String! model: String!): LayoutInfo @cost(weight: "10") + searchKeyboardLayout(deviceProvider: UUID! vendor: String! model: String! physicalLayout: KeyboardLayoutType! logicalLayout: String): LayoutInfo @cost(weight: "10") + pluginInfos(skip: Int take: Int order: [PluginInfoSortInput!] @cost(weight: "10") where: PluginInfoFilterInput @cost(weight: "10")): PluginInfosCollectionSegment @listSize(assumedSize: 100, slicingArguments: [ "take" ], slicingArgumentDefaultValue: 10, sizedFields: [ "items" ], requireOneSlicingArgument: false) @cost(weight: "10") + pluginInfo(pluginGuid: UUID!): PluginInfo @cost(weight: "10") + release(id: Long!): Release @cost(weight: "10") } type Release { - changelog: String - createdAt: DateTime! - dependencies: [Entry!]! - downloadSize: Long! - downloads: Long! - entry: Entry! - entryId: Long! - id: Long! - md5Hash: String - version: String! + id: Long! + version: String! + changelog: String + createdAt: DateTime! + downloads: Long! + downloadSize: Long! + md5Hash: String + entry: Entry! + entryId: Long! + dependencies: [Entry!]! } type Tag { - id: Long! - name: String! + id: Long! + name: String! } +input BooleanOperationFilterInput { + eq: Boolean @cost(weight: "10") + neq: Boolean @cost(weight: "10") +} + +input CategoryFilterInput { + and: [CategoryFilterInput!] + or: [CategoryFilterInput!] + id: LongOperationFilterInput + name: StringOperationFilterInput + icon: StringOperationFilterInput +} + +input CategorySortInput { + id: SortEnumType @cost(weight: "10") + name: SortEnumType @cost(weight: "10") + icon: SortEnumType @cost(weight: "10") +} + +input CreateEntryInput { + entryType: EntryType! + name: String! + summary: String! + description: String! + categories: [Long!]! + tags: [String!]! + defaultEntryInfo: DefaultEntryInfoInput +} + +input CreateLayoutInfoInput { + entryId: Long! + deviceProvider: UUID! + deviceType: RGBDeviceType! + vendor: String! + model: String! + physicalLayout: KeyboardLayoutType + logicalLayout: String +} + +input DateTimeOperationFilterInput { + eq: DateTime @cost(weight: "10") + neq: DateTime @cost(weight: "10") + in: [DateTime] @cost(weight: "10") + nin: [DateTime] @cost(weight: "10") + gt: DateTime @cost(weight: "10") + ngt: DateTime @cost(weight: "10") + gte: DateTime @cost(weight: "10") + ngte: DateTime @cost(weight: "10") + lt: DateTime @cost(weight: "10") + nlt: DateTime @cost(weight: "10") + lte: DateTime @cost(weight: "10") + nlte: DateTime @cost(weight: "10") +} + +input DefaultEntryInfoFilterInput { + and: [DefaultEntryInfoFilterInput!] + or: [DefaultEntryInfoFilterInput!] + entryId: LongOperationFilterInput + isEssential: BooleanOperationFilterInput + isDeviceProvider: BooleanOperationFilterInput +} + +input DefaultEntryInfoInput { + isEssential: Boolean! + isDeviceProvider: Boolean! +} + +input DefaultEntryInfoSortInput { + entryId: SortEnumType @cost(weight: "10") + isEssential: SortEnumType @cost(weight: "10") + isDeviceProvider: SortEnumType @cost(weight: "10") +} + +input EntryFilterInput { + and: [EntryFilterInput!] + or: [EntryFilterInput!] + id: LongOperationFilterInput + entryType: EntryTypeOperationFilterInput + createdAt: DateTimeOperationFilterInput + authorId: UuidOperationFilterInput + author: StringOperationFilterInput + isOfficial: BooleanOperationFilterInput + name: StringOperationFilterInput + summary: StringOperationFilterInput + description: StringOperationFilterInput + downloads: LongOperationFilterInput + iconId: UuidOperationFilterInput + icon: ImageFilterInput + latestReleaseId: LongOperationFilterInput + latestRelease: ReleaseFilterInput + pluginInfo: PluginInfoFilterInput + layoutInfo: ListFilterInputTypeOfLayoutInfoFilterInput + defaultEntryInfo: DefaultEntryInfoFilterInput + categories: ListFilterInputTypeOfCategoryFilterInput + tags: ListFilterInputTypeOfTagFilterInput + images: ListFilterInputTypeOfImageFilterInput + releases: ListFilterInputTypeOfReleaseFilterInput + dependantReleases: ListFilterInputTypeOfReleaseFilterInput +} + +input EntrySortInput { + id: SortEnumType @cost(weight: "10") + entryType: SortEnumType @cost(weight: "10") + createdAt: SortEnumType @cost(weight: "10") + authorId: SortEnumType @cost(weight: "10") + author: SortEnumType @cost(weight: "10") + isOfficial: SortEnumType @cost(weight: "10") + name: SortEnumType @cost(weight: "10") + summary: SortEnumType @cost(weight: "10") + description: SortEnumType @cost(weight: "10") + downloads: SortEnumType @cost(weight: "10") + iconId: SortEnumType @cost(weight: "10") + icon: ImageSortInput @cost(weight: "10") + latestReleaseId: SortEnumType @cost(weight: "10") + latestRelease: ReleaseSortInput @cost(weight: "10") + pluginInfo: PluginInfoSortInput @cost(weight: "10") + defaultEntryInfo: DefaultEntryInfoSortInput @cost(weight: "10") +} + +input EntryTypeOperationFilterInput { + eq: EntryType @cost(weight: "10") + neq: EntryType @cost(weight: "10") + in: [EntryType!] @cost(weight: "10") + nin: [EntryType!] @cost(weight: "10") +} + +input ImageFilterInput { + and: [ImageFilterInput!] + or: [ImageFilterInput!] + id: UuidOperationFilterInput + name: StringOperationFilterInput + description: StringOperationFilterInput + width: IntOperationFilterInput + height: IntOperationFilterInput + size: LongOperationFilterInput + mimeType: StringOperationFilterInput + entry: EntryFilterInput + entryId: LongOperationFilterInput +} + +input ImageSortInput { + id: SortEnumType @cost(weight: "10") + name: SortEnumType @cost(weight: "10") + description: SortEnumType @cost(weight: "10") + width: SortEnumType @cost(weight: "10") + height: SortEnumType @cost(weight: "10") + size: SortEnumType @cost(weight: "10") + mimeType: SortEnumType @cost(weight: "10") + entry: EntrySortInput @cost(weight: "10") + entryId: SortEnumType @cost(weight: "10") +} + +input IntOperationFilterInput { + eq: Int @cost(weight: "10") + neq: Int @cost(weight: "10") + in: [Int] @cost(weight: "10") + nin: [Int] @cost(weight: "10") + gt: Int @cost(weight: "10") + ngt: Int @cost(weight: "10") + gte: Int @cost(weight: "10") + ngte: Int @cost(weight: "10") + lt: Int @cost(weight: "10") + nlt: Int @cost(weight: "10") + lte: Int @cost(weight: "10") + nlte: Int @cost(weight: "10") +} + +input LayoutInfoFilterInput { + and: [LayoutInfoFilterInput!] + or: [LayoutInfoFilterInput!] + id: LongOperationFilterInput + deviceProvider: UuidOperationFilterInput + deviceType: RGBDeviceTypeOperationFilterInput + vendor: StringOperationFilterInput + model: StringOperationFilterInput + physicalLayout: NullableOfKeyboardLayoutTypeOperationFilterInput + logicalLayout: StringOperationFilterInput + entryId: LongOperationFilterInput + entry: EntryFilterInput +} + +input LayoutInfoInput { + deviceProvider: UUID! + deviceType: RGBDeviceType! + vendor: String! + model: String! + physicalLayout: KeyboardLayoutType + logicalLayout: String +} + +input ListFilterInputTypeOfCategoryFilterInput { + all: CategoryFilterInput @cost(weight: "10") + none: CategoryFilterInput @cost(weight: "10") + some: CategoryFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input ListFilterInputTypeOfEntryFilterInput { + all: EntryFilterInput @cost(weight: "10") + none: EntryFilterInput @cost(weight: "10") + some: EntryFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input ListFilterInputTypeOfImageFilterInput { + all: ImageFilterInput @cost(weight: "10") + none: ImageFilterInput @cost(weight: "10") + some: ImageFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input ListFilterInputTypeOfLayoutInfoFilterInput { + all: LayoutInfoFilterInput @cost(weight: "10") + none: LayoutInfoFilterInput @cost(weight: "10") + some: LayoutInfoFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input ListFilterInputTypeOfReleaseFilterInput { + all: ReleaseFilterInput @cost(weight: "10") + none: ReleaseFilterInput @cost(weight: "10") + some: ReleaseFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input ListFilterInputTypeOfTagFilterInput { + all: TagFilterInput @cost(weight: "10") + none: TagFilterInput @cost(weight: "10") + some: TagFilterInput @cost(weight: "10") + any: Boolean @cost(weight: "10") +} + +input LongOperationFilterInput { + eq: Long @cost(weight: "10") + neq: Long @cost(weight: "10") + in: [Long] @cost(weight: "10") + nin: [Long] @cost(weight: "10") + gt: Long @cost(weight: "10") + ngt: Long @cost(weight: "10") + gte: Long @cost(weight: "10") + ngte: Long @cost(weight: "10") + lt: Long @cost(weight: "10") + nlt: Long @cost(weight: "10") + lte: Long @cost(weight: "10") + nlte: Long @cost(weight: "10") +} + +input NullableOfKeyboardLayoutTypeOperationFilterInput { + eq: KeyboardLayoutType @cost(weight: "10") + neq: KeyboardLayoutType @cost(weight: "10") + in: [KeyboardLayoutType] @cost(weight: "10") + nin: [KeyboardLayoutType] @cost(weight: "10") +} + +input PluginInfoFilterInput { + and: [PluginInfoFilterInput!] + or: [PluginInfoFilterInput!] + entryId: LongOperationFilterInput + entry: EntryFilterInput + pluginGuid: UuidOperationFilterInput + api: IntOperationFilterInput + minmumVersion: StringOperationFilterInput + website: StringOperationFilterInput + helpPage: StringOperationFilterInput + repository: StringOperationFilterInput + requiresAdmin: BooleanOperationFilterInput + supportsWindows: BooleanOperationFilterInput + supportsLinux: BooleanOperationFilterInput + supportsOSX: BooleanOperationFilterInput +} + +input PluginInfoSortInput { + entryId: SortEnumType @cost(weight: "10") + entry: EntrySortInput @cost(weight: "10") + pluginGuid: SortEnumType @cost(weight: "10") + api: SortEnumType @cost(weight: "10") + minmumVersion: SortEnumType @cost(weight: "10") + website: SortEnumType @cost(weight: "10") + helpPage: SortEnumType @cost(weight: "10") + repository: SortEnumType @cost(weight: "10") + requiresAdmin: SortEnumType @cost(weight: "10") + supportsWindows: SortEnumType @cost(weight: "10") + supportsLinux: SortEnumType @cost(weight: "10") + supportsOSX: SortEnumType @cost(weight: "10") +} + +input RGBDeviceTypeOperationFilterInput { + eq: RGBDeviceType @cost(weight: "10") + neq: RGBDeviceType @cost(weight: "10") + in: [RGBDeviceType!] @cost(weight: "10") + nin: [RGBDeviceType!] @cost(weight: "10") +} + +input ReleaseFilterInput { + and: [ReleaseFilterInput!] + or: [ReleaseFilterInput!] + id: LongOperationFilterInput + version: StringOperationFilterInput + changelog: StringOperationFilterInput + createdAt: DateTimeOperationFilterInput + downloads: LongOperationFilterInput + downloadSize: LongOperationFilterInput + md5Hash: StringOperationFilterInput + entry: EntryFilterInput + entryId: LongOperationFilterInput + dependencies: ListFilterInputTypeOfEntryFilterInput +} + +input ReleaseSortInput { + id: SortEnumType @cost(weight: "10") + version: SortEnumType @cost(weight: "10") + changelog: SortEnumType @cost(weight: "10") + createdAt: SortEnumType @cost(weight: "10") + downloads: SortEnumType @cost(weight: "10") + downloadSize: SortEnumType @cost(weight: "10") + md5Hash: SortEnumType @cost(weight: "10") + entry: EntrySortInput @cost(weight: "10") + entryId: SortEnumType @cost(weight: "10") +} + +input SetLayoutInfoInput { + entryId: Long! + layoutInfo: [LayoutInfoInput!]! +} + +input StringOperationFilterInput { + and: [StringOperationFilterInput!] + or: [StringOperationFilterInput!] + eq: String @cost(weight: "10") + neq: String @cost(weight: "10") + contains: String @cost(weight: "20") + ncontains: String @cost(weight: "20") + in: [String] @cost(weight: "10") + nin: [String] @cost(weight: "10") + startsWith: String @cost(weight: "20") + nstartsWith: String @cost(weight: "20") + endsWith: String @cost(weight: "20") + nendsWith: String @cost(weight: "20") +} + +input TagFilterInput { + and: [TagFilterInput!] + or: [TagFilterInput!] + id: LongOperationFilterInput + name: StringOperationFilterInput +} + +input UpdateEntryImageInput { + id: UUID! + name: String! + description: String +} + +input UpdateEntryInput { + id: Long! + name: String! + summary: String! + description: String! + categories: [Long!]! + tags: [String!]! + defaultEntryInfo: DefaultEntryInfoInput +} + +input UpdateReleaseInput { + id: Long! + changelog: String +} + +input UuidOperationFilterInput { + eq: UUID @cost(weight: "10") + neq: UUID @cost(weight: "10") + in: [UUID] @cost(weight: "10") + nin: [UUID] @cost(weight: "10") + gt: UUID @cost(weight: "10") + ngt: UUID @cost(weight: "10") + gte: UUID @cost(weight: "10") + ngte: UUID @cost(weight: "10") + lt: UUID @cost(weight: "10") + nlt: UUID @cost(weight: "10") + lte: UUID @cost(weight: "10") + nlte: UUID @cost(weight: "10") +} + +"Defines when a policy shall be executed." enum ApplyPolicy { - AFTER_RESOLVER - BEFORE_RESOLVER - VALIDATION + "Before the resolver was executed." + BEFORE_RESOLVER + "After the resolver was executed." + AFTER_RESOLVER + "The policy is applied in the validation step before the execution." + VALIDATION } enum EntryType { - LAYOUT - PLUGIN - PROFILE + PLUGIN + PROFILE + LAYOUT } enum KeyboardLayoutType { - ABNT - ANSI - ISO - JIS - KS - UNKNOWN + UNKNOWN + ANSI + ISO + JIS + ABNT + KS } enum RGBDeviceType { - ALL - COOLER - DRAM - FAN - GAME_CONTROLLER - GRAPHICS_CARD - HEADSET - HEADSET_STAND - KEYBOARD - KEYPAD - LED_CONTROLLER - LED_MATRIX - LED_STRIPE - MAINBOARD - MONITOR - MOUSE - MOUSEPAD - NONE - SPEAKER - UNKNOWN + NONE + KEYBOARD + MOUSE + HEADSET + MOUSEPAD + LED_STRIPE + LED_MATRIX + MAINBOARD + GRAPHICS_CARD + DRAM + HEADSET_STAND + KEYPAD + FAN + SPEAKER + COOLER + MONITOR + LED_CONTROLLER + GAME_CONTROLLER + UNKNOWN + ALL } enum SortEnumType { - ASC - DESC + ASC + DESC } +"The authorize directive." +directive @authorize("The name of the authorization policy that determines access to the annotated resource." policy: String "Roles that are allowed to access the annotated resource." roles: [String!] "Defines when when the authorize directive shall be applied.By default the authorize directives are applied during the validation phase." apply: ApplyPolicy! = BEFORE_RESOLVER) repeatable on OBJECT | FIELD_DEFINITION + +"The purpose of the `cost` directive is to define a `weight` for GraphQL types, fields, and arguments. Static analysis can use these weights when calculating the overall cost of a query or response." +directive @cost("The `weight` argument defines what value to add to the overall cost for every appearance, or possible appearance, of a type, field, argument, etc." weight: String!) on SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | ENUM | INPUT_FIELD_DEFINITION + +"The purpose of the `@listSize` directive is to either inform the static analysis about the size of returned lists (if that information is statically available), or to point the analysis to where to find that information." +directive @listSize("The `assumedSize` argument can be used to statically define the maximum length of a list returned by a field." assumedSize: Int "The `slicingArguments` argument can be used to define which of the field's arguments with numeric type are slicing arguments, so that their value determines the size of the list returned by that field. It may specify a list of multiple slicing arguments." slicingArguments: [String!] "The `slicingArgumentDefaultValue` argument can be used to define a default value for a slicing argument, which is used if the argument is not present in a query." slicingArgumentDefaultValue: Int "The `sizedFields` argument can be used to define that the value of the `assumedSize` argument or of a slicing argument does not affect the size of a list returned by a field itself, but that of a list returned by one of its sub-fields." sizedFields: [String!] "The `requireOneSlicingArgument` argument can be used to inform the static analysis that it should expect that exactly one of the defined slicing arguments is present in a query. If that is not the case (i.e., if none or multiple slicing arguments are present), the static analysis may throw an error." requireOneSlicingArgument: Boolean! = true) on FIELD_DEFINITION + +"The `@specifiedBy` directive is used within the type system definition language to provide a URL for specifying the behavior of custom scalar definitions." +directive @specifiedBy("The specifiedBy URL points to a human-readable specification. This field will only read a result for scalar types." url: String!) on SCALAR + "The `DateTime` scalar represents an ISO-8601 compliant date time type." -scalar DateTime +scalar DateTime @specifiedBy(url: "https:\/\/www.graphql-scalars.com\/date-time") "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long -scalar UUID - -input BooleanOperationFilterInput { - eq: Boolean - neq: Boolean -} - -input CategoryFilterInput { - and: [CategoryFilterInput!] - icon: StringOperationFilterInput - id: LongOperationFilterInput - name: StringOperationFilterInput - or: [CategoryFilterInput!] -} - -input CategorySortInput { - icon: SortEnumType - id: SortEnumType - name: SortEnumType -} - -input CreateEntryInput { - categories: [Long!]! - description: String! - entryType: EntryType! - isDefault: Boolean! - name: String! - summary: String! - tags: [String!]! -} - -input CreateLayoutInfoInput { - deviceProvider: UUID! - deviceType: RGBDeviceType! - entryId: Long! - logicalLayout: String - model: String! - physicalLayout: KeyboardLayoutType - vendor: String! -} - -input DateTimeOperationFilterInput { - eq: DateTime - gt: DateTime - gte: DateTime - in: [DateTime] - lt: DateTime - lte: DateTime - neq: DateTime - ngt: DateTime - ngte: DateTime - nin: [DateTime] - nlt: DateTime - nlte: DateTime -} - -input EntryFilterInput { - and: [EntryFilterInput!] - author: StringOperationFilterInput - authorId: UuidOperationFilterInput - categories: ListFilterInputTypeOfCategoryFilterInput - createdAt: DateTimeOperationFilterInput - dependantReleases: ListFilterInputTypeOfReleaseFilterInput - description: StringOperationFilterInput - downloads: LongOperationFilterInput - entryType: EntryTypeOperationFilterInput - icon: ImageFilterInput - iconId: UuidOperationFilterInput - id: LongOperationFilterInput - images: ListFilterInputTypeOfImageFilterInput - isDefault: BooleanOperationFilterInput - isOfficial: BooleanOperationFilterInput - latestRelease: ReleaseFilterInput - latestReleaseId: LongOperationFilterInput - layoutInfo: ListFilterInputTypeOfLayoutInfoFilterInput - name: StringOperationFilterInput - or: [EntryFilterInput!] - pluginInfo: PluginInfoFilterInput - popularityScore: FloatOperationFilterInput - releases: ListFilterInputTypeOfReleaseFilterInput - summary: StringOperationFilterInput - tags: ListFilterInputTypeOfTagFilterInput -} - -input EntrySortInput { - author: SortEnumType - authorId: SortEnumType - createdAt: SortEnumType - description: SortEnumType - downloads: SortEnumType - entryType: SortEnumType - icon: ImageSortInput - iconId: SortEnumType - id: SortEnumType - isDefault: SortEnumType - isOfficial: SortEnumType - latestRelease: ReleaseSortInput - latestReleaseId: SortEnumType - name: SortEnumType - pluginInfo: PluginInfoSortInput - popularityScore: SortEnumType - summary: SortEnumType -} - -input EntryTypeOperationFilterInput { - eq: EntryType - in: [EntryType!] - neq: EntryType - nin: [EntryType!] -} - -input FloatOperationFilterInput { - eq: Float - gt: Float - gte: Float - in: [Float] - lt: Float - lte: Float - neq: Float - ngt: Float - ngte: Float - nin: [Float] - nlt: Float - nlte: Float -} - -input ImageFilterInput { - and: [ImageFilterInput!] - description: StringOperationFilterInput - entry: EntryFilterInput - entryId: LongOperationFilterInput - height: IntOperationFilterInput - id: UuidOperationFilterInput - mimeType: StringOperationFilterInput - name: StringOperationFilterInput - or: [ImageFilterInput!] - size: LongOperationFilterInput - width: IntOperationFilterInput -} - -input ImageSortInput { - description: SortEnumType - entry: EntrySortInput - entryId: SortEnumType - height: SortEnumType - id: SortEnumType - mimeType: SortEnumType - name: SortEnumType - size: SortEnumType - width: SortEnumType -} - -input IntOperationFilterInput { - eq: Int - gt: Int - gte: Int - in: [Int] - lt: Int - lte: Int - neq: Int - ngt: Int - ngte: Int - nin: [Int] - nlt: Int - nlte: Int -} - -input LayoutInfoFilterInput { - and: [LayoutInfoFilterInput!] - deviceProvider: UuidOperationFilterInput - deviceType: RGBDeviceTypeOperationFilterInput - entry: EntryFilterInput - entryId: LongOperationFilterInput - id: LongOperationFilterInput - logicalLayout: StringOperationFilterInput - model: StringOperationFilterInput - or: [LayoutInfoFilterInput!] - physicalLayout: NullableOfKeyboardLayoutTypeOperationFilterInput - vendor: StringOperationFilterInput -} - -input LayoutInfoInput { - deviceProvider: UUID! - deviceType: RGBDeviceType! - logicalLayout: String - model: String! - physicalLayout: KeyboardLayoutType - vendor: String! -} - -input ListFilterInputTypeOfCategoryFilterInput { - all: CategoryFilterInput - any: Boolean - none: CategoryFilterInput - some: CategoryFilterInput -} - -input ListFilterInputTypeOfEntryFilterInput { - all: EntryFilterInput - any: Boolean - none: EntryFilterInput - some: EntryFilterInput -} - -input ListFilterInputTypeOfImageFilterInput { - all: ImageFilterInput - any: Boolean - none: ImageFilterInput - some: ImageFilterInput -} - -input ListFilterInputTypeOfLayoutInfoFilterInput { - all: LayoutInfoFilterInput - any: Boolean - none: LayoutInfoFilterInput - some: LayoutInfoFilterInput -} - -input ListFilterInputTypeOfReleaseFilterInput { - all: ReleaseFilterInput - any: Boolean - none: ReleaseFilterInput - some: ReleaseFilterInput -} - -input ListFilterInputTypeOfTagFilterInput { - all: TagFilterInput - any: Boolean - none: TagFilterInput - some: TagFilterInput -} - -input LongOperationFilterInput { - eq: Long - gt: Long - gte: Long - in: [Long] - lt: Long - lte: Long - neq: Long - ngt: Long - ngte: Long - nin: [Long] - nlt: Long - nlte: Long -} - -input NullableOfKeyboardLayoutTypeOperationFilterInput { - eq: KeyboardLayoutType - in: [KeyboardLayoutType] - neq: KeyboardLayoutType - nin: [KeyboardLayoutType] -} - -input PluginInfoFilterInput { - and: [PluginInfoFilterInput!] - api: IntOperationFilterInput - entry: EntryFilterInput - entryId: LongOperationFilterInput - helpPage: StringOperationFilterInput - minmumVersion: StringOperationFilterInput - or: [PluginInfoFilterInput!] - pluginGuid: UuidOperationFilterInput - repository: StringOperationFilterInput - requiresAdmin: BooleanOperationFilterInput - supportsLinux: BooleanOperationFilterInput - supportsOSX: BooleanOperationFilterInput - supportsWindows: BooleanOperationFilterInput - website: StringOperationFilterInput -} - -input PluginInfoSortInput { - api: SortEnumType - entry: EntrySortInput - entryId: SortEnumType - helpPage: SortEnumType - minmumVersion: SortEnumType - pluginGuid: SortEnumType - repository: SortEnumType - requiresAdmin: SortEnumType - supportsLinux: SortEnumType - supportsOSX: SortEnumType - supportsWindows: SortEnumType - website: SortEnumType -} - -input RGBDeviceTypeOperationFilterInput { - eq: RGBDeviceType - in: [RGBDeviceType!] - neq: RGBDeviceType - nin: [RGBDeviceType!] -} - -input ReleaseFilterInput { - and: [ReleaseFilterInput!] - changelog: StringOperationFilterInput - createdAt: DateTimeOperationFilterInput - dependencies: ListFilterInputTypeOfEntryFilterInput - downloadSize: LongOperationFilterInput - downloads: LongOperationFilterInput - entry: EntryFilterInput - entryId: LongOperationFilterInput - id: LongOperationFilterInput - md5Hash: StringOperationFilterInput - or: [ReleaseFilterInput!] - version: StringOperationFilterInput -} - -input ReleaseSortInput { - changelog: SortEnumType - createdAt: SortEnumType - downloadSize: SortEnumType - downloads: SortEnumType - entry: EntrySortInput - entryId: SortEnumType - id: SortEnumType - md5Hash: SortEnumType - version: SortEnumType -} - -input SetLayoutInfoInput { - entryId: Long! - layoutInfo: [LayoutInfoInput!]! -} - -input StringOperationFilterInput { - and: [StringOperationFilterInput!] - contains: String - endsWith: String - eq: String - in: [String] - ncontains: String - nendsWith: String - neq: String - nin: [String] - nstartsWith: String - or: [StringOperationFilterInput!] - startsWith: String -} - -input TagFilterInput { - and: [TagFilterInput!] - id: LongOperationFilterInput - name: StringOperationFilterInput - or: [TagFilterInput!] -} - -input UpdateEntryImageInput { - description: String - id: UUID! - name: String! -} - -input UpdateEntryInput { - categories: [Long!]! - description: String! - id: Long! - isDefault: Boolean! - name: String! - summary: String! - tags: [String!]! -} - -input UpdateReleaseInput { - changelog: String - id: Long! -} - -input UuidOperationFilterInput { - eq: UUID - gt: UUID - gte: UUID - in: [UUID] - lt: UUID - lte: UUID - neq: UUID - ngt: UUID - ngte: UUID - nin: [UUID] - nlt: UUID - nlte: UUID -} +scalar UUID @specifiedBy(url: "https:\/\/tools.ietf.org\/html\/rfc4122") \ No newline at end of file diff --git a/src/Artemis.sln b/src/Artemis.sln index 7f7a038f0..6ffd58dcf 100644 --- a/src/Artemis.sln +++ b/src/Artemis.sln @@ -27,6 +27,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Artemis.sln.DotSettings.user = Artemis.sln.DotSettings.user Directory.Packages.props = Directory.Packages.props Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Storage.Legacy", "Artemis.Storage.Legacy\Artemis.Storage.Legacy.csproj", "{D7B0966D-774A-40E4-9455-00C1261ACB6A}" diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 000000000..4c08a9025 --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,12 @@ + + + + $(DefineConstants);ENABLE_XAML_HOT_RELOAD + + + + + + + + \ No newline at end of file diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 0d74712df..96732544e 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -66,5 +66,9 @@ + + + + \ No newline at end of file From 6d1e39c1cc712d70198fa2836e75a04e371e686c Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 22 Nov 2025 00:01:11 +0100 Subject: [PATCH 03/19] Try HotReload 3.0 --- src/Artemis.Core/Constants.cs | 2 +- src/Artemis.UI.Windows/App.axaml.cs | 3 --- src/Artemis.UI.Windows/Program.cs | 5 ++++- src/Artemis.UI/SerilogAvaloniaSink.cs | 6 +++--- src/Directory.Packages.props | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Artemis.Core/Constants.cs b/src/Artemis.Core/Constants.cs index a05acf32c..6ad386c9f 100644 --- a/src/Artemis.Core/Constants.cs +++ b/src/Artemis.Core/Constants.cs @@ -40,7 +40,7 @@ public static class Constants /// /// The full path to the Artemis data folder /// - public static readonly string DataFolder = Path.Combine(BaseFolder, "Artemis"); + public static readonly string DataFolder = Path.Combine(BaseFolder, "Artemis-dev"); /// /// The full path to the Artemis logs folder diff --git a/src/Artemis.UI.Windows/App.axaml.cs b/src/Artemis.UI.Windows/App.axaml.cs index 824c8a9c4..3099777a6 100644 --- a/src/Artemis.UI.Windows/App.axaml.cs +++ b/src/Artemis.UI.Windows/App.axaml.cs @@ -16,7 +16,6 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using DryIoc; -using HotAvalonia; using ReactiveUI; namespace Artemis.UI.Windows; @@ -28,8 +27,6 @@ public class App : Application public override void Initialize() { - this.EnableHotReload(); - // If Artemis is already running, bring it to foreground and stop this process if (FocusExistingInstance()) { diff --git a/src/Artemis.UI.Windows/Program.cs b/src/Artemis.UI.Windows/Program.cs index f9fc5e1f6..1db782d20 100644 --- a/src/Artemis.UI.Windows/Program.cs +++ b/src/Artemis.UI.Windows/Program.cs @@ -2,8 +2,10 @@ using System; using Artemis.Core; using Artemis.Storage; using Avalonia; +using Avalonia.Logging; using Avalonia.ReactiveUI; using DryIoc; +using HotAvalonia; using Serilog; namespace Artemis.UI.Windows; @@ -36,7 +38,8 @@ internal class Program return AppBuilder.Configure() .UsePlatformDetect() .LogToTrace() - .UseReactiveUI(); + .UseReactiveUI() + .UseHotReload(); } public static void CreateLogger(IContainer container) diff --git a/src/Artemis.UI/SerilogAvaloniaSink.cs b/src/Artemis.UI/SerilogAvaloniaSink.cs index f40c83b28..b8dea3fcd 100644 --- a/src/Artemis.UI/SerilogAvaloniaSink.cs +++ b/src/Artemis.UI/SerilogAvaloniaSink.cs @@ -24,11 +24,11 @@ public class SerilogAvaloniaSink : ILogSink #if DEBUG // Except with binding errors, ignore anything that is information or lower - return (area == "Binding" || logLevel > SerilogLogLevel.Information) && _logger.IsEnabled(logLevel); - #else + return true; +#else // Ignore binding errors in release builds, shoo return area != "Binding" && logLevel > SerilogLogLevel.Information && _logger.IsEnabled(logLevel); - #endif +#endif } /// diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 96732544e..c018e282b 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -68,7 +68,7 @@ - - + + \ No newline at end of file From 7c435fb037ba10d649fae6605d745892488dc2b1 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 23 Nov 2025 15:54:56 +0100 Subject: [PATCH 04/19] Wizard UI improvements and further implementation of default entries step --- ...PluginPrerequisitesInstallDialogView.axaml | 5 +- ...uginPrerequisitesUninstallDialogView.axaml | 5 +- .../StartupWizard/StartupWizardView.axaml | 2 +- .../Steps/DefaultEntriesStepView.axaml | 100 +++++----- .../Steps/DefaultEntriesStepViewModel.cs | 83 ++++---- .../Steps/DefaultEntryItemViewModel.cs | 4 +- .../StartupWizard/Steps/DevicesStepView.axaml | 43 ---- .../Steps/DevicesStepView.axaml.cs | 14 -- .../Steps/DevicesStepViewModel.cs | 33 --- .../StartupWizard/Steps/FinishStepView.axaml | 83 ++++---- .../StartupWizard/Steps/LayoutsStepView.axaml | 41 ++-- .../Steps/LayoutsStepViewModel.cs | 2 +- .../Steps/SettingsStepView.axaml | 188 +++++++++--------- .../Steps/SettingsStepViewModel.cs | 3 +- .../StartupWizard/Steps/SurfaceStepView.axaml | 19 +- .../StartupWizard/Steps/WelcomeStepView.axaml | 12 +- .../Steps/WelcomeStepViewModel.cs | 2 +- 17 files changed, 272 insertions(+), 367 deletions(-) delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml index efa8af53e..6961ac1be 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogView.axaml @@ -7,7 +7,8 @@ xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginPrerequisitesInstallDialogView" - x:DataType="plugins:PluginPrerequisitesInstallDialogViewModel"> + x:DataType="plugins:PluginPrerequisitesInstallDialogViewModel" + Width="800"> - + diff --git a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml index 3ba9bec0c..6d3cfcd84 100644 --- a/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogView.axaml @@ -7,7 +7,8 @@ xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginPrerequisitesUninstallDialogView" - x:DataType="plugins:PluginPrerequisitesUninstallDialogViewModel"> + x:DataType="plugins:PluginPrerequisitesUninstallDialogViewModel" + Width="800"> - + diff --git a/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml b/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml index 67286303f..c83c28447 100644 --- a/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml @@ -11,7 +11,7 @@ x:DataType="startupWizard:StartupWizardViewModel" Icon="/Assets/Images/Logo/application.ico" Title="Artemis | Startup wizard" - Width="1000" + Width="1050" Height="735" WindowStartupLocation="CenterOwner"> diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml index 7133784ca..55ef5da1b 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -6,53 +6,61 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.StartupWizard.Steps.DefaultEntriesStepView" x:DataType="steps:DefaultEntriesStepViewModel"> - - - - - - Below is a list of default features that can be installed to get you started with Artemis. You can always install or uninstall features later via the Workshop. - + + + + + Below is a list of default features that can be installed to get you started with Artemis. You can always install or uninstall features later via the Workshop. + - - Device providers - - - - - - - - + - - Essentials - - - - - - - - + + + + Device providers + + + + + + + + - - Other features - - - - - - - - - - - - - + + Essentials + + + + + + + + + + + Other features + + + + + + + + + + + + + + + + Currently installing + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs index 1d0224a5f..073a797ad 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -20,10 +20,11 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel { [Notify] private bool _workshopReachable; [Notify] private bool _fetchingDefaultEntries; - [Notify] private bool _installed; - [Notify] private int _currentEntries; + [Notify] private int _installedEntries; [Notify] private int _totalEntries = 1; + [Notify] private DefaultEntryItemViewModel? _currentEntry; + private readonly IDeviceService _deviceService; private readonly IWorkshopClient _client; private readonly Func _getDefaultEntryItemViewModel; @@ -34,24 +35,17 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel public DefaultEntriesStepViewModel(IWorkshopService workshopService, IDeviceService deviceService, IWorkshopClient client, Func getDefaultEntryItemViewModel) { + _deviceService = deviceService; _client = client; _getDefaultEntryItemViewModel = getDefaultEntryItemViewModel; ContinueText = "Install selected entries"; Continue = ReactiveCommand.CreateFromTask(async ct => - { - if (Installed) - Wizard.ChangeScreen(); - else - await Install(ct); - }); - GoBack = ReactiveCommand.Create(() => - { - if (deviceService.EnabledDevices.Count == 0) - Wizard.ChangeScreen(); - else - Wizard.ChangeScreen(); + { + await Install(ct); + ExecuteContinue(); }); + GoBack = ReactiveCommand.Create(() => Wizard.ChangeScreen()); this.WhenActivatedAsync(async d => { @@ -63,41 +57,40 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel }); } - private async Task Install(CancellationToken cancellationToken) + private void ExecuteContinue() { - // Remove entries that aren't to be installed - RemoveUnselectedEntries(DeviceProviderEntryViewModels); - RemoveUnselectedEntries(EssentialEntryViewModels); - RemoveUnselectedEntries(OtherEntryViewModels); - - TotalEntries = DeviceProviderEntryViewModels.Count + EssentialEntryViewModels.Count + OtherEntryViewModels.Count; - CurrentEntries = 0; - - // Install entries one by one, removing them from the list as we go - List entries = [..DeviceProviderEntryViewModels, ..EssentialEntryViewModels, ..OtherEntryViewModels]; - foreach (DefaultEntryItemViewModel defaultEntryItemViewModel in entries) - { - cancellationToken.ThrowIfCancellationRequested(); - bool removeFromList = await defaultEntryItemViewModel.InstallEntry(cancellationToken); - if (!removeFromList) - break; - - DeviceProviderEntryViewModels.Remove(defaultEntryItemViewModel); - EssentialEntryViewModels.Remove(defaultEntryItemViewModel); - OtherEntryViewModels.Remove(defaultEntryItemViewModel); - CurrentEntries++; - } - - Installed = true; - ContinueText = "Continue"; + // Without devices skip to the last step + if (_deviceService.EnabledDevices.Count == 0) + Wizard.ChangeScreen(); + else + Wizard.ChangeScreen(); } - private void RemoveUnselectedEntries(ObservableCollection entryViewModels) + private async Task Install(CancellationToken cancellationToken) { - List toRemove = entryViewModels.Where(e => !e.ShouldInstall).ToList(); - foreach (DefaultEntryItemViewModel defaultEntryItemViewModel in toRemove) - entryViewModels.Remove(defaultEntryItemViewModel); + List entries = + [ + ..DeviceProviderEntryViewModels.Where(e => e.ShouldInstall && !e.IsInstalled), + ..EssentialEntryViewModels.Where(e => e.ShouldInstall && !e.IsInstalled), + ..OtherEntryViewModels.Where(e => e.ShouldInstall && !e.IsInstalled) + ]; + InstalledEntries = 0; + TotalEntries = entries.Count; + // Continue to the next screen if there are no entries to install + if (TotalEntries == 0) + return; + + foreach (DefaultEntryItemViewModel defaultEntryItemViewModel in entries) + { + cancellationToken.ThrowIfCancellationRequested(); + CurrentEntry = defaultEntryItemViewModel; + await defaultEntryItemViewModel.InstallEntry(cancellationToken); + InstalledEntries++; + } + + await Task.Delay(1000, cancellationToken); + CurrentEntry = null; } private async Task GetDefaultEntries(CancellationToken cancellationToken) @@ -126,7 +119,7 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel DefaultEntryItemViewModel viewModel = _getDefaultEntryItemViewModel(entry); viewModel.ShouldInstall = entry.DefaultEntryInfo.IsEssential; - + if (entry.DefaultEntryInfo.IsDeviceProvider) DeviceProviderEntryViewModels.Add(viewModel); else if (entry.DefaultEntryInfo.IsEssential) diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs index 3568f3d08..56bba5d22 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs @@ -49,8 +49,8 @@ public partial class DefaultEntryItemViewModel : ActivatableViewModelBase if (IsInstalled || !ShouldInstall || Entry.LatestRelease == null) return true; - // Most entries install so quick it looks broken without a small delay - Task minimumDelay = Task.Delay(100, cancellationToken); + // Most entries install so fast it looks broken without a small delay + Task minimumDelay = Task.Delay(200, cancellationToken); EntryInstallResult result = await _workshopService.InstallEntry(Entry, Entry.LatestRelease, _progress, cancellationToken); await minimumDelay; diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml deleted file mode 100644 index aaed17364..000000000 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - Devices are supported through the use of device providers. - - - In the list below you can enable device providers for each brand you own by checking "Enable feature". - - - - - - - - - - - - - - - - - - - - - - - Note: To avoid possible instability it's recommended to disable the device providers of brands you don't own. - - - - \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml.cs deleted file mode 100644 index a2435a438..000000000 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.axaml.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using Avalonia.ReactiveUI; - -namespace Artemis.UI.Screens.StartupWizard.Steps; - -public partial class DevicesStepView : ReactiveUserControl -{ - public DevicesStepView() - { - InitializeComponent(); - } - -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs deleted file mode 100644 index 1a3e15768..000000000 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs +++ /dev/null @@ -1,33 +0,0 @@ -using ReactiveUI; -using System; -using System.Collections.ObjectModel; -using System.Linq; -using Artemis.Core; -using Artemis.Core.DeviceProviders; -using Artemis.Core.Services; - -namespace Artemis.UI.Screens.StartupWizard.Steps; - -public class DevicesStepViewModel : WizardStepViewModel -{ - public DevicesStepViewModel(IPluginManagementService pluginManagementService, Func getPluginFeatureViewModel, IDeviceService deviceService) - { - // Take all compatible device providers and create a view model for them - DeviceProviders = new ObservableCollection(pluginManagementService.GetAllPlugins() - .Where(p => p.Info.IsCompatible) - .SelectMany(p => p.Features.Where(f => f.FeatureType.IsAssignableTo(typeof(DeviceProvider)))) - .OrderBy(f => f.Name) - .Select(getPluginFeatureViewModel)); - - Continue = ReactiveCommand.Create(() => - { - if (deviceService.EnabledDevices.Count == 0) - Wizard.ChangeScreen(); - else - Wizard.ChangeScreen(); - }); - GoBack = ReactiveCommand.Create(() => Wizard.ChangeScreen()); - } - - public ObservableCollection DeviceProviders { get; } -} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepView.axaml index 700d526ae..8adb1b5d6 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepView.axaml @@ -2,52 +2,51 @@ 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:startupWizard="clr-namespace:Artemis.UI.Screens.StartupWizard" - xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:steps="clr-namespace:Artemis.UI.Screens.StartupWizard.Steps" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.StartupWizard.Steps.FinishStepView" x:DataType="steps:FinishStepViewModel"> - - - All finished! + + All finished! + + + + You are now ready to start using Artemis, enjoy! 😁 + + + To learn more about Artemis and how to use it you may find these resources useful: + - - You are now ready to start using Artemis, enjoy! 😁 - - - To learn more about Artemis and how to use it you may find these resources useful: - + + + + - - - - - - - Artemis wiki - Getting started guide - GitHub - 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 - - - - - + + Artemis wiki + Getting started guide + GitHub + 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 + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/LayoutsStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/LayoutsStepView.axaml index 38a459eb6..58aec59d8 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/LayoutsStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/LayoutsStepView.axaml @@ -7,26 +7,25 @@ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.StartupWizard.Steps.LayoutsStepView" x:DataType="steps:LayoutsStepViewModel"> - - - - - Device layouts provide Artemis with an image of your devices and exact LED positions. - While not strictly necessary, this helps to create effects that are perfectly aligned with your hardware. - - - Below you can automatically search the Artemis Workshop for device layouts of your devices. - + + + Device layouts provide Artemis with an image of your devices and exact LED positions. + While not strictly necessary, this helps to create effects that are perfectly aligned with your hardware. + + + Below you can automatically search the Artemis Workshop for device layouts of your devices. + + - - - - - + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml index 55ef5da1b..115668100 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -13,8 +13,10 @@ Below is a list of default features that can be installed to get you started with Artemis. You can always install or uninstall features later via the Workshop. - - + + + Fetching default features from the Artemis workshop... + @@ -58,9 +60,10 @@ Currently installing - - - + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs index 073a797ad..04574c615 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Reactive.Linq; using System.Threading; using System.Threading.Tasks; using Artemis.Core.Services; @@ -18,8 +19,7 @@ namespace Artemis.UI.Screens.StartupWizard.Steps; public partial class DefaultEntriesStepViewModel : WizardStepViewModel { - [Notify] private bool _workshopReachable; - [Notify] private bool _fetchingDefaultEntries; + [Notify] private bool _fetchingDefaultEntries = true; [Notify] private int _installedEntries; [Notify] private int _totalEntries = 1; [Notify] private DefaultEntryItemViewModel? _currentEntry; @@ -44,16 +44,16 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel { await Install(ct); ExecuteContinue(); - }); + }, this.WhenAnyValue(vm => vm.FetchingDefaultEntries).Select(b => !b)); GoBack = ReactiveCommand.Create(() => Wizard.ChangeScreen()); this.WhenActivatedAsync(async d => { - WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); - if (WorkshopReachable) - { + CancellationToken ct = d.AsCancellationToken(); + if (await workshopService.ValidateWorkshopStatus(false, ct)) await GetDefaultEntries(d.AsCancellationToken()); - } + else if (!ct.IsCancellationRequested) + Wizard.ChangeScreen(); }); } @@ -95,9 +95,6 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel private async Task GetDefaultEntries(CancellationToken cancellationToken) { - if (!WorkshopReachable) - return; - FetchingDefaultEntries = true; IOperationResult result = await _client.GetDefaultEntries.ExecuteAsync(100, null, cancellationToken); diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml new file mode 100644 index 000000000..64fb3ca08 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml @@ -0,0 +1,30 @@ + + + + + + + + + Could not reach the workshop + This unfortunately means the setup wizard cannot continue. + + + Please ensure you are connected to the internet. + If this keeps occuring, hit us up on Discord + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml.cs new file mode 100644 index 000000000..c4162a875 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepView.axaml.cs @@ -0,0 +1,13 @@ +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Avalonia.ReactiveUI; + +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public partial class WorkshopUnreachableStepView : ReactiveUserControl +{ + public WorkshopUnreachableStepView() + { + InitializeComponent(); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs new file mode 100644 index 000000000..d7dc1f617 --- /dev/null +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs @@ -0,0 +1,19 @@ +namespace Artemis.UI.Screens.StartupWizard.Steps; + +public class WorkshopUnreachableStepViewModel : WizardStepViewModel +{ + public WorkshopUnreachableStepViewModel() + { + HideAllButtons = true; + } + + public void Retry() + { + Wizard.ChangeScreen(); + } + + public void Skip() + { + Wizard.Close(false); + } +} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/WizardStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/WizardStepViewModel.cs index 83ebe2172..76ba4c9f9 100644 --- a/src/Artemis.UI/Screens/StartupWizard/WizardStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/WizardStepViewModel.cs @@ -15,6 +15,7 @@ public abstract partial class WizardStepViewModel : ValidatableViewModelBase [Notify] private bool _showFinish; [Notify] private bool _showGoBack = true; [Notify] private bool _showHeader = true; + [Notify] private bool _hideAllButtons; public StartupWizardViewModel Wizard { get; set; } = null!; } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs index 7fd2bb675..3ab39b11b 100644 --- a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs @@ -41,7 +41,7 @@ public partial class WorkshopHomeViewModel : RoutableScreen this.WhenActivatedAsync(async d => { - WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); + WorkshopReachable = await workshopService.ValidateWorkshopStatus(true, d.AsCancellationToken()); IOperationResult popularResult = await client.GetPopularEntries.ExecuteAsync(); popular.Edit(p => diff --git a/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabViewModel.cs b/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabViewModel.cs index caefeab1e..948c9f20f 100644 --- a/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabViewModel.cs @@ -63,7 +63,7 @@ public partial class SubmissionsTabViewModel : RoutableScreen this.WhenActivatedAsync(async d => { - WorkshopReachable = await workshopService.ValidateWorkshopStatus(d.AsCancellationToken()); + WorkshopReachable = await workshopService.ValidateWorkshopStatus(true, d.AsCancellationToken()); if (WorkshopReachable) await GetEntries(d.AsCancellationToken()); }); diff --git a/src/Artemis.WebClient.Workshop/Services/Interfaces/IWorkshopService.cs b/src/Artemis.WebClient.Workshop/Services/Interfaces/IWorkshopService.cs index 922ed3d0d..f6295a9ed 100644 --- a/src/Artemis.WebClient.Workshop/Services/Interfaces/IWorkshopService.cs +++ b/src/Artemis.WebClient.Workshop/Services/Interfaces/IWorkshopService.cs @@ -54,9 +54,10 @@ public interface IWorkshopService /// /// Validates the status of the workshop. /// + /// Whether to navigate to the offline page if the workshop is unreachable. /// The cancellation token. /// A boolean indicating whether the workshop is reachable. - Task ValidateWorkshopStatus(CancellationToken cancellationToken); + Task ValidateWorkshopStatus(bool navigateIfUnreachable, CancellationToken cancellationToken); /// /// Navigates to a specific entry. diff --git a/src/Artemis.WebClient.Workshop/Services/WorkshopService.cs b/src/Artemis.WebClient.Workshop/Services/WorkshopService.cs index 7fcf5f847..553eb5f18 100644 --- a/src/Artemis.WebClient.Workshop/Services/WorkshopService.cs +++ b/src/Artemis.WebClient.Workshop/Services/WorkshopService.cs @@ -130,10 +130,10 @@ public class WorkshopService : IWorkshopService } /// - public async Task ValidateWorkshopStatus(CancellationToken cancellationToken) + public async Task ValidateWorkshopStatus(bool navigateIfUnreachable, CancellationToken cancellationToken) { IWorkshopService.WorkshopStatus status = await GetWorkshopStatus(cancellationToken); - if (!status.IsReachable && !cancellationToken.IsCancellationRequested) + if (navigateIfUnreachable && !status.IsReachable && !cancellationToken.IsCancellationRequested) await _router.Navigate($"workshop/offline/{status.Message}"); return status.IsReachable; } From 63e3eadc356cd933d1cc611ee94da812d9b9a4a6 Mon Sep 17 00:00:00 2001 From: Kira-NT Date: Sun, 30 Nov 2025 16:28:44 +0000 Subject: [PATCH 07/19] Revert to using `.EnableHotReload()` --- src/Artemis.UI.Windows/App.axaml.cs | 2 ++ src/Artemis.UI.Windows/Artemis.UI.Windows.csproj | 1 + 2 files changed, 3 insertions(+) diff --git a/src/Artemis.UI.Windows/App.axaml.cs b/src/Artemis.UI.Windows/App.axaml.cs index 3099777a6..feb425d47 100644 --- a/src/Artemis.UI.Windows/App.axaml.cs +++ b/src/Artemis.UI.Windows/App.axaml.cs @@ -16,6 +16,7 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using DryIoc; +using HotAvalonia; using ReactiveUI; namespace Artemis.UI.Windows; @@ -40,6 +41,7 @@ public class App : Application LegacyMigrationService.MigrateToSqlite(_container); RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; + this.EnableHotReload(); AvaloniaXamlLoader.Load(this); } diff --git a/src/Artemis.UI.Windows/Artemis.UI.Windows.csproj b/src/Artemis.UI.Windows/Artemis.UI.Windows.csproj index 074722051..9f301ae22 100644 --- a/src/Artemis.UI.Windows/Artemis.UI.Windows.csproj +++ b/src/Artemis.UI.Windows/Artemis.UI.Windows.csproj @@ -9,6 +9,7 @@ Artemis ..\Artemis.UI\Assets\Images\Logo\application.ico en + false From 13c497f41e6d540ba9426ca206684d3a714e1c00 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 4 Dec 2025 23:09:28 +0100 Subject: [PATCH 08/19] Enhances setup wizard workflow Refactors the setup wizard to streamline the initial user experience. Includes the following changes: - Adds nyan cat animation during feature installations for user enjoyment - Skips essential feature selection if workshop is unreachable - Moves directly to settings after device/surface selection - Adds option to configure settings, after device configuration --- .../Services/Builders/ContentDialogBuilder.cs | 2 +- .../Services/Window/WindowService.cs | 2 + src/Artemis.UI.Windows/Program.cs | 5 +-- src/Artemis.UI/Assets/Animations/nyan.json | 1 + .../StartupWizard/StartupWizardView.axaml | 2 +- .../Steps/DefaultEntriesStepView.axaml | 31 +++++++++----- .../Steps/DefaultEntriesStepViewModel.cs | 7 +++- .../Steps/DefaultEntryItemViewModel.cs | 40 +++++++++++++++---- .../Steps/SurfaceStepViewModel.cs | 4 +- .../Steps/WorkshopUnreachableStepViewModel.cs | 14 ++++++- 10 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 src/Artemis.UI/Assets/Animations/nyan.json diff --git a/src/Artemis.UI.Shared/Services/Builders/ContentDialogBuilder.cs b/src/Artemis.UI.Shared/Services/Builders/ContentDialogBuilder.cs index da40fa9d2..5eef4bff9 100644 --- a/src/Artemis.UI.Shared/Services/Builders/ContentDialogBuilder.cs +++ b/src/Artemis.UI.Shared/Services/Builders/ContentDialogBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using System.Windows.Input; using Avalonia.Controls; diff --git a/src/Artemis.UI.Shared/Services/Window/WindowService.cs b/src/Artemis.UI.Shared/Services/Window/WindowService.cs index 19ea3dbe3..45f5cd6cc 100644 --- a/src/Artemis.UI.Shared/Services/Window/WindowService.cs +++ b/src/Artemis.UI.Shared/Services/Window/WindowService.cs @@ -8,6 +8,7 @@ using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Threading; using DryIoc; using FluentAvalonia.UI.Controls; +using ContentDialogButton = Artemis.UI.Shared.Services.Builders.ContentDialogButton; namespace Artemis.UI.Shared.Services; @@ -94,6 +95,7 @@ internal class WindowService : IWindowService .WithTitle(title) .WithContent(message) .HavingPrimaryButton(b => b.WithText(confirm)) + .WithDefaultButton(ContentDialogButton.Primary) .WithCloseButtonText(cancel) .ShowAsync(); diff --git a/src/Artemis.UI.Windows/Program.cs b/src/Artemis.UI.Windows/Program.cs index c102c79eb..b7ccdd7a9 100644 --- a/src/Artemis.UI.Windows/Program.cs +++ b/src/Artemis.UI.Windows/Program.cs @@ -34,10 +34,7 @@ internal class Program // Avalonia configuration, don't remove; also used by visual designer. public static AppBuilder BuildAvaloniaApp() { - return AppBuilder.Configure() - .UsePlatformDetect() - .LogToTrace() - .UseReactiveUI(); + return AppBuilder.Configure().UsePlatformDetect().LogToTrace().UseReactiveUI(); } public static void CreateLogger(IContainer container) diff --git a/src/Artemis.UI/Assets/Animations/nyan.json b/src/Artemis.UI/Assets/Animations/nyan.json new file mode 100644 index 000000000..ee086765a --- /dev/null +++ b/src/Artemis.UI/Assets/Animations/nyan.json @@ -0,0 +1 @@ +{"v":"5.5.4","fr":60,"ip":0,"op":40,"w":800,"h":800,"nm":"nyan cat","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[100]},{"t":37,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[637.938,650.813,0],"to":[-16.667,0,0],"ti":[16.667,0,0]},{"t":38,"s":[537.938,650.813,0]}],"ix":2},"a":{"a":0,"k":[303.75,98.813,0],"ix":1},"s":{"a":0,"k":[93.465,93.465,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":37,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":270,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":37,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":37,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":37,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":27,"op":38,"st":27,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[100]},{"t":23,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[245.938,622.813,0],"to":[-16.667,0,0],"ti":[16.667,0,0]},{"t":24,"s":[145.938,622.813,0]}],"ix":2},"a":{"a":0,"k":[303.75,98.813,0],"ix":1},"s":{"a":0,"k":[224.995,224.995,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":18,"s":[{"i":[[-0.313,0.031],[0,-0.313],[0.156,0.031],[0.031,0.344]],"o":[[0.313,-0.031],[0,0.313],[-0.156,-0.031],[-0.031,-0.344]],"v":[[0.125,-0.688],[0.75,0],[0.031,0.344],[-0.25,-0.094]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":630,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":585,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":495,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":405,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":315,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":270,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":23,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":24,"st":13,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[100]},{"t":14,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[591.218,168.813,0],"to":[-16.667,0,0],"ti":[16.667,0,0]},{"t":15,"s":[491.218,168.813,0]}],"ix":2},"a":{"a":0,"k":[303.75,98.813,0],"ix":1},"s":{"a":0,"k":[108.137,108.137,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":9,"s":[{"i":[[-0.313,0.031],[0,-0.313],[0.156,0.031],[0.031,0.344]],"o":[[0.313,-0.031],[0,0.313],[-0.156,-0.031],[-0.031,-0.344]],"v":[[0.125,-0.688],[0.75,0],[0.031,0.344],[-0.25,-0.094]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":630,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":585,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":495,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":405,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":315,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":270,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-19.688],[3.25,-16.438],[0,-4.25],[-3.25,-16.438]],"c":true}]},{"t":14,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":4,"op":15,"st":4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"t":10,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[717.938,270.813,0],"to":[-16.667,0,0],"ti":[16.667,0,0]},{"t":11,"s":[617.938,270.813,0]}],"ix":2},"a":{"a":0,"k":[303.75,98.813,0],"ix":1},"s":{"a":0,"k":[158.816,158.816,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":10,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":270,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":10,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":10,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-3.25],[3.25,0],[0,3.25],[-3.25,0]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-29.688],[3.25,-26.438],[0,-4.25],[-3.25,-26.438]],"c":true}]},{"t":10,"s":[{"i":[[-1.795,0],[0,-1.795],[1.795,0],[0,1.795]],"o":[[1.795,0],[0,1.795],[-1.795,0],[0,-1.795]],"v":[[0,-38.5],[3.25,-35.25],[0,-28],[-3.25,-35.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.933333337307,0.933333337307,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[303.75,98.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":11,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"mouth","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[393,401,0],"to":[2,0,0],"ti":[-1.833,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[405,401,0],"to":[1.833,2,0],"ti":[2.5,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[404,413,0],"to":[-2.5,2,0],"ti":[1.833,2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[390,413,0],"to":[-1.833,-2,0],"ti":[-0.5,2,0]},{"t":40,"s":[393,401,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.5,0],[0,0],[19.75,0],[-1.25,10.75]],"o":[[0,0],[-20.5,0],[0,0],[-13.022,0],[1.282,-11.027]],"v":[[134.375,43.125],[121.5,57.5],[100.5,43.5],[80.75,57.25],[64,41.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"face","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[393,401,0],"to":[2,0,0],"ti":[-1.833,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[405,401,0],"to":[1.833,2,0],"ti":[2.5,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[404,413,0],"to":[-2.5,2,0],"ti":[1.833,2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[390,413,0],"to":[-1.833,-2,0],"ti":[-0.5,2,0]},{"t":40,"s":[393,401,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.5,8.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.75,13.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.5,8.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55.75,13.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[21.5,21.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470649242,0.643137276173,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.5,44.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22.5,22.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.976470649242,0.643137276173,0.674509823322,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36.5,44.75],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.678],[-1.75,-0.125],[0.125,2.625]],"o":[[0,2.375],[2.494,0.178],[-0.173,-3.623]],"v":[[93.375,25.75],[99.5,33.25],[106.375,25.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.125,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138,17],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59,17],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"head","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[393,401,0],"to":[2,0,0],"ti":[-1.833,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[405,401,0],"to":[1.833,2,0],"ti":[2.5,-2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[404,413,0],"to":[-2.5,2,0],"ti":[1.833,2,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[390,413,0],"to":[-1.833,-2,0],"ti":[-0.5,2,0]},{"t":40,"s":[393,401,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[6.5,5],[0,0],[20,-4.5],[3,-3.5],[-4.5,-26.5],[0,0],[-26.266,0.048],[-18.746,2.631],[4.438,20.78],[-0.557,5.572]],"o":[[-9,-1],[0,0],[-17,-22.5],[-3,3.5],[-30,60],[0,0],[12.871,-0.024],[34.251,-4.807],[-2.623,-12.282],[1.5,-15]],"v":[[150.5,-44.5],[114,-15],[71.5,-16],[31.5,-44],[20.5,0],[53.5,72.5],[93.503,76.055],[141,72.5],[173.7,17.064],[164.5,-6]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[6.5,5],[0,0],[20,-4.5],[3,-3.5],[-4.5,-26.5],[-7,-0.75],[-26.266,0.048],[-28.75,1],[4.438,20.78],[1.19,5.472]],"o":[[-9,-1],[0,0],[-17,-22.5],[-3,3.5],[-30,60],[7,0.75],[12.871,-0.024],[32.278,-1.123],[-2.623,-12.282],[-5,-23]],"v":[[138.5,-46.5],[114,-15],[71.5,-16],[19,-40],[20.5,0],[53.5,72.5],[96.503,73.055],[141,72.5],[173.7,17.064],[164.5,-6]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[6.5,5],[0,0],[20,-4.5],[3,-3.5],[-4.5,-26.5],[-7,-0.75],[-26.266,0.048],[-28.75,1],[4.438,20.78],[1.596,5.368]],"o":[[-9,-1],[0,0],[-23.5,-21],[-3,3.5],[-30,60],[7,0.75],[12.871,-0.024],[32.278,-1.123],[-2.623,-12.282],[-5.5,-18.5]],"v":[[148,-48.5],[114,-15],[71.5,-16],[36,-46.5],[20.5,0],[53.5,72.5],[96.503,73.055],[141,72.5],[173.7,17.064],[164.5,-6]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[6.5,5],[0,0],[20,-4.5],[3,-3.5],[-4.5,-26.5],[-10,-0.5],[-26.266,0.048],[-28.75,1],[4.438,20.78],[2.881,4.802]],"o":[[-9,-1],[0,0],[-19.5,-17],[-3,3.5],[-30,60],[7.031,0.352],[12.871,-0.024],[32.278,-1.123],[-2.623,-12.282],[-10.5,-17.5]],"v":[[153.5,-47],[114,-15],[71.5,-16],[42.5,-46.5],[20.5,0],[53.5,71.5],[96.503,73.055],[145.5,71.5],[173.7,17.064],[164.5,-6]],"c":true}]},{"t":40,"s":[{"i":[[6.5,5],[0,0],[20,-4.5],[3,-3.5],[-4.5,-26.5],[0,0],[-26.266,0.048],[-18.746,2.631],[4.438,20.78],[-0.557,5.572]],"o":[[-9,-1],[0,0],[-17,-22.5],[-3,3.5],[-30,60],[0,0],[12.871,-0.024],[34.251,-4.807],[-2.623,-12.282],[1.5,-15]],"v":[[150.5,-44.5],[114,-15],[71.5,-16],[31.5,-44],[20.5,0],[53.5,72.5],[93.503,76.055],[141,72.5],[173.7,17.064],[164.5,-6]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"body 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[400,400,0],"to":[0,-1.833,0],"ti":[0.167,0.167,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[400,389,0],"to":[-0.167,-0.167,0],"ti":[0.167,-1.667,0]},{"t":40,"s":[399,399,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[94.191,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.867,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[94.191,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[-0.4,0,0]},"t":32,"s":[102.905,95.811,100]},{"t":40,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.5,-35.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 10","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.25,-54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-25.5,45.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-59.75,56.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73,26.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-50.5,4],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-16.75,-15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-4.25,-55.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784375668,0.266666680574,0.709803938866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-60.75,-44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[120.908,120.908],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[28,0],[0,0],[0,-35],[0,0],[-55,0],[0,0],[0,40.5]],"o":[[0,0],[-39,0],[0,0],[0,35],[0,0],[35,0],[0,0],[0,-40.5]],"v":[[70.5,-71],[-53.5,-71],[-89.5,-38],[-89.5,38],[-56,67.5],[70,67.5],[104.5,33.5],[104.5,-32]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.647058844566,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"body 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[400,400,0],"to":[0,-1.833,0],"ti":[0.167,0.167,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[400,389,0],"to":[-0.167,-0.167,0],"ti":[0.167,-1.667,0]},{"t":40,"s":[399,399,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[94.191,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[0.867,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[94.191,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[-0.4,0,0]},"t":32,"s":[102.905,95.811,100]},{"t":40,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[21.5,0],[0,0],[0,-26.5],[0,0],[-23,0],[0,0],[0,23.5]],"o":[[0,0],[-21.5,0],[0,0],[0,26.5],[0,0],[23,0],[0,0],[0,-23.5]],"v":[[97,-85],[-87,-85],[-106.5,-61],[-106.5,57],[-86,82.5],[98,82.5],[120.5,58],[120.5,-64]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.988235354424,0.827451050282,0.611764729023,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[4.5,-4],[-24.412,-17.437],[-32.5,0.5],[7.15,-0.367],[8.75,8.75]],"o":[[-4.5,4],[8.75,6.25],[17.562,-0.27],[-9.75,0.5],[-17.221,-17.221]],"v":[[-172.75,-14.25],[-157.75,25.25],[-105.5,39],[-104.5,6],[-142,-3.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6.666,"s":[{"i":[[12.75,-12.125],[-14.5,-5.75],[-22.75,6.625],[7.154,-0.232],[9,4.75]],"o":[[-12.75,12.125],[14.5,5.75],[17.561,0.048],[-17.75,7.625],[-9,-4.75]],"v":[[-176.25,-1.625],[-156.5,38.75],[-104.75,38.875],[-104.25,5.875],[-143.5,9.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13.334,"s":[{"i":[[6.65,-18.55],[-17.15,1.95],[-13.7,7.7],[7.156,-0.151],[17.8,-2.65]],"o":[[-6.65,18.55],[17.15,-1.95],[17.561,0.239],[-17.4,9.7],[-17.8,2.65]],"v":[[-184.35,26.95],[-138.65,48.95],[-104.3,38.8],[-104.1,5.8],[-143.7,18.35]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-6.387,-6.559],[-15.5,12],[-12,-0.25],[7.158,-0.097],[11.5,-9.5]],"o":[[9.25,9.5],[8.939,-6.921],[17.56,0.366],[-18.5,0.25],[-19.205,15.865]],"v":[[-173.25,59.5],[-135.25,50.25],[-104,38.75],[-104,5.75],[-157,21.25]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.666,"s":[{"i":[[-8.25,-16],[-19.25,0.25],[-11.133,-4.484],[10.5,6.75],[18,0.25]],"o":[[10.297,19.97],[13.769,-0.179],[18,7.25],[-15.563,-10.005],[-26.2,-0.364]],"v":[[-188.75,30.5],[-147.25,26.25],[-107,35.75],[-103,7.25],[-143,-4.75]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33.334,"s":[{"i":[[-2.35,-19.1],[-20.15,-7.65],[-13.8,-8.05],[14.7,3.45],[18.7,6.55]],"o":[[2.35,19.1],[20.15,7.65],[17.736,3.12],[-12.7,-5.35],[-24.281,-8.505]],"v":[[-185.35,2.4],[-142.65,21.35],[-105.2,37.55],[-101.8,1.85],[-137.2,-11.05]],"c":true}]},{"t":40,"s":[{"i":[[4.5,-4],[-24.412,-17.437],[-32.5,0.5],[7.15,-0.367],[8.75,8.75]],"o":[[-4.5,4],[8.75,6.25],[17.562,-0.27],[-9.75,0.5],[-17.221,-17.221]],"v":[[-172.75,-14.25],[-157.75,25.25],[-105.5,39],[-104.5,6],[-142,-3.25]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"leg 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[620,395,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[-0.614,-19.764],[-20,2.5],[0,0],[1.047,4.405]],"o":[[-15.491,3.778],[0.356,11.451],[23.815,-2.977],[0,0],[-1.3,-5.472]],"v":[[-95,64.5],[-106.856,90.549],[-88,112.5],[-78,81.5],[-78.351,72.72]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[0.856,-6.049],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-0.861,6.086],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-112.356,93.049],[-88.5,108],[-78,81.5],[-84.99,75.877]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[5.348,-3.709],[-0.144,-8.299],[-15.175,0.912],[-0.375,4.5],[4.955,3.26]],"o":[[-16,10.5],[-1.753,8.394],[24.25,-1.25],[0.25,-3],[-4.74,-3.104]],"v":[[-109.625,68.75],[-121.856,93.299],[-95.5,110.25],[-87.5,83.75],[-93.73,70.047]],"c":true}]},{"t":40,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[-0.614,-19.764],[-20,2.5],[0,0],[1.047,4.405]],"o":[[-15.491,3.778],[0.356,11.451],[23.815,-2.977],[0,0],[-1.3,-5.472]],"v":[[-95,64.5],[-106.856,90.549],[-88,112.5],[-78,81.5],[-78.351,72.72]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[0.856,-6.049],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-0.861,6.086],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-112.356,93.049],[-88.5,108],[-78,81.5],[-84.99,75.877]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[5.348,-3.709],[-0.144,-8.299],[-15.175,0.912],[-0.375,4.5],[4.955,3.26]],"o":[[-16,10.5],[-1.753,8.394],[24.25,-1.25],[0.25,-3],[-4.74,-3.104]],"v":[[-109.625,68.75],[-121.856,93.299],[-95.5,110.25],[-87.5,83.75],[-93.73,70.047]],"c":true}]},{"t":40,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"leg 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[563,395,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[-0.614,-19.764],[-20,2.5],[0,0],[1.047,4.405]],"o":[[-15.491,3.778],[0.356,11.451],[23.815,-2.977],[0,0],[-1.3,-5.472]],"v":[[-95,64.5],[-106.856,90.549],[-88,112.5],[-78,81.5],[-78.351,72.72]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[0.856,-6.049],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-0.861,6.086],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-112.356,93.049],[-88.5,108],[-78,81.5],[-84.99,75.877]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[5.348,-3.709],[-0.144,-8.299],[-15.175,0.912],[-0.375,4.5],[4.955,3.26]],"o":[[-16,10.5],[-1.753,8.394],[24.25,-1.25],[0.25,-3],[-4.74,-3.104]],"v":[[-109.625,68.75],[-121.856,93.299],[-95.5,110.25],[-87.5,83.75],[-93.73,70.047]],"c":true}]},{"t":40,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[-0.614,-19.764],[-20,2.5],[0,0],[1.047,4.405]],"o":[[-15.491,3.778],[0.356,11.451],[23.815,-2.977],[0,0],[-1.3,-5.472]],"v":[[-95,64.5],[-106.856,90.549],[-88,112.5],[-78,81.5],[-78.351,72.72]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[0.856,-6.049],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-0.861,6.086],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-112.356,93.049],[-88.5,108],[-78,81.5],[-84.99,75.877]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[5.348,-3.709],[-0.144,-8.299],[-15.175,0.912],[-0.375,4.5],[4.955,3.26]],"o":[[-16,10.5],[-1.753,8.394],[24.25,-1.25],[0.25,-3],[-4.74,-3.104]],"v":[[-109.625,68.75],[-121.856,93.299],[-95.5,110.25],[-87.5,83.75],[-93.73,70.047]],"c":true}]},{"t":40,"s":[{"i":[[5.548,-2.912],[4.319,-17.479],[-10.277,0],[-0.75,9],[5.846,3.907]],"o":[[-20,10.5],[-2.644,10.701],[21,0],[0.5,-6],[-4.43,-2.961]],"v":[[-117.25,63],[-126.356,95.549],[-111.5,113.5],[-94,87],[-102.471,64.218]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"leg 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,395,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[4.715,-4.126],[10.941,-14.299],[-6.936,3.153],[0,0],[11.346,12.282]],"o":[[-12,10.5],[-9.144,11.951],[22,-10],[0,0],[-3.616,-3.915]],"v":[[-105,69],[-135.356,94.549],[-122.5,112.5],[-85,89],[-88.846,70.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[18.31,-7.464],[-20,2.5],[0,0],[1.851,5.53]],"o":[[-15.491,3.778],[-12.144,4.951],[23.815,-2.977],[0,0],[-1.785,-5.334]],"v":[[-95,64.5],[-105.856,82.049],[-95,103.5],[-75.5,82.5],[-77.726,70.845]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[18.31,-7.464],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-12.144,4.951],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-116.356,92.549],[-105.5,114],[-78,81.5],[-84.99,75.877]],"c":true}]},{"t":40,"s":[{"i":[[4.715,-4.126],[10.941,-14.299],[-6.936,3.153],[0,0],[11.346,12.282]],"o":[[-12,10.5],[-9.144,11.951],[22,-10],[0,0],[-3.616,-3.915]],"v":[[-105,69],[-135.356,94.549],[-122.5,112.5],[-85,89],[-88.846,70.218]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"leg 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[450,395,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[4.715,-4.126],[10.941,-14.299],[-6.936,3.153],[0,0],[11.346,12.282]],"o":[[-12,10.5],[-9.144,11.951],[22,-10],[0,0],[-3.616,-3.915]],"v":[[-105,69],[-135.356,94.549],[-122.5,112.5],[-85,89],[-88.846,70.218]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[5.149,-4.506],[14.856,-13.049],[-20.506,0],[0,0],[4.175,4.046]],"o":[[-12,10.5],[-11.305,9.931],[24,0],[0,0],[-5.187,-5.027]],"v":[[-101.5,62.5],[-115.856,78.549],[-109,102],[-77,76],[-84.199,67.652]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[11.358,-2.77],[18.31,-7.464],[-20,2.5],[0,0],[1.851,5.53]],"o":[[-15.491,3.778],[-12.144,4.951],[23.815,-2.977],[0,0],[-1.785,-5.334]],"v":[[-95,64.5],[-105.856,82.049],[-95,103.5],[-75.5,82.5],[-77.726,70.845]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[5.149,-4.506],[18.31,-7.464],[-20.073,1.825],[0,0],[4.065,2.613]],"o":[[-12,10.5],[-12.144,4.951],[27.5,-2.5],[0,0],[-5.05,-3.247]],"v":[[-102,74.5],[-116.356,92.549],[-105.5,114],[-78,81.5],[-84.99,75.877]],"c":true}]},{"t":40,"s":[{"i":[[4.715,-4.126],[10.941,-14.299],[-6.936,3.153],[0,0],[11.346,12.282]],"o":[[-12,10.5],[-9.144,11.951],[22,-10],[0,0],[-3.616,-3.915]],"v":[[-105,69],[-135.356,94.549],[-122.5,112.5],[-85,89],[-88.846,70.218]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.658823549747,0.662745118141,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[401,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-67,59],[28,16]],"o":[[0,0],[0,0],[46.318,-40.788],[-37.122,-21.213]],"v":[[-401,-104],[-401,119],[-94,78],[-89,-84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":40,"st":20,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"rainbow Outlines 2","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[279.611,406,0],"to":[-30.789,0,0],"ti":[30.789,0,0]},{"t":40,"s":[94.875,406,0]}],"ix":2},"a":{"a":0,"k":[367.5,131.5,0],"ix":1},"s":{"a":0,"k":[75.507,75.507,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.279],[0,-25.923],[-122.4,-12.279],[-244.8,-25.923],[-367.2,-12.279],[-367.2,25.923],[-244.8,12.278],[-122.4,25.923],[0,12.278],[122.4,25.923],[244.8,12.278],[367.2,25.923],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317314267626,0.213829025568,0.589291920381,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,216.168],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.922],[122.4,-12.278],[0,-25.922],[-122.4,-12.278],[-244.8,-25.922],[-367.2,-12.278],[-367.2,25.922],[-244.8,12.28],[-122.4,25.922],[0,12.28],[122.4,25.922],[244.8,12.28],[367.2,25.922],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341164592668,0.606181006338,0.780451516544,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,179.465],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.279],[0,-25.923],[-122.4,-12.279],[-244.8,-25.923],[-367.2,-12.279],[-367.2,25.923],[-244.8,12.279],[-122.4,25.923],[0,12.279],[122.4,25.923],[244.8,12.279],[367.2,25.923],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.418309709138,0.728695200004,0.130248021144,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,143.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.922],[122.4,-12.279],[0,-25.922],[-122.4,-12.279],[-244.8,-25.922],[-367.2,-12.279],[-367.2,25.922],[-244.8,12.279],[-122.4,25.922],[0,12.279],[122.4,25.922],[244.8,12.279],[367.2,25.922],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.915979662129,0.96097166772,0.066235486199,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,106.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.278],[0,-25.923],[-122.4,-12.278],[-244.8,-25.923],[-367.2,-12.278],[-367.2,25.923],[-244.8,12.28],[-122.4,25.923],[0,12.28],[122.4,25.923],[244.8,12.28],[367.2,25.923],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999794574812,0.598157276827,0.02665384517,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,70.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.278],[0,-25.923],[-122.4,-12.278],[-244.8,-25.923],[-367.2,-12.278],[-367.2,25.923],[-244.8,12.279],[-122.4,25.923],[0,12.279],[122.4,25.923],[244.8,12.279],[367.2,25.923],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.994454716701,0.031589493097,0.023664128547,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,34.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":40,"st":20,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[401,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-67,59],[28,16]],"o":[[0,0],[0,0],[46.318,-40.788],[-37.122,-21.213]],"v":[[-401,-104],[-401,119],[-94,78],[-89,-84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":21,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"rainbow Outlines","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[279.611,406,0],"to":[-30.789,0,0],"ti":[30.789,0,0]},{"t":20,"s":[94.875,406,0]}],"ix":2},"a":{"a":0,"k":[367.5,131.5,0],"ix":1},"s":{"a":0,"k":[75.507,75.507,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.279],[0,-25.923],[-122.4,-12.279],[-244.8,-25.923],[-367.2,-12.279],[-367.2,25.923],[-244.8,12.278],[-122.4,25.923],[0,12.278],[122.4,25.923],[244.8,12.278],[367.2,25.923],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.317314267626,0.213829025568,0.589291920381,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,216.168],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.922],[122.4,-12.278],[0,-25.922],[-122.4,-12.278],[-244.8,-25.922],[-367.2,-12.278],[-367.2,25.922],[-244.8,12.28],[-122.4,25.922],[0,12.28],[122.4,25.922],[244.8,12.28],[367.2,25.922],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.341164592668,0.606181006338,0.780451516544,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,179.465],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.279],[0,-25.923],[-122.4,-12.279],[-244.8,-25.923],[-367.2,-12.279],[-367.2,25.923],[-244.8,12.279],[-122.4,25.923],[0,12.279],[122.4,25.923],[244.8,12.279],[367.2,25.923],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.418309709138,0.728695200004,0.130248021144,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,143.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.922],[122.4,-12.279],[0,-25.922],[-122.4,-12.279],[-244.8,-25.922],[-367.2,-12.279],[-367.2,25.922],[-244.8,12.279],[-122.4,25.922],[0,12.279],[122.4,25.922],[244.8,12.279],[367.2,25.922],[367.2,-12.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.915979662129,0.96097166772,0.066235486199,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,106.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.278],[0,-25.923],[-122.4,-12.278],[-244.8,-25.923],[-367.2,-12.278],[-367.2,25.923],[-244.8,12.28],[-122.4,25.923],[0,12.28],[122.4,25.923],[244.8,12.28],[367.2,25.923],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999794574812,0.598157276827,0.02665384517,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,70.362],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[49.823,0],[0,0],[-61.2,0],[-49.823,0],[-61.2,0],[-49.824,0],[-61.2,0],[-49.824,0],[0,0]],"o":[[-61.2,0],[-49.824,0],[-61.2,0],[-49.823,0],[-61.2,0],[0,0],[49.823,0],[61.2,0],[49.824,0],[61.2,0],[49.824,0],[61.2,0],[0,0],[-49.824,0]],"v":[[244.8,-25.923],[122.4,-12.278],[0,-25.923],[-122.4,-12.278],[-244.8,-25.923],[-367.2,-12.278],[-367.2,25.923],[-244.8,12.279],[-122.4,25.923],[0,12.279],[122.4,25.923],[244.8,12.279],[367.2,25.923],[367.2,-12.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.994454716701,0.031589493097,0.023664128547,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[364.387,34.661],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":21,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml b/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml index b3c179d71..89f20e955 100644 --- a/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/StartupWizardView.axaml @@ -54,8 +54,8 @@ - + diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml index 115668100..877ff9849 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -9,10 +9,10 @@ - + Below is a list of default features that can be installed to get you started with Artemis. You can always install or uninstall features later via the Workshop. - + Fetching default features from the Artemis workshop... @@ -29,7 +29,7 @@ - + Essentials @@ -40,7 +40,7 @@ - + Other features @@ -56,14 +56,23 @@ - - - Currently installing - - + + - + + + Currently installing: + + + + + + feature(s) remaining, hold on tight! + \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs index 04574c615..7a8c60467 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -27,17 +27,22 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel private readonly IDeviceService _deviceService; private readonly IWorkshopClient _client; private readonly Func _getDefaultEntryItemViewModel; + private readonly ObservableAsPropertyHelper _remainingEntries; public ObservableCollection DeviceProviderEntryViewModels { get; } = []; public ObservableCollection EssentialEntryViewModels { get; } = []; public ObservableCollection OtherEntryViewModels { get; } = []; - + public int RemainingEntries => _remainingEntries.Value; + public DefaultEntriesStepViewModel(IWorkshopService workshopService, IDeviceService deviceService, IWorkshopClient client, Func getDefaultEntryItemViewModel) { _deviceService = deviceService; _client = client; _getDefaultEntryItemViewModel = getDefaultEntryItemViewModel; + _remainingEntries = this.WhenAnyValue(vm => vm.InstalledEntries, vm => vm.TotalEntries) + .Select(t => t.Item2 - t.Item1) + .ToProperty(this, vm => vm.RemainingEntries); ContinueText = "Install selected entries"; Continue = ReactiveCommand.CreateFromTask(async ct => diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs index 56bba5d22..a96f28bd1 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs @@ -16,12 +16,13 @@ using Artemis.WebClient.Workshop.Models; using Artemis.WebClient.Workshop.Services; using PropertyChanged.SourceGenerator; using ReactiveUI; -using StrawberryShake; +using Serilog; namespace Artemis.UI.Screens.StartupWizard.Steps; public partial class DefaultEntryItemViewModel : ActivatableViewModelBase { + private readonly ILogger _logger; private readonly IWorkshopService _workshopService; private readonly IWindowService _windowService; private readonly IPluginManagementService _pluginManagementService; @@ -30,15 +31,20 @@ public partial class DefaultEntryItemViewModel : ActivatableViewModelBase [Notify] private bool _isInstalled; [Notify] private bool _shouldInstall; - - public DefaultEntryItemViewModel(IEntrySummary entry, IWorkshopService workshopService, IWindowService windowService, IPluginManagementService pluginManagementService, ISettingsVmFactory settingsVmFactory) + [Notify] private bool _enabling; + [Notify] private float _installProgress; + + public DefaultEntryItemViewModel(ILogger logger, IEntrySummary entry, IWorkshopService workshopService, IWindowService windowService, IPluginManagementService pluginManagementService, + ISettingsVmFactory settingsVmFactory) { + _logger = logger; _workshopService = workshopService; _windowService = windowService; _pluginManagementService = pluginManagementService; _settingsVmFactory = settingsVmFactory; Entry = entry; + _progress.ProgressChanged += (_, f) => InstallProgress = f.ProgressPercentage; this.WhenActivated((CompositeDisposable _) => { IsInstalled = workshopService.GetInstalledEntry(entry.Id) != null; }); } @@ -61,26 +67,44 @@ public partial class DefaultEntryItemViewModel : ActivatableViewModelBase .WithCloseButtonText("Skip and continue") .ShowAsync(); } - // If the entry is a plugin, enable the plugin + // If the entry is a plugin, enable the plugin and all features else if (result.Entry?.EntryType == EntryType.Plugin) { - await EnablePlugin(result.Entry); + Enabling = true; + await EnablePluginAndFeatures(result.Entry); + Enabling = false; } return result.IsSuccess; } - private async Task EnablePlugin(InstalledEntry entry) + private async Task EnablePluginAndFeatures(InstalledEntry entry) { if (!entry.TryGetMetadata("PluginId", out Guid pluginId)) throw new InvalidOperationException("Plugin entry does not contain a PluginId metadata value."); - + Plugin? plugin = _pluginManagementService.GetAllPlugins().FirstOrDefault(p => p.Guid == pluginId); if (plugin == null) throw new InvalidOperationException($"Plugin with id '{pluginId}' does not exist."); - + // There's quite a bit of UI involved in enabling a plugin, borrowing the PluginSettingsViewModel for this PluginViewModel pluginViewModel = _settingsVmFactory.PluginViewModel(plugin, ReactiveCommand.Create(() => { })); await pluginViewModel.UpdateEnabled(true); + + // Find features without prerequisites to enable + foreach (PluginFeatureInfo pluginFeatureInfo in plugin.Features) + { + if (pluginFeatureInfo.Instance == null || pluginFeatureInfo.Instance.IsEnabled || pluginFeatureInfo.Prerequisites.Count != 0) + continue; + + try + { + _pluginManagementService.EnablePluginFeature(pluginFeatureInfo.Instance, true); + } + catch (Exception e) + { + _logger.Warning(e, "Failed to enable plugin feature '{FeatureName}', skipping", pluginFeatureInfo.Name); + } + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs index 3ddc71021..04989be43 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/SurfaceStepViewModel.cs @@ -19,7 +19,7 @@ public class SurfaceStepViewModel : WizardStepViewModel _deviceService = deviceService; SelectLayout = ReactiveCommand.Create(ExecuteSelectLayout); - Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); + Continue = ReactiveCommand.Create(() => Wizard.ChangeScreen()); GoBack = ReactiveCommand.Create(() => Wizard.ChangeScreen()); } @@ -30,6 +30,6 @@ public class SurfaceStepViewModel : WizardStepViewModel // TODO: Implement the layout _deviceService.AutoArrangeDevices(); - Wizard.ChangeScreen(); + Wizard.ChangeScreen(); } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs index d7dc1f617..c91fa8ef6 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/WorkshopUnreachableStepViewModel.cs @@ -1,9 +1,15 @@ -namespace Artemis.UI.Screens.StartupWizard.Steps; +using Artemis.Core; +using Artemis.Core.Services; + +namespace Artemis.UI.Screens.StartupWizard.Steps; public class WorkshopUnreachableStepViewModel : WizardStepViewModel { - public WorkshopUnreachableStepViewModel() + private readonly ISettingsService _settingsService; + + public WorkshopUnreachableStepViewModel(ISettingsService settingsService) { + _settingsService = settingsService; HideAllButtons = true; } @@ -14,6 +20,10 @@ public class WorkshopUnreachableStepViewModel : WizardStepViewModel public void Skip() { + PluginSetting setting = _settingsService.GetSetting("UI.SetupWizardCompleted", false); + setting.Value = false; + setting.Save(); + Wizard.Close(false); } } \ No newline at end of file From f0cbc3e56196828b6e3022a5ac609a552b5cfd3a Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 6 Dec 2025 20:27:48 +0100 Subject: [PATCH 09/19] Workshop - Add button to upload submission directly from library Workshop - While creating submission allow fitting the icon instead of cropping Workshop - Add the ability to filter default entries --- src/Artemis.UI/Extensions/Bitmap.cs | 71 ++++++--- .../ProfileConfigurationEditViewModel.cs | 2 +- .../Details/EntrySpecificationsView.axaml | 2 +- .../Details/EntrySpecificationsViewModel.cs | 29 +++- .../Workshop/Entries/List/EntryListView.axaml | 17 +- .../Entries/List/EntryListViewModel.cs | 7 +- .../Library/Tabs/SubmissionsTabView.axaml | 1 + .../Steps/SpecificationsStepViewModel.cs | 2 +- .../WorkshopConstants.cs | 8 +- .../graphql.config.yml | 2 +- src/Artemis.WebClient.Workshop/schema.graphql | 146 +++++++++++++++--- 11 files changed, 227 insertions(+), 60 deletions(-) diff --git a/src/Artemis.UI/Extensions/Bitmap.cs b/src/Artemis.UI/Extensions/Bitmap.cs index e30bc754f..13a07c35b 100644 --- a/src/Artemis.UI/Extensions/Bitmap.cs +++ b/src/Artemis.UI/Extensions/Bitmap.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Threading.Tasks; using Avalonia.Media.Imaging; using SkiaSharp; @@ -8,41 +7,75 @@ namespace Artemis.UI.Extensions; public class BitmapExtensions { - public static Bitmap LoadAndResize(string file, int size) + public static Bitmap LoadAndResize(string file, int size, bool fit) { using SKBitmap source = SKBitmap.Decode(file); - return Resize(source, size); + return Resize(source, size, fit); } - public static Bitmap LoadAndResize(Stream stream, int size) + public static Bitmap LoadAndResize(Stream stream, int size, bool fit) { stream.Seek(0, SeekOrigin.Begin); using MemoryStream copy = new(); stream.CopyTo(copy); copy.Seek(0, SeekOrigin.Begin); using SKBitmap source = SKBitmap.Decode(copy); - return Resize(source, size); + return Resize(source, size, fit); } - private static Bitmap Resize(SKBitmap source, int size) + private static Bitmap Resize(SKBitmap source, int size, bool fit) { - // Get smaller dimension. - int minDim = Math.Min(source.Width, source.Height); + if (!fit) + { + // Get smaller dimension. + int minDim = Math.Min(source.Width, source.Height); - // Calculate crop rectangle position for center crop. - int deltaX = (source.Width - minDim) / 2; - int deltaY = (source.Height - minDim) / 2; + // Calculate crop rectangle position for center crop. + int deltaX = (source.Width - minDim) / 2; + int deltaY = (source.Height - minDim) / 2; - // Create crop rectangle. - SKRectI rect = new(deltaX, deltaY, deltaX + minDim, deltaY + minDim); + // Create crop rectangle. + SKRectI rect = new(deltaX, deltaY, deltaX + minDim, deltaY + minDim); - // Do the actual cropping of the bitmap. - using SKBitmap croppedBitmap = new(minDim, minDim); - source.ExtractSubset(croppedBitmap, rect); + // Do the actual cropping of the bitmap. + using SKBitmap croppedBitmap = new(minDim, minDim); + source.ExtractSubset(croppedBitmap, rect); - // Resize to the desired size after cropping. - using SKBitmap resizedBitmap = croppedBitmap.Resize(new SKImageInfo(size, size), SKFilterQuality.High); + // Resize to the desired size after cropping. + using SKBitmap resizedBitmap = croppedBitmap.Resize(new SKImageInfo(size, size), SKFilterQuality.High); - return new Bitmap(resizedBitmap.Encode(SKEncodedImageFormat.Png, 100).AsStream()); + // Encode via SKImage for compatibility + using SKImage image = SKImage.FromBitmap(resizedBitmap); + using SKData data = image.Encode(SKEncodedImageFormat.Png, 100); + return new Bitmap(data.AsStream()); + } + else + { + // Fit the image inside a size x size square without cropping. + // Compute scale based on the larger dimension. + float scale = (float)size / Math.Max(source.Width, source.Height); + int targetW = Math.Max(1, (int)Math.Floor(source.Width * scale)); + int targetH = Math.Max(1, (int)Math.Floor(source.Height * scale)); + + // Resize maintaining aspect ratio. + using SKBitmap resizedAspect = source.Resize(new SKImageInfo(targetW, targetH), SKFilterQuality.High); + + // Create final square canvas and draw the fitted image centered. + using SKBitmap finalBitmap = new(size, size); + using (SKCanvas canvas = new(finalBitmap)) + { + // Clear to transparent. + canvas.Clear(SKColors.Transparent); + + int offsetX = (size - targetW) / 2; + int offsetY = (size - targetH) / 2; + canvas.DrawBitmap(resizedAspect, new SKPoint(offsetX, offsetY)); + canvas.Flush(); + } + + using SKImage image = SKImage.FromBitmap(finalBitmap); + using SKData data = image.Encode(SKEncodedImageFormat.Png, 100); + return new Bitmap(data.AsStream()); + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs index afa278f98..7518b2862 100644 --- a/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs +++ b/src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs @@ -187,7 +187,7 @@ public partial class ProfileConfigurationEditViewModel : DialogViewModelBase - Icon required + Shrink diff --git a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs index 4ea3ed070..d2cdd265f 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs @@ -38,15 +38,18 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase [Notify] private bool _isDefault; [Notify] private bool _isEssential; [Notify] private bool _isDeviceProvider; + [Notify] private bool _fit; [Notify] private Bitmap? _iconBitmap; [Notify(Setter.Private)] private bool _iconChanged; + private string? _lastIconPath; + public EntrySpecificationsViewModel(IWorkshopClient workshopClient, IWindowService windowService, IAuthenticationService authenticationService) { _workshopClient = workshopClient; _windowService = windowService; SelectIcon = ReactiveCommand.CreateFromTask(ExecuteSelectIcon); - + Categories.ToObservableChangeSet() .AutoRefresh(c => c.IsSelected) .Filter(c => c.IsSelected) @@ -68,23 +71,24 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase _categoriesValid = categoriesRule.ValidationChanged.Select(c => c.IsValid).ToProperty(this, vm => vm.CategoriesValid); _descriptionValid = descriptionRule.ValidationChanged.Select(c => c.IsValid).ToProperty(this, vm => vm.DescriptionValid); - this.WhenActivatedAsync(async _ => await PopulateCategories()); IsAdministrator = authenticationService.GetRoles().Contains("Administrator"); + this.WhenActivatedAsync(async _ => await PopulateCategories()); + this.WhenAnyValue(vm => vm.Fit).Subscribe(_ => UpdateIcon()); } - + public ReactiveCommand SelectIcon { get; } public ObservableCollection Categories { get; } = new(); public ObservableCollection Tags { get; } = new(); public ReadOnlyObservableCollection SelectedCategories { get; } - - public bool CategoriesValid => _categoriesValid.Value ; + + public bool CategoriesValid => _categoriesValid.Value; public bool IconValid => _iconValid.Value; public bool DescriptionValid => _descriptionValid.Value; public bool IsAdministrator { get; } - + public List PreselectedCategories { get; set; } = new(); - + private async Task ExecuteSelectIcon() { string[]? result = await _windowService.CreateOpenFileDialog() @@ -94,8 +98,17 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase if (result == null) return; + _lastIconPath = result[0]; + UpdateIcon(); + } + + private void UpdateIcon() + { + if (_lastIconPath == null) + return; + IconBitmap?.Dispose(); - IconBitmap = BitmapExtensions.LoadAndResize(result[0], 128); + IconBitmap = BitmapExtensions.LoadAndResize(_lastIconPath, 128, Fit); IconChanged = true; } diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml index 8dbdd04b5..fdbebe7ca 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml +++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml @@ -3,6 +3,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:list="clr-namespace:Artemis.UI.Screens.Workshop.Entries.List" + xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Workshop.Entries.List.EntryListView" x:DataType="list:EntryListViewModel"> @@ -26,6 +27,20 @@ HorizontalAlignment="Right" Width="300" IsVisible="{CompiledBinding ShowCategoryFilter}"> + + + Categories + + + + + + Default entries + + + + + Categories @@ -59,7 +74,7 @@ Modify or clear your filters to view other entries - + diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs index a6b5309c7..cf7f7f816 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs @@ -30,6 +30,7 @@ public partial class EntryListViewModel : RoutableScreen [Notify] private bool _initializing = true; [Notify] private bool _fetchingMore; [Notify] private int _entriesPerFetch; + [Notify] private bool _includeDefaultEntries; [Notify] private Vector _scrollOffset; protected EntryListViewModel(IWorkshopClient workshopClient, @@ -51,13 +52,14 @@ public partial class EntryListViewModel : RoutableScreen Entries = entries; // Respond to filter query input changes + this.WhenAnyValue(vm => vm.IncludeDefaultEntries).Skip(1).Throttle(TimeSpan.FromMilliseconds(200)).Subscribe(_ => Reset()); this.WhenActivated(d => { InputViewModel.WhenAnyValue(vm => vm.Search).Skip(1).Throttle(TimeSpan.FromMilliseconds(200)).Subscribe(_ => Reset()).DisposeWith(d); InputViewModel.WhenAnyValue(vm => vm.SortBy).Skip(1).Throttle(TimeSpan.FromMilliseconds(200)).Subscribe(_ => Reset()).DisposeWith(d); CategoriesViewModel.WhenAnyValue(vm => vm.CategoryFilters).Skip(1).Subscribe(_ => Reset()).DisposeWith(d); }); - + // Load entries when the view model is first activated this.WhenActivatedAsync(async _ => { @@ -76,7 +78,7 @@ public partial class EntryListViewModel : RoutableScreen public EntryType? EntryType { get; set; } public ReadOnlyObservableCollection Entries { get; } - + public async Task FetchMore(CancellationToken cancellationToken) { if (FetchingMore || _currentPageInfo != null && !_currentPageInfo.HasNextPage) @@ -122,6 +124,7 @@ public partial class EntryListViewModel : RoutableScreen And = [ new EntryFilterInput {EntryType = new EntryTypeOperationFilterInput {Eq = EntryType}}, + new EntryFilterInput {DefaultEntryInfo = IncludeDefaultEntries ? new DefaultEntryInfoFilterInput {EntryId = new LongOperationFilterInput {Ngt = 0}} : null}, ..CategoriesViewModel.CategoryFilters ?? [] ] }; diff --git a/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabView.axaml b/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabView.axaml index 63f5272e0..2fd59cde3 100644 --- a/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabView.axaml +++ b/src/Artemis.UI/Screens/Workshop/Library/Tabs/SubmissionsTabView.axaml @@ -32,6 +32,7 @@ + diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs index be4f864b9..593b5255c 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs @@ -80,7 +80,7 @@ public partial class SpecificationsStepViewModel : SubmissionViewModel if (State.Icon != null) { State.Icon.Seek(0, SeekOrigin.Begin); - viewModel.IconBitmap = BitmapExtensions.LoadAndResize(State.Icon, 128); + viewModel.IconBitmap = BitmapExtensions.LoadAndResize(State.Icon, 128, false); } EntrySpecificationsViewModel = viewModel; diff --git a/src/Artemis.WebClient.Workshop/WorkshopConstants.cs b/src/Artemis.WebClient.Workshop/WorkshopConstants.cs index 907ddb843..10807064c 100644 --- a/src/Artemis.WebClient.Workshop/WorkshopConstants.cs +++ b/src/Artemis.WebClient.Workshop/WorkshopConstants.cs @@ -2,10 +2,10 @@ namespace Artemis.WebClient.Workshop; public static class WorkshopConstants { - public const string AUTHORITY_URL = "https://localhost:5001"; - public const string WORKSHOP_URL = "https://localhost:7281"; - // public const string AUTHORITY_URL = "https://identity.artemis-rgb.com"; - // public const string WORKSHOP_URL = "https://workshop.artemis-rgb.com"; + // public const string AUTHORITY_URL = "https://localhost:5001"; + // public const string WORKSHOP_URL = "https://localhost:7281"; + public const string AUTHORITY_URL = "https://identity.artemis-rgb.com"; + public const string WORKSHOP_URL = "https://workshop.artemis-rgb.com"; public const string IDENTITY_CLIENT_NAME = "IdentityApiClient"; public const string WORKSHOP_CLIENT_NAME = "WorkshopApiClient"; } \ No newline at end of file diff --git a/src/Artemis.WebClient.Workshop/graphql.config.yml b/src/Artemis.WebClient.Workshop/graphql.config.yml index 4e6e409e5..f4c94896d 100644 --- a/src/Artemis.WebClient.Workshop/graphql.config.yml +++ b/src/Artemis.WebClient.Workshop/graphql.config.yml @@ -2,7 +2,7 @@ schema: schema.graphql extensions: endpoints: Default GraphQL Endpoint: - url: https://localhost:7281/graphql/ + url: https://workshop.artemis-rgb.com/graphql/ headers: user-agent: JS GraphQL introspect: true diff --git a/src/Artemis.WebClient.Workshop/schema.graphql b/src/Artemis.WebClient.Workshop/schema.graphql index 17190a026..3ca000dce 100644 --- a/src/Artemis.WebClient.Workshop/schema.graphql +++ b/src/Artemis.WebClient.Workshop/schema.graphql @@ -1,6 +1,4 @@ -# This file was generated. Do not edit manually. - -schema { +schema { query: Query mutation: Mutation } @@ -107,11 +105,19 @@ type Mutation { addEntry(input: CreateEntryInput!): Entry @authorize @cost(weight: "10") updateEntry(input: UpdateEntryInput!): Entry @authorize @cost(weight: "10") removeEntry(id: Long!): Entry @authorize @cost(weight: "10") - updateEntryImage(input: UpdateEntryImageInput!): Image @authorize @cost(weight: "10") - setLayoutInfo(input: SetLayoutInfoInput!): [LayoutInfo!]! @authorize @cost(weight: "10") - addLayoutInfo(input: CreateLayoutInfoInput!): LayoutInfo @authorize @cost(weight: "10") + updateEntryImage(input: UpdateEntryImageInput!): Image + @authorize + @cost(weight: "10") + setLayoutInfo(input: SetLayoutInfoInput!): [LayoutInfo!]! + @authorize + @cost(weight: "10") + addLayoutInfo(input: CreateLayoutInfoInput!): LayoutInfo + @authorize + @cost(weight: "10") removeLayoutInfo(id: Long!): LayoutInfo! @authorize @cost(weight: "10") - updateRelease(input: UpdateReleaseInput!): Release @authorize @cost(weight: "10") + updateRelease(input: UpdateReleaseInput!): Release + @authorize + @cost(weight: "10") removeRelease(id: Long!): Release! @authorize @cost(weight: "10") } @@ -152,16 +158,88 @@ type PluginInfosCollectionSegment { } type Query { - categories(order: [CategorySortInput!] @cost(weight: "10") where: CategoryFilterInput @cost(weight: "10")): [Category!]! @cost(weight: "10") - entries(skip: Int take: Int search: String popular: Boolean order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): EntriesCollectionSegment @listSize(assumedSize: 100, slicingArguments: [ "take" ], slicingArgumentDefaultValue: 10, sizedFields: [ "items" ], requireOneSlicingArgument: false) @cost(weight: "10") - entriesV2(search: String popular: Boolean "Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." after: String "Returns the last _n_ elements from the list." last: Int "Returns the elements in the list that come before the specified cursor." before: String order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): EntriesV2Connection @listSize(assumedSize: 100, slicingArguments: [ "first", "last" ], slicingArgumentDefaultValue: 10, sizedFields: [ "edges", "nodes" ], requireOneSlicingArgument: false) @cost(weight: "10") + categories( + order: [CategorySortInput!] @cost(weight: "10") + where: CategoryFilterInput @cost(weight: "10") + ): [Category!]! @cost(weight: "10") + entries( + skip: Int + take: Int + search: String + popular: Boolean + order: [EntrySortInput!] @cost(weight: "10") + where: EntryFilterInput @cost(weight: "10") + ): EntriesCollectionSegment + @listSize( + assumedSize: 100 + slicingArguments: ["take"] + slicingArgumentDefaultValue: 10 + sizedFields: ["items"] + requireOneSlicingArgument: false + ) + @cost(weight: "10") + entriesV2( + search: String + popular: Boolean + "Returns the first _n_ elements from the list." + first: Int + "Returns the elements in the list that come after the specified cursor." + after: String + "Returns the last _n_ elements from the list." + last: Int + "Returns the elements in the list that come before the specified cursor." + before: String + order: [EntrySortInput!] @cost(weight: "10") + where: EntryFilterInput @cost(weight: "10") + ): EntriesV2Connection + @listSize( + assumedSize: 100 + slicingArguments: ["first", "last"] + slicingArgumentDefaultValue: 10 + sizedFields: ["edges", "nodes"] + requireOneSlicingArgument: false + ) + @cost(weight: "10") entry(id: Long!): Entry @cost(weight: "10") - submittedEntries(order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): [Entry!]! @authorize @cost(weight: "10") - popularEntries(where: EntryFilterInput @cost(weight: "10")): [Entry!]! @cost(weight: "10") - searchEntries(input: String! type: EntryType order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10")): [Entry!]! @cost(weight: "10") - searchLayout(deviceProvider: UUID! deviceType: RGBDeviceType! vendor: String! model: String!): LayoutInfo @cost(weight: "10") - searchKeyboardLayout(deviceProvider: UUID! vendor: String! model: String! physicalLayout: KeyboardLayoutType! logicalLayout: String): LayoutInfo @cost(weight: "10") - pluginInfos(skip: Int take: Int order: [PluginInfoSortInput!] @cost(weight: "10") where: PluginInfoFilterInput @cost(weight: "10")): PluginInfosCollectionSegment @listSize(assumedSize: 100, slicingArguments: [ "take" ], slicingArgumentDefaultValue: 10, sizedFields: [ "items" ], requireOneSlicingArgument: false) @cost(weight: "10") + submittedEntries( + order: [EntrySortInput!] @cost(weight: "10") + where: EntryFilterInput @cost(weight: "10") + ): [Entry!]! @authorize @cost(weight: "10") + popularEntries(where: EntryFilterInput @cost(weight: "10")): [Entry!]! + @cost(weight: "10") + searchEntries( + input: String! + type: EntryType + order: [EntrySortInput!] @cost(weight: "10") + where: EntryFilterInput @cost(weight: "10") + ): [Entry!]! @cost(weight: "10") + searchLayout( + deviceProvider: UUID! + deviceType: RGBDeviceType! + vendor: String! + model: String! + ): LayoutInfo @cost(weight: "10") + searchKeyboardLayout( + deviceProvider: UUID! + vendor: String! + model: String! + physicalLayout: KeyboardLayoutType! + logicalLayout: String + ): LayoutInfo @cost(weight: "10") + pluginInfos( + skip: Int + take: Int + order: [PluginInfoSortInput!] @cost(weight: "10") + where: PluginInfoFilterInput @cost(weight: "10") + ): PluginInfosCollectionSegment + @listSize( + assumedSize: 100 + slicingArguments: ["take"] + slicingArgumentDefaultValue: 10 + sizedFields: ["items"] + requireOneSlicingArgument: false + ) + @cost(weight: "10") pluginInfo(pluginGuid: UUID!): PluginInfo @cost(weight: "10") release(id: Long!): Release @cost(weight: "10") } @@ -621,21 +699,45 @@ enum SortEnumType { } "The authorize directive." -directive @authorize("The name of the authorization policy that determines access to the annotated resource." policy: String "Roles that are allowed to access the annotated resource." roles: [String!] "Defines when when the authorize directive shall be applied.By default the authorize directives are applied during the validation phase." apply: ApplyPolicy! = BEFORE_RESOLVER) repeatable on OBJECT | FIELD_DEFINITION +directive @authorize( + "The name of the authorization policy that determines access to the annotated resource." + policy: String + "Roles that are allowed to access the annotated resource." + roles: [String!] + "Defines when when the authorize directive shall be applied.By default the authorize directives are applied during the validation phase." + apply: ApplyPolicy! = BEFORE_RESOLVER +) repeatable on OBJECT | FIELD_DEFINITION "The purpose of the `cost` directive is to define a `weight` for GraphQL types, fields, and arguments. Static analysis can use these weights when calculating the overall cost of a query or response." -directive @cost("The `weight` argument defines what value to add to the overall cost for every appearance, or possible appearance, of a type, field, argument, etc." weight: String!) on SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | ENUM | INPUT_FIELD_DEFINITION +directive @cost( + "The `weight` argument defines what value to add to the overall cost for every appearance, or possible appearance, of a type, field, argument, etc." + weight: String! +) on SCALAR | OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | ENUM | INPUT_FIELD_DEFINITION "The purpose of the `@listSize` directive is to either inform the static analysis about the size of returned lists (if that information is statically available), or to point the analysis to where to find that information." -directive @listSize("The `assumedSize` argument can be used to statically define the maximum length of a list returned by a field." assumedSize: Int "The `slicingArguments` argument can be used to define which of the field's arguments with numeric type are slicing arguments, so that their value determines the size of the list returned by that field. It may specify a list of multiple slicing arguments." slicingArguments: [String!] "The `slicingArgumentDefaultValue` argument can be used to define a default value for a slicing argument, which is used if the argument is not present in a query." slicingArgumentDefaultValue: Int "The `sizedFields` argument can be used to define that the value of the `assumedSize` argument or of a slicing argument does not affect the size of a list returned by a field itself, but that of a list returned by one of its sub-fields." sizedFields: [String!] "The `requireOneSlicingArgument` argument can be used to inform the static analysis that it should expect that exactly one of the defined slicing arguments is present in a query. If that is not the case (i.e., if none or multiple slicing arguments are present), the static analysis may throw an error." requireOneSlicingArgument: Boolean! = true) on FIELD_DEFINITION +directive @listSize( + "The `assumedSize` argument can be used to statically define the maximum length of a list returned by a field." + assumedSize: Int + "The `slicingArguments` argument can be used to define which of the field's arguments with numeric type are slicing arguments, so that their value determines the size of the list returned by that field. It may specify a list of multiple slicing arguments." + slicingArguments: [String!] + "The `slicingArgumentDefaultValue` argument can be used to define a default value for a slicing argument, which is used if the argument is not present in a query." + slicingArgumentDefaultValue: Int + "The `sizedFields` argument can be used to define that the value of the `assumedSize` argument or of a slicing argument does not affect the size of a list returned by a field itself, but that of a list returned by one of its sub-fields." + sizedFields: [String!] + "The `requireOneSlicingArgument` argument can be used to inform the static analysis that it should expect that exactly one of the defined slicing arguments is present in a query. If that is not the case (i.e., if none or multiple slicing arguments are present), the static analysis may throw an error." + requireOneSlicingArgument: Boolean! = true +) on FIELD_DEFINITION "The `@specifiedBy` directive is used within the type system definition language to provide a URL for specifying the behavior of custom scalar definitions." -directive @specifiedBy("The specifiedBy URL points to a human-readable specification. This field will only read a result for scalar types." url: String!) on SCALAR +directive @specifiedBy( + "The specifiedBy URL points to a human-readable specification. This field will only read a result for scalar types." + url: String! +) on SCALAR "The `DateTime` scalar represents an ISO-8601 compliant date time type." -scalar DateTime @specifiedBy(url: "https:\/\/www.graphql-scalars.com\/date-time") +scalar DateTime @specifiedBy(url: "https://www.graphql-scalars.com/date-time") "The `Long` scalar type represents non-fractional signed whole 64-bit numeric values. Long can represent values between -(2^63) and 2^63 - 1." scalar Long -scalar UUID @specifiedBy(url: "https:\/\/tools.ietf.org\/html\/rfc4122") \ No newline at end of file +scalar UUID @specifiedBy(url: "https://tools.ietf.org/html/rfc4122") From 565647f1ed6514dd63754932b9f6fe24563f778d Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 8 Dec 2025 22:27:18 +0100 Subject: [PATCH 10/19] Workshop - Improves default entry handling in workshop Core - Modifies the Artemis data folder path based on the build configuration. Plugins - Adds a confirmation dialog to prompt the user to restart if a plugin requires admin rights. Startup wizard - Updates the installation progress bar in the startup wizard. Workshop - Changes category retrieval to be based on EntryType. Workshop - Adds the ability to include default entries when searching the workshop. --- src/Artemis.Core/Constants.cs | 4 ++++ .../Screens/Plugins/PluginViewModel.cs | 2 +- .../Steps/DefaultEntriesStepView.axaml | 1 - .../Steps/DefaultEntriesStepViewModel.cs | 2 +- .../Steps/DefaultEntryItemViewModel.cs | 3 --- .../Workshop/Categories/CategoriesViewModel.cs | 4 ++-- .../Details/EntrySpecificationsViewModel.cs | 3 ++- .../Workshop/Entries/List/EntryListView.axaml | 15 ++++++--------- .../Workshop/Entries/List/EntryListViewModel.cs | 17 +++++++++-------- .../Workshop/Home/WorkshopHomeViewModel.cs | 2 +- .../Layout/LayoutListDefaultViewModel.cs | 6 +++--- .../Library/SubmissionDetailsViewModel.cs | 1 + .../Workshop/Plugins/PluginListViewModel.cs | 6 +++--- .../Workshop/Profile/ProfileListViewModel.cs | 6 +++--- .../Steps/SpecificationsStepViewModel.cs | 1 + .../Steps/SubmitStepViewModel.cs | 2 +- .../Queries/GetCategories.graphql | 4 ++-- .../Queries/GetEntries.graphql | 5 +++-- src/Artemis.WebClient.Workshop/schema.graphql | 14 ++++++++++++-- 19 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/Artemis.Core/Constants.cs b/src/Artemis.Core/Constants.cs index 6ad386c9f..5699dbac4 100644 --- a/src/Artemis.Core/Constants.cs +++ b/src/Artemis.Core/Constants.cs @@ -40,7 +40,11 @@ public static class Constants /// /// The full path to the Artemis data folder /// +#if DEBUG public static readonly string DataFolder = Path.Combine(BaseFolder, "Artemis-dev"); +#else + public static readonly string DataFolder = Path.Combine(BaseFolder, "Artemis"); +#endif /// /// The full path to the Artemis logs folder diff --git a/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs b/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs index ae312a2be..c29963248 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs +++ b/src/Artemis.UI/Screens/Plugins/PluginViewModel.cs @@ -119,7 +119,7 @@ public partial class PluginViewModel : ActivatableViewModelBase Enabling = true; if (Plugin.Info.RequiresAdmin && !_coreService.IsElevated) { - bool confirmed = await _windowService.ShowConfirmContentDialog("Enable plugin", "This plugin requires admin rights, are you sure you want to enable it?"); + bool confirmed = await _windowService.ShowConfirmContentDialog("Enable plugin", "This plugin requires admin rights, are you sure you want to enable it? Artemis will need to restart.", "Confirm and restart"); if (!confirmed) return; } diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml index 877ff9849..f474cfe5b 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepView.axaml @@ -62,7 +62,6 @@ Currently installing: diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs index 7a8c60467..5b631e1f9 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntriesStepViewModel.cs @@ -41,7 +41,7 @@ public partial class DefaultEntriesStepViewModel : WizardStepViewModel _client = client; _getDefaultEntryItemViewModel = getDefaultEntryItemViewModel; _remainingEntries = this.WhenAnyValue(vm => vm.InstalledEntries, vm => vm.TotalEntries) - .Select(t => t.Item2 - t.Item1) + .Select(t => t.Item2 - t.Item1 + 1) .ToProperty(this, vm => vm.RemainingEntries); ContinueText = "Install selected entries"; diff --git a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs index a96f28bd1..a93e8512c 100644 --- a/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs +++ b/src/Artemis.UI/Screens/StartupWizard/Steps/DefaultEntryItemViewModel.cs @@ -31,7 +31,6 @@ public partial class DefaultEntryItemViewModel : ActivatableViewModelBase [Notify] private bool _isInstalled; [Notify] private bool _shouldInstall; - [Notify] private bool _enabling; [Notify] private float _installProgress; public DefaultEntryItemViewModel(ILogger logger, IEntrySummary entry, IWorkshopService workshopService, IWindowService windowService, IPluginManagementService pluginManagementService, @@ -70,9 +69,7 @@ public partial class DefaultEntryItemViewModel : ActivatableViewModelBase // If the entry is a plugin, enable the plugin and all features else if (result.Entry?.EntryType == EntryType.Plugin) { - Enabling = true; await EnablePluginAndFeatures(result.Entry); - Enabling = false; } return result.IsSuccess; diff --git a/src/Artemis.UI/Screens/Workshop/Categories/CategoriesViewModel.cs b/src/Artemis.UI/Screens/Workshop/Categories/CategoriesViewModel.cs index 74d0f629e..40f68116f 100644 --- a/src/Artemis.UI/Screens/Workshop/Categories/CategoriesViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Categories/CategoriesViewModel.cs @@ -18,10 +18,10 @@ public class CategoriesViewModel : ActivatableViewModelBase { private ObservableAsPropertyHelper?>? _categoryFilters; - public CategoriesViewModel(IWorkshopClient client) + public CategoriesViewModel(EntryType entryType, IWorkshopClient client) { client.GetCategories - .Watch(ExecutionStrategy.CacheFirst) + .Watch(entryType, ExecutionStrategy.CacheFirst) .SelectOperationResult(c => c.Categories) .ToObservableChangeSet(c => c.Id) .Transform(c => new CategoryViewModel(c)) diff --git a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs index d2cdd265f..aee4bb5b9 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Entries/Details/EntrySpecificationsViewModel.cs @@ -88,6 +88,7 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase public bool IsAdministrator { get; } public List PreselectedCategories { get; set; } = new(); + public EntryType EntryType { get; set; } private async Task ExecuteSelectIcon() { @@ -114,7 +115,7 @@ public partial class EntrySpecificationsViewModel : ValidatableViewModelBase private async Task PopulateCategories() { - IOperationResult categories = await _workshopClient.GetCategories.ExecuteAsync(); + IOperationResult categories = await _workshopClient.GetCategories.ExecuteAsync(EntryType); Categories.Clear(); if (categories.Data != null) Categories.AddRange(categories.Data.Categories.Select(c => new CategoryViewModel(c) {IsSelected = PreselectedCategories.Contains(c.Id)})); diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml index fdbebe7ca..c8b0051c7 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml +++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListView.axaml @@ -22,6 +22,7 @@ Categories - - - - Default entries - - - Categories - - + + + Include default entries + + diff --git a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs index cf7f7f816..fd29fcd46 100644 --- a/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Entries/List/EntryListViewModel.cs @@ -25,7 +25,7 @@ public partial class EntryListViewModel : RoutableScreen private readonly SourceList _entries = new(); private readonly INotificationService _notificationService; private readonly IWorkshopClient _workshopClient; - private IGetEntriesv2_EntriesV2_PageInfo? _currentPageInfo; + private IGetEntries_EntriesV2_PageInfo? _currentPageInfo; [Notify] private bool _initializing = true; [Notify] private bool _fetchingMore; @@ -33,18 +33,20 @@ public partial class EntryListViewModel : RoutableScreen [Notify] private bool _includeDefaultEntries; [Notify] private Vector _scrollOffset; - protected EntryListViewModel(IWorkshopClient workshopClient, - CategoriesViewModel categoriesViewModel, + protected EntryListViewModel(EntryType entryType, + IWorkshopClient workshopClient, EntryListInputViewModel entryListInputViewModel, INotificationService notificationService, + Func getCategoriesViewModel, Func getEntryListViewModel) { _workshopClient = workshopClient; _notificationService = notificationService; - CategoriesViewModel = categoriesViewModel; + CategoriesViewModel = getCategoriesViewModel(entryType); InputViewModel = entryListInputViewModel; - + EntryType = entryType; + _entries.Connect() .Transform(getEntryListViewModel) .Bind(out ReadOnlyObservableCollection entries) @@ -75,7 +77,7 @@ public partial class EntryListViewModel : RoutableScreen public CategoriesViewModel CategoriesViewModel { get; } public EntryListInputViewModel InputViewModel { get; } public bool ShowCategoryFilter { get; set; } = true; - public EntryType? EntryType { get; set; } + public EntryType EntryType { get; } public ReadOnlyObservableCollection Entries { get; } @@ -93,7 +95,7 @@ public partial class EntryListViewModel : RoutableScreen try { - IOperationResult entries = await _workshopClient.GetEntriesv2.ExecuteAsync(search, filter, sort, entriesPerFetch, _currentPageInfo?.EndCursor, cancellationToken); + IOperationResult entries = await _workshopClient.GetEntries.ExecuteAsync(search, IncludeDefaultEntries, filter, sort, entriesPerFetch, _currentPageInfo?.EndCursor, cancellationToken); entries.EnsureNoErrors(); _currentPageInfo = entries.Data?.EntriesV2?.PageInfo; @@ -124,7 +126,6 @@ public partial class EntryListViewModel : RoutableScreen And = [ new EntryFilterInput {EntryType = new EntryTypeOperationFilterInput {Eq = EntryType}}, - new EntryFilterInput {DefaultEntryInfo = IncludeDefaultEntries ? new DefaultEntryInfoFilterInput {EntryId = new LongOperationFilterInput {Ngt = 0}} : null}, ..CategoriesViewModel.CategoryFilters ?? [] ] }; diff --git a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs index 3ab39b11b..4dee0a822 100644 --- a/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Home/WorkshopHomeViewModel.cs @@ -51,7 +51,7 @@ public partial class WorkshopHomeViewModel : RoutableScreen p.AddRange(popularResult.Data.PopularEntries.Take(8)); }); - IOperationResult latestResult = await client.GetEntriesv2.ExecuteAsync(null, null, [new EntrySortInput {CreatedAt = SortEnumType.Desc}], 8, null); + IOperationResult latestResult = await client.GetEntries.ExecuteAsync(null, null, null, [new EntrySortInput {CreatedAt = SortEnumType.Desc}], 8, null); latest.Edit(l => { l.Clear(); diff --git a/src/Artemis.UI/Screens/Workshop/Layout/LayoutListDefaultViewModel.cs b/src/Artemis.UI/Screens/Workshop/Layout/LayoutListDefaultViewModel.cs index b9521529c..c61eabef9 100644 --- a/src/Artemis.UI/Screens/Workshop/Layout/LayoutListDefaultViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Layout/LayoutListDefaultViewModel.cs @@ -1,3 +1,4 @@ +using System; using Artemis.UI.Screens.Workshop.Entries.List; using Artemis.UI.Screens.Workshop.LayoutFinder; using Artemis.UI.Shared.Routing; @@ -7,11 +8,10 @@ namespace Artemis.UI.Screens.Workshop.Layout; public class LayoutListDefaultViewModel : RoutableScreen { - public LayoutListDefaultViewModel(LayoutFinderViewModel layoutFinderViewModel, EntryListViewModel entryListViewModel) + public LayoutListDefaultViewModel(LayoutFinderViewModel layoutFinderViewModel, Func getEntryListViewModel) { LayoutFinderViewModel = layoutFinderViewModel; - EntryListViewModel = entryListViewModel; - EntryListViewModel.EntryType = EntryType.Layout; + EntryListViewModel = getEntryListViewModel(EntryType.Layout); EntryListViewModel.ShowCategoryFilter = false; } diff --git a/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs b/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs index bcef82f2c..1c500fc7c 100644 --- a/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Library/SubmissionDetailsViewModel.cs @@ -109,6 +109,7 @@ public partial class SubmissionDetailsViewModel : RoutableScreen specificationsViewModel.IsEssential = Entry.DefaultEntryInfo?.IsEssential ?? false; specificationsViewModel.IsDeviceProvider = Entry.DefaultEntryInfo?.IsDeviceProvider ?? false; specificationsViewModel.PreselectedCategories = Entry.Categories.Select(c => c.Id).ToList(); + specificationsViewModel.EntryType = Entry.EntryType; specificationsViewModel.Tags.Clear(); foreach (string tag in Entry.Tags.Select(c => c.Name)) diff --git a/src/Artemis.UI/Screens/Workshop/Plugins/PluginListViewModel.cs b/src/Artemis.UI/Screens/Workshop/Plugins/PluginListViewModel.cs index 7401c2659..422a67223 100644 --- a/src/Artemis.UI/Screens/Workshop/Plugins/PluginListViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Plugins/PluginListViewModel.cs @@ -1,3 +1,4 @@ +using System; using Artemis.UI.Screens.Workshop.Entries.List; using Artemis.UI.Shared.Routing; using Artemis.WebClient.Workshop; @@ -9,9 +10,8 @@ public class PluginListViewModel : RoutableHostScreen private readonly EntryListViewModel _entryListViewModel; public override RoutableScreen DefaultScreen => _entryListViewModel; - public PluginListViewModel(EntryListViewModel entryListViewModel) + public PluginListViewModel(Func getEntryListViewModel) { - _entryListViewModel = entryListViewModel; - _entryListViewModel.EntryType = EntryType.Plugin; + _entryListViewModel = getEntryListViewModel(EntryType.Plugin); } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Workshop/Profile/ProfileListViewModel.cs b/src/Artemis.UI/Screens/Workshop/Profile/ProfileListViewModel.cs index 75faa19a1..d8b098761 100644 --- a/src/Artemis.UI/Screens/Workshop/Profile/ProfileListViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/Profile/ProfileListViewModel.cs @@ -1,3 +1,4 @@ +using System; using Artemis.UI.Screens.Workshop.Entries.List; using Artemis.UI.Shared.Routing; using Artemis.WebClient.Workshop; @@ -9,9 +10,8 @@ public class ProfileListViewModel : RoutableHostScreen private readonly EntryListViewModel _entryListViewModel; public override RoutableScreen DefaultScreen => _entryListViewModel; - public ProfileListViewModel(EntryListViewModel entryListViewModel) + public ProfileListViewModel(Func getEntryListViewModel) { - _entryListViewModel = entryListViewModel; - _entryListViewModel.EntryType = EntryType.Profile; + _entryListViewModel = getEntryListViewModel(EntryType.Profile); } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs index 593b5255c..1b8c2a35c 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SpecificationsStepViewModel.cs @@ -75,6 +75,7 @@ public partial class SpecificationsStepViewModel : SubmissionViewModel // Categories viewModel.PreselectedCategories = State.Categories; + viewModel.EntryType = State.EntryType; // Icon if (State.Icon != null) diff --git a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SubmitStepViewModel.cs b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SubmitStepViewModel.cs index 5cbc4c1ef..111b9bb36 100644 --- a/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SubmitStepViewModel.cs +++ b/src/Artemis.UI/Screens/Workshop/SubmissionWizard/Steps/SubmitStepViewModel.cs @@ -38,7 +38,7 @@ public partial class SubmitStepViewModel : SubmissionViewModel IconBitmap.DisposeWith(d); } - Observable.FromAsync(workshopClient.GetCategories.ExecuteAsync).Subscribe(PopulateCategories).DisposeWith(d); + Observable.FromAsync(() => workshopClient.GetCategories.ExecuteAsync(State.EntryType)).Subscribe(PopulateCategories).DisposeWith(d); }); } diff --git a/src/Artemis.WebClient.Workshop/Queries/GetCategories.graphql b/src/Artemis.WebClient.Workshop/Queries/GetCategories.graphql index 864caa217..1770bfcdc 100644 --- a/src/Artemis.WebClient.Workshop/Queries/GetCategories.graphql +++ b/src/Artemis.WebClient.Workshop/Queries/GetCategories.graphql @@ -1,5 +1,5 @@ -query GetCategories { - categories(order: {name: ASC}) { +query GetCategories($entryType: EntryType) { + categories(where: {entryType: {in: [$entryType, null]}} order: {name: ASC}) { id name icon diff --git a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql index 782faa984..cdcda0581 100644 --- a/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql +++ b/src/Artemis.WebClient.Workshop/Queries/GetEntries.graphql @@ -1,5 +1,5 @@ -query GetEntriesv2($search: String $filter: EntryFilterInput $order: [EntrySortInput!] $first: Int $after: String) { - entriesV2(search: $search where: $filter order: $order first: $first after: $after) { +query GetEntries($search: String $includeDefaults: Boolean $filter: EntryFilterInput $order: [EntrySortInput!] $first: Int $after: String) { + entriesV2(search: $search includeDefaults: $includeDefaults where: $filter order: $order first: $first after: $after) { totalCount pageInfo { hasNextPage @@ -22,6 +22,7 @@ query GetPopularEntries { query GetDefaultEntries($first: Int, $after: String) { entriesV2( + includeDefaults: true where: { defaultEntryInfo: { entryId: { gt: 0 } } } first: $first after: $after diff --git a/src/Artemis.WebClient.Workshop/schema.graphql b/src/Artemis.WebClient.Workshop/schema.graphql index 3ca000dce..ebc1d6535 100644 --- a/src/Artemis.WebClient.Workshop/schema.graphql +++ b/src/Artemis.WebClient.Workshop/schema.graphql @@ -7,6 +7,7 @@ type Category { id: Long! name: String! icon: String! + entryType: EntryType } "Information about the offset pagination." @@ -166,7 +167,7 @@ type Query { skip: Int take: Int search: String - popular: Boolean + includeDefaults: Boolean order: [EntrySortInput!] @cost(weight: "10") where: EntryFilterInput @cost(weight: "10") ): EntriesCollectionSegment @@ -180,7 +181,7 @@ type Query { @cost(weight: "10") entriesV2( search: String - popular: Boolean + includeDefaults: Boolean "Returns the first _n_ elements from the list." first: Int "Returns the elements in the list that come after the specified cursor." @@ -273,12 +274,14 @@ input CategoryFilterInput { id: LongOperationFilterInput name: StringOperationFilterInput icon: StringOperationFilterInput + entryType: NullableOfEntryTypeOperationFilterInput } input CategorySortInput { id: SortEnumType @cost(weight: "10") name: SortEnumType @cost(weight: "10") icon: SortEnumType @cost(weight: "10") + entryType: SortEnumType @cost(weight: "10") } input CreateEntryInput { @@ -509,6 +512,13 @@ input LongOperationFilterInput { nlte: Long @cost(weight: "10") } +input NullableOfEntryTypeOperationFilterInput { + eq: EntryType @cost(weight: "10") + neq: EntryType @cost(weight: "10") + in: [EntryType] @cost(weight: "10") + nin: [EntryType] @cost(weight: "10") +} + input NullableOfKeyboardLayoutTypeOperationFilterInput { eq: KeyboardLayoutType @cost(weight: "10") neq: KeyboardLayoutType @cost(weight: "10") From 3c8d8b23875c297264fbc7337e2dc71ea238ca83 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 9 Dec 2025 20:19:26 +0100 Subject: [PATCH 11/19] Plugins - Allow config window to be mandatory UI - Move profile editor into Profile screen, profile page no longer always has to show the editor --- .../Plugins/IPluginConfigurationDialog.cs | 6 +++ .../Controls/TagsInput/TagsInputStyles.axaml | 1 - .../Plugins/PluginConfigurationDialog.cs | 19 +++++++ .../Styles/BrokenState.axaml | 1 - src/Artemis.UI.Shared/Styles/Button.axaml | 3 +- .../Styles/Controls/DataModelPicker.axaml | 1 - .../Controls/DataModelPickerButton.axaml | 1 - src/Artemis.UI/Artemis.UI.csproj | 51 +++++++++++++++++++ src/Artemis.UI/Artemis.UI.csproj.DotSettings | 5 +- .../Controls/SplitMarkdownEditor.axaml | 2 - .../Converters/PropertyTreeMarginConverter.cs | 1 + .../BrushPropertyInputViewModel.cs | 1 + src/Artemis.UI/DryIoc/Factories/IVMFactory.cs | 16 +++++- .../LayerPropertyViewModelInstanceProvider.cs | 3 ++ src/Artemis.UI/Routing/Routes.cs | 1 + .../Performance/PerformanceDebugView.axaml | 3 +- .../Screens/Device/DeviceSettingsView.axaml | 1 - .../Tabs/General/DeviceGeneralTabView.axaml | 1 - .../InputMappings/InputMappingsTabView.axaml | 1 - .../LayoutProviders/WorkshopLayoutView.axaml | 1 - .../Device/Tabs/Leds/DeviceLedsTabView.axaml | 1 - .../Plugins/Features/PluginFeatureView.axaml | 2 - .../Plugins/PluginSettingsWindowView.axaml | 1 - .../Screens/Plugins/PluginView.axaml | 1 - .../PluginPrerequisiteActionView.axaml | 1 - .../PluginPrerequisiteView.axaml | 1 - .../ConditionTypeViewModel.cs | 2 +- .../AlwaysOnConditionView.axaml | 2 +- .../AlwaysOnConditionView.axaml.cs | 3 +- .../AlwaysOnConditionViewModel.cs | 2 +- .../ConditionTypes/EventConditionView.axaml | 4 +- .../EventConditionView.axaml.cs | 3 +- .../ConditionTypes/EventConditionViewModel.cs | 2 +- .../PlayOnceConditionView.axaml | 2 +- .../PlayOnceConditionView.axaml.cs | 3 +- .../PlayOnceConditionViewModel.cs | 2 +- .../ConditionTypes/StaticConditionView.axaml | 4 +- .../StaticConditionView.axaml.cs | 3 +- .../StaticConditionViewModel.cs | 2 +- .../DisplayConditionScriptView.axaml | 4 +- .../DisplayConditionScriptView.axaml.cs | 3 +- .../DisplayConditionScriptViewModel.cs | 2 +- .../Panels/MenuBar/MenuBarView.axaml | 6 +-- .../Panels/MenuBar/MenuBarView.axaml.cs | 3 +- .../Panels/MenuBar/MenuBarViewModel.cs | 4 +- .../Panels/Playback/PlaybackView.axaml | 6 +-- .../Panels/Playback/PlaybackView.axaml.cs | 3 +- .../Panels/Playback/PlaybackViewModel.cs | 4 +- .../Behaviors/ProfileTreeViewDropHandler.cs | 2 +- .../ProfileElementRenameView.axaml | 6 +-- .../ProfileElementRenameView.axaml.cs | 5 +- .../ProfileElementRenameViewModel.cs | 4 +- .../AdaptionHintViewModelBase.cs | 2 +- .../CategoryAdaptionHintView.axaml | 6 +-- .../CategoryAdaptionHintView.axaml.cs | 3 +- .../CategoryAdaptionHintViewModel.cs | 2 +- .../DeviceAdaptionHintView.axaml | 6 +-- .../DeviceAdaptionHintView.axaml.cs | 3 +- .../DeviceAdaptionHintViewModel.cs | 2 +- .../KeyboardSectionAdaptionHintView.axaml | 6 +-- .../KeyboardSectionAdaptionHintView.axaml.cs | 3 +- .../KeyboardSectionAdaptionHintViewModel.cs | 2 +- .../SingleLedAdaptionHintView.axaml | 7 ++- .../SingleLedAdaptionHintView.axaml.cs | 3 +- .../SingleLedAdaptionHintViewModel.cs | 6 +-- .../Dialogs/LayerHintsDialogView.axaml | 7 ++- .../Dialogs/LayerHintsDialogView.axaml.cs | 4 +- .../Dialogs/LayerHintsDialogViewModel.cs | 4 +- .../ProfileTree/FolderTreeItemView.axaml | 7 ++- .../ProfileTree/FolderTreeItemView.axaml.cs | 2 +- .../ProfileTree/FolderTreeItemViewModel.cs | 6 +-- .../ProfileTree/LayerTreeItemView.axaml | 7 ++- .../ProfileTree/LayerTreeItemView.axaml.cs | 2 +- .../ProfileTree/LayerTreeItemViewModel.cs | 2 +- .../Panels/ProfileTree/ProfileTreeView.axaml | 12 ++--- .../ProfileTree/ProfileTreeView.axaml.cs | 2 +- .../ProfileTree/ProfileTreeViewModel.cs | 14 ++--- .../Panels/ProfileTree/TreeItemViewModel.cs | 16 +++--- .../DataBinding/DataBindingView.axaml | 5 +- .../DataBinding/DataBindingView.axaml.cs | 3 +- .../DataBinding/DataBindingViewModel.cs | 2 +- .../Properties/Dialogs/AddEffectView.axaml | 6 +-- .../Properties/Dialogs/AddEffectView.axaml.cs | 3 +- .../Properties/Dialogs/AddEffectViewModel.cs | 4 +- .../Dialogs/TimelineSegmentEditView.axaml | 6 +-- .../Dialogs/TimelineSegmentEditView.axaml.cs | 3 +- .../Dialogs/TimelineSegmentEditViewModel.cs | 2 +- .../Panels/Properties/PropertiesView.axaml | 8 +-- .../Panels/Properties/PropertiesView.axaml.cs | 3 +- .../Panels/Properties/PropertiesViewModel.cs | 10 ++-- .../Properties/PropertyGroupViewModel.cs | 9 ++-- .../Panels/Properties/PropertyViewModel.cs | 6 +-- .../Properties/PropertyViewModelBase.cs | 2 +- .../Timeline/ITimelinePropertyViewModel.cs | 4 +- .../Keyframes/ITimelineKeyframeViewModel.cs | 2 +- .../Keyframes/TimelineEasingView.axaml | 6 +-- .../Keyframes/TimelineEasingView.axaml.cs | 3 +- .../Keyframes/TimelineEasingViewModel.cs | 2 +- .../Keyframes/TimelineKeyframeView.axaml | 6 +-- .../Keyframes/TimelineKeyframeView.axaml.cs | 3 +- .../Keyframes/TimelineKeyframeViewModel.cs | 5 +- .../Timeline/Segments/EndSegmentView.axaml | 6 +-- .../Timeline/Segments/EndSegmentView.axaml.cs | 3 +- .../Timeline/Segments/EndSegmentViewModel.cs | 2 +- .../Timeline/Segments/MainSegmentView.axaml | 6 +-- .../Segments/MainSegmentView.axaml.cs | 3 +- .../Timeline/Segments/MainSegmentViewModel.cs | 2 +- .../Timeline/Segments/Segment.axaml | 0 .../Timeline/Segments/StartSegmentView.axaml | 6 +-- .../Segments/StartSegmentView.axaml.cs | 3 +- .../Segments/StartSegmentViewModel.cs | 2 +- .../Segments/TimelineSegmentViewModel.cs | 6 +-- .../Timeline/TimelineGroupView.axaml | 12 ++--- .../Timeline/TimelineGroupView.axaml.cs | 3 +- .../Timeline/TimelineGroupViewModel.cs | 6 +-- .../Timeline/TimelinePropertyView.axaml | 2 +- .../Timeline/TimelinePropertyView.axaml.cs | 3 +- .../Timeline/TimelinePropertyViewModel.cs | 4 +- .../Properties/Timeline/TimelineView.axaml | 10 ++-- .../Properties/Timeline/TimelineView.axaml.cs | 5 +- .../Properties/Timeline/TimelineViewModel.cs | 7 ++- .../LayerEffectRenameView.axaml | 6 +-- .../LayerEffectRenameView.axaml.cs | 3 +- .../LayerEffectRenameViewModel.cs | 4 +- .../Tree/Dialogs/LayerBrushPresetView.axaml | 6 +-- .../Dialogs/LayerBrushPresetView.axaml.cs | 3 +- .../Tree/Dialogs/LayerBrushPresetViewModel.cs | 4 +- .../Properties/Tree/ITreePropertyViewModel.cs | 2 +- .../Properties/Tree/TreeGroupView.axaml | 22 ++++---- .../Properties/Tree/TreeGroupView.axaml.cs | 3 +- .../Properties/Tree/TreeGroupViewModel.cs | 10 ++-- .../Properties/Tree/TreePropertyView.axaml | 6 +-- .../Properties/Tree/TreePropertyView.axaml.cs | 3 +- .../Properties/Tree/TreePropertyViewModel.cs | 2 +- .../BrushConfigurationWindowView.axaml | 6 +-- .../BrushConfigurationWindowView.axaml.cs | 3 +- .../BrushConfigurationWindowViewModel.cs | 2 +- .../EffectConfigurationWindowView.axaml | 4 +- .../EffectConfigurationWindowView.axaml.cs | 3 +- .../EffectConfigurationWindowViewModel.cs | 2 +- .../Panels/StatusBar/StatusBarView.axaml | 6 +-- .../Panels/StatusBar/StatusBarView.axaml.cs | 3 +- .../Panels/StatusBar/StatusBarViewModel.cs | 4 +- .../Tools/SelectionAddToolView.axaml | 2 +- .../Tools/SelectionAddToolView.axaml.cs | 3 +- .../Tools/SelectionAddToolViewModel.cs | 3 +- .../Tools/SelectionRemoveToolView.axaml | 2 +- .../Tools/SelectionRemoveToolView.axaml.cs | 3 +- .../Tools/SelectionRemoveToolViewModel.cs | 3 +- .../Tools/TransformToolView.axaml | 6 +-- .../Tools/TransformToolView.axaml.cs | 6 +-- .../Tools/TransformToolViewModel.cs | 3 +- .../VisualEditor/VisualEditorView.axaml | 10 ++-- .../VisualEditor/VisualEditorView.axaml.cs | 2 +- .../VisualEditor/VisualEditorViewModel.cs | 4 +- .../Visualizers/IVisualizerViewModel.cs | 2 +- .../LayerShapeVisualizerView.axaml | 6 +-- .../LayerShapeVisualizerView.axaml.cs | 3 +- .../LayerShapeVisualizerViewModel.cs | 4 +- .../Visualizers/LayerVisualizerView.axaml | 6 +-- .../Visualizers/LayerVisualizerView.axaml.cs | 3 +- .../Visualizers/LayerVisualizerViewModel.cs | 2 +- .../ProfileEditorTitleBarView.axaml | 6 +-- .../ProfileEditorTitleBarView.axaml.cs | 3 +- .../ProfileEditorTitleBarViewModel.cs | 5 +- .../ProfileEditor/ProfileEditorView.axaml | 6 +-- .../ProfileEditor/ProfileEditorView.axaml.cs | 2 +- .../ProfileEditor/ProfileEditorViewModel.cs | 12 ++--- .../Screens/Settings/Tabs/AboutTabView.axaml | 1 - .../Settings/Tabs/PluginsTabView.axaml | 1 - .../Settings/Tabs/ReleasesTabView.axaml | 1 - .../SidebarProfileConfigurationView.axaml | 22 ++++---- .../Screens/Sidebar/SidebarView.axaml | 1 - .../Steps/DefaultEntryItemView.axaml | 3 +- .../Steps/DefaultEntryItemView.axaml.cs | 11 +++- .../Steps/DefaultEntryItemViewModel.cs | 12 ++++- .../StartupWizard/Steps/LayoutsStepView.axaml | 15 +++--- .../Steps/LayoutsStepViewModel.cs | 15 ++++-- .../Steps/SettingsStepView.axaml | 1 - .../StartupWizard/Steps/SurfaceStepView.axaml | 1 - .../WizardPluginFeatureView.axaml | 1 - .../NodeScriptWindowView.axaml | 3 -- .../Screens/VisualScripting/NodeView.axaml | 1 - .../CurrentUser/CurrentUserView.axaml | 1 - .../Workshop/Entries/List/EntryListView.axaml | 1 - .../LayoutFinder/LayoutFinderDeviceView.axaml | 8 ++- .../LayoutFinderDeviceViewModel.cs | 6 ++- .../Steps/Layout/LayoutInfoStepView.axaml | 1 - .../ProfileAdaptionHintsLayerViewModel.cs | 1 + .../ProfileAdaptionHintsStepView.axaml | 1 - .../ProfileAdaptionHintsStepViewModel.cs | 1 + 191 files changed, 449 insertions(+), 416 deletions(-) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs (85%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml (87%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs (61%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs (78%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs (65%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml (86%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml.cs (61%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionViewModel.cs (78%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs (65%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml (94%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml.cs (71%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/MenuBar/MenuBarView.axaml (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/MenuBar/MenuBarView.axaml.cs (86%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/MenuBar/MenuBarViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Playback/PlaybackView.axaml (94%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Playback/PlaybackView.axaml.cs (68%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Playback/PlaybackViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Behaviors/ProfileTreeViewDropHandler.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ContentDialogs/ProfileElementRenameView.axaml (62%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ContentDialogs/ProfileElementRenameView.axaml.cs (82%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ContentDialogs/ProfileElementRenameViewModel.cs (83%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/AdaptionHintViewModelBase.cs (87%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintView.axaml (89%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintView.axaml.cs (62%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintViewModel.cs (79%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.axaml (89%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.axaml.cs (61%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintViewModel.cs (79%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.axaml (81%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.axaml.cs (64%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintViewModel.cs (81%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/SingleLedAdaptionHintView.axaml (88%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/SingleLedAdaptionHintView.axaml.cs (62%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/AdaptionHints/SingleLedAdaptionHintViewModel.cs (72%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/LayerHintsDialogView.axaml (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/LayerHintsDialogView.axaml.cs (69%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml (88%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml.cs (75%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/LayerTreeItemView.axaml (85%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/LayerTreeItemView.axaml.cs (74%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ProfileTreeView.axaml (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ProfileTreeView.axaml.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs (82%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs (94%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/DataBinding/DataBindingView.axaml.cs (66%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/DataBinding/DataBindingViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/AddEffectView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/AddEffectView.axaml.cs (85%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/AddEffectViewModel.cs (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/TimelineSegmentEditView.axaml (76%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/TimelineSegmentEditView.axaml.cs (69%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Dialogs/TimelineSegmentEditViewModel.cs (80%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertiesView.axaml (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertiesView.axaml.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertiesViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertyGroupViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertyViewModel.cs (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/PropertyViewModelBase.cs (79%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/ITimelinePropertyViewModel.cs (72%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/ITimelineKeyframeViewModel.cs (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingView.axaml (79%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingView.axaml.cs (61%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingViewModel.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs (94%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml (100%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml (83%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs (67%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs (82%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs (68%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml (80%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs (89%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml (62%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs (86%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs (82%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs (85%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs (89%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs (78%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs (83%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml (76%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml (87%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/StatusBar/StatusBarView.axaml (91%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/StatusBar/StatusBarView.axaml.cs (68%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/StatusBar/StatusBarViewModel.cs (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolView.axaml (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolView.axaml.cs (85%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolView.axaml.cs (83%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs (96%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/TransformToolView.axaml (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/TransformToolView.axaml.cs (98%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Tools/TransformToolViewModel.cs (99%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml (92%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs (69%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml (90%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml.cs (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerViewModel.cs (94%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerView.axaml (84%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerView.axaml.cs (93%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerViewModel.cs (95%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorTitleBarView.axaml (76%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorTitleBarView.axaml.cs (70%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorTitleBarViewModel.cs (78%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorView.axaml (97%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorView.axaml.cs (78%) rename src/Artemis.UI/Screens/{ => Profile}/ProfileEditor/ProfileEditorViewModel.cs (96%) diff --git a/src/Artemis.Core/Plugins/IPluginConfigurationDialog.cs b/src/Artemis.Core/Plugins/IPluginConfigurationDialog.cs index 7df4491bb..d75ed35be 100644 --- a/src/Artemis.Core/Plugins/IPluginConfigurationDialog.cs +++ b/src/Artemis.Core/Plugins/IPluginConfigurationDialog.cs @@ -11,4 +11,10 @@ public interface IPluginConfigurationDialog /// The type of view model the tab contains /// Type Type { get; } + + /// + /// A value indicating whether it's mandatory to configure this plugin. + /// If set to , the dialog will open the first time the plugin is enabled. + /// + bool IsMandatory { get; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/TagsInput/TagsInputStyles.axaml b/src/Artemis.UI.Shared/Controls/TagsInput/TagsInputStyles.axaml index e2a0ff8e5..5d492c436 100644 --- a/src/Artemis.UI.Shared/Controls/TagsInput/TagsInputStyles.axaml +++ b/src/Artemis.UI.Shared/Controls/TagsInput/TagsInputStyles.axaml @@ -1,6 +1,5 @@ diff --git a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs index 7febeeb80..0c46da3c6 100644 --- a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs @@ -6,6 +6,22 @@ namespace Artemis.UI.Shared; /// public class PluginConfigurationDialog : PluginConfigurationDialog where T : PluginConfigurationViewModel { + /// + /// Creates a new instance of the class. + /// + public PluginConfigurationDialog() + { + } + + /// + /// Creates a new instance of the class with the specified flag. + /// + /// A value indicating whether the configuration dialog is mandatory. + public PluginConfigurationDialog(bool isMandatory) + { + IsMandatory = isMandatory; + } + /// public override Type Type => typeof(T); } @@ -17,4 +33,7 @@ public abstract class PluginConfigurationDialog : IPluginConfigurationDialog { /// public abstract Type Type { get; } + + /// + public bool IsMandatory { get; protected set; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Styles/BrokenState.axaml b/src/Artemis.UI.Shared/Styles/BrokenState.axaml index c28d4bca2..a72803f26 100644 --- a/src/Artemis.UI.Shared/Styles/BrokenState.axaml +++ b/src/Artemis.UI.Shared/Styles/BrokenState.axaml @@ -1,6 +1,5 @@  diff --git a/src/Artemis.UI.Shared/Styles/Button.axaml b/src/Artemis.UI.Shared/Styles/Button.axaml index 41b7529c0..b8e7a4da4 100644 --- a/src/Artemis.UI.Shared/Styles/Button.axaml +++ b/src/Artemis.UI.Shared/Styles/Button.axaml @@ -1,7 +1,6 @@  + xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"> diff --git a/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml b/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml index d4cd0f731..5a7e24c39 100644 --- a/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml +++ b/src/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml @@ -2,7 +2,6 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dataModel="clr-namespace:Artemis.UI.Shared.DataModelVisualization.Shared" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:dataModelPicker="clr-namespace:Artemis.UI.Shared.DataModelPicker"> diff --git a/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml b/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml index 3308fedc9..8e90e6c26 100644 --- a/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml +++ b/src/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml @@ -1,6 +1,5 @@  diff --git a/src/Artemis.UI/Artemis.UI.csproj b/src/Artemis.UI/Artemis.UI.csproj index c53778340..049023504 100644 --- a/src/Artemis.UI/Artemis.UI.csproj +++ b/src/Artemis.UI/Artemis.UI.csproj @@ -42,4 +42,55 @@ Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.UI/Artemis.UI.csproj.DotSettings b/src/Artemis.UI/Artemis.UI.csproj.DotSettings index e73de0af9..19751458b 100644 --- a/src/Artemis.UI/Artemis.UI.csproj.DotSettings +++ b/src/Artemis.UI/Artemis.UI.csproj.DotSettings @@ -1,5 +1,4 @@ - + True True True @@ -7,6 +6,8 @@ True False True + False + True True True True \ No newline at end of file diff --git a/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml b/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml index a84b7d6ed..f264335d7 100644 --- a/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml +++ b/src/Artemis.UI/Controls/SplitMarkdownEditor.axaml @@ -4,8 +4,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avaloniaEdit="https://github.com/avaloniaui/avaloniaedit" xmlns:mdxaml="https://github.com/whistyun/Markdown.Avalonia.Tight" - xmlns:fa="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" - xmlns:input="clr-namespace:System.Windows.Input;assembly=System.ObjectModel" xmlns:ui="clr-namespace:Artemis.UI" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Controls.SplitMarkdownEditor"> diff --git a/src/Artemis.UI/Converters/PropertyTreeMarginConverter.cs b/src/Artemis.UI/Converters/PropertyTreeMarginConverter.cs index aa7cfc232..8be626e0d 100644 --- a/src/Artemis.UI/Converters/PropertyTreeMarginConverter.cs +++ b/src/Artemis.UI/Converters/PropertyTreeMarginConverter.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; using Artemis.UI.Screens.ProfileEditor.Properties.Tree; using Avalonia; using Avalonia.Data.Converters; diff --git a/src/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputViewModel.cs b/src/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputViewModel.cs index 92321d8a0..589ddaa95 100644 --- a/src/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputViewModel.cs +++ b/src/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputViewModel.cs @@ -14,6 +14,7 @@ using Artemis.UI.Shared.Services.ProfileEditor.Commands; using Artemis.UI.Shared.Services.PropertyInput; using Avalonia.Threading; using ReactiveUI; +using LayerBrushPresetViewModel = Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.Dialogs.LayerBrushPresetViewModel; namespace Artemis.UI.DefaultTypes.PropertyInput; diff --git a/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs b/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs index 6e8bb8bd3..4ea40ce84 100644 --- a/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs +++ b/src/Artemis.UI/DryIoc/Factories/IVMFactory.cs @@ -11,12 +11,16 @@ using Artemis.UI.Screens.Device.Leds; using Artemis.UI.Screens.Plugins; using Artemis.UI.Screens.Plugins.Features; using Artemis.UI.Screens.Plugins.Prerequisites; +using Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; +using Artemis.UI.Screens.Profile.ProfileEditor.ProfileTree; +using Artemis.UI.Screens.Profile.ProfileEditor.ProfileTree.Dialogs.AdaptionHints; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.DataBinding; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; using Artemis.UI.Screens.ProfileEditor; -using Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; using Artemis.UI.Screens.ProfileEditor.ProfileTree; using Artemis.UI.Screens.ProfileEditor.ProfileTree.Dialogs.AdaptionHints; using Artemis.UI.Screens.ProfileEditor.Properties; -using Artemis.UI.Screens.ProfileEditor.Properties.DataBinding; using Artemis.UI.Screens.ProfileEditor.Properties.Timeline; using Artemis.UI.Screens.ProfileEditor.Properties.Tree; using Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers; @@ -29,6 +33,14 @@ using Artemis.UI.Screens.VisualScripting.Pins; using Artemis.WebClient.Updating; using DryIoc; using ReactiveUI; +using LayerShapeVisualizerViewModel = Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers.LayerShapeVisualizerViewModel; +using LayerVisualizerViewModel = Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers.LayerVisualizerViewModel; +using ProfileEditorViewModel = Artemis.UI.Screens.Profile.ProfileEditor.ProfileEditorViewModel; +using PropertyGroupViewModel = Artemis.UI.Screens.Profile.ProfileEditor.Properties.PropertyGroupViewModel; +using PropertyViewModel = Artemis.UI.Screens.Profile.ProfileEditor.Properties.PropertyViewModel; +using SingleLedAdaptionHintViewModel = Artemis.UI.Screens.Profile.ProfileEditor.ProfileTree.Dialogs.AdaptionHints.SingleLedAdaptionHintViewModel; +using TimelineGroupViewModel = Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.TimelineGroupViewModel; +using TreeItemViewModel = Artemis.UI.Screens.Profile.ProfileEditor.ProfileTree.TreeItemViewModel; namespace Artemis.UI.DryIoc.Factories; diff --git a/src/Artemis.UI/DryIoc/InstanceProviders/LayerPropertyViewModelInstanceProvider.cs b/src/Artemis.UI/DryIoc/InstanceProviders/LayerPropertyViewModelInstanceProvider.cs index 108caeb84..ff4b761f1 100644 --- a/src/Artemis.UI/DryIoc/InstanceProviders/LayerPropertyViewModelInstanceProvider.cs +++ b/src/Artemis.UI/DryIoc/InstanceProviders/LayerPropertyViewModelInstanceProvider.cs @@ -2,10 +2,13 @@ using Artemis.Core; using Artemis.UI.DryIoc.Factories; using Artemis.UI.Exceptions; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; using Artemis.UI.Screens.ProfileEditor.Properties; using Artemis.UI.Screens.ProfileEditor.Properties.Timeline; using Artemis.UI.Screens.ProfileEditor.Properties.Tree; using DryIoc; +using PropertyViewModel = Artemis.UI.Screens.Profile.ProfileEditor.Properties.PropertyViewModel; namespace Artemis.UI.DryIoc.InstanceProviders; diff --git a/src/Artemis.UI/Routing/Routes.cs b/src/Artemis.UI/Routing/Routes.cs index b600e635f..05ba5b7fd 100644 --- a/src/Artemis.UI/Routing/Routes.cs +++ b/src/Artemis.UI/Routing/Routes.cs @@ -16,6 +16,7 @@ using Artemis.UI.Screens.Workshop.Plugins; using Artemis.UI.Screens.Workshop.Profile; using Artemis.UI.Shared.Routing; using PluginDetailsViewModel = Artemis.UI.Screens.Workshop.Plugins.PluginDetailsViewModel; +using ProfileEditorViewModel = Artemis.UI.Screens.Profile.ProfileEditor.ProfileEditorViewModel; namespace Artemis.UI.Routing { diff --git a/src/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml b/src/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml index 3430c04d0..ad8b75823 100644 --- a/src/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml +++ b/src/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml @@ -2,8 +2,7 @@ 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:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" - xmlns:debugger="clr-namespace:Artemis.UI.Screens.Debugger.Performance;assembly=Artemis.UI" + xmlns:debugger="clr-namespace:Artemis.UI.Screens.Debugger.Performance;assembly=Artemis.UI" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:DataType="debugger:PerformanceDebugViewModel" x:Class="Artemis.UI.Screens.Debugger.Performance.PerformanceDebugView"> diff --git a/src/Artemis.UI/Screens/Device/DeviceSettingsView.axaml b/src/Artemis.UI/Screens/Device/DeviceSettingsView.axaml index e3157ba28..028303543 100644 --- a/src/Artemis.UI/Screens/Device/DeviceSettingsView.axaml +++ b/src/Artemis.UI/Screens/Device/DeviceSettingsView.axaml @@ -3,7 +3,6 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" xmlns:local="clr-namespace:Artemis.UI.Screens.Device" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" diff --git a/src/Artemis.UI/Screens/Device/Tabs/General/DeviceGeneralTabView.axaml b/src/Artemis.UI/Screens/Device/Tabs/General/DeviceGeneralTabView.axaml index c6d42e2b5..ba1c825b1 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/General/DeviceGeneralTabView.axaml +++ b/src/Artemis.UI/Screens/Device/Tabs/General/DeviceGeneralTabView.axaml @@ -4,7 +4,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:converters="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared" - xmlns:device="clr-namespace:Artemis.UI.Screens.Device" xmlns:general="clr-namespace:Artemis.UI.Screens.Device.General" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="650" x:Class="Artemis.UI.Screens.Device.General.DeviceGeneralTabView" diff --git a/src/Artemis.UI/Screens/Device/Tabs/InputMappings/InputMappingsTabView.axaml b/src/Artemis.UI/Screens/Device/Tabs/InputMappings/InputMappingsTabView.axaml index f76881aed..0c3914b31 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/InputMappings/InputMappingsTabView.axaml +++ b/src/Artemis.UI/Screens/Device/Tabs/InputMappings/InputMappingsTabView.axaml @@ -2,7 +2,6 @@ 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:device="clr-namespace:Artemis.UI.Screens.Device" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:inputMappings="clr-namespace:Artemis.UI.Screens.Device.InputMappings" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" diff --git a/src/Artemis.UI/Screens/Device/Tabs/Layout/LayoutProviders/WorkshopLayoutView.axaml b/src/Artemis.UI/Screens/Device/Tabs/Layout/LayoutProviders/WorkshopLayoutView.axaml index 1020b7d03..386d1ef92 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/Layout/LayoutProviders/WorkshopLayoutView.axaml +++ b/src/Artemis.UI/Screens/Device/Tabs/Layout/LayoutProviders/WorkshopLayoutView.axaml @@ -2,7 +2,6 @@ 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:services="clr-namespace:Artemis.WebClient.Workshop.Services;assembly=Artemis.WebClient.Workshop" xmlns:layoutProviders="clr-namespace:Artemis.UI.Screens.Device.Layout.LayoutProviders" xmlns:models="clr-namespace:Artemis.WebClient.Workshop.Models;assembly=Artemis.WebClient.Workshop" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" diff --git a/src/Artemis.UI/Screens/Device/Tabs/Leds/DeviceLedsTabView.axaml b/src/Artemis.UI/Screens/Device/Tabs/Leds/DeviceLedsTabView.axaml index 9b0ccf258..40f297554 100644 --- a/src/Artemis.UI/Screens/Device/Tabs/Leds/DeviceLedsTabView.axaml +++ b/src/Artemis.UI/Screens/Device/Tabs/Leds/DeviceLedsTabView.axaml @@ -2,7 +2,6 @@ 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:device="clr-namespace:Artemis.UI.Screens.Device" xmlns:converters="clr-namespace:Artemis.UI.Converters" xmlns:shared="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared" xmlns:leds="clr-namespace:Artemis.UI.Screens.Device.Leds" diff --git a/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml index 4141ec69e..44a79ca8f 100644 --- a/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Features/PluginFeatureView.axaml @@ -3,8 +3,6 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" - xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:features="clr-namespace:Artemis.UI.Screens.Plugins.Features" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.Features.PluginFeatureView" diff --git a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml index 648239132..ccab77d68 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml +++ b/src/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml @@ -4,7 +4,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" - xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" diff --git a/src/Artemis.UI/Screens/Plugins/PluginView.axaml b/src/Artemis.UI/Screens/Plugins/PluginView.axaml index 4e4aecc13..a0a6beb70 100644 --- a/src/Artemis.UI/Screens/Plugins/PluginView.axaml +++ b/src/Artemis.UI/Screens/Plugins/PluginView.axaml @@ -4,7 +4,6 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" - xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.PluginView" diff --git a/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml index d7a09a975..953124768 100644 --- a/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteActionView.axaml @@ -2,7 +2,6 @@ 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:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.Prerequisites.PluginPrerequisiteActionView" diff --git a/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml index 6fa41801c..36e6b229d 100644 --- a/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml +++ b/src/Artemis.UI/Screens/Plugins/Prerequisites/PluginPrerequisiteView.axaml @@ -2,7 +2,6 @@ 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:plugins="clr-namespace:Artemis.UI.Screens.Plugins" xmlns:prerequisites="clr-namespace:Artemis.UI.Screens.Plugins.Prerequisites" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.UI.Screens.Plugins.Prerequisites.PluginPrerequisiteView" diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs similarity index 85% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs index 20683fb03..8fb8c8444 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypeViewModel.cs @@ -1,7 +1,7 @@ using System; using Artemis.UI.Shared; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition; public class ConditionTypeViewModel : ViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml similarity index 87% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml index 0f18dd967..7609940ae 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml @@ -4,7 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes.AlwaysOnConditionView"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes.AlwaysOnConditionView"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs similarity index 61% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs index 20c9a7452..03367b6c9 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionView.axaml.cs @@ -1,7 +1,6 @@ using Avalonia.Controls; -using Avalonia.Markup.Xaml; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public partial class AlwaysOnConditionView : UserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs similarity index 78% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs index 94e6eeb55..4ae79f2c6 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/AlwaysOnConditionViewModel.cs @@ -1,7 +1,7 @@ using Artemis.Core; using Artemis.UI.Shared; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public class AlwaysOnConditionViewModel : ViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml similarity index 95% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml index d45a21c9f..981594e4b 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml @@ -2,10 +2,10 @@ 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:conditionTypes="clr-namespace:Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes" xmlns:dataModelPicker="clr-namespace:Artemis.UI.Shared.DataModelPicker;assembly=Artemis.UI.Shared" + xmlns:conditionTypes="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes.EventConditionView" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes.EventConditionView" x:DataType="conditionTypes:EventConditionViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs similarity index 65% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs index 2240a63ea..bd33d86d7 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public partial class EventConditionView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs similarity index 98% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs index fbd8eea25..73dc2e6a2 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/EventConditionViewModel.cs @@ -11,7 +11,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public class EventConditionViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml similarity index 86% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml index c93b52499..e3ea967ec 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/PlayOnceConditionView.axaml @@ -4,7 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes.PlayOnceConditionView"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes.PlayOnceConditionView"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs similarity index 65% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs index cbe8b1ab1..7c0fdf07b 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public partial class StaticConditionView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs similarity index 96% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs index 086c67091..95134ddd5 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/ConditionTypes/StaticConditionViewModel.cs @@ -10,7 +10,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.DisplayCondition.ConditionTypes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.ConditionTypes; public class StaticConditionViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml similarity index 94% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml index d0352947e..1b2f50ad3 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/DisplayCondition/DisplayConditionScriptView.axaml @@ -2,9 +2,9 @@ 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:displayCondition="clr-namespace:Artemis.UI.Screens.ProfileEditor.DisplayCondition" + xmlns:displayCondition="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition" mc:Ignorable="d" d:DesignWidth="200" d:DesignHeight="650" - x:Class="Artemis.UI.Screens.ProfileEditor.DisplayCondition.DisplayConditionScriptView" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.DisplayCondition.DisplayConditionScriptView" x:DataType="displayCondition:DisplayConditionScriptViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs similarity index 96% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs index cebade11d..abb7b51bc 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs @@ -1,10 +1,9 @@ using System; using Avalonia.Input; using Avalonia.LogicalTree; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Keyframes; public partial class TimelineKeyframeView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs similarity index 98% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs index 3c618d0b8..18a5a5a88 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs @@ -13,14 +13,13 @@ using Artemis.UI.Shared; using Artemis.UI.Shared.Extensions; using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; -using Avalonia; using Avalonia.Input; using DynamicData; using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Keyframes; public partial class TimelineKeyframeViewModel : ActivatableViewModelBase, ITimelineKeyframeViewModel { @@ -49,7 +48,7 @@ public partial class TimelineKeyframeViewModel : ActivatableViewModelBase, IT profileEditorService.PixelsPerSecond.Subscribe(_ => Update()).DisposeWith(d); this.WhenAnyValue(vm => vm.LayerPropertyKeyframe.Position).Subscribe(_ => Update()).DisposeWith(d); }); - this.WhenAnyValue(vm => vm.IsFlyoutOpen).Subscribe(UpdateCanPaste); + this.WhenAnyValue, bool>(vm => vm.IsFlyoutOpen).Subscribe(UpdateCanPaste); Duplicate = ReactiveCommand.Create(ExecuteDuplicate); Copy = ReactiveCommand.CreateFromTask(ExecuteCopy); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml similarity index 92% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml index d49617362..4b6d3fc7e 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml @@ -3,10 +3,10 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.EndSegmentView" - x:DataType="segments:EndSegmentViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments.EndSegmentView" + x:DataType="segments1:EndSegmentViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs index b93038748..5ab5af82e 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs @@ -1,8 +1,7 @@ using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public partial class EndSegmentView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs index 1d556bb59..567039090 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public class EndSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml index 846f1d021..9bdd7b4f4 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml @@ -3,10 +3,10 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.MainSegmentView" - x:DataType="segments:MainSegmentViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments.MainSegmentView" + x:DataType="segments1:MainSegmentViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs similarity index 94% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs index 4923e2def..b48f2cf7d 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs @@ -1,8 +1,7 @@ using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public partial class MainSegmentView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs index a122bbb56..2688189bf 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public class MainSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml similarity index 100% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml similarity index 92% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml index a121edb07..e2289262a 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml @@ -3,10 +3,10 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.StartSegmentView" - x:DataType="segments:StartSegmentViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments.StartSegmentView" + x:DataType="segments1:StartSegmentViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs index 231a80b51..fee59c2b9 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs @@ -1,8 +1,7 @@ using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public partial class StartSegmentView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs similarity index 96% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs index 38acf3c31..6e27862d4 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public class StartSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs index 04397ef25..a3439f132 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs @@ -6,7 +6,7 @@ using System.Reactive.Disposables; using System.Reactive.Linq; using System.Threading.Tasks; using Artemis.Core; -using Artemis.UI.Screens.ProfileEditor.Properties.Dialogs; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Dialogs; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services.Builders; @@ -15,7 +15,7 @@ using Artemis.UI.Shared.Services.ProfileEditor.Commands; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; public abstract partial class TimelineSegmentViewModel : ActivatableViewModelBase { @@ -38,7 +38,7 @@ public abstract partial class TimelineSegmentViewModel : ActivatableViewModelBas EditTime = ReactiveCommand.CreateFromTask(ExecuteEditTime); - this.WhenActivated(d => + ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => { profileEditorService.ProfileElement.Subscribe(p => _profileElement = p).DisposeWith(d); profileEditorService.PixelsPerSecond.Subscribe(p => _pixelsPerSecond = p).DisposeWith(d); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml similarity index 83% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml index 5f78cb52e..35b9682df 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml @@ -2,12 +2,12 @@ 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:properties="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" - xmlns:timeline="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline" xmlns:system="clr-namespace:System;assembly=netstandard" + xmlns:timeline1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline" + xmlns:properties1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.TimelineGroupView" - x:DataType="timeline:TimelineGroupViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.TimelineGroupView" + x:DataType="timeline1:TimelineGroupViewModel"> - + - + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs similarity index 67% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs index 327a9ef5b..8e0d3ec9c 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public partial class TimelineGroupView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs similarity index 82% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs index b3876c952..6a6b6d2be 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs @@ -8,7 +8,7 @@ using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public partial class TimelineGroupViewModel : ActivatableViewModelBase { @@ -20,11 +20,11 @@ public partial class TimelineGroupViewModel : ActivatableViewModelBase PropertyGroupViewModel = propertyGroupViewModel; _keyframePositions = new ReadOnlyObservableCollection(new ObservableCollection()); - this.WhenActivated(d => + ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => { profileEditorService.PixelsPerSecond.Subscribe(p => _pixelsPerSecond = p).DisposeWith(d); - PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); + PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); PropertyGroupViewModel.Keyframes .ToObservableChangeSet() .AutoRefreshOnObservable(_ => profileEditorService.PixelsPerSecond) diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml similarity index 90% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml index 2cc8139e6..ab8004516 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml @@ -3,7 +3,7 @@ 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.ProfileEditor.Properties.Timeline.TimelinePropertyView"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.TimelinePropertyView"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs similarity index 68% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs index 8bb5494d0..e2afd768c 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs @@ -1,7 +1,6 @@ -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public partial class TimelinePropertyView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs similarity index 96% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs index 4ae156667..df7e5fe59 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs @@ -5,13 +5,13 @@ using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using Artemis.Core; -using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Keyframes; using Artemis.UI.Shared; using Artemis.UI.Shared.Services.ProfileEditor; using DynamicData; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public class TimelinePropertyViewModel : ActivatableViewModelBase, ITimelinePropertyViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml similarity index 80% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml index bba79ebed..cada9d795 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml @@ -2,12 +2,12 @@ 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:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" - xmlns:timeline="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" + xmlns:timeline1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline" + xmlns:properties="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.TimelineView" - x:DataType="timeline:TimelineViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.TimelineView" + x:DataType="timeline1:TimelineViewModel"> @@ -19,7 +19,7 @@ - + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs similarity index 89% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs index dce407954..511cf600b 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs @@ -1,15 +1,14 @@ using System.Collections.Generic; using System.Linq; -using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Keyframes; using Artemis.UI.Shared.Events; using Artemis.UI.Shared.Extensions; using Avalonia; using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using Avalonia.VisualTree; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public partial class TimelineView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs index a4c4952ba..15f10a0a1 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs @@ -8,16 +8,15 @@ using System.Reactive.Linq; using System.Threading.Tasks; using Artemis.Core; using Artemis.UI.Models; -using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; -using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline.Segments; using Artemis.UI.Services.ProfileEditor.Commands; using Artemis.UI.Shared; using Artemis.UI.Shared.Extensions; using Artemis.UI.Shared.Services.ProfileEditor; -using Avalonia; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Timeline; public class TimelineViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml similarity index 62% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml index 854942d2f..ac51f6d62 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml @@ -2,10 +2,10 @@ 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:contentDialogs="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs" + xmlns:contentDialogs1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.ContentDialogs" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs.LayerEffectRenameView" - x:DataType="contentDialogs:LayerEffectRenameViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.ContentDialogs.LayerEffectRenameView" + x:DataType="contentDialogs1:LayerEffectRenameViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs similarity index 86% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs index 9f99d70b9..ae413e46a 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs @@ -1,11 +1,10 @@ using System.Threading.Tasks; using Artemis.UI.Shared.Extensions; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.ContentDialogs; public partial class LayerEffectRenameView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs similarity index 82% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs index 9924dc746..34d44ed5e 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs @@ -8,7 +8,7 @@ using PropertyChanged.SourceGenerator; using ReactiveUI; using ReactiveUI.Validation.Extensions; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.ContentDialogs; public partial class LayerEffectRenameViewModel : ContentDialogViewModelBase { @@ -23,7 +23,7 @@ public partial class LayerEffectRenameViewModel : ContentDialogViewModelBase _layerEffectName = layerEffect.Name; Confirm = ReactiveCommand.Create(ExecuteConfirm, ValidationContext.Valid); - this.ValidationRule(vm => vm.LayerEffectName, categoryName => !string.IsNullOrWhiteSpace(categoryName), "You must specify a valid name"); + this.ValidationRule(vm => vm.LayerEffectName, categoryName => !string.IsNullOrWhiteSpace(categoryName), "You must specify a valid name"); } public ReactiveCommand Confirm { get; } diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml similarity index 92% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml index 464e1d37d..8ebe14b95 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml @@ -4,11 +4,11 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" - xmlns:dialogs="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs" xmlns:layerBrushes="clr-namespace:Artemis.Core.LayerBrushes;assembly=Artemis.Core" + xmlns:dialogs1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.Dialogs" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs.LayerBrushPresetView" - x:DataType="dialogs:LayerBrushPresetViewModel" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.Dialogs.LayerBrushPresetView" + x:DataType="dialogs1:LayerBrushPresetViewModel" Width="500"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs similarity index 85% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs index 9f25e9c19..d81777e4d 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs @@ -1,10 +1,9 @@ using Artemis.Core.LayerBrushes; using Avalonia; using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.Dialogs; public partial class LayerBrushPresetView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs similarity index 89% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs index 2577aa1b5..33ab6f923 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs @@ -7,7 +7,7 @@ using DynamicData; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.Dialogs; public partial class LayerBrushPresetViewModel : ContentDialogViewModelBase { @@ -21,7 +21,7 @@ public partial class LayerBrushPresetViewModel : ContentDialogViewModelBase SourceList presetsSourceList = new(); if (layerBrush.Presets != null) presetsSourceList.AddRange(layerBrush.Presets); - IObservable> presetsFilter = this.WhenAnyValue(vm => vm.SearchText).Select(CreatePredicate); + IObservable> presetsFilter = this.WhenAnyValue(vm => vm.SearchText).Select(CreatePredicate); presetsSourceList.Connect() .Filter(presetsFilter) diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs similarity index 78% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs index b91eca4e7..bc1eb16ea 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs @@ -1,7 +1,7 @@ using Artemis.Core; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; public interface ITreePropertyViewModel : IReactiveObject { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml index 9ed3c8be1..ea10aba37 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml @@ -5,12 +5,12 @@ xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:sharedConverters="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared" xmlns:converters="clr-namespace:Artemis.UI.Converters" - xmlns:viewModel="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree" - xmlns:properties="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" + xmlns:tree="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree" + xmlns:properties1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreeGroupView" - x:DataType="viewModel:TreeGroupViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.TreeGroupView" + x:DataType="tree:TreeGroupViewModel"> @@ -48,12 +48,12 @@ VerticalAlignment="Center" HorizontalAlignment="Left" Margin="3 5 0 5" - IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static viewModel:LayerPropertyGroupType.None}}" /> + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static tree:LayerPropertyGroupType.None}}" /> + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static tree:LayerPropertyGroupType.General}}"> General @@ -61,13 +61,13 @@ + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static tree:LayerPropertyGroupType.Transform}}"> Transform - - - + - + diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs similarity index 83% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs index eb5e233a1..253d98d9c 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs @@ -1,8 +1,7 @@ using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; public partial class TreeGroupView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs index 9a5409908..b3cb38bb1 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs @@ -8,8 +8,8 @@ using Artemis.Core; using Artemis.Core.LayerBrushes; using Artemis.Core.LayerEffects; using Artemis.UI.Exceptions; -using Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; -using Artemis.UI.Screens.ProfileEditor.Properties.Windows; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.ContentDialogs; +using Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerBrushes; using Artemis.UI.Shared.LayerEffects; @@ -19,7 +19,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; public class TreeGroupViewModel : ActivatableViewModelBase { @@ -35,9 +35,9 @@ public class TreeGroupViewModel : ActivatableViewModelBase PropertyGroupViewModel = propertyGroupViewModel; DetermineGroupType(); - this.WhenActivated(d => + ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => { - PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); + PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); Disposable.Create(CloseViewModels).DisposeWith(d); }); diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml similarity index 92% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml index 2d87a8108..07c62ad53 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml @@ -4,10 +4,10 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:converters="clr-namespace:Artemis.UI.Converters" - xmlns:tree="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree" + xmlns:tree1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreePropertyView" - x:DataType="tree:ITreePropertyViewModel"> + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree.TreePropertyView" + x:DataType="tree1:ITreePropertyViewModel"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs similarity index 92% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs index 04a3a4d99..666bc8410 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs @@ -4,11 +4,10 @@ using System.Reactive.Linq; using Artemis.Core; using Avalonia.Controls; using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; public partial class TreePropertyView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs index 8c7e214a5..27f54a399 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs @@ -10,7 +10,7 @@ using Artemis.UI.Shared.Services.ProfileEditor.Commands; using Artemis.UI.Shared.Services.PropertyInput; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Tree; internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropertyViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml similarity index 76% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml index cf0b73621..45db57691 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" - xmlns:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Windows" - x:DataType="local:BrushConfigurationWindowViewModel" + xmlns:local="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows" + x:DataType="local:BrushConfigurationWindowViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Windows.BrushConfigurationWindowView" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows.BrushConfigurationWindowView" Icon="/Assets/Images/Logo/application.ico" Title="Artemis | Brush configuration" Width="{CompiledBinding Configuration.DialogWidth}" diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs similarity index 90% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs index d01dc274c..85fb0e956 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs @@ -1,9 +1,8 @@ using System.ComponentModel; using Artemis.UI.Shared; -using Avalonia; using Avalonia.Markup.Xaml; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows; public partial class BrushConfigurationWindowView : ReactiveAppWindow { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs index 4a51d9f74..633a92a28 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerBrushes; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows; public class BrushConfigurationWindowViewModel : DialogViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml similarity index 87% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml index 134bb9147..886fd487c 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" - xmlns:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Windows" + xmlns:local="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows" x:DataType="local:EffectConfigurationWindowViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Windows.EffectConfigurationWindowView" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows.EffectConfigurationWindowView" Icon="/Assets/Images/Logo/application.ico" Title="Artemis | Effect configuration" Width="{CompiledBinding Configuration.DialogWidth}" diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs similarity index 90% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs index ddee1ec69..5a87687e9 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs @@ -1,9 +1,8 @@ using System.ComponentModel; using Artemis.UI.Shared; -using Avalonia; using Avalonia.Markup.Xaml; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows; public partial class EffectConfigurationWindowView : ReactiveAppWindow { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs index dd3778036..4f9922894 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerEffects; -namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.Profile.ProfileEditor.Properties.Windows; public class EffectConfigurationWindowViewModel : DialogViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/StatusBar/StatusBarView.axaml similarity index 91% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/StatusBar/StatusBarView.axaml index 25c79efee..30c64a103 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/StatusBar/StatusBarView.axaml @@ -5,9 +5,9 @@ xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:core="clr-namespace:Artemis.Core;assembly=Artemis.Core" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="23" - xmlns:vm="clr-namespace:Artemis.UI.Screens.ProfileEditor.StatusBar;assembly=Artemis.UI" - x:DataType="vm:StatusBarViewModel" - x:Class="Artemis.UI.Screens.ProfileEditor.StatusBar.StatusBarView"> + xmlns:statusBar="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.StatusBar" + x:DataType="statusBar:StatusBarViewModel" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.StatusBar.StatusBarView"> diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs index f7e4491a5..0d5ee2008 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs @@ -10,7 +10,7 @@ using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.VisualEditor; +namespace Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor; public partial class VisualEditorView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs index a5246024b..5db1a5c35 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs @@ -8,7 +8,7 @@ using System.Reactive.Linq; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.DryIoc.Factories; -using Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers; +using Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers; using Artemis.UI.Shared; using Artemis.UI.Shared.Services.ProfileEditor; using DynamicData; @@ -16,7 +16,7 @@ using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.ProfileEditor.VisualEditor; +namespace Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor; public partial class VisualEditorViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs similarity index 69% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs index 357f99e7e..0fee58c46 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs @@ -1,6 +1,6 @@ using Artemis.Core; -namespace Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers; +namespace Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers; public interface IVisualizerViewModel { diff --git a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml similarity index 90% rename from src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml rename to src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml index 78a2f969a..dc1aee5e8 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml +++ b/src/Artemis.UI/Screens/Profile/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml @@ -2,10 +2,10 @@ 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:visualizers="clr-namespace:Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers" + xmlns:visualizers1="clr-namespace:Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers.LayerShapeVisualizerView" - x:DataType="visualizers:LayerShapeVisualizerViewModel" + x:Class="Artemis.UI.Screens.Profile.ProfileEditor.VisualEditor.Visualizers.LayerShapeVisualizerView" + x:DataType="visualizers1:LayerShapeVisualizerViewModel" ClipToBounds="False"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs similarity index 96% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs index 7afb4a813..cebade11d 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs @@ -1,9 +1,10 @@ using System; using Avalonia.Input; using Avalonia.LogicalTree; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Keyframes; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; public partial class TimelineKeyframeView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs index 3fc3931a1..3c618d0b8 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs @@ -13,13 +13,14 @@ using Artemis.UI.Shared; using Artemis.UI.Shared.Extensions; using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; +using Avalonia; using Avalonia.Input; using DynamicData; using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Keyframes; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; public partial class TimelineKeyframeViewModel : ActivatableViewModelBase, ITimelineKeyframeViewModel { @@ -48,7 +49,7 @@ public partial class TimelineKeyframeViewModel : ActivatableViewModelBase, IT profileEditorService.PixelsPerSecond.Subscribe(_ => Update()).DisposeWith(d); this.WhenAnyValue(vm => vm.LayerPropertyKeyframe.Position).Subscribe(_ => Update()).DisposeWith(d); }); - this.WhenAnyValue, bool>(vm => vm.IsFlyoutOpen).Subscribe(UpdateCanPaste); + this.WhenAnyValue(vm => vm.IsFlyoutOpen).Subscribe(UpdateCanPaste); Duplicate = ReactiveCommand.Create(ExecuteDuplicate); Copy = ReactiveCommand.CreateFromTask(ExecuteCopy); diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml similarity index 89% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml index 9a0cd2768..d49617362 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments.EndSegmentView" - x:DataType="segments1:EndSegmentViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.EndSegmentView" + x:DataType="segments:EndSegmentViewModel"> - + { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs index 6f00c1b5d..1d556bb59 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; public class EndSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml similarity index 90% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml index c5060ab80..846f1d021 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments.MainSegmentView" - x:DataType="segments1:MainSegmentViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.MainSegmentView" + x:DataType="segments:MainSegmentViewModel"> - + { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs index 7172e0e99..a122bbb56 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; public class MainSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml similarity index 100% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml similarity index 88% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml index 51ac4fb92..a121edb07 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" - xmlns:segments1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments" + xmlns:segments="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="18" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments.StartSegmentView" - x:DataType="segments1:StartSegmentViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments.StartSegmentView" + x:DataType="segments:StartSegmentViewModel"> - + { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs similarity index 96% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs index eadae620c..38acf3c31 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs @@ -7,7 +7,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; public class StartSegmentViewModel : TimelineSegmentViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs index 709571d2d..04397ef25 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs @@ -6,7 +6,7 @@ using System.Reactive.Disposables; using System.Reactive.Linq; using System.Threading.Tasks; using Artemis.Core; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Dialogs; +using Artemis.UI.Screens.ProfileEditor.Properties.Dialogs; using Artemis.UI.Shared; using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services.Builders; @@ -15,7 +15,7 @@ using Artemis.UI.Shared.Services.ProfileEditor.Commands; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; public abstract partial class TimelineSegmentViewModel : ActivatableViewModelBase { @@ -38,7 +38,7 @@ public abstract partial class TimelineSegmentViewModel : ActivatableViewModelBas EditTime = ReactiveCommand.CreateFromTask(ExecuteEditTime); - ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => + this.WhenActivated(d => { profileEditorService.ProfileElement.Subscribe(p => _profileElement = p).DisposeWith(d); profileEditorService.PixelsPerSecond.Subscribe(p => _pixelsPerSecond = p).DisposeWith(d); diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml similarity index 83% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml index 3910ea3f1..5f78cb52e 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml @@ -2,12 +2,12 @@ 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:properties="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" + xmlns:timeline="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline" xmlns:system="clr-namespace:System;assembly=netstandard" - xmlns:timeline1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline" - xmlns:properties1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.TimelineGroupView" - x:DataType="timeline1:TimelineGroupViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.TimelineGroupView" + x:DataType="timeline:TimelineGroupViewModel"> - + - + diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs similarity index 67% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs index 7ee09a9be..327a9ef5b 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs @@ -1,6 +1,7 @@ +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public partial class TimelineGroupView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs similarity index 82% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs index cb9281d44..b3876c952 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs @@ -8,7 +8,7 @@ using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public partial class TimelineGroupViewModel : ActivatableViewModelBase { @@ -20,11 +20,11 @@ public partial class TimelineGroupViewModel : ActivatableViewModelBase PropertyGroupViewModel = propertyGroupViewModel; _keyframePositions = new ReadOnlyObservableCollection(new ObservableCollection()); - ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => + this.WhenActivated(d => { profileEditorService.PixelsPerSecond.Subscribe(p => _pixelsPerSecond = p).DisposeWith(d); - PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); + PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); PropertyGroupViewModel.Keyframes .ToObservableChangeSet() .AutoRefreshOnObservable(_ => profileEditorService.PixelsPerSecond) diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml similarity index 90% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml index 1ce25e725..2cc8139e6 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml @@ -3,7 +3,7 @@ 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.Profiles.ProfileEditor.Properties.Timeline.TimelinePropertyView"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.TimelinePropertyView"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs similarity index 68% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs index 012f3adcd..8bb5494d0 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs @@ -1,6 +1,7 @@ +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public partial class TimelinePropertyView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs similarity index 96% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs index a5eb1bcf4..4ae156667 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs @@ -5,13 +5,13 @@ using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using Artemis.Core; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; using Artemis.UI.Shared; using Artemis.UI.Shared.Services.ProfileEditor; using DynamicData; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public class TimelinePropertyViewModel : ActivatableViewModelBase, ITimelinePropertyViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml similarity index 80% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml index fd8ed76c3..bba79ebed 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml @@ -2,12 +2,12 @@ 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:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" + xmlns:timeline="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Timeline" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" - xmlns:timeline1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline" - xmlns:properties="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.TimelineView" - x:DataType="timeline1:TimelineViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Timeline.TimelineView" + x:DataType="timeline:TimelineViewModel"> @@ -19,7 +19,7 @@ - + diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs similarity index 89% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs index fac533bdf..dce407954 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs @@ -1,14 +1,15 @@ using System.Collections.Generic; using System.Linq; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; using Artemis.UI.Shared.Events; using Artemis.UI.Shared.Extensions; using Avalonia; using Avalonia.Input; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using Avalonia.VisualTree; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public partial class TimelineView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs index 2d2c984cf..a4c4952ba 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs @@ -8,15 +8,16 @@ using System.Reactive.Linq; using System.Threading.Tasks; using Artemis.Core; using Artemis.UI.Models; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Keyframes; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline.Segments; +using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Keyframes; +using Artemis.UI.Screens.ProfileEditor.Properties.Timeline.Segments; using Artemis.UI.Services.ProfileEditor.Commands; using Artemis.UI.Shared; using Artemis.UI.Shared.Extensions; using Artemis.UI.Shared.Services.ProfileEditor; +using Avalonia; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Timeline; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Timeline; public class TimelineViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml similarity index 61% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml index 53d10e130..854942d2f 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml @@ -2,10 +2,10 @@ 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:contentDialogs1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.ContentDialogs" + xmlns:contentDialogs="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.ContentDialogs.LayerEffectRenameView" - x:DataType="contentDialogs1:LayerEffectRenameViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs.LayerEffectRenameView" + x:DataType="contentDialogs:LayerEffectRenameViewModel"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs similarity index 86% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs index a3b80f061..9f99d70b9 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameView.axaml.cs @@ -1,10 +1,11 @@ using System.Threading.Tasks; using Artemis.UI.Shared.Extensions; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.ContentDialogs; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; public partial class LayerEffectRenameView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs similarity index 82% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs index 2bca328cf..9924dc746 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ContentDialogs/LayerEffectRenameViewModel.cs @@ -8,7 +8,7 @@ using PropertyChanged.SourceGenerator; using ReactiveUI; using ReactiveUI.Validation.Extensions; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.ContentDialogs; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; public partial class LayerEffectRenameViewModel : ContentDialogViewModelBase { @@ -23,7 +23,7 @@ public partial class LayerEffectRenameViewModel : ContentDialogViewModelBase _layerEffectName = layerEffect.Name; Confirm = ReactiveCommand.Create(ExecuteConfirm, ValidationContext.Valid); - this.ValidationRule(vm => vm.LayerEffectName, categoryName => !string.IsNullOrWhiteSpace(categoryName), "You must specify a valid name"); + this.ValidationRule(vm => vm.LayerEffectName, categoryName => !string.IsNullOrWhiteSpace(categoryName), "You must specify a valid name"); } public ReactiveCommand Confirm { get; } diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml similarity index 92% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml index 65475153c..464e1d37d 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml @@ -4,11 +4,11 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" + xmlns:dialogs="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs" xmlns:layerBrushes="clr-namespace:Artemis.Core.LayerBrushes;assembly=Artemis.Core" - xmlns:dialogs1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.Dialogs" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.Dialogs.LayerBrushPresetView" - x:DataType="dialogs1:LayerBrushPresetViewModel" + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs.LayerBrushPresetView" + x:DataType="dialogs:LayerBrushPresetViewModel" Width="500"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs similarity index 85% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs index 5ad7af955..9f25e9c19 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetView.axaml.cs @@ -1,9 +1,10 @@ using Artemis.Core.LayerBrushes; using Avalonia; using Avalonia.Input; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.Dialogs; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs; public partial class LayerBrushPresetView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs similarity index 89% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs index 63b03b573..2577aa1b5 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs @@ -7,7 +7,7 @@ using DynamicData; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.Dialogs; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree.Dialogs; public partial class LayerBrushPresetViewModel : ContentDialogViewModelBase { @@ -21,7 +21,7 @@ public partial class LayerBrushPresetViewModel : ContentDialogViewModelBase SourceList presetsSourceList = new(); if (layerBrush.Presets != null) presetsSourceList.AddRange(layerBrush.Presets); - IObservable> presetsFilter = this.WhenAnyValue(vm => vm.SearchText).Select(CreatePredicate); + IObservable> presetsFilter = this.WhenAnyValue(vm => vm.SearchText).Select(CreatePredicate); presetsSourceList.Connect() .Filter(presetsFilter) diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs similarity index 78% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs index ce05004c8..b91eca4e7 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs @@ -1,7 +1,7 @@ using Artemis.Core; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; public interface ITreePropertyViewModel : IReactiveObject { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml similarity index 93% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml index 8157ba895..9ed3c8be1 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml @@ -5,12 +5,12 @@ xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:sharedConverters="clr-namespace:Artemis.UI.Shared.Converters;assembly=Artemis.UI.Shared" xmlns:converters="clr-namespace:Artemis.UI.Converters" + xmlns:viewModel="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree" + xmlns:properties="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties" xmlns:shared="clr-namespace:Artemis.UI.Shared;assembly=Artemis.UI.Shared" - xmlns:tree="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree" - xmlns:properties1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.TreeGroupView" - x:DataType="tree:TreeGroupViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreeGroupView" + x:DataType="viewModel:TreeGroupViewModel"> @@ -48,12 +48,12 @@ VerticalAlignment="Center" HorizontalAlignment="Left" Margin="3 5 0 5" - IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static tree:LayerPropertyGroupType.None}}" /> + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static viewModel:LayerPropertyGroupType.None}}" /> + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static viewModel:LayerPropertyGroupType.General}}"> General @@ -61,13 +61,13 @@ + IsVisible="{CompiledBinding GroupType, Converter={StaticResource EnumBoolConverter}, ConverterParameter={x:Static viewModel:LayerPropertyGroupType.Transform}}"> Transform - - - + - + diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs similarity index 83% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs index ef04ea787..eb5e233a1 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs @@ -1,7 +1,8 @@ using Avalonia.Input; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; public partial class TreeGroupView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs index d7fe7258f..9a5409908 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs @@ -8,8 +8,8 @@ using Artemis.Core; using Artemis.Core.LayerBrushes; using Artemis.Core.LayerEffects; using Artemis.UI.Exceptions; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.ContentDialogs; -using Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows; +using Artemis.UI.Screens.ProfileEditor.Properties.Tree.ContentDialogs; +using Artemis.UI.Screens.ProfileEditor.Properties.Windows; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerBrushes; using Artemis.UI.Shared.LayerEffects; @@ -19,7 +19,7 @@ using Artemis.UI.Shared.Services.ProfileEditor; using Artemis.UI.Shared.Services.ProfileEditor.Commands; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; public class TreeGroupViewModel : ActivatableViewModelBase { @@ -35,9 +35,9 @@ public class TreeGroupViewModel : ActivatableViewModelBase PropertyGroupViewModel = propertyGroupViewModel; DetermineGroupType(); - ViewForMixins.WhenActivated((IActivatableViewModel) this, (CompositeDisposable d) => + this.WhenActivated(d => { - PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); + PropertyGroupViewModel.WhenAnyValue(vm => vm.IsExpanded).Subscribe(_ => this.RaisePropertyChanged(nameof(Children))).DisposeWith(d); Disposable.Create(CloseViewModels).DisposeWith(d); }); diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml similarity index 92% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml index b5008e3dc..2d87a8108 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml @@ -4,10 +4,10 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:converters="clr-namespace:Artemis.UI.Converters" - xmlns:tree1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree" + xmlns:tree="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Tree" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree.TreePropertyView" - x:DataType="tree1:ITreePropertyViewModel"> + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Tree.TreePropertyView" + x:DataType="tree:ITreePropertyViewModel"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs similarity index 92% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs index 91d0bf19b..04a3a4d99 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs @@ -4,10 +4,11 @@ using System.Reactive.Linq; using Artemis.Core; using Avalonia.Controls; using Avalonia.Interactivity; +using Avalonia.Markup.Xaml; using Avalonia.ReactiveUI; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; public partial class TreePropertyView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs index aa2cf1445..8c7e214a5 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs @@ -10,7 +10,7 @@ using Artemis.UI.Shared.Services.ProfileEditor.Commands; using Artemis.UI.Shared.Services.PropertyInput; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Tree; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Tree; internal class TreePropertyViewModel : ActivatableViewModelBase, ITreePropertyViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml similarity index 76% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml index f270bca4b..cf0b73621 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" - xmlns:local="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows" - x:DataType="local:BrushConfigurationWindowViewModel" + xmlns:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Windows" + x:DataType="local:BrushConfigurationWindowViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows.BrushConfigurationWindowView" + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Windows.BrushConfigurationWindowView" Icon="/Assets/Images/Logo/application.ico" Title="Artemis | Brush configuration" Width="{CompiledBinding Configuration.DialogWidth}" diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs similarity index 90% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs index dd8742b34..d01dc274c 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs @@ -1,8 +1,9 @@ using System.ComponentModel; using Artemis.UI.Shared; +using Avalonia; using Avalonia.Markup.Xaml; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; public partial class BrushConfigurationWindowView : ReactiveAppWindow { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs index 8bbf02f88..4a51d9f74 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerBrushes; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; public class BrushConfigurationWindowViewModel : DialogViewModelBase { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml similarity index 87% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml index 862355ade..134bb9147 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml @@ -3,12 +3,12 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:windowing="clr-namespace:FluentAvalonia.UI.Windowing;assembly=FluentAvalonia" - xmlns:local="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows" + xmlns:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Properties.Windows" x:DataType="local:EffectConfigurationWindowViewModel" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows.EffectConfigurationWindowView" + x:Class="Artemis.UI.Screens.ProfileEditor.Properties.Windows.EffectConfigurationWindowView" Icon="/Assets/Images/Logo/application.ico" Title="Artemis | Effect configuration" Width="{CompiledBinding Configuration.DialogWidth}" diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs similarity index 90% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs index 679086e75..ddee1ec69 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs @@ -1,8 +1,9 @@ using System.ComponentModel; using Artemis.UI.Shared; +using Avalonia; using Avalonia.Markup.Xaml; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; public partial class EffectConfigurationWindowView : ReactiveAppWindow { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs similarity index 93% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs index 65fde0979..dd3778036 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Artemis.UI.Shared; using Artemis.UI.Shared.LayerEffects; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.Properties.Windows; +namespace Artemis.UI.Screens.ProfileEditor.Properties.Windows; public class EffectConfigurationWindowViewModel : DialogViewModelBase { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/StatusBar/StatusBarView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml similarity index 91% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/StatusBar/StatusBarView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml index afa31ddb8..25c79efee 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/StatusBar/StatusBarView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml @@ -5,9 +5,9 @@ xmlns:avalonia="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia" xmlns:core="clr-namespace:Artemis.Core;assembly=Artemis.Core" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="23" - xmlns:statusBar="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.StatusBar" - x:DataType="statusBar:StatusBarViewModel" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.StatusBar.StatusBarView"> + xmlns:vm="clr-namespace:Artemis.UI.Screens.ProfileEditor.StatusBar;assembly=Artemis.UI" + x:DataType="vm:StatusBarViewModel" + x:Class="Artemis.UI.Screens.ProfileEditor.StatusBar.StatusBarView"> diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs index 4128edef4..f7e4491a5 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs @@ -10,7 +10,7 @@ using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor; +namespace Artemis.UI.Screens.ProfileEditor.VisualEditor; public partial class VisualEditorView : ReactiveUserControl { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs similarity index 97% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs index 8c761f44f..a5246024b 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs @@ -8,7 +8,7 @@ using System.Reactive.Linq; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.DryIoc.Factories; -using Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor.Visualizers; +using Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers; using Artemis.UI.Shared; using Artemis.UI.Shared.Services.ProfileEditor; using DynamicData; @@ -16,7 +16,7 @@ using DynamicData.Binding; using PropertyChanged.SourceGenerator; using ReactiveUI; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor; +namespace Artemis.UI.Screens.ProfileEditor.VisualEditor; public partial class VisualEditorViewModel : ActivatableViewModelBase { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs similarity index 69% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs rename to src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs index 02b813ed3..357f99e7e 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs @@ -1,6 +1,6 @@ using Artemis.Core; -namespace Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor.Visualizers; +namespace Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers; public interface IVisualizerViewModel { diff --git a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml similarity index 90% rename from src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml rename to src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml index ab34ee678..78a2f969a 100644 --- a/src/Artemis.UI/Screens/Profiles/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml +++ b/src/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml @@ -2,10 +2,10 @@ 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:visualizers1="clr-namespace:Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor.Visualizers" + xmlns:visualizers="clr-namespace:Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" - x:Class="Artemis.UI.Screens.Profiles.ProfileEditor.VisualEditor.Visualizers.LayerShapeVisualizerView" - x:DataType="visualizers1:LayerShapeVisualizerViewModel" + x:Class="Artemis.UI.Screens.ProfileEditor.VisualEditor.Visualizers.LayerShapeVisualizerView" + x:DataType="visualizers:LayerShapeVisualizerViewModel" ClipToBounds="False">