501 lines
17 KiB
C#
501 lines
17 KiB
C#
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
using PlasticGui;
|
|
using PlasticGui.WorkspaceWindow.Merge;
|
|
using Unity.PlasticSCM.Editor.UI;
|
|
|
|
namespace Unity.PlasticSCM.Editor.Views.Merge.Developer
|
|
{
|
|
internal class MergeViewFileConflictMenu
|
|
{
|
|
internal interface IMetaMenuOperations
|
|
{
|
|
void DiffSourceWithAncestor();
|
|
void DiffDestinationWithAncestor();
|
|
void DiffSourceWithDestination();
|
|
void ShowHistory();
|
|
bool SelectionHasMeta();
|
|
}
|
|
|
|
internal GenericMenu Menu { get { return mMenu; } }
|
|
|
|
internal MergeViewFileConflictMenu(
|
|
IMergeViewMenuOperations mergeViewMenuOperations,
|
|
IMetaMenuOperations mergeMetaMenuOperations,
|
|
bool isIncomingMerge,
|
|
bool isMergeTo,
|
|
bool isShelvesetMerge = false)
|
|
{
|
|
mMergeViewMenuOperations = mergeViewMenuOperations;
|
|
mMergeMetaMenuOperations = mergeMetaMenuOperations;
|
|
mIsShelvesetMerge = isShelvesetMerge;
|
|
|
|
BuildComponents(isIncomingMerge, isMergeTo);
|
|
}
|
|
|
|
internal void Popup()
|
|
{
|
|
mMenu = new GenericMenu();
|
|
|
|
UpdateMenuItems(mMenu);
|
|
|
|
mMenu.ShowAsContext();
|
|
}
|
|
|
|
internal bool ProcessKeyActionIfNeeded(Event e)
|
|
{
|
|
MergeMenuOperations operationToExecute = GetMenuOperations(e);
|
|
|
|
if (operationToExecute == MergeMenuOperations.None)
|
|
return false;
|
|
|
|
SelectedMergeChangesGroupInfo info =
|
|
mMergeViewMenuOperations.GetSelectedMergeChangesGroupInfo();
|
|
MergeMenuOperations operations =
|
|
UpdateMergeMenu.GetAvailableMenuOperations(info);
|
|
|
|
if (!operations.HasFlag(operationToExecute))
|
|
return false;
|
|
|
|
ProcessMenuOperation(operationToExecute, mMergeViewMenuOperations);
|
|
return true;
|
|
}
|
|
|
|
void MergeSelectedFilesMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.MergeContributors();
|
|
}
|
|
|
|
void MergeKeepingSourceChangesMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.MergeKeepingSourceChanges();
|
|
}
|
|
|
|
void MergeKeepingWorkspaceChangesMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.MergeKeepingWorkspaceChanges();
|
|
}
|
|
|
|
void DiffSourceWithDestinationMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.DiffSourceWithDestination();
|
|
}
|
|
|
|
void DiffDestinationWithAncestorMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.DiffDestinationWithAncestor();
|
|
}
|
|
|
|
void DiffSourceWithAncestorMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.DiffSourceWithAncestor();
|
|
}
|
|
|
|
void DiffMetaSourceWithDestinationMenuItem_Click()
|
|
{
|
|
mMergeMetaMenuOperations.DiffSourceWithDestination();
|
|
}
|
|
|
|
void DiffMetaDestinationWithAncestorMenuItem_Click()
|
|
{
|
|
mMergeMetaMenuOperations.DiffDestinationWithAncestor();
|
|
}
|
|
|
|
void DiffMetaSourceWithAncestorMenuItem_Click()
|
|
{
|
|
mMergeMetaMenuOperations.DiffSourceWithAncestor();
|
|
}
|
|
|
|
void HistoryMetaMenuItem_Click()
|
|
{
|
|
mMergeMetaMenuOperations.ShowHistory();
|
|
}
|
|
|
|
void CopyFilePathMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.CopyFilePath(relativePath: false);
|
|
}
|
|
|
|
void CopyRelativeFilePathMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.CopyFilePath(relativePath: true);
|
|
}
|
|
|
|
void HistoryMenuItem_Click()
|
|
{
|
|
mMergeViewMenuOperations.ShowHistory();
|
|
}
|
|
|
|
void UpdateMenuItems(GenericMenu menu)
|
|
{
|
|
SelectedMergeChangesGroupInfo info =
|
|
mMergeViewMenuOperations.GetSelectedMergeChangesGroupInfo();
|
|
MergeMenuOperations operations =
|
|
UpdateMergeMenu.GetAvailableMenuOperations(info);
|
|
|
|
if (operations == MergeMenuOperations.None)
|
|
{
|
|
menu.AddDisabledItem(GetNoActionMenuItemContent());
|
|
return;
|
|
}
|
|
|
|
if (!mIsShelvesetMerge)
|
|
{
|
|
AddMergeActions(menu, operations);
|
|
|
|
menu.AddSeparator(string.Empty);
|
|
}
|
|
|
|
AddDiffActions(menu, info, operations);
|
|
|
|
if (mMergeMetaMenuOperations.SelectionHasMeta())
|
|
{
|
|
menu.AddSeparator(string.Empty);
|
|
|
|
AddMetaActions(menu, info, operations);
|
|
}
|
|
|
|
menu.AddSeparator(string.Empty);
|
|
|
|
AddCopyFilePathActions(menu, operations);
|
|
|
|
menu.AddSeparator(string.Empty);
|
|
|
|
AddHistoryMenuItem(mHistoryMenuItemContent, menu, operations, HistoryMenuItem_Click);
|
|
}
|
|
|
|
void AddMergeActions(
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations)
|
|
{
|
|
AddMergeSelectedFilesMenuItem(
|
|
mMergeSelectedFilesMenuItemContent, menu, operations, MergeSelectedFilesMenuItem_Click);
|
|
|
|
AddMergeKeepingSourceChangesMenuItem(
|
|
mMergeKeepingSourceChangesMenuItemContent, menu, operations, MergeKeepingSourceChangesMenuItem_Click);
|
|
|
|
AddMergeKeepingWorkspaceChangesMenuItem(
|
|
mMergeKeepingWorkspaceChangesMenuItemContent, menu, operations, MergeKeepingWorkspaceChangesMenuItem_Click);
|
|
}
|
|
|
|
void AddDiffActions(
|
|
GenericMenu menu,
|
|
SelectedMergeChangesGroupInfo info,
|
|
MergeMenuOperations operations)
|
|
{
|
|
mDiffSourceWithDestinationMenuItemContent.text =
|
|
UnityMenuItem.EscapedText(info.DiffSourceWithDestinationMenuItemText);
|
|
AddDiffSourceWithDestinationMenuItem(
|
|
mDiffSourceWithDestinationMenuItemContent, menu, operations, DiffSourceWithDestinationMenuItem_Click);
|
|
|
|
AddDiffDestinationWithAncestorMenuItem(
|
|
mDiffDestinationWithAncestorMenuItemContent, menu, operations, DiffDestinationWithAncestorMenuItem_Click);
|
|
|
|
AddDiffSourceWithAncestorMenuItem(
|
|
mDiffSourceWithAncestorMenuItem, menu, operations, DiffSourceWithAncestorMenuItem_Click);
|
|
}
|
|
|
|
void AddMetaActions(
|
|
GenericMenu menu,
|
|
SelectedMergeChangesGroupInfo info,
|
|
MergeMenuOperations operations)
|
|
{
|
|
mDiffMetaSourceWithDestinationMenuItemContent.text = string.Format(
|
|
"{0}/{1}",
|
|
MetaPath.META_EXTENSION,
|
|
UnityMenuItem.EscapedText(info.DiffSourceWithDestinationMenuItemText));
|
|
AddDiffSourceWithDestinationMenuItem(
|
|
mDiffMetaSourceWithDestinationMenuItemContent, menu, operations, DiffMetaSourceWithDestinationMenuItem_Click);
|
|
|
|
AddDiffDestinationWithAncestorMenuItem(
|
|
mDiffMetaDestinationWithAncestorMenuItemContent, menu, operations, DiffMetaDestinationWithAncestorMenuItem_Click);
|
|
|
|
AddDiffSourceWithAncestorMenuItem(
|
|
mDiffMetaSourceWithAncestorMenuItemContent, menu, operations, DiffMetaSourceWithAncestorMenuItem_Click);
|
|
|
|
AddHistoryMenuItem(
|
|
mHistoryMetaMenuItemContent, menu, operations, HistoryMetaMenuItem_Click);
|
|
}
|
|
|
|
void AddCopyFilePathActions(
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations)
|
|
{
|
|
AddCopyFilePathMenuItem(
|
|
mCopyFilePathMenuItemContent, menu, operations, CopyFilePathMenuItem_Click);
|
|
|
|
AddCopyFilePathMenuItem(
|
|
mCopyRelativeFilePathMenuItemContent, menu, operations, CopyRelativeFilePathMenuItem_Click);
|
|
}
|
|
|
|
GUIContent GetNoActionMenuItemContent()
|
|
{
|
|
if (mNoActionMenuItemContent == null)
|
|
{
|
|
mNoActionMenuItemContent = new GUIContent(
|
|
PlasticLocalization.GetString(
|
|
PlasticLocalization.Name.NoActionMenuItem));
|
|
}
|
|
|
|
return mNoActionMenuItemContent;
|
|
}
|
|
|
|
static void AddMergeSelectedFilesMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.MergeContributors))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddMergeKeepingSourceChangesMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.MergeKeepingSourceChanges))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddMergeKeepingWorkspaceChangesMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.MergeKeepingWorkspaceChanges))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddDiffSourceWithDestinationMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.DiffSourceWithDestination))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddDiffDestinationWithAncestorMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (!operations.HasFlag(MergeMenuOperations.DiffDestinationWithAncestor))
|
|
return;
|
|
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
}
|
|
|
|
static void AddDiffSourceWithAncestorMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.DiffSourceWithAncestor))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddCopyFilePathMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.CopyFilePath))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static void AddHistoryMenuItem(
|
|
GUIContent menuItemContent,
|
|
GenericMenu menu,
|
|
MergeMenuOperations operations,
|
|
GenericMenu.MenuFunction menuFunction)
|
|
{
|
|
if (operations.HasFlag(MergeMenuOperations.ShowHistory))
|
|
{
|
|
menu.AddItem(
|
|
menuItemContent,
|
|
false,
|
|
menuFunction);
|
|
|
|
return;
|
|
}
|
|
|
|
menu.AddDisabledItem(menuItemContent);
|
|
}
|
|
|
|
static MergeMenuOperations GetMenuOperations(Event e)
|
|
{
|
|
if (Keyboard.IsControlOrCommandKeyPressed(e) &&
|
|
Keyboard.IsKeyPressed(e, KeyCode.H))
|
|
return MergeMenuOperations.ShowHistory;
|
|
|
|
return MergeMenuOperations.None;
|
|
}
|
|
|
|
static void ProcessMenuOperation(
|
|
MergeMenuOperations operationToExecute,
|
|
IMergeViewMenuOperations mergeViewMenuOperations)
|
|
{
|
|
if (operationToExecute == MergeMenuOperations.ShowHistory)
|
|
{
|
|
mergeViewMenuOperations.ShowHistory();
|
|
return;
|
|
}
|
|
}
|
|
|
|
void BuildComponents(
|
|
bool isIncomingMerge,
|
|
bool isMergeTo)
|
|
{
|
|
mMergeSelectedFilesMenuItemContent = new GUIContent(
|
|
PlasticLocalization.GetString(PlasticLocalization.
|
|
Name.MergeSelectedFiles));
|
|
|
|
mMergeKeepingSourceChangesMenuItemContent = new GUIContent(
|
|
UnityMenuItem.EscapedText(
|
|
MergeViewTexts.GetMergeKeepingSourceChangesMenuItemText(
|
|
isIncomingMerge, isMergeTo)));
|
|
|
|
mMergeKeepingWorkspaceChangesMenuItemContent = new GUIContent(
|
|
UnityMenuItem.EscapedText(
|
|
MergeViewTexts.GetMergeKeepingWorkspaceChangesMenuItemText(
|
|
isIncomingMerge, isMergeTo)));
|
|
|
|
string diffSourceWithAncestorText = UnityMenuItem.EscapedText(
|
|
MergeViewTexts.GetDiffSourceWithAncestorMenuItemText(isIncomingMerge));
|
|
|
|
mDiffSourceWithDestinationMenuItemContent = new GUIContent(string.Empty);
|
|
|
|
mDiffDestinationWithAncestorMenuItemContent = new GUIContent(
|
|
UnityMenuItem.EscapedText(
|
|
PlasticLocalization.GetString(
|
|
PlasticLocalization.Name.DiffDestinationWithAncestor)));
|
|
|
|
mDiffSourceWithAncestorMenuItem = new GUIContent(
|
|
diffSourceWithAncestorText);
|
|
|
|
mDiffMetaSourceWithDestinationMenuItemContent = new GUIContent(string.Empty);
|
|
mDiffMetaDestinationWithAncestorMenuItemContent = new GUIContent(
|
|
string.Format(
|
|
"{0}/{1}",
|
|
MetaPath.META_EXTENSION,
|
|
UnityMenuItem.EscapedText(
|
|
PlasticLocalization.GetString(
|
|
PlasticLocalization.Name.DiffDestinationWithAncestor))));
|
|
|
|
mDiffMetaSourceWithAncestorMenuItemContent = new GUIContent(
|
|
string.Format(
|
|
"{0}/{1}",
|
|
MetaPath.META_EXTENSION,
|
|
diffSourceWithAncestorText));
|
|
|
|
mHistoryMetaMenuItemContent = new GUIContent(
|
|
string.Format(
|
|
"{0}/{1}",
|
|
MetaPath.META_EXTENSION,
|
|
PlasticLocalization.Name.ItemsMenuItemHistory.GetString()));
|
|
|
|
mCopyFilePathMenuItemContent = new GUIContent(PlasticLocalization.Name.CopyFilePathMenuItem.GetString());
|
|
|
|
mCopyRelativeFilePathMenuItemContent =
|
|
new GUIContent(PlasticLocalization.Name.CopyRelativeFilePathMenuItem.GetString());
|
|
|
|
mHistoryMenuItemContent = new GUIContent(string.Format("{0} {1}",
|
|
PlasticLocalization.Name.ItemsMenuItemHistory.GetString(),
|
|
GetPlasticShortcut.ForHistory()));
|
|
}
|
|
|
|
GenericMenu mMenu;
|
|
|
|
GUIContent mNoActionMenuItemContent;
|
|
|
|
GUIContent mMergeSelectedFilesMenuItemContent;
|
|
GUIContent mMergeKeepingSourceChangesMenuItemContent;
|
|
GUIContent mMergeKeepingWorkspaceChangesMenuItemContent;
|
|
|
|
GUIContent mDiffSourceWithDestinationMenuItemContent;
|
|
GUIContent mDiffDestinationWithAncestorMenuItemContent;
|
|
GUIContent mDiffSourceWithAncestorMenuItem;
|
|
|
|
GUIContent mDiffMetaSourceWithDestinationMenuItemContent;
|
|
GUIContent mDiffMetaDestinationWithAncestorMenuItemContent;
|
|
GUIContent mDiffMetaSourceWithAncestorMenuItemContent;
|
|
GUIContent mHistoryMetaMenuItemContent;
|
|
|
|
GUIContent mCopyFilePathMenuItemContent;
|
|
GUIContent mCopyRelativeFilePathMenuItemContent;
|
|
GUIContent mHistoryMenuItemContent;
|
|
|
|
readonly IMergeViewMenuOperations mMergeViewMenuOperations;
|
|
readonly IMetaMenuOperations mMergeMetaMenuOperations;
|
|
|
|
readonly bool mIsShelvesetMerge;
|
|
}
|
|
}
|