Files
XRLib/Assets/Scripts/UVC/UIToolkit/Label/UTKLabel.cs
2026-01-08 20:15:57 +09:00

283 lines
7.5 KiB
C#

#nullable enable
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UVC.UIToolkit
{
/// <summary>
/// 텍스트 라벨 컴포넌트.
/// 다양한 스타일과 크기의 텍스트를 표시합니다.
/// </summary>
[UxmlElement]
public partial class UTKLabel : VisualElement, IDisposable
{
#region Constants
private const string USS_PATH = "UIToolkit/Label/UTKLabel";
#endregion
#region Fields
private bool _disposed;
private Label? _label;
private string _text = "";
private LabelSize _size = LabelSize.Body1;
private LabelVariant _variant = LabelVariant.Primary;
private bool _isBold;
private bool _isItalic;
private TextAlign _textAlign = TextAlign.Left;
private bool _isSelectable;
#endregion
#region Properties
/// <summary>텍스트</summary>
[UxmlAttribute]
public string Text
{
get => _text;
set
{
_text = value;
if (_label != null) _label.text = value;
}
}
/// <summary>텍스트 크기</summary>
[UxmlAttribute]
public LabelSize Size
{
get => _size;
set
{
_size = value;
UpdateSize();
}
}
/// <summary>텍스트 변형</summary>
[UxmlAttribute]
public LabelVariant Variant
{
get => _variant;
set
{
_variant = value;
UpdateVariant();
}
}
/// <summary>굵은 글꼴</summary>
[UxmlAttribute]
public bool IsBold
{
get => _isBold;
set
{
_isBold = value;
EnableInClassList("utk-label--bold", value);
}
}
/// <summary>기울임 글꼴</summary>
[UxmlAttribute]
public bool IsItalic
{
get => _isItalic;
set
{
_isItalic = value;
EnableInClassList("utk-label--italic", value);
}
}
/// <summary>텍스트 정렬</summary>
[UxmlAttribute]
public TextAlign TextAlignment
{
get => _textAlign;
set
{
_textAlign = value;
UpdateTextAlign();
}
}
/// <summary>텍스트 선택 가능 여부</summary>
[UxmlAttribute]
public bool IsSelectable
{
get => _isSelectable;
set
{
_isSelectable = value;
if (_label != null)
{
_label.selection.isSelectable = value;
}
}
}
#endregion
#region Enums
public enum LabelSize
{
H1,
H2,
H3,
Body1,
Body2,
Label1,
Label2,
Label3,
Caption
}
public enum LabelVariant
{
Primary,
Secondary,
Disabled,
Success,
Warning,
Error,
Info
}
public enum TextAlign
{
Left,
Center,
Right
}
#endregion
#region Constructor
public UTKLabel()
{
UTKThemeManager.Instance.ApplyThemeToElement(this);
var uss = Resources.Load<StyleSheet>(USS_PATH);
if (uss != null)
{
styleSheets.Add(uss);
}
CreateUI();
SubscribeToThemeChanges();
}
public UTKLabel(string text, LabelSize size = LabelSize.Body1) : this()
{
Text = text;
Size = size;
}
#endregion
#region UI Creation
private void CreateUI()
{
AddToClassList("utk-label");
_label = new Label { name = "label" };
_label.AddToClassList("utk-label__text");
Add(_label);
UpdateSize();
UpdateVariant();
UpdateTextAlign();
}
private void SubscribeToThemeChanges()
{
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
RegisterCallback<DetachFromPanelEvent>(_ =>
{
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
});
}
private void OnThemeChanged(UTKTheme theme)
{
UTKThemeManager.Instance.ApplyThemeToElement(this);
}
#endregion
#region Update Methods
private void UpdateSize()
{
RemoveFromClassList("utk-label--h1");
RemoveFromClassList("utk-label--h2");
RemoveFromClassList("utk-label--h3");
RemoveFromClassList("utk-label--body1");
RemoveFromClassList("utk-label--body2");
RemoveFromClassList("utk-label--label1");
RemoveFromClassList("utk-label--label2");
RemoveFromClassList("utk-label--label3");
RemoveFromClassList("utk-label--caption");
var sizeClass = _size switch
{
LabelSize.H1 => "utk-label--h1",
LabelSize.H2 => "utk-label--h2",
LabelSize.H3 => "utk-label--h3",
LabelSize.Body2 => "utk-label--body2",
LabelSize.Label1 => "utk-label--label1",
LabelSize.Label2 => "utk-label--label2",
LabelSize.Label3 => "utk-label--label3",
LabelSize.Caption => "utk-label--caption",
_ => "utk-label--body1"
};
AddToClassList(sizeClass);
}
private void UpdateVariant()
{
RemoveFromClassList("utk-label--primary");
RemoveFromClassList("utk-label--secondary");
RemoveFromClassList("utk-label--disabled");
RemoveFromClassList("utk-label--success");
RemoveFromClassList("utk-label--warning");
RemoveFromClassList("utk-label--error");
RemoveFromClassList("utk-label--info");
var variantClass = _variant switch
{
LabelVariant.Secondary => "utk-label--secondary",
LabelVariant.Disabled => "utk-label--disabled",
LabelVariant.Success => "utk-label--success",
LabelVariant.Warning => "utk-label--warning",
LabelVariant.Error => "utk-label--error",
LabelVariant.Info => "utk-label--info",
_ => "utk-label--primary"
};
AddToClassList(variantClass);
}
private void UpdateTextAlign()
{
RemoveFromClassList("utk-label--left");
RemoveFromClassList("utk-label--center");
RemoveFromClassList("utk-label--right");
var alignClass = _textAlign switch
{
TextAlign.Center => "utk-label--center",
TextAlign.Right => "utk-label--right",
_ => "utk-label--left"
};
AddToClassList(alignClass);
}
#endregion
#region IDisposable
public void Dispose()
{
if (_disposed) return;
_disposed = true;
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
}
#endregion
}
}