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

132 lines
5.6 KiB
C#

using UnityEngine;
using UVC.Locale;
using System.Collections.Generic;
using UVC.UI.Commands;
using UVC.Log;
using System;
namespace UVC.UI.Menu
{
public class TopMenuController : MonoBehaviour
{
protected TopMenuView view;
protected TopMenuModel model;
protected LocalizationManager _locManager;
protected virtual void Awake()
{
// 1. 동일한 GameObject에서 TopMenuView 컴포넌트 검색
view = GetComponent<TopMenuView>();
// 2. 동일한 GameObject에 없다면, 자식 GameObject에서 검색
if (view == null)
{
view = GetComponentInChildren<TopMenuView>();
}
}
protected virtual void Start()
{
model = new TopMenuModel();
_locManager = LocalizationManager.Instance;
if (view == null)
{
ULog.Error("TopMenuView가 Inspector에서 할당되지 않았습니다.");
return;
}
if (_locManager == null)
{
ULog.Error("LocalizationManager 인스턴스를 찾을 수 없습니다. 메뉴 텍스트가 올바르게 표시되지 않을 수 있습니다.");
// _locManager가 null이어도 메뉴 구조는 생성될 수 있도록 진행합니다.
// TopMenuView에서 _locManager null 체크를 통해 텍스트 처리를 합니다.
}
InitializeMenuItems();
view.ClearMenuItems();
// menuContainer가 TopMenuView 내부에 public으로 노출되어 있다고 가정합니다.
// 만약 private이라면, TopMenuView에 menuContainer를 전달받는 public 메서드가 필요할 수 있습니다.
view.CreateMenuItems(model.MenuItems, view.MenuContainer);
view.OnMenuItemClicked += HandleMenuItemClicked;
if (_locManager != null)
{
_locManager.OnLanguageChanged += HandleLanguageChanged;
}
}
protected virtual void OnDestroy()
{
if (view != null)
{
view.OnMenuItemClicked -= HandleMenuItemClicked;
}
if (_locManager != null)
{
_locManager.OnLanguageChanged -= HandleLanguageChanged;
}
}
protected virtual void InitializeMenuItems()
{
model.MenuItems.Clear();
model.MenuItems.Add(new MenuItemData("file", "menu_file", subMenuItems: new List<MenuItemData>
{
new MenuItemData("file_new", "menu_file_new", subMenuItems: new List<MenuItemData>
{
new MenuItemData("file_new_project", "menu_file_new_project", new DebugLogCommand("새 프로젝트 선택됨 (Command)")),
new MenuItemData("file_new_file", "menu_file_new_file", new DebugLogCommand("새 파일 선택됨 (Command)"))
}),
new MenuItemData("file_open", "menu_file_open", new DebugLogCommand("파일 열기 선택됨 (Command)")),
MenuItemData.CreateSeparator("file_sep1"), // 구분선 추가
new MenuItemData("file_save", "menu_file_save", command: new DebugLogCommand("저장 선택됨 (Command)") , subMenuItems: new List<MenuItemData> // 저장 메뉴에 Command 추가
{
new MenuItemData("file_save_as", "menu_file_save_as", new DebugLogCommand("다른 이름으로 저장 선택됨 (Command)"))
}),
MenuItemData.CreateSeparator("file_sep2"), // 또 다른 구분선 추가
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("실행 취소 선택됨 (Command)")),
new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("다시 실행 선택됨 (Command)")),
MenuItemData.CreateSeparator("edit_sep1"),
new MenuItemData("preferences", "menu_preferences", new DebugLogCommand("환경설정 선택됨 (Command)"))
}));
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))
}));
}
else
{
ULog.Warning("LocalizationManager가 null이므로 언어 변경 메뉴를 초기화할 수 없습니다.");
}
}
protected virtual void HandleMenuItemClicked(MenuItemData clickedItemData)
{
if (clickedItemData.IsSeparator) return; // 구분선은 클릭 액션이 없음
ULog.Debug($"메뉴 아이템 클릭됨: {clickedItemData.ItemId} (Key: {clickedItemData.DisplayNameKey})");
clickedItemData.Command?.Execute();
}
protected virtual void HandleLanguageChanged(string newLanguageCode)
{
ULog.Debug($"언어 변경 감지: {newLanguageCode}. 메뉴 텍스트 업데이트 중...");
if (view != null && model != null)
{
view.UpdateAllMenuTexts(model.MenuItems);
}
}
}
}