using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; namespace UnityEditor.U2D.Tooling.Analyzer { [Serializable] class AtlasSaveData : ISaveData { public long lastCaptureTime; public EditorAtlasAnalyzerCapture capture; } class SpriteAtlasDataSource : IReportDataSource { event Action m_OnDataSourceChange; event Action m_OnCaptureStart; event Action m_OnCaptureEnd; EditorAtlasAnalyzerCapture m_Capture = new (); EditorAtlasAnalyzer m_CurrentTask; Task m_ResultTask; long m_LastCaptureTime; public async void Capture(string [] assetSearchPath) { if (m_CurrentTask != null) return; m_OnCaptureStart?.Invoke(this); m_CurrentTask = new EditorAtlasAnalyzer(m_Capture); m_CurrentTask.assetSearchPath = assetSearchPath; m_ResultTask = m_CurrentTask.StartTask(); await m_ResultTask; m_LastCaptureTime = DateTime.UtcNow.ToFileTimeUtc(); m_Capture = m_ResultTask.Result; m_CurrentTask = null; m_OnCaptureEnd?.Invoke(this); m_OnDataSourceChange?.Invoke(this); } public void StopCapture() { m_CurrentTask?.CancelTask(); } public event Action onDataSourceChanged { add => m_OnDataSourceChange += value; remove => m_OnDataSourceChange -= value; } public event Action onCaptureStart { add => m_OnCaptureStart += value; remove => m_OnCaptureStart -= value; } public event Action onCaptureEnd { add => m_OnCaptureEnd += value; remove => m_OnCaptureEnd -= value; } public bool capturing => m_CurrentTask != null; public void Dispose() { m_CurrentTask?.CancelTask(); if(m_ResultTask != null) { var _ = m_ResultTask.Result; } m_OnDataSourceChange = null; m_OnCaptureStart = null; m_OnCaptureEnd = null; } public void Save(ISaveFile saveData) { AtlasSaveData atlasSaveData = new AtlasSaveData { capture = m_Capture, lastCaptureTime = m_LastCaptureTime }; saveData.AddSaveData(atlasSaveData); } public void Load(ISaveFile saveData) { List atlasSaveDataList = new List(); saveData.GetSaveData(atlasSaveDataList); if (atlasSaveDataList.Count > 0) { m_LastCaptureTime = atlasSaveDataList[0].lastCaptureTime; m_Capture = atlasSaveDataList[0].capture; } else { m_Capture = new EditorAtlasAnalyzerCapture(); m_LastCaptureTime = DateTime.UtcNow.ToFileTimeUtc(); } m_OnDataSourceChange?.Invoke(this); } public string name => "Sprite Atlas Report Data Source"; public long lastCaptureTime => m_LastCaptureTime; public virtual List data => m_Capture.atlasInfo; } }