#nullable enable using System; using System.Collections.Generic; using UVC.UI.Commands; namespace UVC.UI.Menu { /// /// 메뉴 시스템에서 개별 메뉴 아이템을 나타내는 데이터 클래스입니다. /// 각 메뉴 아이템은 고유 ID, 표시 이름, 실행될 명령, 하위 메뉴 등을 가질 수 있습니다. /// public class MenuItemData { /// /// 메뉴 아이템의 고유 식별자입니다. /// public string ItemId { get; private set; } /// /// UI에 표시될 메뉴 아이템의 이름입니다. 다국어 키도 가능합니다. /// 이 키를 사용하여 실제 표시될 텍스트를 가져옵니다. /// public string DisplayName { get; private set; } /// /// 메뉴 아이템이 선택되었을 때 실행될 명령입니다. /// `ICommand` 인터페이스를 구현하는 객체여야 합니다. /// 실행할 동작이 없는 경우 null일 수 있습니다. /// public ICommand? Command { get; private set; } /// /// 실행 시 전달될 파라미터입니다. /// 이 파라미터는 에서 호출 시 사용될 수 있습니다. /// public object? CommandParameter { get; set; } /// /// 이 메뉴 아이템에 속한 하위 메뉴 아이템들의 목록입니다. /// 하위 메뉴가 없는 경우 빈 리스트입니다. /// public List? SubMenuItems { get; private set; } /// /// 이 메뉴 아이템이 시각적인 구분선인지 여부를 나타냅니다. /// `true`이면 메뉴 UI에서 다른 아이템들과 구분되는 선으로 표시됩니다. /// public bool IsSeparator { get; private set; } /// /// 메뉴 아이템의 활성화 상태를 나타냅니다. /// `false`일 경우 메뉴 아이템은 비활성화되어 사용자가 선택할 수 없습니다. /// 기본값은 `true` (활성화) 입니다. /// public bool IsEnabled { get; set; } /// /// 메뉴 아이템의 단축키 문자열입니다. /// 예: "Ctrl+S", "Ctrl+Shift+N" 등 /// 단축키가 없는 경우 null 또는 빈 문자열입니다. /// public string? Shortcut { get; set; } private int depth = 0; // 메뉴 아이템의 깊이 (하위 메뉴의 레벨) /// /// 계층 구조에서 현재 개체의 깊이를 가져옵니다. /// public int Depth { get { return depth; } // 외부에서 접근할 수 있도록 프로퍼티로 노출 internal set { depth = value; } } private MenuItemData? parent = null; /// /// 현재 메뉴 항목의 부모 메뉴 항목을 가져옵니다. /// public MenuItemData? Parent { get { return parent; } // 외부에서 접근할 수 있도록 프로퍼티로 노출 internal set { parent = value; } } /// /// `MenuItemData` 클래스의 새 인스턴스를 초기화합니다. /// /// 메뉴 아이템의 고유 ID. /// 표시 이름. 표시 이름의 다국어 키도 가능. /// 실행할 명령 (선택 사항). /// 커맨드에 전달할 파라미터 (선택 사항). /// 하위 메뉴 아이템 목록 (선택 사항). /// 구분선 여부 (선택 사항, 기본값: false). /// 활성화 상태 (선택 사항, 기본값: true). /// 단축키 문자열 (선택 사항). 예: "Ctrl+S" public MenuItemData(string itemId, string displayName, ICommand? command = null, object? commandParameter = null, List? subMenuItems = null, bool isSeparator = false, bool isEnabled = true, int depth = 0, string? shortcut = null) { ItemId = itemId; DisplayName = displayName; Command = command; CommandParameter = commandParameter; // 파라미터 저장 SubMenuItems = subMenuItems ?? new List(); // null인 경우 빈 리스트로 초기화 IsSeparator = isSeparator; IsEnabled = isEnabled; this.depth = depth; // 메뉴 아이템의 깊이 설정 Shortcut = shortcut; // 단축키 문자열 설정 SetupDepthAndParent(); } /// /// 모든 하위 메뉴 항목의 깊이와 부모 관계를 구성합니다. /// /// 이 메서드는 하위 메뉴 항목 컬렉션을 반복하며 깊이와 /// 부모 속성을 설정합니다. 깊이는 현재 항목의 깊이에 따라 증가하고, 부모는 /// 현재 항목으로 설정됩니다. 하위 메뉴 항목에 자체 하위 메뉴 항목이 포함된 경우, 이 메서드는 재귀적으로 호출되어 /// 깊이와 부모 관계를 구성합니다. 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(); // 재귀적으로 하위 메뉴 아이템의 깊이 설정 } } } /// /// 현재 메뉴 아이템에 하위 메뉴 아이템을 추가합니다. /// 만약 현재 아이템이 구분선(`IsSeparator`가 `true`)이라면, 하위 메뉴를 추가할 수 없습니다. /// /// 추가할 하위 메뉴 아이템. public void AddSubMenuItem(MenuItemData subItem) { if (IsSeparator) return; // 구분선에는 하위 메뉴를 추가할 수 없음 subItem.Depth = this.depth + 1; // 하위 메뉴 아이템의 깊이를 현재 아이템의 깊이 + 1로 설정 subItem.Parent = this; // 하위 메뉴 아이템의 부모를 현재 아이템으로 설정 SubMenuItems.Add(subItem); } /// /// 메뉴 UI에서 시각적인 구분선으로 사용될 `MenuItemData` 객체를 생성합니다. /// /// 구분선의 고유 ID. null일 경우 GUID를 사용하여 자동으로 생성됩니다. /// 구분선 역할을 하는 새로운 `MenuItemData` 객체입니다. public static MenuItemData CreateSeparator(string itemId = null) { // 구분선은 특정 동작이나 표시 이름이 필요 없으므로, displayName는 비워두고 command는 null로 설정합니다. return new MenuItemData(itemId ?? $"separator_{Guid.NewGuid()}", string.Empty, null, null, null, true); } /// /// 지정된 메뉴 항목에 연관된 하위 메뉴 항목이 있는지 여부를 확인합니다. /// /// 확인할 메뉴 항목의 고유 식별자입니다. /// 지정된 메뉴 항목에 대한 하위 메뉴 항목이 있으면 를 반환하고, 그렇지 않으면 를 반환합니다. public bool HasSubMenuItems(string ItemId) { return SubMenuItems.Exists(item => item.ItemId == ItemId); } } public class TopMenuModel { public List MenuItems { get; private set; } public TopMenuModel() { MenuItems = new List(); } // LoadMenuItems 메서드는 Controller에서 직접 데이터를 채움 //public void LoadMenuItems(string jsonString) { } } }