init
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using RPGCore.ObjectModules.EventObjectModule;
|
||||
using RPGCoreCommon.Helpers;
|
||||
using UnityEditor;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace RPGCore.Editor.Drawers.SceneModules.Event
|
||||
{
|
||||
[CustomEditor(typeof(EventModule))]
|
||||
public class EventModuleDrawer : UnityEditor.Editor
|
||||
{
|
||||
private class DrawerContext
|
||||
{
|
||||
public SerializedObject obj;
|
||||
public List<Type> events = new();
|
||||
public List<Type> preventableEvents = new();
|
||||
}
|
||||
|
||||
public override VisualElement CreateInspectorGUI()
|
||||
{
|
||||
var root = new VisualElement();
|
||||
|
||||
var property = serializedObject.GetIterator();
|
||||
|
||||
var enterChildren = true;
|
||||
while (property.NextVisible(enterChildren))
|
||||
{
|
||||
root.Add(new PropertyField(property) { enabledSelf = property.name != "m_Script" });
|
||||
enterChildren = false;
|
||||
}
|
||||
|
||||
root.Add(CreateEventList());
|
||||
return root;
|
||||
}
|
||||
|
||||
private VisualElement CreateEventList()
|
||||
{
|
||||
if (!EditorApplication.isPlaying)
|
||||
return new HelpBox("Subscribed events preview available only in play mode.", HelpBoxMessageType.Info);
|
||||
|
||||
var wrapper = new VisualElement();
|
||||
|
||||
var list1 = new Foldout();
|
||||
list1.text = "<b>Events</b> registered:";
|
||||
list1.style.marginLeft = 12;
|
||||
list1.Add(new Label("List empty."));
|
||||
wrapper.Add(list1);
|
||||
|
||||
var list2 = new Foldout();
|
||||
list2.text = "<b>Preventable Events (before)</b> registered:";
|
||||
list2.style.marginLeft = 12;
|
||||
list2.Add(new Label("List empty."));
|
||||
wrapper.Add(list2);
|
||||
|
||||
var list3 = new Foldout();
|
||||
list3.text = "<b>Preventable Events (after)</b> registered:";
|
||||
list3.style.marginLeft = 12;
|
||||
list3.Add(new Label("List empty."));
|
||||
wrapper.Add(list3);
|
||||
|
||||
var context = new DrawerContext{obj = serializedObject};
|
||||
wrapper.schedule.Execute(() => Refresh(context, list1, list2, list3)).Every(1000);
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
private void Refresh(DrawerContext context, VisualElement list, VisualElement beforeList, VisualElement afterList)
|
||||
{
|
||||
var eventModule = context.obj.targetObject as EventModule;
|
||||
RefreshList(context.events, eventModule.events, list);
|
||||
RefreshList(context.preventableEvents, eventModule.preventableEvents.ToDictionary(pair => pair.Key, pair => pair.Value[0]), beforeList);
|
||||
RefreshList(context.preventableEvents, eventModule.preventableEvents.ToDictionary(pair => pair.Key, pair => pair.Value[1]), afterList);
|
||||
|
||||
context.events = eventModule.events.Keys.ToList();
|
||||
context.preventableEvents = eventModule.preventableEvents.Keys.ToList();
|
||||
}
|
||||
|
||||
private void RefreshList(List<Type> before, Dictionary<Type, Delegate> after, VisualElement list)
|
||||
{
|
||||
var toRemove = before.Except(after.Keys).ToList();
|
||||
var toAdd = after.Keys.Except(before).ToList();
|
||||
|
||||
if (!toRemove.Any() && !toAdd.Any()) return;
|
||||
|
||||
list.Clear();
|
||||
after.DictSelect((type, action) =>
|
||||
{
|
||||
var row = new VisualElement();
|
||||
row.style.flexDirection = FlexDirection.Row;
|
||||
row.Add(new HelpBox { text = type.Name });
|
||||
|
||||
var callers = action?.GetInvocationList().Select(a => $"{a.Target.GetType().Name} : {a.Method.Name}").StringJoin("\n");
|
||||
if (string.IsNullOrEmpty(callers)) callers = "<u>No registered callers</u>";
|
||||
row.Add(string.IsNullOrEmpty(callers) ? new Label() : new HelpBox { text = callers });
|
||||
|
||||
return row;
|
||||
|
||||
}).ForEach(list.Add);
|
||||
|
||||
if (!after.Any()) list.Add(new Label("List empty."));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3379740cce21445b882d2175c6f699ce
|
||||
timeCreated: 1761919852
|
||||
Reference in New Issue
Block a user