Files
EnglewoodLAB/Assets/Sample/UIToolkit/UTKShortcutListSample.cs
2026-03-10 11:35:30 +09:00

214 lines
10 KiB
C#

#nullable enable
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using UVC.UIToolkit;
/// <summary>
/// UTKShortcutList의 기능을 테스트하기 위한 샘플 MonoBehaviour입니다.
/// <list type="bullet">
/// <item>Studio 단축키 목록 SetData</item>
/// <item>OnDataChanged 이벤트 핸들링</item>
/// <item>GetData / 리셋 / 항목 추가 버튼</item>
/// <item>라이트/다크 테마 토글</item>
/// </list>
/// </summary>
public class UTKShortcutListSample : MonoBehaviour
{
[SerializeField]
public UIDocument uiDocument;
[SerializeField]
[Tooltip("시작 시 적용할 테마")]
private UTKTheme initialTheme = UTKTheme.Dark;
private UTKToggle? _themeToggle;
private UTKShortcutList? _shortcutList;
// ── 샘플 데이터 원본 (리셋용) ──────────────────────────────────────────
private static readonly List<UTKShortcutItemData> DefaultShortcuts = new()
{
new() { Id = "file.new_project", CommandName = "File > New Project", UseCtrl = true, UseShift = false, UseAlt = false, Key = "N" },
new() { Id = "file.open_project", CommandName = "File > Open Project", UseCtrl = true, UseShift = true, UseAlt = false, Key = "O" },
new() { Id = "file.save_project", CommandName = "File > Save Project", UseCtrl = true, UseShift = false, UseAlt = true, Key = "S" },
new() { Id = "file.save_as", CommandName = "File > Save As...", UseCtrl = true, UseShift = true, UseAlt = true, Key = "S" },
new() { Id = "file.insert_database", CommandName = "File > Insert Database", UseCtrl = true, UseShift = true, UseAlt = false, Key = "I" },
new() { Id = "file.export_layout", CommandName = "File > Export > Layout", UseCtrl = true, UseShift = true, UseAlt = false, Key = "L" },
new() { Id = "file.export_metadata", CommandName = "File > Export > Metadata",UseCtrl = true, UseShift = true, UseAlt = false, Key = "M" },
new() { Id = "file.export_gltf", CommandName = "File > Export > glTF", UseCtrl = true, UseShift = true, UseAlt = false, Key = "G" },
new() { Id = "edit.undo", CommandName = "Edit > Undo", UseCtrl = true, UseShift = true, UseAlt = false, Key = "Z" },
new() { Id = "edit.redo", CommandName = "Edit > Redo", UseCtrl = true, UseShift = true, UseAlt = false, Key = "Y" },
new() { Id = "edit.duplicate", CommandName = "Edit > Duplicate", UseCtrl = true, UseShift = true, UseAlt = false, Key = "D" },
new() { Id = "edit.delete", CommandName = "Edit > Delete", UseCtrl = false, UseShift = true, UseAlt = false, Key = "Delete" },
new() { Id = "create.plane", CommandName = "Create > Plane", UseCtrl = true, UseShift = true, UseAlt = false, Key = "V" },
new() { Id = "tool.select", CommandName = "Select Tool", UseCtrl = false, UseShift = false, UseAlt = false, Key = "1" },
new() { Id = "tool.move", CommandName = "Move Tool", UseCtrl = false, UseShift = false, UseAlt = false, Key = "2" },
new() { Id = "tool.rotate", CommandName = "Rotate Tool", UseCtrl = false, UseShift = false, UseAlt = false, Key = "3" },
new() { Id = "tool.scale", CommandName = "Scale Tool", UseCtrl = false, UseShift = false, UseAlt = false, Key = "4" },
new() { Id = "view.focus", CommandName = "View > Focus Selected", UseCtrl = false, UseShift = false, UseAlt = false, Key = "F" },
new() { Id = "view.toggle_grid", CommandName = "View > Toggle Grid", UseCtrl = false, UseShift = false, UseAlt = false, Key = "G" },
new() { Id = "view.toggle_wireframe", CommandName = "View > Toggle Wireframe", UseCtrl = false, UseShift = false, UseAlt = false, Key = "W" },
};
// ─────────────────────────────────────────────────────────────────────────
private void Start()
{
// UIDocument 참조
var doc = GetComponent<UIDocument>();
if (doc == null)
{
Debug.LogError("[UTKShortcutListSample] UIDocument 컴포넌트가 없습니다.");
return;
}
uiDocument = doc;
var root = uiDocument.rootVisualElement;
// 테마 토글
_themeToggle = root.Q<UTKToggle>("toggle");
if (_themeToggle == null)
Debug.LogWarning("[UTKShortcutListSample] UXML에서 UTKToggle(name='toggle')을 찾을 수 없습니다.");
// ShortcutList
_shortcutList = root.Q<UTKShortcutList>("shortcut-list");
if (_shortcutList == null)
{
// 이름을 못 찾으면 타입으로 검색
_shortcutList = root.Q<UTKShortcutList>();
}
if (_shortcutList == null)
{
Debug.LogError("[UTKShortcutListSample] UXML에서 UTKShortcutList를 찾을 수 없습니다.");
return;
}
// 테마 초기화
UTKThemeManager.Instance.RegisterRoot(root);
UTKThemeManager.Instance.SetTheme(initialTheme);
_themeToggle!.OnValueChanged += (isOn) =>
{
UTKThemeManager.Instance.SetTheme(isOn ? UTKTheme.Light : UTKTheme.Dark);
};
// 이벤트 핸들러
_shortcutList.OnDataChanged += OnShortcutDataChanged;
// 기본 데이터 로드 (DeepCopy 로 원본 보존)
LoadDefaultData();
// 테스트 버튼 생성
CreateButtons(root);
}
// ── 이벤트 핸들러 ─────────────────────────────────────────────────────────
/// <summary>단축키 데이터가 변경될 때 호출됩니다.</summary>
private void OnShortcutDataChanged(UTKShortcutItemData item)
{
Debug.Log($"[UTKShortcutListSample] 변경 → id={item.Id} " +
$"Ctrl={item.UseCtrl} Shift={item.UseShift} Alt={item.UseAlt} Key={item.Key}");
}
// ── 데이터 관리 ───────────────────────────────────────────────────────────
/// <summary>DefaultShortcuts 의 복사본을 리스트에 로드합니다.</summary>
private void LoadDefaultData()
{
var copy = new List<UTKShortcutItemData>(DefaultShortcuts.Count);
foreach (var src in DefaultShortcuts)
{
copy.Add(new UTKShortcutItemData
{
Id = src.Id,
CommandName = src.CommandName,
UseCtrl = src.UseCtrl,
UseShift = src.UseShift,
UseAlt = src.UseAlt,
Key = src.Key,
});
}
_shortcutList?.SetData(copy);
Debug.Log($"[UTKShortcutListSample] {copy.Count}개 단축키 로드 완료");
}
// ── 테스트 버튼 ───────────────────────────────────────────────────────────
private void CreateButtons(VisualElement root)
{
var bar = new VisualElement();
bar.style.flexDirection = FlexDirection.Row;
bar.style.justifyContent = Justify.Center;
bar.style.paddingTop = 8;
bar.style.paddingBottom = 8;
bar.style.flexWrap = Wrap.Wrap;
// GetData 버튼: 현재 데이터를 콘솔에 출력
var getDataBtn = new UTKButton("GetData", variant: UTKButton.ButtonVariant.Primary);
getDataBtn.OnClicked += OnGetDataClicked;
getDataBtn.style.marginRight = 4;
bar.Add(getDataBtn);
// 리셋 버튼: 기본값으로 복원
var resetBtn = new UTKButton("리셋", variant: UTKButton.ButtonVariant.Normal);
resetBtn.OnClicked += LoadDefaultData;
resetBtn.style.marginRight = 4;
bar.Add(resetBtn);
// 항목 추가 버튼: 빈 항목 하나 추가
var addBtn = new UTKButton("항목 추가", variant: UTKButton.ButtonVariant.OutlinePrimary);
addBtn.OnClicked += OnAddItemClicked;
bar.Add(addBtn);
root.Add(bar);
}
/// <summary>현재 최종 데이터를 콘솔에 출력합니다.</summary>
private void OnGetDataClicked()
{
if (_shortcutList == null) return;
var data = _shortcutList.GetData();
Debug.Log($"[UTKShortcutListSample] ── GetData ({data.Count}개) ──");
foreach (var item in data)
{
var mods = $"{(item.UseCtrl ? "Ctrl+" : "")}" +
$"{(item.UseShift ? "Shift+" : "")}" +
$"{(item.UseAlt ? "Alt+" : "")}";
Debug.Log($" [{item.Id}] {item.CommandName} → {mods}{item.Key}");
}
}
/// <summary>빈 항목을 목록 끝에 추가하고 리스트를 갱신합니다.</summary>
private void OnAddItemClicked()
{
if (_shortcutList == null) return;
var current = _shortcutList.GetData();
var newItem = new UTKShortcutItemData
{
Id = $"custom.{current.Count + 1}",
CommandName = $"Custom Command {current.Count + 1}",
UseCtrl = false,
UseShift = false,
UseAlt = false,
Key = "",
};
current.Add(newItem);
_shortcutList.SetData(current);
Debug.Log($"[UTKShortcutListSample] 항목 추가: {newItem.CommandName}");
}
// ─────────────────────────────────────────────────────────────────────────
private void OnDestroy()
{
if (_shortcutList != null)
{
_shortcutList.OnDataChanged -= OnShortcutDataChanged;
_shortcutList.Dispose();
}
}
}