Files
XRLib/Assets/Scripts/SampleProject/UI/Menu/SampleProjectTopMenuController.cs
2025-06-11 19:24:08 +09:00

131 lines
6.8 KiB
C#

using UVC.UI.Menu;
using System.Collections.Generic;
using UVC.UI.Commands; // DebugLogCommand 등 기본 Command 사용 시
// using SampleProject.UI.Commands; // 프로젝트별 Command 사용 시
using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용
using System;
namespace SampleProject.UI.Menu
{
public class SampleProjectTopMenuController : TopMenuController
{
protected override void Awake()
{
// 1. 동일한 GameObject에서 SampleProjectTopMenuView 컴포넌트 검색
view = GetComponent<SampleProjectTopMenuView>();
// 2. 동일한 GameObject에 없다면, 자식 GameObject에서 검색
if (view == null)
{
view = GetComponentInChildren<SampleProjectTopMenuView>();
}
// view가 여전히 null이라면, 부모 타입(TopMenuView)으로 다시 한번 검색 (선택 사항)
if (view == null)
{
ULog.Warning("SampleProjectTopMenuView를 찾을 수 없어 TopMenuView로 검색합니다.");
base.Awake(); // 부모의 Awake를 호출하여 TopMenuView를 찾도록 시도
}
}
protected override void Start()
{
// model과 _locManager는 부모 클래스에서 protected로 선언되어 접근 가능
// 만약 부모의 Start 로직을 완전히 대체하고 싶지 않다면 base.Start()를 호출할 수 있습니다.
// 여기서는 메뉴 아이템 구성을 완전히 새로 하므로 base.Start()를 호출하지 않거나,
// 호출 후 model.MenuItems.Clear()를 다시 수행합니다.
model = new TopMenuModel(); // 새 모델 인스턴스 또는 프로젝트별 모델 사용
_locManager = UVC.Locale.LocalizationManager.Instance; // LocalizationManager 인스턴스 가져오기
if (view == null)
{
ULog.Error("SampleProjectTopMenuView가 Inspector에서 할당되지 않았거나 찾을 수 없습니다.");
return;
}
if (_locManager == null)
{
ULog.Error("LocalizationManager 인스턴스를 찾을 수 없습니다. 메뉴 텍스트가 올바르게 표시되지 않을 수 있습니다.");
}
InitializeMenuItems(); // 프로젝트별 메뉴 아이템 초기화 메서드 호출
view.ClearMenuItems();
view.CreateMenuItems(model.MenuItems, view.MenuContainer);
view.OnMenuItemClicked += HandleMenuItemClicked; // 부모의 핸들러 재사용 또는 override
if (_locManager != null)
{
_locManager.OnLanguageChanged += HandleLanguageChanged; // 부모의 핸들러 재사용 또는 override
}
ULog.Debug("SampleProjectTopMenuController Start 실행됨");
}
// 부모의 OnDestroy를 그대로 사용하거나, 필요시 override하여 로직 추가/변경
// protected new void OnDestroy()
// {
// base.OnDestroy();
// // 프로젝트별 리소스 해제 로직 추가
// }
/// <summary>
/// 프로젝트에 특화된 메뉴 아이템들을 초기화합니다.
/// TopMenuController의 InitializeMenuItems를 override하거나,
/// 이처럼 새로운 메서드를 만들어 사용할 수 있습니다.
/// </summary>
protected override void InitializeMenuItems()
{
model.MenuItems.Clear(); // 기존 메뉴 아이템 제거
// 예시: "파일" 메뉴는 유지하되, "새 프로젝트" 제거 및 "프로젝트 설정" 추가
model.MenuItems.Add(new MenuItemData("file", "menu_file", subMenuItems: new List<MenuItemData>
{
new MenuItemData("file_new_file", "menu_file_new_file", new DebugLogCommand("[SampleProject] 새 파일 선택됨")),
new MenuItemData("file_open", "menu_file_open", new DebugLogCommand("[SampleProject] 파일 열기 선택됨")),
MenuItemData.CreateSeparator("file_sep_sample1"),
new MenuItemData("project_settings", "project_settings_key", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨")), // 프로젝트별 메뉴 아이템
MenuItemData.CreateSeparator("file_sep_sample2"),
new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand())
}));
// "편집" 메뉴는 그대로 사용 (부모 클래스의 메뉴 아이템 구성을 재활용하거나 여기서 다시 정의)
model.MenuItems.Add(new MenuItemData("edit", "menu_edit", subMenuItems: new List<MenuItemData>
{
new MenuItemData("edit_undo", "menu_edit_undo", new DebugLogCommand("[SampleProject] 실행 취소 선택됨")),
new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("[SampleProject] 다시 실행 선택됨"))
}));
// "도움말" 메뉴 추가 (프로젝트별)
model.MenuItems.Add(new MenuItemData("help", "menu_help_key", subMenuItems: new List<MenuItemData>
{
new MenuItemData("help_about", "menu_about_key", new DebugLogCommand("[SampleProject] 프로그램 정보 선택됨"))
}));
if (_locManager != null)
{
// 언어 메뉴는 부모와 동일하게 유지하거나, 프로젝트별로 변경 가능
model.MenuItems.Add(new MenuItemData("language", "menu_language", subMenuItems: new List<MenuItemData>
{
new MenuItemData("lang_ko", "menu_lang_korean", new ChangeLanguageCommand("ko-KR", _locManager)),
new MenuItemData("lang_en", "menu_lang_english", new ChangeLanguageCommand("en-US", _locManager)),
// new MenuItemData("lang_jp", "menu_lang_japanese", new ChangeLanguageCommand("ja-JP", _locManager)) // 예: 일본어 추가
}));
}
else
{
ULog.Warning("[SampleProject] LocalizationManager가 null이므로 언어 변경 메뉴를 초기화할 수 없습니다.");
}
}
// HandleMenuItemClicked와 HandleLanguageChanged는 필요에 따라 override하여
// 프로젝트별 특별한 처리를 추가할 수 있습니다.
// 예시:
// protected override void HandleMenuItemClicked(MenuItemData clickedItemData)
// {
// base.HandleMenuItemClicked(clickedItemData); // 부모 로직 실행
// ULog.Debug($"[SampleProject] 메뉴 아이템 클릭됨: {clickedItemData.ItemId}");
// // 프로젝트별 추가 클릭 처리 로직
// }
}
}