using System; using UnityEditor; using UnityEngine; using Codice.Utils; using PlasticGui; using Unity.PlasticSCM.Editor.UI; namespace Unity.PlasticSCM.Editor.CloudDrive.Workspaces.Tree { [Flags] internal enum CloudWorkspacesTreeOperations : short { None = 0, OpenInExplorer = 1 << 0, OpenUnityCloud = 1 << 1, Delete = 1 << 2, Share = 1 << 3, UnshareWithMe = 1 << 4, } internal static class CloudWorkspacesTreeMenuUpdater { internal static CloudWorkspacesTreeOperations GetAvailableMenuOperations( int selectedItemsCount, bool isAnyNonRootItemSelected, bool isAnySharedDriveSelected) { CloudWorkspacesTreeOperations result = CloudWorkspacesTreeOperations.None; if (selectedItemsCount != 1) return result; result |= CloudWorkspacesTreeOperations.OpenInExplorer; if (isAnyNonRootItemSelected) return result; result |= CloudWorkspacesTreeOperations.Delete | CloudWorkspacesTreeOperations.OpenUnityCloud; if (isAnySharedDriveSelected) result |= CloudWorkspacesTreeOperations.UnshareWithMe; else result |= CloudWorkspacesTreeOperations.Share; return result; } } internal interface ICloudWorkspacesTreeMenuOperations { int GetSelectedItemsCount(); bool IsAnyNonRootItemSelected(); bool IsAnySharedDriveSelected(); void OpenInExplorer(); void OpenUnityCloud(); void Delete(); void Share(); void UnshareWithMe(); } internal class CloudWorkspacesTreeViewMenu { internal CloudWorkspacesTreeViewMenu(ICloudWorkspacesTreeMenuOperations operations) { mOperations = operations; BuildComponents(); } internal void Popup() { GenericMenu menu = new GenericMenu(); UpdateMenuItems(menu); menu.ShowAsContext(); } internal bool ProcessKeyActionIfNeeded(Event e) { CloudWorkspacesTreeOperations operationToExecute = GetMenuOperation(e); if (operationToExecute == CloudWorkspacesTreeOperations.None) return false; int selectedCount = mOperations.GetSelectedItemsCount(); bool isAnyNonRootItemSelected = mOperations.IsAnyNonRootItemSelected(); bool isAnySharedDriveSelected = mOperations.IsAnySharedDriveSelected(); CloudWorkspacesTreeOperations operations = CloudWorkspacesTreeMenuUpdater.GetAvailableMenuOperations( selectedCount, isAnyNonRootItemSelected, isAnySharedDriveSelected); if (!operations.HasFlag(operationToExecute)) return false; ProcessMenuOperation(operationToExecute); return true; } void OpenInExplorerMenuItem_Click() { mOperations.OpenInExplorer(); } void OpenUnityCloud_Click() { mOperations.OpenUnityCloud(); } void DeleteMenuItem_Click() { mOperations.Delete(); } void ShareMenuItem_Click() { mOperations.Share(); } void UnshareWithMeMenuItem_Click() { mOperations.UnshareWithMe(); } void UpdateMenuItems(GenericMenu menu) { int selectedCount = mOperations.GetSelectedItemsCount(); bool isAnyNonRootItemSelected = mOperations.IsAnyNonRootItemSelected(); bool isAnySharedDriveSelected = mOperations.IsAnySharedDriveSelected(); CloudWorkspacesTreeOperations operations = CloudWorkspacesTreeMenuUpdater.GetAvailableMenuOperations( selectedCount, isAnyNonRootItemSelected, isAnySharedDriveSelected); AddMenuItem( mOpenInExplorerMenuItemContent, menu, operations, CloudWorkspacesTreeOperations.OpenInExplorer, OpenInExplorerMenuItem_Click); AddMenuItem( mOpenUnityCloudMenuItemContent, menu, operations, CloudWorkspacesTreeOperations.OpenUnityCloud, OpenUnityCloud_Click); AddMenuItem( mDeleteMenuItemContent, menu, operations, CloudWorkspacesTreeOperations.Delete, DeleteMenuItem_Click); if (!operations.HasFlag(CloudWorkspacesTreeOperations.Share) && !operations.HasFlag(CloudWorkspacesTreeOperations.UnshareWithMe)) { return; } menu.AddSeparator(string.Empty); if (operations.HasFlag(CloudWorkspacesTreeOperations.Share)) { AddMenuItem( mShareMenuItemContent, menu, operations, CloudWorkspacesTreeOperations.Share, ShareMenuItem_Click); } if (operations.HasFlag(CloudWorkspacesTreeOperations.UnshareWithMe)) { AddMenuItem( mUnshareWithMeMenuItemContent, menu, operations, CloudWorkspacesTreeOperations.UnshareWithMe, UnshareWithMeMenuItem_Click); } } static void AddMenuItem( GUIContent menuItemContent, GenericMenu menu, CloudWorkspacesTreeOperations operations, CloudWorkspacesTreeOperations operationsToCheck, GenericMenu.MenuFunction menuFunction) { if (operations.HasFlag(operationsToCheck)) { menu.AddItem(menuItemContent, false, menuFunction); return; } menu.AddDisabledItem(menuItemContent); } void ProcessMenuOperation(CloudWorkspacesTreeOperations operationToExecute) { if (operationToExecute == CloudWorkspacesTreeOperations.OpenInExplorer) { OpenInExplorerMenuItem_Click(); return; } if (operationToExecute == CloudWorkspacesTreeOperations.Delete) { DeleteMenuItem_Click(); return; } } static CloudWorkspacesTreeOperations GetMenuOperation(Event e) { if (Keyboard.HasControlOrCommandModifier(e) && Keyboard.HasShiftModifier(e) && Keyboard.IsKeyPressed(e, KeyCode.S)) { return CloudWorkspacesTreeOperations.OpenInExplorer; } if (Keyboard.IsDeleteKeyPressed(e)) return CloudWorkspacesTreeOperations.Delete; return CloudWorkspacesTreeOperations.None; } void BuildComponents() { mOpenInExplorerMenuItemContent = new GUIContent( string.Format("{0} {1}", PlatformIdentifier.IsMac() ? PlasticLocalization.Name.ItemsMenuItemRevealInFinder.GetString() : PlasticLocalization.Name.ShowInExplorerMenuItem.GetString(), GetPlasticShortcut.ForShowInExplorer())); mOpenUnityCloudMenuItemContent = new GUIContent( PlasticLocalization.Name.OpenUnityDashboard.GetString()); mDeleteMenuItemContent = new GUIContent( string.Format("{0} {1}", PlasticLocalization.Name.ItemsMenuItemDelete.GetString(), GetPlasticShortcut.ForDelete())); mShareMenuItemContent = new GUIContent( PlasticLocalization.Name.ShareMenuItem.GetString()); mUnshareWithMeMenuItemContent = new GUIContent( PlasticLocalization.Name.UnshareWithMeMenuItem.GetString()); } GUIContent mOpenInExplorerMenuItemContent; GUIContent mOpenUnityCloudMenuItemContent; GUIContent mDeleteMenuItemContent; GUIContent mShareMenuItemContent; GUIContent mUnshareWithMeMenuItemContent; readonly ICloudWorkspacesTreeMenuOperations mOperations; } }