Merge branch 'asset-options' of https://github.com/Tryibion/FlaxEngine into Tryibion-asset-options
This commit is contained in:
@@ -4,8 +4,11 @@ using System;
|
|||||||
using FlaxEditor.Content;
|
using FlaxEditor.Content;
|
||||||
using FlaxEditor.CustomEditors;
|
using FlaxEditor.CustomEditors;
|
||||||
using FlaxEditor.GUI;
|
using FlaxEditor.GUI;
|
||||||
|
using FlaxEditor.GUI.ContextMenu;
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
using FlaxEngine.GUI;
|
using FlaxEngine.GUI;
|
||||||
|
using FlaxEngine.Json;
|
||||||
|
using FlaxEngine.Utilities;
|
||||||
|
|
||||||
namespace FlaxEditor.Windows.Assets
|
namespace FlaxEditor.Windows.Assets
|
||||||
{
|
{
|
||||||
@@ -16,6 +19,53 @@ namespace FlaxEditor.Windows.Assets
|
|||||||
/// <seealso cref="FlaxEditor.Windows.Assets.AssetEditorWindow" />
|
/// <seealso cref="FlaxEditor.Windows.Assets.AssetEditorWindow" />
|
||||||
public sealed class JsonAssetWindow : AssetEditorWindowBase<JsonAsset>
|
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 CustomEditorPresenter _presenter;
|
||||||
private readonly ToolStripButton _saveButton;
|
private readonly ToolStripButton _saveButton;
|
||||||
private readonly ToolStripButton _undoButton;
|
private readonly ToolStripButton _undoButton;
|
||||||
@@ -24,6 +74,8 @@ namespace FlaxEditor.Windows.Assets
|
|||||||
private object _object;
|
private object _object;
|
||||||
private bool _isRegisteredForScriptsReload;
|
private bool _isRegisteredForScriptsReload;
|
||||||
private Label _typeText;
|
private Label _typeText;
|
||||||
|
private ToolStripButton _optionsButton;
|
||||||
|
private ContextMenu _optionsCM;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the instance of the Json asset object that is being edited.
|
/// Gets the instance of the Json asset object that is being edited.
|
||||||
@@ -139,6 +191,30 @@ namespace FlaxEditor.Windows.Assets
|
|||||||
|
|
||||||
if (_typeText != null)
|
if (_typeText != null)
|
||||||
_typeText.Dispose();
|
_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
|
var typeText = new ClickableLabel
|
||||||
{
|
{
|
||||||
Text = $"{Asset.DataTypeName}",
|
Text = $"{Asset.DataTypeName}",
|
||||||
@@ -147,9 +223,8 @@ namespace FlaxEditor.Windows.Assets
|
|||||||
AutoWidth = true,
|
AutoWidth = true,
|
||||||
Parent = this,
|
Parent = this,
|
||||||
};
|
};
|
||||||
typeText.LocalX += -(typeText.Width + 4);
|
typeText.LocalX += -(typeText.Width + _optionsButton.Width + 8);
|
||||||
typeText.LocalY += (_toolstrip.Height - typeText.Height) * 0.5f;
|
typeText.LocalY += (_toolstrip.Height - typeText.Height) * 0.5f;
|
||||||
typeText.RightClick = () => Clipboard.Text = Asset.DataTypeName;
|
|
||||||
_typeText = typeText;
|
_typeText = typeText;
|
||||||
|
|
||||||
_undo.Clear();
|
_undo.Clear();
|
||||||
@@ -165,6 +240,62 @@ namespace FlaxEditor.Windows.Assets
|
|||||||
base.OnAssetLoaded();
|
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 />
|
/// <inheritdoc />
|
||||||
protected override void OnAssetLoadFailed()
|
protected override void OnAssetLoadFailed()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user