UTKProperyWIndow 수정 중

This commit is contained in:
logonkhi
2026-02-02 19:33:27 +09:00
parent f2d0f3d423
commit 297ca29082
118 changed files with 3043 additions and 1924 deletions

View File

@@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
@@ -14,15 +15,16 @@ namespace UVC.UIToolkit
public partial class UTKPropertyWindow : VisualElement, IDisposable
{
#region Constants
private const string USS_PATH = "UIToolkit/Property/UTKPropertyWindow";
private const string UXML_PATH = "UIToolkit/Property/UTKPropertyWindow";
private const string USS_PATH = "UIToolkit/Property/UTKPropertyWindowUss";
#endregion
#region Fields
private bool _disposed;
private UTKPropertyList? _propertyList;
private VisualElement? _header;
private Label? _titleLabel;
private Button? _closeButton;
private UTKLabel? _titleLabel;
private UTKButton? _closeButton;
private string _title = "Properties";
private bool _showCloseButton = true;
private bool _isDragging;
@@ -40,7 +42,7 @@ namespace UVC.UIToolkit
_title = value;
if (_titleLabel != null)
{
_titleLabel.text = value;
_titleLabel.Text = value;
}
}
}
@@ -93,6 +95,7 @@ namespace UVC.UIToolkit
public UTKPropertyWindow()
{
UTKThemeManager.Instance.ApplyThemeToElement(this);
SubscribeToThemeChanges();
var styleSheet = Resources.Load<StyleSheet>(USS_PATH);
if (styleSheet != null)
@@ -114,29 +117,99 @@ namespace UVC.UIToolkit
{
AddToClassList("utk-property-window");
var asset = Resources.Load<VisualTreeAsset>(UXML_PATH);
if (asset != null)
{
CreateUIFromUxml(asset);
}
else
{
CreateUIFallback();
}
// 드래그 이벤트
if (_header != null)
{
_header.RegisterCallback<PointerDownEvent>(OnHeaderPointerDown);
_header.RegisterCallback<PointerMoveEvent>(OnHeaderPointerMove);
_header.RegisterCallback<PointerUpEvent>(OnHeaderPointerUp);
}
}
private void CreateUIFromUxml(VisualTreeAsset asset)
{
var root = asset.Instantiate();
var windowRoot = root.Q<VisualElement>("window-root");
if (windowRoot != null)
{
// windowRoot의 자식들을 현재 요소로 이동
foreach (var child in windowRoot.Children().ToArray())
{
Add(child);
}
}
else
{
// window-root가 없으면 전체 추가
Add(root);
}
// 요소 참조 가져오기
_header = this.Q<VisualElement>("header");
_titleLabel = this.Q<UTKLabel>("title");
_closeButton = this.Q<UTKButton>("close-btn");
_propertyList = this.Q<UTKPropertyList>("content");
// 타이틀 설정
if (_titleLabel != null)
{
_titleLabel.Text = _title;
_titleLabel.IsBold = true;
_titleLabel.Size = UTKLabel.LabelSize.Label1;
}
// 닫기 버튼 설정
if (_closeButton != null)
{
_closeButton.SetMaterialIcon(UTKMaterialIcons.Close, 14);
_closeButton.IconOnly = true;
_closeButton.OnClicked += () => OnCloseClicked?.Invoke();
_closeButton.style.display = _showCloseButton ? DisplayStyle.Flex : DisplayStyle.None;
}
// PropertyList가 없으면 생성
if (_propertyList == null)
{
_propertyList = new UTKPropertyList();
_propertyList.name = "content";
_propertyList.AddToClassList("utk-property-window__content");
Add(_propertyList);
}
}
private void CreateUIFallback()
{
// 헤더
_header = new VisualElement();
_header.name = "header";
_header.AddToClassList("utk-property-window__header");
_titleLabel = new Label(_title);
_titleLabel = new UTKLabel(_title, UTKLabel.LabelSize.Label1);
_titleLabel.name = "title";
_titleLabel.IsBold = true;
_titleLabel.AddToClassList("utk-property-window__title");
_header.Add(_titleLabel);
_closeButton = new Button { text = "✕" };
_closeButton = new UTKButton("", UTKMaterialIcons.Close, UTKButton.ButtonVariant.Text, 14);
_closeButton.name = "close-btn";
_closeButton.IconOnly = true;
_closeButton.AddToClassList("utk-property-window__close-btn");
_closeButton.clicked += () => OnCloseClicked?.Invoke();
_closeButton.OnClicked += () => OnCloseClicked?.Invoke();
_header.Add(_closeButton);
Add(_header);
// 드래그 이벤트
_header.RegisterCallback<PointerDownEvent>(OnHeaderPointerDown);
_header.RegisterCallback<PointerMoveEvent>(OnHeaderPointerMove);
_header.RegisterCallback<PointerUpEvent>(OnHeaderPointerUp);
// PropertyList
_propertyList = new UTKPropertyList();
_propertyList.AddToClassList("utk-property-window__content");
@@ -242,12 +315,33 @@ namespace UVC.UIToolkit
}
#endregion
#region (Theme)
private void SubscribeToThemeChanges()
{
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
RegisterCallback<DetachFromPanelEvent>(_ =>
{
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
});
}
private void OnThemeChanged(UTKTheme theme)
{
UTKThemeManager.Instance.ApplyThemeToElement(this);
}
#endregion
#region IDisposable
public void Dispose()
{
if (_disposed) return;
_disposed = true;
// 테마 변경 이벤트 해제
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
// 드래그 이벤트 해제
if (_header != null)
{