Editor/ChitChat/DialogueInspector.cs
using Sandbox;
using Editor;
using System;

namespace ChitChat.Editor;

public class DialogueInspector : Widget
{
	private SerializedObject _serializedObject;
	private Type _actionType;

	private readonly Layout _content;

	public DialogueInspector(Widget parent) : base(parent)
	{
		WindowTitle = "Dialogue Inspector";
		Name = "Dialogue Inspector";
		Size = new Vector2(ChitChatEditorWindow.WINDOW_SIZE_X * 0.5f, ChitChatEditorWindow.WINDOW_SIZE_Y * 0.5f);
		Layout = Layout.Column();
		SetWindowIcon("tune");

		ScrollArea area = new ScrollArea(this);
		area.HorizontalScrollbarMode = ScrollbarMode.Off;
		area.Canvas = new Widget(area);
		area.Canvas.Layout = Layout.Column();
		area.SetSizeMode(SizeMode.CanGrow, SizeMode.CanGrow);

		_content = area.Canvas.Layout;
		_content.Alignment = TextFlag.LeftTop;

		Layout.Add(area);
	}

	public void OnDialogueSelected(SerializedProperty prop)
	{
		DialogueActionBase baseAction = prop.GetValue<DialogueActionBase>();

		if (baseAction is SpeakAction speak)
		{
			_serializedObject = speak.GetSerialized();
			_actionType = typeof(SpeakAction);

			if (_serializedObject == null)
			{
				Log.Error("Could not convert DialogueAction to SerializedObject!");
				Clear();
				_serializedObject = null;
				return;
			}

			OpenAction();
			return;
		}
		else if (baseAction is EventAction)
		{
			return;
		}
		else if (baseAction is ChoiceAction choice)
		{
			_serializedObject = choice.GetSerialized();
			_actionType = typeof(ChoiceAction);

			if (_serializedObject == null)
			{
				Log.Error("Could not convert DialogueAction to SerializedObject!");
				Clear();
				_serializedObject = null;
				return;
			}

			OpenAction();
			return;
		}
		else
		{
			Log.Error("Dialogue Action not yet implemented in editor!");
			Clear();
			_serializedObject = null;
			return;
		}
	}

	/// <summary>
	/// Opens an action if a serialized object already exits in DialogueInspector
	/// </summary>
	public void OpenAction()
	{
		if(_actionType == null || _serializedObject == null)
			return;

		Clear();

		if (_actionType == typeof(SpeakAction))
		{
			_content.Add(new SpeakActionInspectorWidget(_serializedObject, this));
		}
		else if(_actionType == typeof(ChoiceAction))
		{
			_content.Add(new ChoiceActionInspectorWidget(_serializedObject, this));
		}
	}

	public void Clear()
	{
		_content.Clear(true);
		Update();
	}
}