using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using CUE4Parse.UE4.Assets.Exports.Texture; using CUE4Parse.UE4.Objects.Core.Serialization; using CUE4Parse.UE4.Versions; using CUE4Parse_Conversion.Meshes; using CUE4Parse_Conversion.Textures; using CUE4Parse.UE4.Assets.Exports.Material; using FModel.Framework; using FModel.Services; using FModel.Settings; namespace FModel.ViewModels; public class SettingsViewModel : ViewModel { private readonly DiscordHandler _discordHandler = DiscordService.DiscordHandler; private bool _useCustomOutputFolders; public bool UseCustomOutputFolders { get => _useCustomOutputFolders; set => SetProperty(ref _useCustomOutputFolders, value); } private EUpdateMode _selectedUpdateMode; public EUpdateMode SelectedUpdateMode { get => _selectedUpdateMode; set => SetProperty(ref _selectedUpdateMode, value); } private ETexturePlatform _selectedUePlatform; public ETexturePlatform SelectedUePlatform { get => _selectedUePlatform; set => SetProperty(ref _selectedUePlatform, value); } private EGame _selectedUeGame; public EGame SelectedUeGame { get => _selectedUeGame; set => SetProperty(ref _selectedUeGame, value); } private IList _selectedCustomVersions; public IList SelectedCustomVersions { get => _selectedCustomVersions; set => SetProperty(ref _selectedCustomVersions, value); } private IDictionary _selectedOptions; public IDictionary SelectedOptions { get => _selectedOptions; set => SetProperty(ref _selectedOptions, value); } private IDictionary> _selectedMapStructTypes; public IDictionary> SelectedMapStructTypes { get => _selectedMapStructTypes; set => SetProperty(ref _selectedMapStructTypes, value); } private EndpointSettings _aesEndpoint; public EndpointSettings AesEndpoint { get => _aesEndpoint; set => SetProperty(ref _aesEndpoint, value); } private EndpointSettings _mappingEndpoint; public EndpointSettings MappingEndpoint { get => _mappingEndpoint; set => SetProperty(ref _mappingEndpoint, value); } private ELanguage _selectedAssetLanguage; public ELanguage SelectedAssetLanguage { get => _selectedAssetLanguage; set => SetProperty(ref _selectedAssetLanguage, value); } private EAesReload _selectedAesReload; public EAesReload SelectedAesReload { get => _selectedAesReload; set => SetProperty(ref _selectedAesReload, value); } private EDiscordRpc _selectedDiscordRpc; public EDiscordRpc SelectedDiscordRpc { get => _selectedDiscordRpc; set => SetProperty(ref _selectedDiscordRpc, value); } private ECompressedAudio _selectedCompressedAudio; public ECompressedAudio SelectedCompressedAudio { get => _selectedCompressedAudio; set => SetProperty(ref _selectedCompressedAudio, value); } private EIconStyle _selectedCosmeticStyle; public EIconStyle SelectedCosmeticStyle { get => _selectedCosmeticStyle; set => SetProperty(ref _selectedCosmeticStyle, value); } private EMeshFormat _selectedMeshExportFormat; public EMeshFormat SelectedMeshExportFormat { get => _selectedMeshExportFormat; set => SetProperty(ref _selectedMeshExportFormat, value); } private ESocketFormat _selectedSocketExportFormat; public ESocketFormat SelectedSocketExportFormat { get => _selectedSocketExportFormat; set => SetProperty(ref _selectedSocketExportFormat, value); } private ELodFormat _selectedLodExportFormat; public ELodFormat SelectedLodExportFormat { get => _selectedLodExportFormat; set => SetProperty(ref _selectedLodExportFormat, value); } private EMaterialFormat _selectedMaterialExportFormat; public EMaterialFormat SelectedMaterialExportFormat { get => _selectedMaterialExportFormat; set => SetProperty(ref _selectedMaterialExportFormat, value); } private ETextureFormat _selectedTextureExportFormat; public ETextureFormat SelectedTextureExportFormat { get => _selectedTextureExportFormat; set => SetProperty(ref _selectedTextureExportFormat, value); } public ReadOnlyObservableCollection UpdateModes { get; private set; } public ReadOnlyObservableCollection UeGames { get; private set; } public ReadOnlyObservableCollection AssetLanguages { get; private set; } public ReadOnlyObservableCollection AesReloads { get; private set; } public ReadOnlyObservableCollection DiscordRpcs { get; private set; } public ReadOnlyObservableCollection CompressedAudios { get; private set; } public ReadOnlyObservableCollection CosmeticStyles { get; private set; } public ReadOnlyObservableCollection MeshExportFormats { get; private set; } public ReadOnlyObservableCollection SocketExportFormats { get; private set; } public ReadOnlyObservableCollection LodExportFormats { get; private set; } public ReadOnlyObservableCollection MaterialExportFormats { get; private set; } public ReadOnlyObservableCollection TextureExportFormats { get; private set; } public ReadOnlyObservableCollection Platforms { get; private set; } private string _outputSnapshot; private string _rawDataSnapshot; private string _propertiesSnapshot; private string _textureSnapshot; private string _audioSnapshot; private string _modelSnapshot; private string _gameSnapshot; private EUpdateMode _updateModeSnapshot; private ETexturePlatform _uePlatformSnapshot; private EGame _ueGameSnapshot; private IList _customVersionsSnapshot; private IDictionary _optionsSnapshot; private IDictionary> _mapStructTypesSnapshot; private ELanguage _assetLanguageSnapshot; private ECompressedAudio _compressedAudioSnapshot; private EIconStyle _cosmeticStyleSnapshot; private EMeshFormat _meshExportFormatSnapshot; private ESocketFormat _socketExportFormatSnapshot; private ELodFormat _lodExportFormatSnapshot; private EMaterialFormat _materialExportFormatSnapshot; private ETextureFormat _textureExportFormatSnapshot; private bool _mappingsUpdate = false; public SettingsViewModel() { } public void Initialize() { _outputSnapshot = UserSettings.Default.OutputDirectory; _rawDataSnapshot = UserSettings.Default.RawDataDirectory; _propertiesSnapshot = UserSettings.Default.PropertiesDirectory; _textureSnapshot = UserSettings.Default.TextureDirectory; _audioSnapshot = UserSettings.Default.AudioDirectory; _modelSnapshot = UserSettings.Default.ModelDirectory; _gameSnapshot = UserSettings.Default.GameDirectory; _updateModeSnapshot = UserSettings.Default.UpdateMode; _uePlatformSnapshot = UserSettings.Default.CurrentDir.TexturePlatform; _ueGameSnapshot = UserSettings.Default.CurrentDir.UeVersion; _customVersionsSnapshot = UserSettings.Default.CurrentDir.Versioning.CustomVersions; _optionsSnapshot = UserSettings.Default.CurrentDir.Versioning.Options; _mapStructTypesSnapshot = UserSettings.Default.CurrentDir.Versioning.MapStructTypes; AesEndpoint = UserSettings.Default.CurrentDir.Endpoints[0]; MappingEndpoint = UserSettings.Default.CurrentDir.Endpoints[1]; MappingEndpoint.PropertyChanged += (_, args) => { if (!_mappingsUpdate) _mappingsUpdate = args.PropertyName is "Overwrite" or "FilePath"; }; _assetLanguageSnapshot = UserSettings.Default.AssetLanguage; _compressedAudioSnapshot = UserSettings.Default.CompressedAudioMode; _cosmeticStyleSnapshot = UserSettings.Default.CosmeticStyle; _meshExportFormatSnapshot = UserSettings.Default.MeshExportFormat; _socketExportFormatSnapshot = UserSettings.Default.SocketExportFormat; _lodExportFormatSnapshot = UserSettings.Default.LodExportFormat; _materialExportFormatSnapshot = UserSettings.Default.MaterialExportFormat; _textureExportFormatSnapshot = UserSettings.Default.TextureExportFormat; SelectedUpdateMode = _updateModeSnapshot; SelectedUePlatform = _uePlatformSnapshot; SelectedUeGame = _ueGameSnapshot; SelectedCustomVersions = _customVersionsSnapshot; SelectedOptions = _optionsSnapshot; SelectedMapStructTypes = _mapStructTypesSnapshot; SelectedAssetLanguage = _assetLanguageSnapshot; SelectedCompressedAudio = _compressedAudioSnapshot; SelectedCosmeticStyle = _cosmeticStyleSnapshot; SelectedMeshExportFormat = _meshExportFormatSnapshot; SelectedSocketExportFormat = _socketExportFormatSnapshot; SelectedLodExportFormat = _lodExportFormatSnapshot; SelectedMaterialExportFormat = _materialExportFormatSnapshot; SelectedTextureExportFormat = _textureExportFormatSnapshot; SelectedAesReload = UserSettings.Default.AesReload; SelectedDiscordRpc = UserSettings.Default.DiscordRpc; UpdateModes = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUpdateModes())); UeGames = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUeGames())); AssetLanguages = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateAssetLanguages())); AesReloads = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateAesReloads())); DiscordRpcs = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateDiscordRpcs())); CompressedAudios = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateCompressedAudios())); CosmeticStyles = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateCosmeticStyles())); MeshExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateMeshExportFormat())); SocketExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateSocketExportFormat())); LodExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateLodExportFormat())); MaterialExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateMaterialExportFormat())); TextureExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateTextureExportFormat())); Platforms = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUePlatforms())); } public bool Save(out List whatShouldIDo) { var restart = false; whatShouldIDo = new List(); if (_assetLanguageSnapshot != SelectedAssetLanguage) whatShouldIDo.Add(SettingsOut.ReloadLocres); if (_mappingsUpdate) whatShouldIDo.Add(SettingsOut.ReloadMappings); if (_updateModeSnapshot != SelectedUpdateMode) whatShouldIDo.Add(SettingsOut.CheckForUpdates); if (_ueGameSnapshot != SelectedUeGame || _customVersionsSnapshot != SelectedCustomVersions || _uePlatformSnapshot != SelectedUePlatform || _optionsSnapshot != SelectedOptions || // combobox _mapStructTypesSnapshot != SelectedMapStructTypes || _outputSnapshot != UserSettings.Default.OutputDirectory || // textbox _rawDataSnapshot != UserSettings.Default.RawDataDirectory || // textbox _propertiesSnapshot != UserSettings.Default.PropertiesDirectory || // textbox _textureSnapshot != UserSettings.Default.TextureDirectory || // textbox _audioSnapshot != UserSettings.Default.AudioDirectory || // textbox _modelSnapshot != UserSettings.Default.ModelDirectory || // textbox _gameSnapshot != UserSettings.Default.GameDirectory) // textbox restart = true; UserSettings.Default.UpdateMode = SelectedUpdateMode; UserSettings.Default.CurrentDir.UeVersion = SelectedUeGame; UserSettings.Default.CurrentDir.TexturePlatform = SelectedUePlatform; UserSettings.Default.CurrentDir.Versioning.CustomVersions = SelectedCustomVersions; UserSettings.Default.CurrentDir.Versioning.Options = SelectedOptions; UserSettings.Default.CurrentDir.Versioning.MapStructTypes = SelectedMapStructTypes; UserSettings.Default.AssetLanguage = SelectedAssetLanguage; UserSettings.Default.CompressedAudioMode = SelectedCompressedAudio; UserSettings.Default.CosmeticStyle = SelectedCosmeticStyle; UserSettings.Default.MeshExportFormat = SelectedMeshExportFormat; UserSettings.Default.SocketExportFormat = SelectedSocketExportFormat; UserSettings.Default.LodExportFormat = SelectedLodExportFormat; UserSettings.Default.MaterialExportFormat = SelectedMaterialExportFormat; UserSettings.Default.TextureExportFormat = SelectedTextureExportFormat; UserSettings.Default.AesReload = SelectedAesReload; UserSettings.Default.DiscordRpc = SelectedDiscordRpc; if (SelectedDiscordRpc == EDiscordRpc.Never) _discordHandler.Shutdown(); return restart; } private IEnumerable EnumerateUpdateModes() => Enum.GetValues(); private IEnumerable EnumerateUeGames() => Enum.GetValues() .GroupBy(value => (int)value) .Select(group => group.First()) .OrderBy(value => (int)value == ((int)value & ~0xF)); private IEnumerable EnumerateAssetLanguages() => Enum.GetValues(); private IEnumerable EnumerateAesReloads() => Enum.GetValues(); private IEnumerable EnumerateDiscordRpcs() => Enum.GetValues(); private IEnumerable EnumerateCompressedAudios() => Enum.GetValues(); private IEnumerable EnumerateCosmeticStyles() => Enum.GetValues(); private IEnumerable EnumerateMeshExportFormat() => Enum.GetValues(); private IEnumerable EnumerateSocketExportFormat() => Enum.GetValues(); private IEnumerable EnumerateLodExportFormat() => Enum.GetValues(); private IEnumerable EnumerateMaterialExportFormat() => Enum.GetValues(); private IEnumerable EnumerateTextureExportFormat() => Enum.GetValues(); private IEnumerable EnumerateUePlatforms() => Enum.GetValues(); }