JD2022-TU1/main/tools/modules/JD.Guinness.WPF.Module/PlumeAction/SubmitAction.cs

65 lines
2.6 KiB
C#

using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Input;
using JD.Guinness.WPF.Module.View;
using JD.Guinness.WPF.Module.ViewModel;
using Plume.Icons;
using Plume.Perforce.Service.Api;
namespace JD.Guinness.WPF.Module.PlumeAction
{
public sealed class SubmitAction : Plume.Interfaces.WPF.Actions.Action
{
private readonly GameViewModel _gameViewModel;
private readonly IPerforceService _perforceService;
public SubmitAction(GameViewModel gameViewModel, IPerforceService perforceService)
: base("Submit", "Submit", StandardIcon.Perforce, new KeyGesture(Key.P, ModifierKeys.Control))
{
_gameViewModel = gameViewModel;
_perforceService = perforceService;
}
public override bool CanExecute() => _gameViewModel.IsAvailable && _gameViewModel.HasWorkspace;
public override async void TryExecute()
{
if (!SubmitDescriptionBox.Show(out string description))
{
return;
}
_gameViewModel.SaveCommand.Execute(false);
FileInfo gameSave = new FileInfo(Path.Combine(_gameViewModel.Settings.WorkspacePath, _gameViewModel.Settings.GameSaveFilePath));
await _gameViewModel.StartProcess(
Task.Run(async () =>
{
if (_perforceService.Connect(_gameViewModel.Settings.PerforceServer, Environment.UserName, _gameViewModel.Settings.WorkspaceName))
{
try
{
string changeList = _perforceService.Connection.CreatePendingChangelist(description);
_perforceService.Connection.MoveFileToChangelist(gameSave.FullName, changeList);
_perforceService.Connection.Submit(changeList);
}
finally
{
_perforceService.Disconnect();
}
await _gameViewModel.SetWorkspaceCommand.ExecuteAsync(false).ConfigureAwait(true);
}
else
{
throw new Exception($"Unable to connect on the server '{_gameViewModel.Settings.PerforceServer}' with user '{Environment.UserName}' on client '{_gameViewModel.Settings.WorkspaceName}'.");
}
}),
$"Submiting file \"{gameSave.FullName}\"",
$"Submited file \"{gameSave.FullName}\"",
$"Failed to submit file \"{gameSave.FullName}\"").ConfigureAwait(true);
}
}
}