Files
XRLib/Assets/Sample/UIToolkit/UTKStyleGuideSample.ToolBar.cs
2026-02-19 18:40:37 +09:00

329 lines
13 KiB
C#

#nullable enable
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using UVC.UIToolkit;
using UVC.UI.Commands;
/// <summary>
/// UTKStyleGuideSample의 ToolBar 카테고리 Initialize 메서드들
/// </summary>
public partial class UTKStyleGuideSample
{
#region ToolBar Fields
private UTKToolBar? _sampleToolBarHorizontal;
private UTKToolBarModel? _sampleToolBarModelHorizontal;
private UTKToolBar? _sampleToolBarVertical;
private UTKToolBarModel? _sampleToolBarModelVertical;
private Label? _toolBarEventLogLabel;
private readonly List<string> _toolBarEventLogs = new();
private const int MaxToolBarLogLines = 5;
#endregion
#region ToolBar Initializers
private void InitializeToolBarSample(VisualElement root)
{
_toolBarEventLogLabel = root.Q<Label>("event-log-label");
InitializeHorizontalToolBar(root);
InitializeVerticalToolBar(root);
InitializeToolBarApiTest(root);
SetCodeSamples(root,
csharpCode: @"// === 가로 툴바 ===
var model = new UTKToolBarModel();
// Standard 버튼
model.AddStandardButton(""저장"", UTKMaterialIcons.Save);
// 구분선
model.AddSeparator();
// Toggle 버튼
model.AddToggleButton(""그리드"", false,
UTKMaterialIcons.GridOn,
UTKMaterialIcons.GridOff);
// Radio 버튼 그룹
model.AddRadioButton(""tool"", ""선택"", true,
UTKMaterialIcons.NearMe);
model.AddRadioButton(""tool"", ""이동"", false,
UTKMaterialIcons.OpenWith);
model.AddSeparator();
// Expandable 버튼 (서브 메뉴)
var shapes = model.AddExpandableButton(""도형"",
UTKMaterialIcons.Category, updateIconOnSelection: true);
shapes.SubButtons.Add(
new UTKToolBarStandardButtonData
{ Text = ""사각형"", IconPath = UTKMaterialIcons.CropSquare,
UseMaterialIcon = true });
shapes.SubButtons.Add(
new UTKToolBarStandardButtonData
{ Text = ""원형"", IconPath = UTKMaterialIcons.Circle,
UseMaterialIcon = true });
// View 생성 및 빌드
var toolbar = new UTKToolBar();
toolbar.Orientation = UTKToolBarOrientation.Horizontal;
parent.Add(toolbar);
toolbar.BuildToolBar(model);
// 이벤트 구독
toolbar.OnAction += args =>
Debug.Log($""{args.Text}: {args.ActionType}"");
// === 세로 배치로 전환 ===
toolbar.SetOrientation(UTKToolBarOrientation.Vertical);
// === API ===
// 토글 상태 변경
model.SetToggleButtonStateByText(""그리드"", true);
// 라디오 선택 변경
model.SetRadioButtonSelectionByText(""tool"", ""이동"");",
uxmlCode: @"<!-- 네임스페이스 선언 -->
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
<!-- UXML에서 직접 사용 -->
<utk:UTKToolBar orientation=""Horizontal""
item-spacing=""2""
toolbar-size=""40"" />
<!-- 세로 배치 -->
<utk:UTKToolBar orientation=""Vertical"" />
</ui:UXML>");
}
/// <summary>
/// 가로 툴바 초기화
/// </summary>
private void InitializeHorizontalToolBar(VisualElement root)
{
var container = root.Q<VisualElement>("horizontal-toolbar-container");
if (container == null) return;
_sampleToolBarModelHorizontal = new UTKToolBarModel();
// Standard 버튼들
_sampleToolBarModelHorizontal.AddStandardButton("저장", UTKMaterialIcons.Save, new DebugLogCommand("저장"), "파일 저장");
_sampleToolBarModelHorizontal.AddStandardButton("실행 취소", UTKMaterialIcons.Undo, new DebugLogCommand("실행 취소"), "실행 취소");
_sampleToolBarModelHorizontal.AddStandardButton("다시 실행", UTKMaterialIcons.Redo, new DebugLogCommand("다시 실행"), "다시 실행");
_sampleToolBarModelHorizontal.AddSeparator();
// Toggle 버튼들
_sampleToolBarModelHorizontal.AddToggleButton("그리드", false,
UTKMaterialIcons.GridOn, UTKMaterialIcons.GridOff,
isOn => AppendToolBarLog($"그리드: {(isOn ? "ON" : "OFF")}"),
tooltip: "그리드 표시/숨김");
_sampleToolBarModelHorizontal.AddToggleButton("스냅", false,
UTKMaterialIcons.FilterCenterFocus, UTKMaterialIcons.CenterFocusWeak,
isOn => AppendToolBarLog($"스냅: {(isOn ? "ON" : "OFF")}"),
tooltip: "스냅 활성화/비활성화");
_sampleToolBarModelHorizontal.AddSeparator();
// Radio 버튼 그룹 (도구 선택)
_sampleToolBarModelHorizontal.AddRadioButton("tool", "선택", true,
UTKMaterialIcons.NearMe, null,
isOn => { if (isOn) AppendToolBarLog("도구: 선택"); },
tooltip: "선택 도구");
_sampleToolBarModelHorizontal.AddRadioButton("tool", "이동", false,
UTKMaterialIcons.OpenWith, null,
isOn => { if (isOn) AppendToolBarLog("도구: 이동"); },
tooltip: "이동 도구");
_sampleToolBarModelHorizontal.AddRadioButton("tool", "회전", false,
UTKMaterialIcons.Refresh, null,
isOn => { if (isOn) AppendToolBarLog("도구: 회전"); },
tooltip: "회전 도구");
_sampleToolBarModelHorizontal.AddRadioButton("tool", "크기", false,
UTKMaterialIcons.AspectRatio, null,
isOn => { if (isOn) AppendToolBarLog("도구: 크기"); },
tooltip: "크기 도구");
_sampleToolBarModelHorizontal.AddSeparator();
// Expandable 버튼 (도형)
var shapeBtn = _sampleToolBarModelHorizontal.AddExpandableButton("도형",
UTKMaterialIcons.Category, tooltip: "도형 추가", updateIconOnSelection: true);
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "사각형", IconPath = UTKMaterialIcons.CropSquare, UseMaterialIcon = true });
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "원형", IconPath = UTKMaterialIcons.Circle, UseMaterialIcon = true });
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "삼각형", IconPath = UTKMaterialIcons.ChangeHistory, UseMaterialIcon = true });
// View 생성
_sampleToolBarHorizontal = new UTKToolBar();
_sampleToolBarHorizontal.Orientation = UTKToolBarOrientation.Horizontal;
_sampleToolBarHorizontal.OnAction += OnToolBarSampleAction;
_sampleToolBarHorizontal.BuildToolBar(_sampleToolBarModelHorizontal);
container.Add(_sampleToolBarHorizontal);
}
/// <summary>
/// 세로 툴바 초기화
/// </summary>
private void InitializeVerticalToolBar(VisualElement root)
{
var container = root.Q<VisualElement>("vertical-toolbar-container");
if (container == null) return;
_sampleToolBarModelVertical = new UTKToolBarModel();
// Standard 버튼들 (아이콘만)
_sampleToolBarModelVertical.AddStandardButton("", UTKMaterialIcons.Save, new DebugLogCommand("세로: 저장"), "저장");
_sampleToolBarModelVertical.AddStandardButton("", UTKMaterialIcons.Undo, new DebugLogCommand("세로: 실행 취소"), "실행 취소");
_sampleToolBarModelVertical.AddSeparator();
// Toggle 버튼
_sampleToolBarModelVertical.AddToggleButton("", false,
UTKMaterialIcons.Visibility, UTKMaterialIcons.VisibilityOff,
tooltip: "표시/숨김");
_sampleToolBarModelVertical.AddToggleButton("", false,
UTKMaterialIcons.Lock, UTKMaterialIcons.LockOpen,
tooltip: "잠금/해제");
_sampleToolBarModelVertical.AddSeparator();
// Radio 버튼 그룹
_sampleToolBarModelVertical.AddRadioButton("vtool", "", true,
UTKMaterialIcons.NearMe, null, tooltip: "선택 도구");
_sampleToolBarModelVertical.AddRadioButton("vtool", "", false,
UTKMaterialIcons.OpenWith, null, tooltip: "이동 도구");
_sampleToolBarModelVertical.AddRadioButton("vtool", "", false,
UTKMaterialIcons.Refresh, null, tooltip: "회전 도구");
_sampleToolBarModelVertical.AddSeparator();
// Expandable 버튼 (도형)
var shapeBtn = _sampleToolBarModelVertical.AddExpandableButton("",
UTKMaterialIcons.Category, tooltip: "도형 추가", updateIconOnSelection: true);
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "사각형", IconPath = UTKMaterialIcons.CropSquare, UseMaterialIcon = true });
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "원형", IconPath = UTKMaterialIcons.Circle, UseMaterialIcon = true });
shapeBtn.SubButtons.Add(new UTKToolBarStandardButtonData { Text = "삼각형", IconPath = UTKMaterialIcons.ChangeHistory, UseMaterialIcon = true });
// View 생성
_sampleToolBarVertical = new UTKToolBar();
_sampleToolBarVertical.Orientation = UTKToolBarOrientation.Vertical;
_sampleToolBarVertical.OnAction += OnToolBarSampleAction;
_sampleToolBarVertical.BuildToolBar(_sampleToolBarModelVertical);
container.Add(_sampleToolBarVertical);
}
/// <summary>
/// API 테스트 버튼 초기화
/// </summary>
private void InitializeToolBarApiTest(VisualElement root)
{
var container = root.Q<VisualElement>("api-test-container");
var resultLabel = root.Q<Label>("api-result-label");
if (container == null || resultLabel == null) return;
// SetToggleButtonState 테스트
var toggleBtn = new UTKButton("Toggle Grid ON");
toggleBtn.OnClicked += () =>
{
if (_sampleToolBarModelHorizontal == null) return;
_sampleToolBarModelHorizontal.SetToggleButtonStateByText("그리드", true, true);
resultLabel.text = "SetToggleButtonStateByText(\"그리드\", true) 실행됨";
};
container.Add(toggleBtn);
// SetRadioButtonSelection 테스트
var radioBtn = new UTKButton("Select 이동");
radioBtn.OnClicked += () =>
{
if (_sampleToolBarModelHorizontal == null) return;
_sampleToolBarModelHorizontal.SetRadioButtonSelectionByText("tool", "이동", true);
resultLabel.text = "SetRadioButtonSelectionByText(\"tool\", \"이동\") 실행됨";
};
container.Add(radioBtn);
// ClearRadioButtonSelection 테스트
var clearBtn = new UTKButton("Clear Radio");
clearBtn.OnClicked += () =>
{
if (_sampleToolBarModelHorizontal == null) return;
_sampleToolBarModelHorizontal.ClearRadioButtonSelection("tool", true);
resultLabel.text = "ClearRadioButtonSelection(\"tool\") 실행됨";
};
container.Add(clearBtn);
// GetToggleButtonState 테스트
var getStateBtn = new UTKButton("Get Grid State");
getStateBtn.OnClicked += () =>
{
if (_sampleToolBarModelHorizontal == null) return;
bool state = _sampleToolBarModelHorizontal.GetToggleButtonState("그리드");
resultLabel.text = $"GetToggleButtonState(\"\"): {state}";
};
container.Add(getStateBtn);
}
/// <summary>
/// 툴바 액션 이벤트 핸들러
/// </summary>
private void OnToolBarSampleAction(UTKToolBarActionEventArgs args)
{
string valueStr = args.Value != null ? args.Value.ToString() ?? "" : "null";
string logEntry = $"[{args.ActionType}] {args.Text}: {valueStr}";
Debug.Log($"[UTKToolBar Sample] {logEntry}");
AppendToolBarLog(logEntry);
}
/// <summary>
/// 이벤트 로그에 항목을 추가합니다.
/// </summary>
private void AppendToolBarLog(string message)
{
_toolBarEventLogs.Add(message);
while (_toolBarEventLogs.Count > MaxToolBarLogLines)
{
_toolBarEventLogs.RemoveAt(0);
}
if (_toolBarEventLogLabel != null)
{
_toolBarEventLogLabel.text = string.Join("\n", _toolBarEventLogs);
}
}
/// <summary>
/// 툴바 샘플 리소스 정리
/// </summary>
private void CleanupToolBarSample()
{
if (_sampleToolBarHorizontal != null)
{
_sampleToolBarHorizontal.OnAction -= OnToolBarSampleAction;
_sampleToolBarHorizontal.Dispose();
_sampleToolBarHorizontal = null;
}
if (_sampleToolBarVertical != null)
{
_sampleToolBarVertical.OnAction -= OnToolBarSampleAction;
_sampleToolBarVertical.Dispose();
_sampleToolBarVertical = null;
}
_sampleToolBarModelHorizontal?.Dispose();
_sampleToolBarModelHorizontal = null;
_sampleToolBarModelVertical?.Dispose();
_sampleToolBarModelVertical = null;
_toolBarEventLogs.Clear();
_toolBarEventLogLabel = null;
}
#endregion
}