using System; using System.IO; using System.Threading; using System.Threading.Tasks; using UnityEditor; using UnityEngine; namespace Crowdin.Editor.SendToServer { using Plugin.Helpers; using Plugin.Helpers.PluginLocalization; using Plugin.Models; using Plugin.Operations; using Plugin.Views; public class SendScreenshotsToServerPopup : BasePopupEditor { [MenuItem("Tools/Crowdin/Take Screenshot", false, 104)] private static void OpenPopup() { InitPopup( LocalizationHelper.GetLocalStringByKey(LocalKeys.take_screenshot) ); } private void OnGUI() { if (!isBusy) { if (GUILayout.Button(LocalizationHelper.GetLocalStringByKey(LocalKeys.push_screenshots_btn_title))) { status.Clear(); if (!IsProjectSelected()) { return; } if (!Application.isPlaying) { EditorUtility.DisplayDialog( LocalizationHelper.GetLocalStringByKey(LocalKeys.alert_title), LocalizationHelper.GetLocalStringByKey(LocalKeys.alert_desc), LocalizationHelper.GetLocalStringByKey(LocalKeys.alert_btn) ); return; } RunOperation(CaptureAndUploadAsync, result => { }); } } OnGUIStatusLabel(); } private static async Task CaptureAndUploadAsync( IProgress progress, CancellationToken cancellationToken) { FolderHelper.TryCreateFolders(); var captureFinished = new TaskCompletionSource<(string Path, Texture2D Texture)>(); using CancellationTokenRegistration registration = cancellationToken.Register(() => captureFinished.TrySetCanceled(cancellationToken)); var capture = new TakeScreenshotForCrowdin(); void OnCaptured(string path, Texture2D texture) { capture.OnScreenshotTacked -= OnCaptured; // TakeScreenshotForCrowdin has no cancellation of its own, so the capture can still // finish after this operation was already cancelled (popup closed mid-capture). // Don't leave the screenshot file orphaned on disk in that case. if (!captureFinished.TrySetResult((path, texture)) && File.Exists(path)) { File.Delete(path); } } capture.OnScreenshotTacked += OnCaptured; capture.TakeScreenshot(cancellationToken); (string path, Texture2D texture) = await captureFinished.Task; ScreenshotHelper.AddOrUpdateScreenshotByTranslationKey(path, texture); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); return await UploadScreenshots.RunAsync(new ScreenshotsOptions(path), progress, cancellationToken); } } }