283 lines
7.5 KiB
C#
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
|
|
}
|
|
}
|