Singularity/Library/PackageCache/com.unity.collab-proxy@2.0.3/Editor/PlasticSCM/Views/PendingChanges/PendingChangesViewPendingCh...
2024-05-06 11:45:45 -07:00

477 lines
18 KiB
C#

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using Codice.Client.Commands;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WorkspaceWindow.Items;
using PlasticGui.WorkspaceWindow.Open;
using PlasticGui.WorkspaceWindow.PendingChanges;
using PlasticGui.WorkspaceWindow.PendingChanges.Changelists;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.Views.PendingChanges.Changelists;
namespace Unity.PlasticSCM.Editor.Views.PendingChanges
{
internal class PendingChangesViewPendingChangeMenu
{
internal interface IMetaMenuOperations
{
void DiffMeta();
void OpenMeta();
void OpenMetaWith();
void OpenMetaInExplorer();
void HistoryMeta();
bool SelectionHasMeta();
}
internal PendingChangesViewPendingChangeMenu(
WorkspaceInfo wkInfo,
IPendingChangesMenuOperations pendingChangesMenuOperations,
IChangelistMenuOperations changelistMenuOperations,
IOpenMenuOperations openMenuOperations,
IMetaMenuOperations metaMenuOperations,
IFilesFilterPatternsMenuOperations filterMenuOperations)
{
mPendingChangesMenuOperations = pendingChangesMenuOperations;
mChangelistMenuOperations = changelistMenuOperations;
mOpenMenuOperations = openMenuOperations;
mMetaMenuOperations = metaMenuOperations;
mFilterMenuBuilder = new FilesFilterPatternsMenuBuilder(filterMenuOperations);
mMoveToChangelistMenuBuilder = new MoveToChangelistMenuBuilder(
wkInfo,
changelistMenuOperations);
BuildComponents();
}
internal void Popup()
{
GenericMenu menu = new GenericMenu();
UpdateMenuItems(menu);
menu.ShowAsContext();
}
internal bool ProcessKeyActionIfNeeded(Event e)
{
PendingChangesMenuOperations operationToExecute =
GetPendingChangesMenuOperation(e);
OpenMenuOperations openOperationToExecute =
GetOpenMenuOperation(e);
if (operationToExecute == PendingChangesMenuOperations.None &&
openOperationToExecute == OpenMenuOperations.None)
return false;
SelectedChangesGroupInfo info =
mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
if (operationToExecute != PendingChangesMenuOperations.None)
return ProcessKeyActionForPendingChangesMenu(
operationToExecute, mPendingChangesMenuOperations, info);
return ProcessKeyActionForOpenMenu(
openOperationToExecute, mOpenMenuOperations, info);
}
void OpenMenuItem_Click()
{
mOpenMenuOperations.Open();
}
void OpenWithMenuItem_Click()
{
mOpenMenuOperations.OpenWith();
}
void OpenInExplorerMenuItem_Click()
{
mOpenMenuOperations.OpenInExplorer();
}
void OpenMetaMenuItem_Click()
{
mMetaMenuOperations.OpenMeta();
}
void OpenMetaWithMenuItem_Click()
{
mMetaMenuOperations.OpenMetaWith();
}
void OpenMetaInExplorerMenuItem_Click()
{
mMetaMenuOperations.OpenMetaInExplorer();
}
void DiffMenuItem_Click()
{
mPendingChangesMenuOperations.Diff();
}
void DiffMetaMenuItem_Click()
{
mMetaMenuOperations.DiffMeta();
}
void UndoChangesMenuItem_Click()
{
mPendingChangesMenuOperations.UndoChanges();
}
void CheckoutMenuItem_Click()
{
mPendingChangesMenuOperations.ApplyLocalChanges();
}
void DeleteMenuItem_Click()
{
mPendingChangesMenuOperations.Delete();
}
void HistoryMenuItem_Click()
{
mPendingChangesMenuOperations.History();
}
void HistoryMetaMenuItem_Click()
{
mMetaMenuOperations.HistoryMeta();
}
void UpdateMenuItems(GenericMenu menu)
{
SelectedChangesGroupInfo info =
mPendingChangesMenuOperations.GetSelectedChangesGroupInfo();
PendingChangesMenuOperations operations =
PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
ChangelistMenuOperations changelistOperations =
ChangelistMenuOperations.None;
OpenMenuOperations openOperations =
GetOpenMenuOperations.ForPendingChangesView(info);
bool useChangelists = PlasticGuiConfig.Get().
Configuration.CommitUseChangeLists;
if (useChangelists)
{
List<ChangeListInfo> selectedChangelists =
mChangelistMenuOperations.GetSelectedChangelistInfos();
changelistOperations = ChangelistMenuUpdater.
GetAvailableMenuOperations(info, selectedChangelists);
}
if (operations == PendingChangesMenuOperations.None &&
changelistOperations == ChangelistMenuOperations.None &&
openOperations == OpenMenuOperations.None)
{
menu.AddDisabledItem(GetNoActionMenuItemContent());
return;
}
UpdateOpenMenuItems(menu, openOperations);
menu.AddSeparator(string.Empty);
if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
menu.AddItem(mDiffMenuItemContent, false, DiffMenuItem_Click);
else
menu.AddDisabledItem(mDiffMenuItemContent);
if (mMetaMenuOperations.SelectionHasMeta())
{
if (operations.HasFlag(PendingChangesMenuOperations.DiffWorkspaceContent))
menu.AddItem(mDiffMetaMenuItemContent, false, DiffMetaMenuItem_Click);
else
menu.AddDisabledItem(mDiffMetaMenuItemContent);
}
menu.AddSeparator(string.Empty);
if (operations.HasFlag(PendingChangesMenuOperations.UndoChanges))
menu.AddItem(mUndoChangesMenuItemContent, false, UndoChangesMenuItem_Click);
else
menu.AddDisabledItem(mUndoChangesMenuItemContent);
menu.AddSeparator(string.Empty);
if (operations.HasFlag(PendingChangesMenuOperations.ApplyLocalChanges))
menu.AddItem(mCheckoutMenuItemContent, false, CheckoutMenuItem_Click);
else
menu.AddDisabledItem(mCheckoutMenuItemContent);
if (operations.HasFlag(PendingChangesMenuOperations.Delete))
menu.AddItem(mDeleteMenuItemContent, false, DeleteMenuItem_Click);
else
menu.AddDisabledItem(mDeleteMenuItemContent);
if (useChangelists)
{
menu.AddSeparator(string.Empty);
mMoveToChangelistMenuBuilder.UpdateMenuItems(
menu,
changelistOperations,
info.SelectedChanges,
info.ChangelistsWithSelectedChanges);
}
menu.AddSeparator(string.Empty);
mFilterMenuBuilder.UpdateMenuItems(
menu, FilterMenuUpdater.GetMenuActions(info));
menu.AddSeparator(string.Empty);
if (operations.HasFlag(PendingChangesMenuOperations.History))
menu.AddItem(mViewHistoryMenuItemContent, false, HistoryMenuItem_Click);
else
menu.AddDisabledItem(mViewHistoryMenuItemContent, false);
if (mMetaMenuOperations.SelectionHasMeta())
{
if (operations.HasFlag(PendingChangesMenuOperations.History))
menu.AddItem(mViewHistoryMetaMenuItemContent, false, HistoryMetaMenuItem_Click);
else
menu.AddDisabledItem(mViewHistoryMetaMenuItemContent);
}
}
void UpdateOpenMenuItems(GenericMenu menu, OpenMenuOperations operations)
{
if (!operations.HasFlag(OpenMenuOperations.Open) &&
!operations.HasFlag(OpenMenuOperations.OpenWith) &&
!operations.HasFlag(OpenMenuOperations.OpenInExplorer))
{
menu.AddDisabledItem(mOpenSubmenuItemContent);
return;
}
if (operations.HasFlag(OpenMenuOperations.Open))
menu.AddItem(mOpenMenuItemContent, false, OpenMenuItem_Click);
else
menu.AddDisabledItem(mOpenMenuItemContent);
if (operations.HasFlag(OpenMenuOperations.OpenWith))
menu.AddItem(mOpenWithMenuItemContent, false, OpenWithMenuItem_Click);
else
menu.AddDisabledItem(mOpenWithMenuItemContent);
if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
menu.AddItem(mOpenInExplorerMenuItemContent, false, OpenInExplorerMenuItem_Click);
else
menu.AddDisabledItem(mOpenInExplorerMenuItemContent);
if (!mMetaMenuOperations.SelectionHasMeta())
return;
menu.AddSeparator(PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen) + "/");
if (operations.HasFlag(OpenMenuOperations.Open))
menu.AddItem(mOpenMetaMenuItemContent, false, OpenMetaMenuItem_Click);
else
menu.AddDisabledItem(mOpenMetaMenuItemContent);
if (operations.HasFlag(OpenMenuOperations.OpenWith))
menu.AddItem(mOpenMetaWithMenuItemContent, false, OpenMetaWithMenuItem_Click);
else
menu.AddDisabledItem(mOpenMetaWithMenuItemContent);
if (operations.HasFlag(OpenMenuOperations.OpenInExplorer))
menu.AddItem(mOpenMetaInExplorerMenuItemContent, false, OpenMetaInExplorerMenuItem_Click);
else
menu.AddDisabledItem(mOpenMetaInExplorerMenuItemContent);
}
GUIContent GetNoActionMenuItemContent()
{
if (mNoActionMenuItemContent == null)
{
mNoActionMenuItemContent = new GUIContent(PlasticLocalization.GetString(
PlasticLocalization.Name.NoActionMenuItem));
}
return mNoActionMenuItemContent;
}
void BuildComponents()
{
mOpenSubmenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen));
mOpenMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
GetPlasticShortcut.ForOpen())));
mOpenWithMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpenWith)));
mOpenInExplorerMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
PlasticLocalization.GetString(PlasticLocalization.Name.OpenInExplorerMenuItem)));
mOpenMetaMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
PlasticLocalization.GetString(PlasticLocalization.Name.OpenMeta)));
mOpenMetaWithMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaWith)));
mOpenMetaInExplorerMenuItemContent = new GUIContent(
UnityMenuItem.GetText(
PlasticLocalization.GetString(PlasticLocalization.Name.ItemsMenuItemOpen),
PlasticLocalization.GetString(PlasticLocalization.Name.OpenMetaInExplorer)));
mDiffMenuItemContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.DiffMenuItem),
GetPlasticShortcut.ForDiff()));
mDiffMetaMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.DiffMetaMenuItem));
mUndoChangesMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemUndoChanges));
mCheckoutMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemCheckout));
mDeleteMenuItemContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.PendingChangesMenuItemDelete),
GetPlasticShortcut.ForDelete()));
mViewHistoryMenuItemContent = new GUIContent(string.Format("{0} {1}",
PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMenuItem),
GetPlasticShortcut.ForHistory()));
mViewHistoryMetaMenuItemContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMetaMenuItem));
mFilterMenuBuilder.BuildIgnoredSubmenuItem();
mFilterMenuBuilder.BuildHiddenChangesSubmenuItem();
mMoveToChangelistMenuBuilder.BuildComponents();
}
static bool ProcessKeyActionForPendingChangesMenu(
PendingChangesMenuOperations operationToExecute,
IPendingChangesMenuOperations pendingChangesMenuOperations,
SelectedChangesGroupInfo info)
{
PendingChangesMenuOperations operations =
PendingChangesMenuUpdater.GetAvailableMenuOperations(info);
if (!operations.HasFlag(operationToExecute))
return false;
ProcessPendingChangesMenuOperation(
operationToExecute, pendingChangesMenuOperations);
return true;
}
static bool ProcessKeyActionForOpenMenu(
OpenMenuOperations openOperationToExecute,
IOpenMenuOperations openMenuOperations,
SelectedChangesGroupInfo info)
{
OpenMenuOperations openOperations =
GetOpenMenuOperations.ForPendingChangesView(info);
if (!openOperations.HasFlag(openOperationToExecute))
return false;
ProcessOpenMenuOperation(
openOperationToExecute, openMenuOperations);
return true;
}
static void ProcessPendingChangesMenuOperation(
PendingChangesMenuOperations operationToExecute,
IPendingChangesMenuOperations pendingChangesMenuOperations)
{
if (operationToExecute == PendingChangesMenuOperations.DiffWorkspaceContent)
{
pendingChangesMenuOperations.Diff();
return;
}
if (operationToExecute == PendingChangesMenuOperations.Delete)
{
pendingChangesMenuOperations.Delete();
return;
}
if (operationToExecute == PendingChangesMenuOperations.History)
{
pendingChangesMenuOperations.History();
return;
}
}
static void ProcessOpenMenuOperation(
OpenMenuOperations openOperationToExecute,
IOpenMenuOperations openMenuOperations)
{
if (openOperationToExecute == OpenMenuOperations.Open)
{
openMenuOperations.Open();
return;
}
}
static PendingChangesMenuOperations GetPendingChangesMenuOperation(Event e)
{
if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.D))
return PendingChangesMenuOperations.DiffWorkspaceContent;
if (Keyboard.IsKeyPressed(e, KeyCode.Delete))
return PendingChangesMenuOperations.Delete;
if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.H))
return PendingChangesMenuOperations.History;
return PendingChangesMenuOperations.None;
}
static OpenMenuOperations GetOpenMenuOperation(Event e)
{
if (Keyboard.IsShiftPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.O))
return OpenMenuOperations.Open;
return OpenMenuOperations.None;
}
GUIContent mNoActionMenuItemContent;
GUIContent mOpenSubmenuItemContent;
GUIContent mOpenMenuItemContent;
GUIContent mOpenWithMenuItemContent;
GUIContent mOpenInExplorerMenuItemContent;
GUIContent mOpenMetaMenuItemContent;
GUIContent mOpenMetaWithMenuItemContent;
GUIContent mOpenMetaInExplorerMenuItemContent;
GUIContent mDiffMenuItemContent;
GUIContent mDiffMetaMenuItemContent;
GUIContent mUndoChangesMenuItemContent;
GUIContent mCheckoutMenuItemContent;
GUIContent mDeleteMenuItemContent;
GUIContent mViewHistoryMenuItemContent;
GUIContent mViewHistoryMetaMenuItemContent;
readonly WorkspaceInfo mWkInfo;
readonly IMetaMenuOperations mMetaMenuOperations;
readonly IOpenMenuOperations mOpenMenuOperations;
readonly IChangelistMenuOperations mChangelistMenuOperations;
readonly IPendingChangesMenuOperations mPendingChangesMenuOperations;
readonly FilesFilterPatternsMenuBuilder mFilterMenuBuilder;
readonly MoveToChangelistMenuBuilder mMoveToChangelistMenuBuilder;
readonly bool mIsGluonMode;
}
}