#nullable enable using System.Collections.Generic; using UnityEngine; using UnityEngine.UIElements; using UVC.UIToolkit; /// /// UTKShortcutList의 기능을 테스트하기 위한 샘플 MonoBehaviour입니다. /// /// Studio 단축키 목록 SetData /// OnDataChanged 이벤트 핸들링 /// GetData / 리셋 / 항목 추가 버튼 /// 라이트/다크 테마 토글 /// /// 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 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(); if (doc == null) { Debug.LogError("[UTKShortcutListSample] UIDocument 컴포넌트가 없습니다."); return; } uiDocument = doc; var root = uiDocument.rootVisualElement; // 테마 토글 _themeToggle = root.Q("toggle"); if (_themeToggle == null) Debug.LogWarning("[UTKShortcutListSample] UXML에서 UTKToggle(name='toggle')을 찾을 수 없습니다."); // ShortcutList _shortcutList = root.Q("shortcut-list"); if (_shortcutList == null) { // 이름을 못 찾으면 타입으로 검색 _shortcutList = root.Q(); } 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); } // ── 이벤트 핸들러 ───────────────────────────────────────────────────────── /// 단축키 데이터가 변경될 때 호출됩니다. private void OnShortcutDataChanged(UTKShortcutItemData item) { Debug.Log($"[UTKShortcutListSample] 변경 → id={item.Id} " + $"Ctrl={item.UseCtrl} Shift={item.UseShift} Alt={item.UseAlt} Key={item.Key}"); } // ── 데이터 관리 ─────────────────────────────────────────────────────────── /// DefaultShortcuts 의 복사본을 리스트에 로드합니다. private void LoadDefaultData() { var copy = new List(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); } /// 현재 최종 데이터를 콘솔에 출력합니다. 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}"); } } /// 빈 항목을 목록 끝에 추가하고 리스트를 갱신합니다. 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(); } } }