using System; using UnityEditor; using UnityEngine; using Codice.CM.Common; using Unity.PlasticSCM.Editor.AssetMenu; using Unity.PlasticSCM.Editor.AssetsOverlays; using Unity.PlasticSCM.Editor.AssetsOverlays.Cache; using Unity.PlasticSCM.Editor.AssetUtils.Processor; using Unity.PlasticSCM.Editor.CollabMigration; using Unity.PlasticSCM.Editor.Inspector; using Unity.PlasticSCM.Editor.ProjectDownloader; using Unity.PlasticSCM.Editor.SceneView; using Unity.PlasticSCM.Editor.UI; namespace Unity.PlasticSCM.Editor { /// /// The Plastic SCM plugin for Unity editor. /// [InitializeOnLoad] public static class PlasticPlugin { /// /// Invoked when notification status changed. /// public static event Action OnNotificationUpdated = delegate { }; internal static IAssetStatusCache AssetStatusCache { get { return sAssetStatusCache; } } internal static WorkspaceOperationsMonitor WorkspaceOperationsMonitor { get { return sWorkspaceOperationsMonitor; } } static PlasticPlugin() { CloudProjectDownloader.Initialize(); MigrateCollabProject.Initialize(); EditorDispatcher.Initialize(); CooldownWindowDelayer cooldownInitializeAction = new CooldownWindowDelayer( Enable, UnityConstants.PLUGIN_DELAYED_INITIALIZE_INTERVAL); cooldownInitializeAction.Ping(); } /// /// Get the plugin icon. /// public static Texture GetPluginIcon() { return PlasticNotification.GetIcon(sNotificationStatus); } internal static void Enable() { if (sIsEnabled) return; sIsEnabled = true; PlasticApp.InitializeIfNeeded(); if (!FindWorkspace.HasWorkspace(Application.dataPath)) return; EnableForWorkspace(); } internal static void EnableForWorkspace() { if (sIsEnabledForWorkspace) return; WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath( Application.dataPath, PlasticApp.PlasticAPI); if (wkInfo == null) return; sIsEnabledForWorkspace = true; PlasticApp.SetWorkspace(wkInfo); bool isGluonMode = PlasticApp.PlasticAPI.IsGluonWorkspace(wkInfo); sAssetStatusCache = new AssetStatusCache(wkInfo, isGluonMode); PlasticAssetsProcessor plasticAssetsProcessor = new PlasticAssetsProcessor(); sWorkspaceOperationsMonitor = BuildWorkspaceOperationsMonitor( plasticAssetsProcessor, isGluonMode); sWorkspaceOperationsMonitor.Start(); AssetsProcessors.Enable(plasticAssetsProcessor, sAssetStatusCache); AssetMenuItems.Enable(); DrawAssetOverlay.Enable(); DrawInspectorOperations.Enable(); DrawSceneOperations.Enable(sWorkspaceOperationsMonitor); } internal static void Disable() { try { PlasticApp.Dispose(); if (!sIsEnabledForWorkspace) return; sWorkspaceOperationsMonitor.Stop(); AssetsProcessors.Disable(); AssetMenuItems.Disable(); DrawAssetOverlay.Disable(); DrawInspectorOperations.Disable(); DrawSceneOperations.Disable(); } finally { sIsEnabled = false; sIsEnabledForWorkspace = false; } } internal static void SetNotificationStatus( PlasticWindow plasticWindow, PlasticNotification.Status status) { sNotificationStatus = status; plasticWindow.SetupWindowTitle(status); if (OnNotificationUpdated != null) OnNotificationUpdated.Invoke(); } static WorkspaceOperationsMonitor BuildWorkspaceOperationsMonitor( PlasticAssetsProcessor plasticAssetsProcessor, bool isGluonMode) { WorkspaceOperationsMonitor result = new WorkspaceOperationsMonitor( PlasticApp.PlasticAPI, plasticAssetsProcessor, isGluonMode); plasticAssetsProcessor.SetWorkspaceOperationsMonitor(result); return result; } static PlasticNotification.Status sNotificationStatus; static AssetStatusCache sAssetStatusCache; static WorkspaceOperationsMonitor sWorkspaceOperationsMonitor; static bool sIsEnabled; static bool sIsEnabledForWorkspace; } }