diff --git a/Source/Editor/Surface/Elements/InputBox.cs b/Source/Editor/Surface/Elements/InputBox.cs index ea6e9e34a..c830cf499 100644 --- a/Source/Editor/Surface/Elements/InputBox.cs +++ b/Source/Editor/Surface/Elements/InputBox.cs @@ -9,6 +9,8 @@ using FlaxEditor.GUI.Input; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using Newtonsoft.Json; +using JsonSerializer = FlaxEngine.Json.JsonSerializer; namespace FlaxEditor.Surface.Elements { @@ -981,6 +983,121 @@ namespace FlaxEditor.Surface.Elements } } + /// + public override bool OnMouseUp(Vector2 location, MouseButton button) + { + if (button == MouseButton.Right && Archetype.ValueIndex != -1) + { + var menu = new FlaxEditor.GUI.ContextMenu.ContextMenu(); + menu.AddButton("Copy value", OnCopyValue); + var paste = menu.AddButton("Paste value", OnPasteValue); + try + { + GetClipboardValue(out _, false); + } + catch + { + paste.Enabled = false; + } + + menu.Show(this, location); + return true; + } + + return base.OnMouseUp(location, button); + } + + private bool GetClipboardValue(out object result, bool deserialize) + { + result = null; + var text = Clipboard.Text; + if (string.IsNullOrEmpty(text)) + return false; + + object obj; + var type = CurrentType; + if (new ScriptType(typeof(FlaxEngine.Object)).IsAssignableFrom(type)) + { + // Object reference + if (text.Length != 32) + return false; + JsonSerializer.ParseID(text, out var id); + obj = FlaxEngine.Object.Find(ref id); + } + else + { + // Default + obj = JsonConvert.DeserializeObject(text, TypeUtils.GetType(type), JsonSerializer.Settings); + } + + if (obj == null || type.IsInstanceOfType(obj)) + { + result = obj; + return true; + } + + return false; + } + + private void OnCopyValue() + { + var value = ParentNode.Values[Archetype.ValueIndex]; + + try + { + string text; + if (value == null) + { + // Missing value + var type = CurrentType; + if (type.Type == typeof(bool)) + text = "false"; + else if (type.Type == typeof(byte) || type.Type == typeof(sbyte) || type.Type == typeof(char) || type.Type == typeof(short) || type.Type == typeof(ushort) || type.Type == typeof(int) || type.Type == typeof(uint) || type.Type == typeof(long) || type.Type == typeof(ulong)) + text = "0"; + else if (type.Type == typeof(float) || type.Type == typeof(double)) + text = "0.0"; + else if (type.Type == typeof(Vector2) || type.Type == typeof(Vector3) || type.Type == typeof(Vector4) || type.Type == typeof(Color)) + text = JsonSerializer.Serialize(TypeUtils.GetDefaultValue(type)); + else if (type.Type == typeof(string)) + text = ""; + else + text = "null"; + } + else if (value is FlaxEngine.Object asObject) + { + // Object reference + text = JsonSerializer.GetStringID(asObject); + } + else + { + // Default + text = JsonSerializer.Serialize(value); + } + Clipboard.Text = text; + } + catch (Exception ex) + { + Editor.LogWarning(ex); + Editor.LogError("Cannot copy property. See log for more info."); + } + } + + private void OnPasteValue() + { + try + { + if (GetClipboardValue(out var value, true)) + { + ParentNode.SetValue(Archetype.ValueIndex, value); + } + } + catch (Exception ex) + { + Editor.LogWarning(ex); + Editor.LogError("Cannot paste property value. See log for more info."); + } + } + /// /// Creates the default value editor control. ///