1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
2021-10-19 21:32:21 +02:00

258 lines
9.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Artemis.Core;
using Artemis.Core.Modules;
using Artemis.Core.Services;
using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.ProfileEditor.Conditions;
using Artemis.UI.Shared;
using Artemis.UI.Shared.Services;
using FluentValidation;
using MaterialDesignThemes.Wpf;
using Ookii.Dialogs.Wpf;
using Stylet;
using EnumUtilities = Artemis.UI.Shared.EnumUtilities;
namespace Artemis.UI.Screens.Sidebar.Dialogs.ProfileEdit
{
public class ProfileEditViewModel : DialogViewModelBase
{
private readonly DataModelConditionGroup _dataModelConditionGroup;
private readonly List<Module> _modules;
private readonly IProfileService _profileService;
private bool _changedImage;
private bool _initializing;
private string _profileName;
private ProfileIconViewModel _selectedIcon;
private ProfileConfigurationIconType _selectedIconType;
private Stream _selectedImage;
private ProfileModuleViewModel _selectedModule;
public ProfileEditViewModel(ProfileConfiguration profileConfiguration, bool isNew,
IProfileService profileService,
IPluginManagementService pluginManagementService,
ISidebarVmFactory sidebarVmFactory,
IDataModelConditionsVmFactory dataModelConditionsVmFactory,
IModelValidator<ProfileEditViewModel> validator) : base(validator)
{
ProfileConfiguration = profileConfiguration;
IsNew = isNew;
_profileService = profileService;
_dataModelConditionGroup = ProfileConfiguration.ActivationCondition ?? new DataModelConditionGroup(null);
_modules = ProfileConfiguration.Module != null ? new List<Module> {ProfileConfiguration.Module} : new List<Module>();
IconTypes = new BindableCollection<ValueDescription>(EnumUtilities.GetAllValuesAndDescriptions(typeof(ProfileConfigurationIconType)));
HotkeyModes = new BindableCollection<ValueDescription>(EnumUtilities.GetAllValuesAndDescriptions(typeof(ProfileConfigurationHotkeyMode)));
Icons = new BindableCollection<ProfileIconViewModel>();
Modules = new BindableCollection<ProfileModuleViewModel>(
pluginManagementService.GetFeaturesOfType<Module>().Where(m => !m.IsAlwaysAvailable).Select(m => new ProfileModuleViewModel(m))
);
Initializing = true;
ActivationConditionViewModel = dataModelConditionsVmFactory.DataModelConditionGroupViewModel(_dataModelConditionGroup, ConditionGroupType.General, _modules);
ActivationConditionViewModel.ConductWith(this);
ActivationConditionViewModel.IsRootGroup = true;
ModuleActivationRequirementsViewModel = new ModuleActivationRequirementsViewModel(sidebarVmFactory);
ModuleActivationRequirementsViewModel.ConductWith(this);
ModuleActivationRequirementsViewModel.SetModule(ProfileConfiguration.Module);
EnableHotkeyViewModel = sidebarVmFactory.ProfileConfigurationHotkeyViewModel(ProfileConfiguration, false);
EnableHotkeyViewModel.ConductWith(this);
DisableHotkeyViewModel = sidebarVmFactory.ProfileConfigurationHotkeyViewModel(ProfileConfiguration, true);
DisableHotkeyViewModel.ConductWith(this);
_profileName = ProfileConfiguration.Name;
_selectedModule = Modules.FirstOrDefault(m => m.Module == ProfileConfiguration.Module);
_selectedIconType = ProfileConfiguration.Icon.IconType;
_selectedImage = ProfileConfiguration.Icon.FileIcon;
Task.Run(() =>
{
Icons.AddRange(Enum.GetValues<PackIconKind>()
.GroupBy(i => i).Select(g => g.First()).Select(i => new ProfileIconViewModel(i))
.OrderBy(i => i.IconName)
.ToList());
if (IsNew)
SelectedIcon = Icons[new Random().Next(0, Icons.Count - 1)];
else
SelectedIcon = Icons.FirstOrDefault(i => i.Icon.ToString() == ProfileConfiguration.Icon.MaterialIcon);
Initializing = false;
});
}
public DataModelConditionGroupViewModel ActivationConditionViewModel { get; }
public ModuleActivationRequirementsViewModel ModuleActivationRequirementsViewModel { get; }
public ProfileConfigurationHotkeyViewModel EnableHotkeyViewModel { get; }
public ProfileConfigurationHotkeyViewModel DisableHotkeyViewModel { get; }
public bool IsNew { get; }
public ProfileConfiguration ProfileConfiguration { get; }
public BindableCollection<ValueDescription> IconTypes { get; }
public BindableCollection<ValueDescription> HotkeyModes { get; }
public BindableCollection<ProfileIconViewModel> Icons { get; }
public BindableCollection<ProfileModuleViewModel> Modules { get; }
public bool HasUsableModules => Modules.Any();
public bool Initializing
{
get => _initializing;
set => SetAndNotify(ref _initializing, value);
}
public string ProfileName
{
get => _profileName;
set => SetAndNotify(ref _profileName, value);
}
public ProfileConfigurationIconType SelectedIconType
{
get => _selectedIconType;
set
{
if (!SetAndNotify(ref _selectedIconType, value)) return;
SelectedImage = null;
}
}
public ProfileConfigurationHotkeyMode SelectedHotkeyMode
{
get => ProfileConfiguration.HotkeyMode;
set
{
ProfileConfiguration.HotkeyMode = value;
NotifyOfPropertyChange(nameof(SelectedHotkeyMode));
NotifyOfPropertyChange(nameof(ShowEnableHotkey));
NotifyOfPropertyChange(nameof(ShowDisableHotkey));
EnableHotkeyViewModel.UpdateHotkeyDisplay();
DisableHotkeyViewModel.UpdateHotkeyDisplay();
}
}
public bool ShowEnableHotkey => ProfileConfiguration.HotkeyMode != ProfileConfigurationHotkeyMode.None;
public bool ShowDisableHotkey => ProfileConfiguration.HotkeyMode == ProfileConfigurationHotkeyMode.EnableDisable;
public Stream SelectedImage
{
get => _selectedImage;
set => SetAndNotify(ref _selectedImage, value);
}
public ProfileIconViewModel SelectedIcon
{
get => _selectedIcon;
set => SetAndNotify(ref _selectedIcon, value);
}
public ProfileModuleViewModel SelectedModule
{
get => _selectedModule;
set
{
if (!SetAndNotify(ref _selectedModule, value)) return;
_modules.Clear();
if (value != null)
_modules.Add(value.Module);
ActivationConditionViewModel.UpdateModules();
ModuleActivationRequirementsViewModel.SetModule(value?.Module);
}
}
public void Delete()
{
Session.Close(nameof(Delete));
}
public async Task Accept()
{
await ValidateAsync();
if (HasErrors)
return;
ProfileConfiguration.Name = ProfileName;
ProfileConfiguration.Icon.IconType = SelectedIconType;
ProfileConfiguration.Icon.MaterialIcon = SelectedIcon?.Icon.ToString();
ProfileConfiguration.Icon.FileIcon = SelectedImage;
ProfileConfiguration.Module = SelectedModule?.Module;
if (_dataModelConditionGroup.Children.Any())
ProfileConfiguration.ActivationCondition = _dataModelConditionGroup;
if (_changedImage)
{
ProfileConfiguration.Icon.FileIcon = SelectedImage;
_profileService.SaveProfileConfigurationIcon(ProfileConfiguration);
}
_profileService.SaveProfileCategory(ProfileConfiguration.Category);
Session.Close(nameof(Accept));
}
public void SelectBitmapFile()
{
VistaOpenFileDialog dialog = new()
{
Filter = "All Graphics Types|*.bmp;*.jpg;*.jpeg;*.png;*.tif;*.tiff|BMP |*.bmp|GIF|*.gif|JPG|*.jpg;*.jpeg|PNG|*.png|TIFF|*.tif;*.tiff",
Title = "Select profile icon"
};
bool? result = dialog.ShowDialog();
if (result != true)
return;
_changedImage = true;
// TODO: Scale down to 100x100-ish
SelectedImage = File.OpenRead(dialog.FileName);
}
public void SelectSvgFile()
{
VistaOpenFileDialog dialog = new()
{
Filter = "Scalable Vector Graphics|*.svg",
Title = "Select profile icon"
};
bool? result = dialog.ShowDialog();
if (result != true)
return;
_changedImage = true;
SelectedImage = File.OpenRead(dialog.FileName);
}
#region Overrides of Screen
protected override void OnInitialActivate()
{
_profileService.HotkeysEnabled = false;
base.OnInitialActivate();
}
protected override void OnClose()
{
_profileService.HotkeysEnabled = true;
base.OnClose();
}
#endregion
}
public class ProfileEditViewModelValidator : AbstractValidator<ProfileEditViewModel>
{
public ProfileEditViewModelValidator()
{
RuleFor(m => m.ProfileName).NotEmpty().WithMessage("Profile name may not be empty");
}
}
}