98 lines
No EOL
3.6 KiB
C#
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();
|
|
}
|
|
}
|
|
} |