Files
XRLib/Assets/Scripts/UVC/UI/ToolBar/ToolbarExpandableButton.cs

71 lines
3.2 KiB
C#
Raw Normal View History


using System;
using System.Collections.Generic;
2025-06-16 19:30:01 +09:00
namespace UVC.UI.Toolbar
{
/// <summary>
/// 클릭 시 하위 버튼 그룹을 확장하여 보여주는 버튼입니다.
/// 하위 버튼 선택 시, 주 버튼의 내용이 업데이트될 수 있습니다.
/// </summary>
public class ToolbarExpandableButton : ToolbarButtonBase
{
public enum ExpansionDirection { Horizontal, Vertical }
public List<ToolbarButtonBase> SubButtons { get; private set; }
public ExpansionDirection Direction { get; set; } = ExpansionDirection.Vertical;
public Action<ToolbarButtonBase> OnSubButtonSelected { get; set; }
public ToolbarExpandableButton()
{
SubButtons = new List<ToolbarButtonBase>();
}
2025-06-16 19:30:01 +09:00
// 주 버튼 클릭 시 하위 메뉴를 토글하는 동작은 View에서 처리될 수 있고,
// ClickCommand는 주 버튼 자체의 액션(있다면)을 정의합니다.
// 또는 ClickCommand가 하위 메뉴 토글 로직을 포함할 수도 있습니다.
// 여기서는 ClickCommand는 주 버튼의 고유 액션, 하위 메뉴 토글은 View의 역할로 가정합니다.
public override void ExecuteClick(object parameter = null)
{
2025-06-16 19:30:01 +09:00
if (!IsEnabled) return;
// ClickCommand는 주 버튼 자체의 액션 (예: 상태 변경, 특정 기능 수행)
ClickCommand?.Execute(parameter);
// 하위 메뉴를 여는 동작은 보통 View에서 이 버튼 클릭 시 별도로 처리합니다.
// OnClick (이제 ClickCommand)이 그 역할을 할 수도 있지만,
// View에서 직접 ToggleSubMenu를 호출하는 것이 더 명확할 수 있습니다.
// ToolbarView의 SetupButtonVisualsAndInteractions에서 expandableModel.ExecuteClick() 후
// ToggleSubMenu()를 호출하는 현재 구조를 유지할 수 있습니다.
}
public void SelectSubButton(ToolbarButtonBase selectedSubButton)
{
if (selectedSubButton != null && selectedSubButton.IsEnabled)
{
bool changed = false;
if (this.Text != selectedSubButton.Text)
{
this.Text = selectedSubButton.Text; // Setter가 OnStateChanged 호출 (단, Text가 실제로 변경되어야 함)
changed = true;
}
2025-06-16 19:30:01 +09:00
if (this.IconSpritePath != selectedSubButton.IconSpritePath)
{
2025-06-16 19:30:01 +09:00
this.IconSpritePath = selectedSubButton.IconSpritePath; // Setter가 OnStateChanged 호출
changed = true;
}
OnSubButtonSelected?.Invoke(selectedSubButton);
// selectedSubButton.ExecuteClick(); // 하위 버튼의 클릭 로직 실행은 선택 사항
if (changed) // Text나 Icon이 실제로 변경된 경우에만 명시적으로 호출하거나, 각 setter에 맡김
{
// NotifyStateChanged(); // Text, Icon setter가 이미 호출하므로 중복될 수 있음.
// 만약 Text, Icon 외 다른 상태도 변경된다면 필요.
}
}
}
}
}