TopMenu 개발 완료
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
using System;
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UVC.UI.Commands;
|
||||
|
||||
@@ -19,7 +21,7 @@ namespace UVC.UI.Menu
|
||||
/// UI에 표시될 메뉴 아이템의 이름입니다. 다국어 키도 가능합니다.
|
||||
/// 이 키를 사용하여 실제 표시될 텍스트를 가져옵니다.
|
||||
/// </summary>
|
||||
public string DisplayNameKey { get; private set; }
|
||||
public string DisplayName { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 메뉴 아이템이 선택되었을 때 실행될 명령입니다.
|
||||
@@ -53,6 +55,26 @@ namespace UVC.UI.Menu
|
||||
/// </summary>
|
||||
public bool IsEnabled { get; set; }
|
||||
|
||||
private int depth = 0; // 메뉴 아이템의 깊이 (하위 메뉴의 레벨)
|
||||
/// <summary>
|
||||
/// 계층 구조에서 현재 개체의 깊이를 가져옵니다.
|
||||
/// </summary>
|
||||
public int Depth
|
||||
{
|
||||
get { return depth; } // 외부에서 접근할 수 있도록 프로퍼티로 노출
|
||||
internal set { depth = value; }
|
||||
}
|
||||
|
||||
private MenuItemData? parent = null;
|
||||
/// <summary>
|
||||
/// 현재 메뉴 항목의 부모 메뉴 항목을 가져옵니다.
|
||||
/// </summary>
|
||||
public MenuItemData? Parent
|
||||
{
|
||||
get { return parent; } // 외부에서 접근할 수 있도록 프로퍼티로 노출
|
||||
internal set { parent = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// `MenuItemData` 클래스의 새 인스턴스를 초기화합니다.
|
||||
/// </summary>
|
||||
@@ -63,15 +85,38 @@ namespace UVC.UI.Menu
|
||||
/// <param name="subMenuItems">하위 메뉴 아이템 목록 (선택 사항).</param>
|
||||
/// <param name="isSeparator">구분선 여부 (선택 사항, 기본값: false).</param>
|
||||
/// <param name="isEnabled">활성화 상태 (선택 사항, 기본값: true).</param>
|
||||
public MenuItemData(string itemId, string displayName, ICommand command = null, object commandParameter = null, List<MenuItemData> subMenuItems = null, bool isSeparator = false, bool isEnabled = true)
|
||||
public MenuItemData(string itemId, string displayName, ICommand command = null, object commandParameter = null, List<MenuItemData> subMenuItems = null, bool isSeparator = false, bool isEnabled = true, int depth = 0)
|
||||
{
|
||||
ItemId = itemId;
|
||||
DisplayNameKey = displayName;
|
||||
DisplayName = displayName;
|
||||
Command = command;
|
||||
CommandParameter = commandParameter; // 파라미터 저장
|
||||
SubMenuItems = subMenuItems ?? new List<MenuItemData>(); // null인 경우 빈 리스트로 초기화
|
||||
IsSeparator = isSeparator;
|
||||
IsEnabled = isEnabled;
|
||||
this.depth = depth; // 메뉴 아이템의 깊이 설정
|
||||
|
||||
SetupDepthAndParent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모든 하위 메뉴 항목의 깊이와 부모 관계를 구성합니다.
|
||||
/// </summary>
|
||||
/// <remarks>이 메서드는 하위 메뉴 항목 컬렉션을 반복하며 깊이와
|
||||
/// 부모 속성을 설정합니다. 깊이는 현재 항목의 깊이에 따라 증가하고, 부모는
|
||||
/// 현재 항목으로 설정됩니다. 하위 메뉴 항목에 자체 하위 메뉴 항목이 포함된 경우, 이 메서드는 재귀적으로 호출되어
|
||||
/// 깊이와 부모 관계를 구성합니다.</remarks>
|
||||
protected void SetupDepthAndParent()
|
||||
{
|
||||
for (int i = 0; i < SubMenuItems.Count; i++)
|
||||
{
|
||||
SubMenuItems[i].Depth = this.depth + 1; // 하위 메뉴 아이템의 깊이를 현재 아이템의 깊이 + 1로 설정
|
||||
SubMenuItems[i].Parent = this; // 하위 메뉴 아이템의 부모를 현재 아이템으로 설정
|
||||
if (SubMenuItems[i].SubMenuItems.Count > 0)
|
||||
{
|
||||
SubMenuItems[i].SetupDepthAndParent(); // 재귀적으로 하위 메뉴 아이템의 깊이 설정
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -82,6 +127,8 @@ namespace UVC.UI.Menu
|
||||
public void AddSubMenuItem(MenuItemData subItem)
|
||||
{
|
||||
if (IsSeparator) return; // 구분선에는 하위 메뉴를 추가할 수 없음
|
||||
subItem.Depth = this.depth + 1; // 하위 메뉴 아이템의 깊이를 현재 아이템의 깊이 + 1로 설정
|
||||
subItem.Parent = this; // 하위 메뉴 아이템의 부모를 현재 아이템으로 설정
|
||||
SubMenuItems.Add(subItem);
|
||||
}
|
||||
|
||||
@@ -92,9 +139,20 @@ namespace UVC.UI.Menu
|
||||
/// <returns>구분선 역할을 하는 새로운 `MenuItemData` 객체입니다.</returns>
|
||||
public static MenuItemData CreateSeparator(string itemId = null)
|
||||
{
|
||||
// 구분선은 특정 동작이나 표시 이름이 필요 없으므로, displayNameKey는 비워두고 command는 null로 설정합니다.
|
||||
// 구분선은 특정 동작이나 표시 이름이 필요 없으므로, displayName는 비워두고 command는 null로 설정합니다.
|
||||
return new MenuItemData(itemId ?? $"separator_{Guid.NewGuid()}", string.Empty, null, null, null, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정된 메뉴 항목에 연관된 하위 메뉴 항목이 있는지 여부를 확인합니다.
|
||||
/// </summary>
|
||||
/// <param name="ItemId">확인할 메뉴 항목의 고유 식별자입니다.</param>
|
||||
/// 지정된 메뉴 항목에 대한 하위 메뉴 항목이 있으면 <see langword="true"/>를 반환하고, 그렇지 않으면 <see langword="false"/>를 반환합니다. </returns>
|
||||
public bool HasSubMenuItems(string ItemId)
|
||||
{
|
||||
return SubMenuItems.Exists(item => item.ItemId == ItemId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class TopMenuModel
|
||||
|
||||
Reference in New Issue
Block a user