using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading.Tasks; using CUE4Parse.UE4.Assets.Exports.Texture; using CUE4Parse.UE4.Objects.Core.Misc; using CUE4Parse.UE4.Objects.Core.Serialization; using CUE4Parse.UE4.Versions; using CUE4Parse_Conversion.Meshes; using CUE4Parse_Conversion.Textures; using FModel.Extensions; using FModel.Framework; using FModel.Services; using FModel.Settings; using FModel.ViewModels.ApiEndpoints.Models; namespace FModel.ViewModels; public class SettingsViewModel : ViewModel { private ThreadWorkerViewModel _threadWorkerView => ApplicationService.ThreadWorkerView; private ApiEndpointViewModel _apiEndpointView => ApplicationService.ApiEndpointView; 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 string _selectedPreset; public string SelectedPreset { get => _selectedPreset; set { SetProperty(ref _selectedPreset, value); RaisePropertyChanged("EnableElements"); } } 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 List _selectedCustomVersions; public List SelectedCustomVersions { get => _selectedCustomVersions; set => SetProperty(ref _selectedCustomVersions, value); } private Dictionary _selectedOptions; public Dictionary SelectedOptions { get => _selectedOptions; set => SetProperty(ref _selectedOptions, value); } private FEndpoint _aesEndpoint; public FEndpoint AesEndpoint { get => _aesEndpoint; set => SetProperty(ref _aesEndpoint, value); } private FEndpoint _mappingEndpoint; public FEndpoint 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 ELodFormat _selectedLodExportFormat; public ELodFormat SelectedLodExportFormat { get => _selectedLodExportFormat; set => SetProperty(ref _selectedLodExportFormat, value); } private ETextureFormat _selectedTextureExportFormat; public ETextureFormat SelectedTextureExportFormat { get => _selectedTextureExportFormat; set => SetProperty(ref _selectedTextureExportFormat, value); } public ReadOnlyObservableCollection UpdateModes { get; private set; } public ObservableCollection Presets { 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 LodExportFormats { get; private set; } public ReadOnlyObservableCollection TextureExportFormats { get; private set; } public ReadOnlyObservableCollection Platforms { get; private set; } public bool EnableElements => SelectedPreset == Constants._NO_PRESET_TRIGGER; private readonly FGame _game; private Game _gamePreset; 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 string _presetSnapshot; private ETexturePlatform _uePlatformSnapshot; private EGame _ueGameSnapshot; private List _customVersionsSnapshot; private Dictionary _optionsSnapshot; private ELanguage _assetLanguageSnapshot; private ECompressedAudio _compressedAudioSnapshot; private EIconStyle _cosmeticStyleSnapshot; private EMeshFormat _meshExportFormatSnapshot; private ELodFormat _lodExportFormatSnapshot; private ETextureFormat _textureExportFormatSnapshot; private bool _mappingsUpdate = false; public SettingsViewModel(FGame game) { _game = game; } 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; _presetSnapshot = UserSettings.Default.Presets[_game]; _uePlatformSnapshot = UserSettings.Default.OverridedPlatform; if (_game == FGame.Unknown && UserSettings.Default.ManualGames.TryGetValue(_gameSnapshot, out var settings)) { _ueGameSnapshot = settings.OverridedGame; _customVersionsSnapshot = settings.OverridedCustomVersions; _optionsSnapshot = settings.OverridedOptions; } else { _ueGameSnapshot = UserSettings.Default.OverridedGame[_game]; _customVersionsSnapshot = UserSettings.Default.OverridedCustomVersions[_game]; _optionsSnapshot = UserSettings.Default.OverridedOptions[_game]; } if (UserSettings.Default.CustomEndpoints.TryGetValue(_game, out var endpoints)) { AesEndpoint = endpoints[0]; MappingEndpoint = endpoints[1]; MappingEndpoint.PropertyChanged += (sender, args) => { if (sender is FEndpoint endpoint && !_mappingsUpdate) _mappingsUpdate = args.PropertyName is "Overwrite" or "FilePath" && endpoint.IsValid; }; } _assetLanguageSnapshot = UserSettings.Default.AssetLanguage; _compressedAudioSnapshot = UserSettings.Default.CompressedAudioMode; _cosmeticStyleSnapshot = UserSettings.Default.CosmeticStyle; _meshExportFormatSnapshot = UserSettings.Default.MeshExportFormat; _lodExportFormatSnapshot = UserSettings.Default.LodExportFormat; _textureExportFormatSnapshot = UserSettings.Default.TextureExportFormat; SelectedUpdateMode = _updateModeSnapshot; SelectedPreset = _presetSnapshot; SelectedUePlatform = _uePlatformSnapshot; SelectedUeGame = _ueGameSnapshot; SelectedCustomVersions = _customVersionsSnapshot; SelectedOptions = _optionsSnapshot; SelectedAssetLanguage = _assetLanguageSnapshot; SelectedCompressedAudio = _compressedAudioSnapshot; SelectedCosmeticStyle = _cosmeticStyleSnapshot; SelectedMeshExportFormat = _meshExportFormatSnapshot; SelectedLodExportFormat = _lodExportFormatSnapshot; SelectedTextureExportFormat = _textureExportFormatSnapshot; SelectedAesReload = UserSettings.Default.AesReload; SelectedDiscordRpc = UserSettings.Default.DiscordRpc; UpdateModes = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUpdateModes())); Presets = new ObservableCollection(EnumeratePresets()); 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())); LodExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateLodExportFormat())); TextureExportFormats = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateTextureExportFormat())); Platforms = new ReadOnlyObservableCollection(new ObservableCollection(EnumerateUePlatforms())); } public async Task InitPresets(string gameName) { await _threadWorkerView.Begin(cancellationToken => { if (string.IsNullOrEmpty(gameName)) return; _gamePreset = _apiEndpointView.FModelApi.GetGames(cancellationToken, gameName); }); if (_gamePreset?.Versions == null) return; foreach (var version in _gamePreset.Versions.Keys) { Presets.Add(version); } } public void SwitchPreset(string key) { if (_gamePreset?.Versions == null || !_gamePreset.Versions.TryGetValue(key, out var version)) return; SelectedUeGame = version.GameEnum.ToEnum(EGame.GAME_UE4_LATEST); SelectedCustomVersions = new List(); foreach (var (guid, v) in version.CustomVersions) { SelectedCustomVersions.Add(new FCustomVersion { Key = new FGuid(guid), Version = v }); } SelectedOptions = new Dictionary(); foreach (var (k, v) in version.Options) { SelectedOptions[k] = v; } } public void ResetPreset() { SelectedUeGame = _ueGameSnapshot; SelectedCustomVersions = _customVersionsSnapshot; SelectedOptions = _optionsSnapshot; } 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 _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.Presets[_game] = SelectedPreset; UserSettings.Default.OverridedPlatform = SelectedUePlatform; if (_game == FGame.Unknown && UserSettings.Default.ManualGames.ContainsKey(UserSettings.Default.GameDirectory)) { UserSettings.Default.ManualGames[UserSettings.Default.GameDirectory].OverridedGame = SelectedUeGame; UserSettings.Default.ManualGames[UserSettings.Default.GameDirectory].OverridedCustomVersions = SelectedCustomVersions; UserSettings.Default.ManualGames[UserSettings.Default.GameDirectory].OverridedOptions = SelectedOptions; } else { UserSettings.Default.OverridedGame[_game] = SelectedUeGame; UserSettings.Default.OverridedCustomVersions[_game] = SelectedCustomVersions; UserSettings.Default.OverridedOptions[_game] = SelectedOptions; } UserSettings.Default.AssetLanguage = SelectedAssetLanguage; UserSettings.Default.CompressedAudioMode = SelectedCompressedAudio; UserSettings.Default.CosmeticStyle = SelectedCosmeticStyle; UserSettings.Default.MeshExportFormat = SelectedMeshExportFormat; UserSettings.Default.LodExportFormat = SelectedLodExportFormat; 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 EnumeratePresets() { yield return Constants._NO_PRESET_TRIGGER; } private IEnumerable EnumerateUeGames() => Enum.GetValues(); 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 EnumerateLodExportFormat() => Enum.GetValues(); private IEnumerable EnumerateTextureExportFormat() => Enum.GetValues(); private IEnumerable EnumerateUePlatforms() => Enum.GetValues(); }