menu 개발 중. 언어 변경 시 반영 않됨
This commit is contained in:
131
Assets/Scripts/UVC/UI/Menu/TopMenuController.cs
Normal file
131
Assets/Scripts/UVC/UI/Menu/TopMenuController.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user