Files
NovaFree/Scripts/Public/Components/TextBlock.cs
2025-08-02 20:11:41 +08:00

454 lines
16 KiB
C#

// Copyright (c) Supernova Technologies LLC
using Nova.Compat;
using Nova.InternalNamespace_25;
using Nova.InternalNamespace_0.InternalNamespace_12;
using Nova.InternalNamespace_0.InternalNamespace_10;
using Nova.InternalNamespace_0.InternalNamespace_5.InternalNamespace_6;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using TMPro;
using Unity.Mathematics;
using UnityEngine;
namespace Nova
{
/// <summary>
/// A <see cref="UIBlock"/> for rendering text
/// </summary>
[ExecuteAlways, RequireComponent(typeof(TMP.TextMeshProTextBlock))]
[AddComponentMenu("Nova/TextBlock")]
[HelpURL("https://novaui.io/manual/TextBlock.html")]
public sealed class TextBlock : UIBlock, InternalType_6
{
#region Public
/// <summary>
/// A shorthand for setting TMP.text
/// </summary>
public string Text
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => TMP.text;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
set
{
TMP.text = value;
}
}
/// <summary>
/// The TextMeshPro component attached to <c>this.gameObject</c>, used to generate the underlying text mesh.
/// </summary>
public TextMeshPro TMP
{
get
{
if (InternalField_3314 == null)
{
InternalField_3314 = GetComponent<TextMeshPro>();
}
return InternalField_3314;
}
}
/// <summary>
/// The primary color of the text. Writes directly to <see cref="TMP"/>.Color.
/// </summary>
public override Color Color
{
get => TMP.color;
set
{
TMP.color = value;
}
}
/// <summary>
/// Configures the render order of this UIBlock within a <see cref="SortGroup"/>.
/// </summary>
/// <remarks><see cref="UIBlock"/>s with a higher ZIndex are rendered on top of <see cref="UIBlock"/>s with a lower ZIndex.</remarks>
public short ZIndex
{
get => visibility.ZIndex;
set
{
visibility.ZIndex = value;
InternalType_274.InternalProperty_190.InternalMethod_3031(this);
}
}
/// <summary>
/// The offset that is applied whenever text is being hugged (i.e. <see cref="UIBlock.AutoSize">AutoSize</see> is set to <see cref="AutoSize.Shrink">Shrink</see> on <c>x</c> or <c>y</c>).
/// If text is not being hugged, this will be <see cref="Vector2.zero"/>.
/// </summary>
public Vector2 VisualOffset
{
get
{
if (!InternalProperty_27.InternalProperty_197 || !InternalProperty_436)
{
return Vector2.zero;
}
ref InternalNamespace_0.InternalType_79 InternalVar_1 = ref InternalType_274.InternalProperty_190.InternalMethod_1265(this, -1);
var InternalVar_2 = AutoSize.XY;
bool2 InternalVar_3 = new bool2(InternalVar_2.X == Nova.AutoSize.Shrink, InternalVar_2.Y == Nova.AutoSize.Shrink);
return InternalVar_1.InternalMethod_2606(InternalVar_3);
}
}
#endregion
#region Internal
[NonSerialized, HideInInspector]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private InternalType_670 InternalField_51 = InternalType_670.InternalField_2828;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
ref InternalNamespace_0.InternalType_79 InternalType_256<InternalNamespace_0.InternalType_79>.InternalProperty_270
{
get => throw new NotImplementedException("Shouldn't call this on text blocks");
}
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
internal bool2 InternalProperty_35
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => (AutoSize.XY == Nova.AutoSize.Shrink).InternalMethod_3297();
}
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private bool InternalProperty_436
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => math.any(InternalProperty_35);
}
[NonSerialized]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private bool InternalField_3350 = false;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private bool InternalProperty_764
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => InternalField_3350;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
set
{
InternalField_3350 = value;
}
}
private bool InternalMethod_2726(InternalType_670 InternalParameter_3092)
{
if (InternalField_51 == InternalParameter_3092)
{
return false;
}
InternalField_51 = InternalParameter_3092;
TMP.margin = InternalParameter_3092.InternalField_2829;
return true;
}
void InternalType_6.InternalMethod_2724(ref InternalType_670 InternalParameter_3091)
{
InternalProperty_764 = true;
if (!InternalMethod_2726(InternalParameter_3091))
{
return;
}
TMP.Rebuild(UnityEngine.UI.CanvasUpdate.PreRender);
InternalMethod_2723();
}
private void InternalMethod_2723()
{
TMP_UpdateManager.UnRegisterTextElementForRebuild(TMP);
TMP.isTextObjectScaleStatic = TMP.isTextObjectScaleStatic;
}
private void InternalMethod_128(TMP_TextInfo InternalParameter_80)
{
if (!InternalProperty_27.InternalProperty_197)
{
return;
}
#pragma warning disable CS0162
if (NovaApplication.ConstIsEditor && TMP.textInfo.characterCount == 0 && !string.IsNullOrWhiteSpace(TMP.text))
{
this.InternalMethod_1959();
}
#pragma warning restore CS0162
ref InternalNamespace_0.InternalType_79 InternalVar_1 = ref InternalType_274.InternalProperty_190.InternalMethod_1265(this, InternalParameter_80.meshInfo.Length);
int InternalVar_2 = 0;
for (int InternalVar_3 = 0; InternalVar_3 < InternalParameter_80.meshInfo.Length; InternalVar_3++)
{
if (InternalVar_3 != 0)
{
InternalParameter_80.meshInfo[InternalVar_3].ClearUnusedVertices();
}
InternalVar_2 += InternalParameter_80.meshInfo[InternalVar_3].vertices.Length;
}
InternalVar_2 /= 4;
if (InternalVar_2 == 0 && InternalVar_1.InternalField_3197 == 0)
{
return;
}
InternalVar_1.InternalField_3197 = InternalVar_2;
InternalVar_1.InternalField_264 = transform.lossyScale.y;
float2 InternalVar_4 = InternalNamespace_0.InternalNamespace_5.InternalType_187.InternalField_2247;
float2 InternalVar_5 = InternalNamespace_0.InternalNamespace_5.InternalType_187.InternalField_525;
for (int InternalVar_6 = 0; InternalVar_6 < InternalParameter_80.characterCount; InternalVar_6++)
{
var InternalVar_7 = InternalParameter_80.characterInfo[InternalVar_6];
InternalVar_4 = math.min(InternalVar_4, new float2(InternalVar_7.origin, InternalVar_7.descender));
InternalVar_5 = math.max(InternalVar_5, new float2(InternalVar_7.xAdvance, InternalVar_7.ascender));
}
if (InternalParameter_80.characterCount == 0)
{
InternalVar_4 = float2.zero;
InternalVar_5 = float2.zero;
}
InternalVar_1.InternalField_262 = new InternalType_306(InternalVar_4, InternalVar_5);
int InternalVar_8 = InternalParameter_80.meshInfo.Length - 1;
if (InternalVar_8 > 0)
{
(TMP as TMP.TextMeshProTextBlock).InternalMethod_3276();
}
for (int InternalVar_9 = 0; InternalVar_9 < InternalVar_1.InternalField_261.InternalProperty_216; ++InternalVar_9)
{
ref InternalNamespace_0.InternalType_110 InternalVar_10 = ref InternalVar_1.InternalField_261.InternalMethod_800(InternalVar_9);
int InternalVar_11 = InternalParameter_80.meshInfo[InternalVar_9].material.GetInstanceID();
if (InternalVar_10.InternalField_354 != InternalVar_11)
{
InternalType_274.InternalProperty_190.InternalField_875[InternalVar_11] = InternalParameter_80.meshInfo[InternalVar_9].material;
}
TMP_MeshInfo InternalVar_12 = InternalParameter_80.meshInfo[InternalVar_9];
InternalVar_10.InternalMethod_553(InternalVar_12);
unsafe
{
TMPUtils.CopyUVs(InternalVar_10.InternalField_357.InternalProperty_232, InternalVar_10.InternalField_358.InternalProperty_232, ref InternalVar_12);
}
}
InternalType_457.InternalProperty_190.InternalMethod_1846(this, InternalVar_1.InternalField_262.InternalMethod_1363().xy);
}
private protected override void InternalMethod_111()
{
InternalField_51 = InternalType_670.InternalField_2828;
InternalMethod_130();
TMP.OnPreRenderText += InternalProperty_41;
TMP.RegisterDirtyVerticesCallback(InternalProperty_40);
InternalMethod_136(this);
InternalProperty_38.hideFlags = HideFlags.HideInInspector;
InternalProperty_38.enabled = false;
base.InternalMethod_111();
}
private protected override void InternalMethod_112()
{
TMP.OnPreRenderText -= InternalProperty_41;
TMP.UnregisterDirtyVerticesCallback(InternalProperty_40);
InternalMethod_137(this);
base.InternalMethod_112();
}
private void InternalMethod_127()
{
if (!InternalProperty_764)
{
InternalMethod_2723();
}
else if (InternalProperty_25 && !TMP.enabled)
{
ref InternalNamespace_0.InternalType_79 InternalVar_1 = ref InternalType_274.InternalProperty_190.InternalMethod_1265(this, TMP.textInfo.meshInfo.Length);
InternalVar_1.InternalField_3197 = 0;
InternalVar_1.InternalField_262 = default;
}
}
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private static readonly Vector2 InternalField_52 = .5f * Vector2.one;
private void InternalMethod_130()
{
InternalProperty_37.anchorMin = InternalField_52;
InternalProperty_37.anchorMax = InternalField_52;
InternalProperty_37.sizeDelta = Vector2.zero;
}
internal override void InternalMethod_1856()
{
base.InternalMethod_1856();
if (!InternalProperty_25 || !InternalProperty_764)
{
return;
}
InternalMethod_2726(InternalType_670.InternalMethod_2348(CalculatedSize.XY.Value, SizeMinMax.InternalMethod_2990().InternalProperty_121.xy, InternalProperty_35));
}
#region
[NonSerialized, HideInInspector]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private TextMeshPro InternalField_3314 = null;
[NonSerialized, HideInInspector]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private RectTransform InternalField_3310 = null;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private RectTransform InternalProperty_37
{
get
{
if (InternalField_3310 == null)
{
InternalField_3310 = GetComponent<RectTransform>();
}
return InternalField_3310;
}
}
[NonSerialized, HideInInspector]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private MeshRenderer InternalField_3309 = null;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private MeshRenderer InternalProperty_38
{
get
{
if (InternalField_3309 == null)
{
InternalField_3309 = GetComponent<MeshRenderer>();
}
return InternalField_3309;
}
}
[NonSerialized]
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private UnityEngine.Events.UnityAction InternalField_54 = null;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private UnityEngine.Events.UnityAction InternalProperty_40
{
get
{
if (InternalField_54 == null)
{
InternalField_54 = InternalMethod_127;
}
return InternalField_54;
}
}
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private Action<TMP_TextInfo> InternalField_55 = null;
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private Action<TMP_TextInfo> InternalProperty_41
{
get
{
if (InternalField_55 == null)
{
InternalField_55 = InternalMethod_128;
}
return InternalField_55;
}
}
#endregion
#region
[System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
private static HashSet<TextBlock> InternalField_56 = new HashSet<TextBlock>();
private static void InternalMethod_136(TextBlock InternalParameter_81)
{
if (!InternalField_56.Add(InternalParameter_81))
{
return;
}
if (InternalField_56.Count == 1)
{
TMPro_EventManager.TEXT_CHANGED_EVENT.Add(InternalMethod_138);
}
}
private static void InternalMethod_137(TextBlock InternalParameter_82)
{
if (!InternalField_56.Remove(InternalParameter_82))
{
return;
}
if (InternalField_56.Count == 0)
{
TMPro_EventManager.TEXT_CHANGED_EVENT.Remove(InternalMethod_138);
}
}
private static void InternalMethod_138(UnityEngine.Object InternalParameter_83)
{
if (!(InternalParameter_83 is TextMeshPro textMeshPro))
{
return;
}
TextBlock InternalVar_1 = textMeshPro.gameObject.GetComponent<TextBlock>();
if (InternalVar_1 == null)
{
return;
}
if (InternalVar_1.TMP.textInfo.characterCount > 0)
{
return;
}
InternalVar_1.InternalMethod_128(InternalVar_1.TMP.textInfo);
}
#endregion
private TextBlock() : base()
{
visibility = InternalType_36.InternalMethod_307(InternalType_11.InternalField_65);
}
#endregion
}
}