Editor/Attack/InspectPanel.cs
using System;
using Editor;
using MANIFOLD.BHLib.Events;
using Sandbox;

namespace MANIFOLD.BHLib.Editor {
    public class InspectPanel : Widget {
        private readonly AttackEditor editor;
        private ControlSheet sheet;
        private object valueCache;

        public InspectPanel(AttackEditor editor, Widget parent = null) : base(parent) {
            this.editor = editor;

            MinimumWidth = 400;

            Layout = Layout.Column();
            Layout.Margin = 8;

            sheet = new ControlSheet();

            var scroll = Layout.Add(new ScrollArea(this));
            scroll.HorizontalScrollbarMode = ScrollbarMode.Off;
            scroll.Canvas = new Widget(scroll);
            scroll.Canvas.Layout = Layout.Column();
            scroll.Canvas.Layout.Add(sheet);
            scroll.Canvas.Layout.AddStretchCell();
        }

        [EditorEvent.Hotload]
        public void RebuildSheet() {
            sheet.Clear(true);
            if (editor.SelectedEvent != null) {
                var obj = editor.SelectedEvent.GetSerialized();
                obj.OnPropertyChanged += OnPropertyChanged;
                obj.OnPropertyStartEdit += OnPropertyStartChange;
                obj.OnPropertyFinishEdit += OnPropertyFinishedChange;
                sheet.AddObject(obj);
            }
        }

        private void OnPropertyChanged(SerializedProperty property) {
            editor.SelectedEventModified();
        }

        private void OnPropertyStartChange(SerializedProperty property) {
            valueCache = property.GetValue<object>();
        }
        
        private void OnPropertyFinishedChange(SerializedProperty property) {
            if (property.GetValue<object>() != valueCache) {
                editor.AttackModified();
            }
        }
    }
}