Kursach_StealthAction/Assets/Tremble/Editor/Manual/Pages/Entities/BuilderPageBase.cs
2026-10-11 19:16:11 +03:00

94 lines
2.5 KiB
C#

//
// This file is part of the Tremble package by Tiny Goose.
// Copyright (c) 2024-2026 TinyGoose Ltd., All Rights Reserved.
//
using System;
using System.Diagnostics.Eventing.Reader;
using UnityEditor;
using UnityEngine;
namespace TinyGoose.Tremble.Editor
{
public abstract class BuilderPageBase<TDataClass> : ManualPageBase
where TDataClass : ScriptableObject
{
private TDataClass m_Sample;
private SerializedObject m_SampleSO;
private TrembleSyncSettings m_SyncSettings;
protected virtual bool HasInitialQuestions { get; } = false;
private bool m_DoneInitialQuestions = false;
protected TDataClass Sample => m_Sample;
protected SerializedObject SampleSO => m_SampleSO;
protected TrembleSyncSettings SyncSettings => m_SyncSettings;
protected override void OnInit()
{
m_Sample = ScriptableObject.CreateInstance<TDataClass>();
m_SampleSO = new(m_Sample);
m_SyncSettings = TrembleSyncSettings.Get();
}
protected sealed override void OnGUI()
{
if (HasInitialQuestions && !m_DoneInitialQuestions)
{
OnInitialQuestionsGUI();
return;
}
OnPrePropertiesGUI();
m_SampleSO.Update();
{
OnPropertiesGUI();
}
m_SampleSO.ApplyModifiedPropertiesWithoutUndo();
OnPostPropertiesGUI();
}
protected virtual void OnInitialQuestionsGUI() { }
protected virtual void OnPrePropertiesGUI() { }
protected virtual void OnPropertiesGUI() { }
protected virtual void OnPostPropertiesGUI() { }
protected void MarkInitialQuestionsDone() => m_DoneInitialQuestions = true;
protected bool RenderProperty(string propName, string title, string description, Type objectReferenceType = null, Action extraContent = null)
{
SerializedProperty prop = m_SampleSO.FindProperty(propName);
uint hash = prop.GetHashOfContent();
GUILayout.BeginVertical(EditorStyles.helpBox);
{
if (prop.propertyType == SerializedPropertyType.ObjectReference)
{
GUILayout.BeginHorizontal();
{
EditorGUILayout.PrefixLabel(new GUIContent(title));
prop.objectReferenceValue = EditorGUILayout.ObjectField(prop.objectReferenceValue, objectReferenceType ?? typeof(GameObject), allowSceneObjects: false);
}
GUILayout.EndVertical();
m_SampleSO.ApplyModifiedProperties();
}
else
{
EditorGUILayout.PropertyField(prop, new GUIContent(title));
}
GUILayout.Label(description, ManualStyles.Styles.Text);
extraContent?.Invoke();
}
GUILayout.EndVertical();
GUILayout.Space(5f);
return hash != prop.GetHashOfContent();
}
}
}