mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
81 lines
3.5 KiB
C#
81 lines
3.5 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Reactive.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Input;
|
|
using Artemis.Core;
|
|
using Artemis.Core.DeviceProviders;
|
|
using Artemis.Core.Services;
|
|
using Artemis.UI.Screens.Workshop.Layout.Dialogs;
|
|
using Artemis.UI.Shared;
|
|
using Artemis.UI.Shared.Services;
|
|
using Artemis.WebClient.Workshop.Handlers.UploadHandlers;
|
|
using PropertyChanged.SourceGenerator;
|
|
using ReactiveUI;
|
|
using ReactiveUI.Validation.Extensions;
|
|
|
|
namespace Artemis.UI.Screens.Workshop.Layout;
|
|
|
|
public partial class LayoutInfoViewModel : ValidatableViewModelBase
|
|
{
|
|
private readonly IWindowService _windowService;
|
|
private readonly ObservableAsPropertyHelper<string?> _deviceProviders;
|
|
[Notify] private string? _vendor;
|
|
[Notify] private string? _model;
|
|
[Notify] private Guid _deviceProviderId;
|
|
[Notify] private string? _deviceProviderIdInput;
|
|
[Notify] private ICommand? _remove;
|
|
|
|
public LayoutInfoViewModel(ArtemisLayout layout,
|
|
IDeviceService deviceService,
|
|
IWindowService windowService,
|
|
IPluginManagementService pluginManagementService)
|
|
{
|
|
ArtemisDevice? device = deviceService.Devices.FirstOrDefault(d => d.Layout == layout);
|
|
|
|
_windowService = windowService;
|
|
_vendor = device?.RgbDevice.DeviceInfo.Manufacturer ?? layout.RgbLayout.Vendor;
|
|
_model = device?.RgbDevice.DeviceInfo.Model ?? layout.RgbLayout.Model;
|
|
|
|
if (device != null)
|
|
_deviceProviderId = device.DeviceProvider.Plugin.Guid;
|
|
|
|
_deviceProviders = this.WhenAnyValue(vm => vm.DeviceProviderId)
|
|
.Select(id => pluginManagementService.GetAllPlugins().FirstOrDefault(p => p.Guid == id)?.Features.Select(f => f.Name))
|
|
.Select(names => names != null ? string.Join(", ", names) : "")
|
|
.ToProperty(this, vm => vm.DeviceProviders);
|
|
|
|
this.WhenAnyValue(vm => vm.DeviceProviderId).Subscribe(g => DeviceProviderIdInput = g.ToString());
|
|
this.WhenAnyValue(vm => vm.DeviceProviderIdInput).Where(i => Guid.TryParse(i, out _)).Subscribe(i => DeviceProviderId = Guid.Parse(i!));
|
|
|
|
this.ValidationRule(vm => vm.Model, input => !string.IsNullOrWhiteSpace(input), "Device model is required");
|
|
this.ValidationRule(vm => vm.Vendor, input => !string.IsNullOrWhiteSpace(input), "Device vendor is required");
|
|
this.ValidationRule(vm => vm.DeviceProviderIdInput, input => Guid.TryParse(input, out _), "Must be a valid GUID formatted as: 00000000-0000-0000-0000-000000000000");
|
|
this.ValidationRule(vm => vm.DeviceProviderIdInput, input => !string.IsNullOrWhiteSpace(input), "Device provider ID is required");
|
|
this.ValidationRule(vm => vm.DeviceProviderIdInput, input => input != "00000000-0000-0000-0000-000000000000", "Device provider ID is required");
|
|
}
|
|
|
|
public string? DeviceProviders => _deviceProviders.Value;
|
|
|
|
public async Task BrowseDeviceProvider()
|
|
{
|
|
await _windowService.CreateContentDialog()
|
|
.WithTitle("Select device provider")
|
|
.WithViewModel(out DeviceProviderPickerDialogViewModel vm)
|
|
.ShowAsync();
|
|
|
|
DeviceProvider? deviceProvider = vm.DeviceProvider;
|
|
if (deviceProvider != null)
|
|
DeviceProviderId = deviceProvider.Plugin.Guid;
|
|
}
|
|
|
|
public LayoutInfo ToLayoutInfo()
|
|
{
|
|
return new LayoutInfo
|
|
{
|
|
Model = Model ?? string.Empty,
|
|
Vendor = Vendor ?? string.Empty,
|
|
DeviceProviderId = DeviceProviderId
|
|
};
|
|
}
|
|
} |