using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Threading.Tasks; using JD.Asset.Types.Map; using Plume.Core.Logging; using Plume.Perforce.Service.Api; using Plume.WPF.Mvvm; using Ubisoft.Perforce.Data; namespace Orbit.Module.ViewModel { public class MapsViewModel : BindableBase, IMapExplorer { private readonly IPerforceService _perforceService; private readonly ILogger _logger; private bool _isLoadingMaps; private Map _selectedMap; public ObservableCollection Maps { get; set; } = new ObservableCollection(); public event EventHandler MapChanged; public Map SelectedMap { get => _selectedMap; set => SetProperty(ref _selectedMap, value, () => MapChanged?.Invoke(this, new MapChangedEventArgs{SelectedMap = value})); } public bool IsLoadingMaps { get => _isLoadingMaps; set => SetProperty(ref _isLoadingMaps, value); } public MapsViewModel(IPerforceService perforceService, ILogger logger) { _perforceService = perforceService ?? throw new ArgumentNullException(nameof(perforceService)); _logger = logger; _perforceService.CurrentClientChanged += PerforceServiceOnCurrentClientChanged; _logger.Info("DEBUG - MapsViewModel initialized"); } public async Task RefreshMaps() { IsLoadingMaps = true; try { var newMaps = await Task.Run(() => { List m = new List(); string mapDepotFolder = _perforceService.GetCurrentStreamDepotRoot() + @"/data/World/Maps/*"; string clientMapsRoot = Path.Combine(_perforceService.CurrentClient.Root, @"data\World\Maps"); _logger.Info( $"Looking under stream depot {mapDepotFolder}. " + $"P4 server: {_perforceService.Connection.PerforcePort}, " + $"client: {_perforceService.CurrentClient.Client}, " + $"root: {clientMapsRoot}"); // Get all depot directories under the Maps folder List dirs = _perforceService.Connection.GetDirs(mapDepotFolder, true); foreach (string directory in dirs) { // Extract the map name from the depot path and convert the path into a client location // to convert into client view we use the depot root path instead of calling WhereDirectoryOnDisk for performance reasons // fix JIRA: https://mdc-tomcat-jira29.ubisoft.org/jira/browse/JDS-2220 string mapName = Path.GetFileName(directory.Replace("/...", "")); string mapDir = Path.Combine(clientMapsRoot, mapName); Map map = new Map(mapName, mapDir, "MAPS"); m.Add(map); } return m; }); _logger.Info($"{newMaps.Count} maps found!"); Maps = new ObservableCollection(newMaps); } finally { IsLoadingMaps = false; OnPropertyChanged(nameof(Maps)); } } private async void PerforceServiceOnCurrentClientChanged(object sender, ClientInfo e) { await RefreshMaps(); } } }