unity/EditorPlugin/Profiler/SnapshotNavigation/ProfilerWindowFacade.cs (95 lines of code) (raw):

#nullable enable using System; using JetBrains.Diagnostics; using JetBrains.Rider.Unity.Editor.Profiler.Adapters.Interfaces; using JetBrains.Rider.Unity.Editor.Profiler.Adapters.ReflectionBasedAdapters.SnapshotNavigation; using UnityEditor; namespace JetBrains.Rider.Unity.Editor.Profiler.SnapshotNavigation { internal class ProfilerWindowFacade : IProfilerWindowSelectionDataProvider { private static readonly ILog ourLogger = Log.GetLog(nameof(ProfilerWindowFacade)); private readonly IProfilerAdaptersFactory myAdaptersFactory; private readonly ReflectionDataProvider myReflectionDataProvider; private OnTimeSampleSelected? myOnTimeSampleSelected; private IProfilerDriverAdapter? myProfilerDriverAdapter; private ITreeViewControllerAdapter? myTreeViewControllerAdapter; internal ProfilerWindowFacade(ReflectionDataProvider reflectionDataProvider, IProfilerAdaptersFactory adaptersFactory) { myReflectionDataProvider = reflectionDataProvider; myAdaptersFactory = adaptersFactory; IsSupportingCurrentUnityVersion = myReflectionDataProvider.IsCompatibleWithCurrentUnityVersion; } public bool IsInitialized { get; private set; } public bool IsSupportingCurrentUnityVersion { get; } public void Deinit(EditorWindow? profilerWindow, OnTimeSampleSelected? onTimeSampleSelected) { if (!IsSupportingCurrentUnityVersion) return; if (!IsInitialized) return; try { if (myTreeViewControllerAdapter != null) myTreeViewControllerAdapter.ItemDoubleClicked -= MyTreeViewControllerAdapterOnItemDoubleClicked; } catch (Exception e) { ourLogger.Verbose($"Failed to init ProfilerWindowFacade: {e}"); } finally { myOnTimeSampleSelected -= onTimeSampleSelected; IsInitialized = false; myTreeViewControllerAdapter = null; } } public void Init(EditorWindow profilerWindow, OnTimeSampleSelected? onTimeSampleSelected) { try { IsInitialized = InternalInit(profilerWindow); myOnTimeSampleSelected += onTimeSampleSelected; ourLogger.Verbose($"{nameof(ProfilerWindowFacade)} has been initialized."); } catch (Exception e) { ourLogger.Verbose($"Failed to init {nameof(ProfilerWindowFacade)}: {e}"); IsInitialized = false; } } private bool InternalInit(EditorWindow profilerWindow) { myProfilerDriverAdapter = new ProfilerDriverAdapter(myReflectionDataProvider.ProfilerDriverReflectionData); if (myProfilerDriverAdapter == null) { ourLogger.Verbose($"Failed to create {nameof(ProfilerDriverAdapter)} for {nameof(ProfilerWindowFacade)}"); return false; } myTreeViewControllerAdapter = myAdaptersFactory.TryCreateTreeViewControllerAdapter(profilerWindow); if (myTreeViewControllerAdapter == null) return false; myTreeViewControllerAdapter.ItemDoubleClicked += MyTreeViewControllerAdapterOnItemDoubleClicked; return true; } private void MyTreeViewControllerAdapterOnItemDoubleClicked(int obj) { if (myProfilerDriverAdapter == null) { ourLogger.Verbose( $"Can't handle double click on {nameof(ProfilerWindowFacade)}: {nameof(myProfilerDriverAdapter)} is null."); return; } try { var selectedPropertyPath = myProfilerDriverAdapter.GetSelectedPropertyPath() ?? string.Empty; myOnTimeSampleSelected?.Invoke(selectedPropertyPath, selectedPropertyPath); } catch (Exception e) { ourLogger.Verbose($"Failed to handle double click on {nameof(ProfilerWindowFacade)}: {e}"); } } } }