This commit is contained in:
2026-04-25 23:37:10 +02:00
commit 19d6bd934a
476 changed files with 9198 additions and 0 deletions
@@ -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