JD2022-TU1/main/tools/modules/Orbit.Module/ViewModel/MapsViewModel.cs

98 lines
No EOL
3.6 KiB
C#

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<Map> Maps { get; set; } = new ObservableCollection<Map>();
public event EventHandler<MapChangedEventArgs> 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<Map> m = new List<Map>();
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<string> 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<Map>(newMaps);
}
finally
{
IsLoadingMaps = false;
OnPropertyChanged(nameof(Maps));
}
}
private async void PerforceServiceOnCurrentClientChanged(object sender, ClientInfo e)
{
await RefreshMaps();
}
}
}