329 lines
13 KiB
C#
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
|
|
}
|