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 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; } }