using System.Collections.Generic; using UVC.Factory.Playback; using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용 using UVC.UI.Commands; using UVC.UI.Menu; using UVC.UI.Modal; namespace SampleProject.UI.Menu { /// /// 를 상속받아 특정 프로젝트(예: SampleProject)에 맞게 /// 상단 메뉴의 동작을 커스터마이징하는 컨트롤러 클래스입니다. /// 이 클래스는 프로젝트 고유의 메뉴 구조를 정의하고, 특정 View()와 상호작용하며, /// 메뉴 아이템 클릭 시 프로젝트별 추가 로직을 수행할 수 있습니다. /// /// /// 이 컨트롤러는 와 함께 사용되도록 설계되었습니다. /// public class SampleProjectTopMenuController : TopMenuController { /// /// SampleProject에 특화된 메뉴 아이템들을 정의하고 모델()에 추가합니다. /// 이 메서드는 를 오버라이드하여 /// 프로젝트 고유의 메뉴 구조를 설정합니다. /// protected override async void InitializeMenuItems() { model.MenuItems.Clear(); // 메뉴를 새로 구성하므로, 기존에 있을 수 있는 아이템들을 모두 제거합니다. // '메인 메뉴' (가상) 아래에 '파일', '편집', '도움말', '언어' 등의 주 메뉴를 구성합니다. // 실제 UI에서는 'menu'라는 최상위 아이템 없이 바로 '파일', '편집' 등이 표시될 수 있습니다. // 여기서는 구조화를 위해 하나의 루트 아이템 아래에 다른 메뉴들을 추가하는 형태로 구성합니다. // 만약 최상위 메뉴가 여러 개 병렬로 존재해야 한다면, model.MenuItems.Add()를 여러 번 호출하면 됩니다. // 이 예제에서는 하나의 "menu"라는 논리적 그룹 아래 모든 것을 배치합니다. // 실제 표시 방식은 TopMenuView의 CreateMenuItems 로직에 따라 달라집니다. // 현재 TopMenuController의 InitializeMenuItems는 여러 최상위 메뉴를 직접 model.MenuItems에 추가하므로, // 그 방식을 따르려면 아래의 "menu" 그룹 없이 바로 model.MenuItems.Add(new MenuItemData("file", ...)) 등을 호출합니다. // 여기서는 TopMenuController와 유사하게 직접 최상위 메뉴들을 추가하는 방식으로 수정합니다. model.MenuItems.Add(new MenuItemData("menu", "menu", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨"), subMenuItems: new List { new MenuItemData("file", "menu_file", subMenuItems: new List { new MenuItemData("file_new_file", "menu_file_new_file", new DebugLogCommand("[SampleProject] 새 파일 선택됨")), // "파일 열기" 메뉴 아이템 생성 시 isEnabled: false로 설정하여 비활성화 상태로 초기화합니다. // 부모 TopMenuController의 HandleMenuItemClicked에서 이 상태를 확인하여 클릭을 무시합니다. new MenuItemData("file_open", "menu_file_open", new DebugLogCommand("[SampleProject] 파일 열기 선택됨"), isEnabled: false), MenuItemData.CreateSeparator("file_sep_sample1"), new MenuItemData("project_settings", "project_settings", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨")), // 프로젝트별 메뉴 아이템 MenuItemData.CreateSeparator("file_sep_sample2"), new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand()) }), new MenuItemData("Playback", "Playback", new PlaybackCommand()), new MenuItemData("modal", "모달", subMenuItems: new List { new MenuItemData("alert", "Alert", new ActionCommand(async () => { await Alert.Show("알림", "이것은 간단한 알림 메시지입니다."); await Alert.Show("경고", "데이터를 저장할 수 없습니다.", "알겠습니다"); await Alert.Show("error", "error_network_not", "button_retry"); })), new MenuItemData("confirm", "Confirm", new ActionCommand(async () => { bool result = await Confirm.Show("확인", "이것은 간단한 알림 메시지입니다."); ULog.Debug($"사용자가 확인 버튼을 눌렀나요? {result}"); result = await Confirm.Show("경고", "데이터를 저장할 수 없습니다.", "알겠습니다", "아니요"); ULog.Debug($"사용자가 알림을 확인했나요? {result}"); result = await Confirm.Show("error", "error_network_not", "button_retry", "button_cancel"); ULog.Debug($"사용자가 네트워크 오류 알림을 확인했나요? {result}"); })) }), new MenuItemData("language", "menu_language", subMenuItems: new List { new MenuItemData("lang_ko", "menu_lang_korean", new ChangeLanguageCommand("ko")), new MenuItemData("lang_en", "menu_lang_english", new ChangeLanguageCommand("en")), // new MenuItemData("lang_jp", "menu_lang_japanese", new ChangeLanguageCommand("ja-JP")) // 예: 일본어 추가 }) })); // 특정 조건에 따라 메뉴 아이템의 활성화 상태를 동적으로 변경하는 예시입니다. // 예를 들어, 특정 기능이 사용 가능한 상태일 때만 관련 메뉴를 활성화할 수 있습니다. // bool isProjectLoaded = CheckProjectLoadedStatus(); // 실제 프로젝트 로드 상태를 확인하는 가상 메서드 // if (isProjectLoaded) // { // // SetMenuItemEnabled 메서드는 부모 클래스 TopMenuController로부터 상속받아 사용합니다. // // 이 메서드는 메뉴 모델의 IsEnabled 값을 변경하고, View의 해당 버튼 UI 상태(interactable)도 업데이트합니다. // SetMenuItemEnabled("project_settings", true); // ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 활성화되었습니다 (조건부 로직)."); // } } // HandleMenuItemClicked와 HandleLanguageChanged 메서드는 // 부모 클래스(TopMenuController)에 이미 구현된 기본적인 처리 로직을 사용합니다. // (메뉴 아이템의 IsEnabled 상태 체크, Command 실행, 메뉴 텍스트 업데이트 등) // 만약 이 프로젝트에서만 특별히 추가하거나 변경해야 할 동작이 있다면, // 아래와 같이 해당 메서드들을 override하여 커스터마이징할 수 있습니다. // 예시: 메뉴 아이템 클릭 시 추가적인 프로젝트별 로직 수행 // protected override void HandleMenuItemClicked(MenuItemData clickedItemData) // { // // 1. 부모 클래스의 HandleMenuItemClicked를 호출하여 기본적인 처리(IsEnabled 체크, Command 실행 등)를 수행합니다. // base.HandleMenuItemClicked(clickedItemData); // // // 2. 부모 로직 실행 후, 이 프로젝트에 필요한 추가적인 동작을 수행합니다. // // 주의: base.HandleMenuItemClicked 내부에서 IsEnabled가 false이면 Command가 실행되지 않고 반환될 수 있습니다. // // 따라서, 여기서도 IsEnabled를 다시 한번 확인하거나, Command가 실제로 실행되었는지 여부를 알 수 있는 방법이 필요할 수 있습니다. // // (예: base.HandleMenuItemClicked가 bool 값을 반환하도록 수정) // // 현재는 부모 메서드가 void이므로, 아래 로직은 부모 메서드 실행 후 항상 시도됩니다. // if (clickedItemData.IsEnabled && !clickedItemData.IsSeparator) // 활성화된 실제 메뉴 아이템에 대해서만 // { // ULog.Debug($"[SampleProject] 메뉴 아이템 '{clickedItemData.ItemId}' 클릭됨 (SampleProjectController에서 추가 처리)"); // // // 프로젝트별 추가 클릭 처리 로직 예시 // if (clickedItemData.ItemId == "project_settings") // { // // OpenProjectSpecificSettingsWindow(); // 프로젝트 설정 창을 여는 메서드 호출 등 // ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴에 대한 특별한 동작 수행!"); // } // } // } // 예시: 언어 변경 시 추가적인 프로젝트별 UI 업데이트 수행 // protected override void HandleLanguageChanged(string newLanguageCode) // { // // 1. 부모 클래스의 HandleLanguageChanged를 호출하여 기본 메뉴 텍스트 업데이트를 수행합니다. // base.HandleLanguageChanged(newLanguageCode); // // // 2. 이 프로젝트에 필요한 추가적인 언어 변경 관련 동작을 수행합니다. // ULog.Debug($"[SampleProject] 언어가 '{newLanguageCode}'(으)로 변경됨 (SampleProjectController에서 추가 처리)"); // // 예: 메뉴 외 다른 UI 요소들의 텍스트도 업데이트 // // UpdateOtherProjectSpecificUITexts(newLanguageCode); // } // --- 아래는 메뉴 아이템의 활성화 상태를 외부에서 제어하는 예시 메서드들입니다. --- // (주석 처리되어 있으며, 필요시 주석을 해제하고 실제 로직을 구현하여 사용할 수 있습니다.) /// /// (예시 메서드) 프로젝트 설정 메뉴의 접근 가능성(활성화 상태)을 업데이트합니다. /// 예를 들어, 프로젝트가 로드되었을 때만 "프로젝트 설정" 메뉴를 활성화할 수 있습니다. /// /// 프로젝트가 로드되었는지 여부입니다. // public void UpdateProjectSettingsMenuAccess(bool projectLoaded) // { // // "project_settings"라는 ID를 가진 메뉴 아이템의 활성화 상태를 변경합니다. // // SetMenuItemEnabled 메서드는 부모 클래스 TopMenuController에 정의되어 있으며, // // 모델 데이터 변경 및 UI(버튼의 interactable 속성) 업데이트를 모두 처리합니다. // SetMenuItemEnabled("project_settings", projectLoaded); // // if (projectLoaded) // { // ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 활성화되었습니다."); // } // else // { // ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 비활성화되었습니다."); // } // } /// /// (예시 메서드) 실제 프로젝트 로드 상태를 확인하는 로직입니다. /// /// 프로젝트가 로드되었으면 true, 아니면 false를 반환합니다. // private bool CheckProjectLoadedStatus() // { // // 여기에 실제 프로젝트 로드 상태를 확인하는 코드를 구현합니다. // // 예: return ProjectManager.Instance.IsProjectCurrentlyLoaded; // return true; // 이 예시에서는 항상 true를 반환하도록 되어 있습니다. 실제 구현 필요. // } // --- 예시 코드 끝 --- } }