using System.Globalization; using System.IO; using System.Threading.Tasks; using Needle.Cloud.Runtime; using UnityEditor; using UnityEngine; namespace Needle.Cloud.Editor { [CustomEditor(typeof(NeedleCloudAsset))] public class NeedleCloudAssetEditor : UnityEditor.Editor { [InitializeOnLoadMethod] private static async void Init() { while (true) { await Task.Delay(3_000); foreach (var inst in NeedleCloudAsset.instances) { if (inst.autoRefresh && inst.enabled) { inst.Load(); } } } } private SerializedProperty url; private SerializedProperty password; private void OnEnable() { url = serializedObject.FindProperty(nameof(NeedleCloudAsset.url)); password = serializedObject.FindProperty(nameof(NeedleCloudAsset.password)); var comp = target as NeedleCloudAsset; if (comp) { comp.Load(); } } public override void OnInspectorGUI() { var comp = target as NeedleCloudAsset; if (!comp) { return; } var hasUrl = !string.IsNullOrEmpty(this.url.stringValue) && this.url.stringValue.StartsWith("http"); { EditorGUILayout.HelpBox($"[Early Access] Needle Cloud Remote Assets\nUse Needle Cloud hosted assets directly in your Unity and Needle Engine projects", MessageType.None); } using(var change = new EditorGUI.ChangeCheckScope()) { using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.PropertyField(url, new GUIContent("URL")); using(new EditorGUI.DisabledScope(!hasUrl)) { if (GUILayout.Button("View", GUILayout.Width(40))) { Application.OpenURL($"https://cloud.needle.tools/view?file={this.url.stringValue}"); } } } if (!hasUrl) { EditorGUILayout.HelpBox("Enter a asset URL from Needle Cloud", MessageType.None); } else if(comp.isMissingPassword || !string.IsNullOrWhiteSpace(password.stringValue)) { var modifierPressed = Event.current.modifiers.HasFlag(EventModifiers.Alt); if (modifierPressed) { password.stringValue = EditorGUILayout.DelayedTextField(new GUIContent("Password"), password.stringValue); } else { // TODO: make this field delayed var newPasswordValue = EditorGUILayout.PasswordField(new GUIContent("Password"), password.stringValue); if (newPasswordValue != password.stringValue) { password.stringValue = newPasswordValue; } } } if (change.changed) { this.serializedObject.ApplyModifiedProperties(); } } if (comp) { if (comp.isMissingPassword) { EditorGUILayout.HelpBox("This asset is password protected. Please enter the password to access", MessageType.Error); } else { var localFileInfo = !string.IsNullOrWhiteSpace(comp.LocalPath) ? new FileInfo(comp.LocalPath) : null; if (localFileInfo != null && localFileInfo.Exists && hasUrl) { var filename = localFileInfo.Name; EditorGUILayout.LabelField("File Name", filename); var sizeInMB = (localFileInfo.Length / 1024f / 1024f).ToString("N2", CultureInfo.InvariantCulture); EditorGUILayout.LabelField("File Size", sizeInMB + " MB"); } } } if (GUILayout.Button("Open Needle Cloud")) { Application.OpenURL("https://cloud.needle.tools"); } } } }