Merge branch 'Tryibion-asset-options'
This commit is contained in:
@@ -4,8 +4,11 @@ using System;
|
||||
using FlaxEditor.Content;
|
||||
using FlaxEditor.CustomEditors;
|
||||
using FlaxEditor.GUI;
|
||||
using FlaxEditor.GUI.ContextMenu;
|
||||
using FlaxEngine;
|
||||
using FlaxEngine.GUI;
|
||||
using FlaxEngine.Json;
|
||||
using FlaxEngine.Utilities;
|
||||
|
||||
namespace FlaxEditor.Windows.Assets
|
||||
{
|
||||
@@ -16,6 +19,53 @@ namespace FlaxEditor.Windows.Assets
|
||||
/// <seealso cref="FlaxEditor.Windows.Assets.AssetEditorWindow" />
|
||||
public sealed class JsonAssetWindow : AssetEditorWindowBase<JsonAsset>
|
||||
{
|
||||
private class ObjectPasteUndo : IUndoAction
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public string ActionString => "Object Paste Undo";
|
||||
|
||||
private JsonAssetWindow _window;
|
||||
private string _oldObject;
|
||||
private string _newObject;
|
||||
|
||||
public ObjectPasteUndo(object oldObject, object newObject, JsonAssetWindow window)
|
||||
{
|
||||
_oldObject = JsonSerializer.Serialize(oldObject);
|
||||
_newObject = JsonSerializer.Serialize(newObject);
|
||||
_window = window;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Dispose()
|
||||
{
|
||||
_oldObject = null;
|
||||
_newObject = null;
|
||||
_window = null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Do()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_newObject))
|
||||
{
|
||||
_window._object = JsonSerializer.Deserialize(_newObject, TypeUtils.GetType(_window.Asset.DataTypeName).Type);
|
||||
_window.MarkAsEdited();
|
||||
_window._presenter.Select(_window._object);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Undo()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(_oldObject))
|
||||
{
|
||||
_window._object = JsonSerializer.Deserialize(_oldObject, TypeUtils.GetType(_window.Asset.DataTypeName).Type);
|
||||
_window.MarkAsEdited();
|
||||
_window._presenter.Select(_window._object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private readonly CustomEditorPresenter _presenter;
|
||||
private readonly ToolStripButton _saveButton;
|
||||
private readonly ToolStripButton _undoButton;
|
||||
@@ -24,6 +74,8 @@ namespace FlaxEditor.Windows.Assets
|
||||
private object _object;
|
||||
private bool _isRegisteredForScriptsReload;
|
||||
private Label _typeText;
|
||||
private ToolStripButton _optionsButton;
|
||||
private ContextMenu _optionsCM;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the instance of the Json asset object that is being edited.
|
||||
@@ -139,6 +191,30 @@ namespace FlaxEditor.Windows.Assets
|
||||
|
||||
if (_typeText != null)
|
||||
_typeText.Dispose();
|
||||
|
||||
// Get content item for options button
|
||||
object buttonTag = null;
|
||||
var allTypes = Editor.CodeEditing.All.Get();
|
||||
foreach (var type in allTypes)
|
||||
{
|
||||
if (type.TypeName.Equals(Asset.DataTypeName, StringComparison.Ordinal))
|
||||
{
|
||||
buttonTag = type.ContentItem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_optionsButton = new ToolStripButton(_toolstrip.ItemsHeight, ref Editor.Icons.Settings12)
|
||||
{
|
||||
AnchorPreset = AnchorPresets.TopRight,
|
||||
Tag = buttonTag,
|
||||
Size = new Float2(18),
|
||||
Parent = this,
|
||||
};
|
||||
_optionsButton.LocalX -= (_optionsButton.Width + 4);
|
||||
_optionsButton.LocalY += (_toolstrip.Height - _optionsButton.Height) * 0.5f;
|
||||
_optionsButton.Clicked += OpenOptionsContextMenu;
|
||||
|
||||
var typeText = new ClickableLabel
|
||||
{
|
||||
Text = $"{Asset.DataTypeName}",
|
||||
@@ -147,9 +223,8 @@ namespace FlaxEditor.Windows.Assets
|
||||
AutoWidth = true,
|
||||
Parent = this,
|
||||
};
|
||||
typeText.LocalX += -(typeText.Width + 4);
|
||||
typeText.LocalX += -(typeText.Width + _optionsButton.Width + 8);
|
||||
typeText.LocalY += (_toolstrip.Height - typeText.Height) * 0.5f;
|
||||
typeText.RightClick = () => Clipboard.Text = Asset.DataTypeName;
|
||||
_typeText = typeText;
|
||||
|
||||
_undo.Clear();
|
||||
@@ -165,6 +240,62 @@ namespace FlaxEditor.Windows.Assets
|
||||
base.OnAssetLoaded();
|
||||
}
|
||||
|
||||
private void OpenOptionsContextMenu()
|
||||
{
|
||||
if (_optionsCM != null && _optionsCM.ContainsFocus)
|
||||
return;
|
||||
|
||||
_optionsCM = new ContextMenu();
|
||||
_optionsCM.AddButton("Copy type name", () => Clipboard.Text = Asset.DataTypeName);
|
||||
_optionsCM.AddButton("Copy asset data", () => Clipboard.Text = Asset.Data);
|
||||
_optionsCM.AddButton("Paste asset data", () =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Clipboard.Text))
|
||||
{
|
||||
var dataTypeName = Asset.DataTypeName;
|
||||
var type = TypeUtils.GetType(dataTypeName);
|
||||
if (type != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var obj = Activator.CreateInstance(type.Type);
|
||||
var data = Clipboard.Text;
|
||||
JsonSerializer.Deserialize(obj, data);
|
||||
if (obj != null)
|
||||
{
|
||||
var undoAction = new ObjectPasteUndo(_object, obj, this);
|
||||
undoAction.Do();
|
||||
_undo.AddAction(undoAction);
|
||||
}
|
||||
else
|
||||
{
|
||||
Editor.LogWarning("Pasted data is not the correct data type or has incomplete data");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Editor.LogWarning($"Pasted data is not the correct data type or has incomplete data. Exception: {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
_optionsCM.Enabled = !string.IsNullOrEmpty(Clipboard.Text);
|
||||
_optionsCM.AddSeparator();
|
||||
if (_optionsButton.Tag is ContentItem item)
|
||||
{
|
||||
_optionsCM.AddButton("Edit asset code", () =>
|
||||
{
|
||||
Editor.Instance.ContentEditing.Open(item);
|
||||
});
|
||||
_optionsCM.AddButton("Show asset code item in content window", () =>
|
||||
{
|
||||
Editor.Instance.Windows.ContentWin.Select(item);
|
||||
});
|
||||
}
|
||||
|
||||
_optionsCM.Show(_optionsButton, _optionsButton.PointFromScreen(Input.MouseScreenPosition));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnAssetLoadFailed()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user