ComponentList > 표시 설정 바로가기 기능 개발

This commit is contained in:
logonkhi
2025-08-12 19:06:20 +09:00
parent 3bb2573c51
commit 6f019476b0
12 changed files with 163 additions and 33 deletions

View File

@@ -8,7 +8,6 @@ using UVC.Data.Core;
using UVC.Factory;
using UVC.Factory.Alarm;
using UVC.Factory.Component;
using UVC.UI.List.ComponentList;
using UVC.Factory.Modal.Settings;
using UVC.Factory.Playback;
using UVC.Log;
@@ -108,7 +107,7 @@ namespace SampleProject
private void SetupTopMenu()
{
if(topMenu == null)
if (topMenu == null)
{
Debug.LogError("TopMenuController is not assigned in SceneMain.");
return;
@@ -167,7 +166,7 @@ namespace SampleProject
private void SetupSideMenu()
{
if(sideMenu == null)
if (sideMenu == null)
{
Debug.LogError("SideMenuController is not assigned in SceneMain.");
return;

View File

@@ -8,14 +8,31 @@ namespace UVC.Factory.Modal.Settings
public class AlarmSettingTabContent : MonoBehaviour, ITabContent
{
/// <summary>
/// 탭 콘텐츠에 데이터를 전달합니다.
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void SetContentData(object? data)
{
}
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void UpdateContentData(object? data)
{
}
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
public UniTask OnCloseAsync()
{
return UniTask.CompletedTask;
}
}
}

View File

@@ -77,12 +77,17 @@ namespace UVC.Factory.Modal.Settings
Debug.Log($"OnOrderChanged: {data.Id} from {oldIndex} to {newIndex}");
UpdateData();
}
private void OnChangedItemData(ListItemData data)
{
Debug.Log($"OnChangedItemData: {data.Id} - {data.DisplayName}");
UpdateData();
}
/// <summary>
/// 탭 콘텐츠에 데이터를 전달합니다.
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
private void UpdateData()
{
Debug.Log($"UpdateData: draggableList != null:{draggableList != null}, viewData != null:{viewData != null}, configKey:{key}");
@@ -104,6 +109,23 @@ namespace UVC.Factory.Modal.Settings
}
}
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void UpdateContentData(object? data)
{
}
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
public UniTask OnCloseAsync()
{
return UniTask.CompletedTask;
}
void OnDestroy()
{
if (draggableList != null)
@@ -112,11 +134,6 @@ namespace UVC.Factory.Modal.Settings
draggableList.OnChangedItemData -= OnChangedItemData;
}
}
public UniTask OnCloseAsync()
{
return UniTask.CompletedTask;
}
}

View File

@@ -12,8 +12,11 @@ namespace UVC.Factory.Modal.Settings
{
[SerializeField]
public TabController tabController; // 탭 컨트롤러
/// <summary>
/// 탭 콘텐츠에 데이터를 전달합니다.
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void SetContentData(object? data)
{
if (tabController != null)
@@ -31,6 +34,37 @@ namespace UVC.Factory.Modal.Settings
}
}
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void UpdateContentData(object? data)
{
if (data != null && data is string content)
{
Debug.Log($"UpdateContentData: {content}");
if (content.StartsWith("shortcut:"))
{
// 특정 탭으로 이동
string[] parts = content.Substring("shortcut:".Length - 1).Split('>');
if (parts.Length > 1)
{
// 시간차를 계산해 0.5초 후에 탭을 활성화
UniTask.Delay(500).ContinueWith(() => {
string tabKey = parts[1];
Debug.Log($"ActivateTab2: {tabKey}");
tabController?.ActivateTab(tabKey);
});
}
}
}
}
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
public async UniTask OnCloseAsync()
{
await UserSetting.SaveToAppData(); // 데이터 마스크를 앱 데이터에 저장합니다.

View File

@@ -14,12 +14,28 @@ namespace UVC.Factory.Modal.Settings
[SerializeField]
private TextMeshProUGUI text;
/// <summary>
/// 탭 콘텐츠에 데이터를 전달합니다.
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void SetContentData(object? data)
{
Debug.Log("GeneralInfoTabContent: SetContentData called");
text.text = $"Version: {Application.version}";
}
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void UpdateContentData(object? data)
{
}
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
public UniTask OnCloseAsync()
{
Debug.Log("GeneralInfoTabContent: OnClose called");

View File

@@ -7,12 +7,27 @@ namespace UVC.Factory.Modal.Settings
{
public class InputSettingTabContent : MonoBehaviour, ITabContent
{
/// <summary>
/// 탭 콘텐츠에 데이터를 전달합니다.
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void SetContentData(object? data)
{
}
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
public void UpdateContentData(object? data)
{
}
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
public UniTask OnCloseAsync()
{
return UniTask.CompletedTask;

View File

@@ -22,12 +22,12 @@ namespace UVC.Factory.Modal.Settings
if (tabController != null)
{
// 코드로 탭 설정하기
SetupTabs();
SetupTabs(content);
}
}
private void SetupTabs()
private void SetupTabs(ModalContent content)
{
// 1. TabConfig 설정
tabController?.AddTabConfig("GeneralInfo", "일반 정보", "Prefabs/UI/Modal/Setting/GeneralInfoTabContent", "Prefabs/UI/images/icon_info", null, true);
@@ -38,10 +38,27 @@ namespace UVC.Factory.Modal.Settings
// 2. 컨트롤러 초기화
tabController?.Initialize();
tabController.OnTabChanged += (index) =>
if (tabController != null)
{
Debug.Log($"탭이 변경되었습니다: {index}");
};
tabController.OnTabChanged += (index) =>
{
Debug.Log($"탭이 변경되었습니다: {index}");
};
if(content.Message.StartsWith("shortcut:"))
{
// 특정 탭으로 이동
string[] parts = content.Message.Substring("shortcut:".Length).Split('>');
if (parts.Length > 0)
{
//시간차를 계산해 0.5초 후에 탭을 활성화
UniTask.Delay(500).ContinueWith(() => {
Debug.Log($"ActivateTab: {parts[0]}");
string tabKey = parts[0];
tabController.ActivateTab(tabKey, content.Message);
});
}
}
}
}
}
}

View File

@@ -168,7 +168,7 @@ namespace UVC.UI.List.ComponentList
var modalContent = new ModalContent("Prefabs/UI/Modal/SettingModal")
{
Title = "설정 카테고리",
Message = $"DisplaySetting>{itemData.categoryName}"
Message = $"shortcut:DisplaySetting>{itemData.categoryName}"
};
// 4. 설정 모달을 엽니다. await 키워드를 사용하여 모달이 닫힐 때까지 기다립니다.
@@ -211,6 +211,7 @@ namespace UVC.UI.List.ComponentList
FactoryObject? obj = FactoryObjectManager.Instance.FindById(itemData.factoryObjectInfo.Id);
if (obj != null)
{
FactoryObjectSelectionManager.Instance.Deselect(obj);
// 객체를 비활성화(숨기기)합니다.
obj.gameObject.SetActive(false);

View File

@@ -15,6 +15,12 @@ namespace UVC.UI.Tab
/// <param name="data">전달할 데이터 객체</param>
void SetContentData(object? data);
/// <summary>
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
/// </summary>
/// <param name="data">전달할 데이터 객체</param>
void UpdateContentData(object? data);
/// <summary>
/// 닫힐 때 실행되는 로직을 처리합니다.
/// </summary>

View File

@@ -47,14 +47,14 @@ namespace UVC.UI.Tab
///
/// private object CreateAGVData()
/// {
/// Dictionary<string, string> data = new Dictionary<string, string>();
/// return data;
/// Dictionary<string, string> updateData = new Dictionary<string, string>();
/// return updateData;
/// }
///
/// private object CreateAlarmData()
/// {
/// Dictionary<string, string> data = new Dictionary<string, string>();
/// return data;
/// Dictionary<string, string> updateData = new Dictionary<string, string>();
/// return updateData;
/// }
/// }
/// </code>
@@ -200,7 +200,7 @@ namespace UVC.UI.Tab
/// <summary>
/// 탭 변경 이벤트 처리
/// </summary>
private void HandleTabChanged(int newTabIndex)
private void HandleTabChanged(int newTabIndex, object? updateData = null)
{
if (_tabModel == null || tabView == null) return;
@@ -208,7 +208,7 @@ namespace UVC.UI.Tab
if (activeTabData == null) return;
// TabView에 탭 변경 전달
tabView.UpdateActiveTab(newTabIndex, _tabModel.PrevTabIndex, activeTabData).ContinueWith(() =>
tabView.UpdateActiveTab(newTabIndex, _tabModel.PrevTabIndex, activeTabData, updateData).ContinueWith(() =>
{
// 외부 이벤트 발생
OnTabChanged?.Invoke(newTabIndex);
@@ -223,17 +223,21 @@ namespace UVC.UI.Tab
/// <summary>
/// ID로 특정 탭을 활성화합니다.
/// </summary>
public void ActivateTab(string tabID)
/// <param name="tabID">활성화할 탭의 ID</param>
/// <param name="updateData">탭에 전달할 데이터 (선택적)</param>
public void ActivateTab(string tabID, object? updateData = null)
{
_tabModel?.SwitchToTab(tabID);
_tabModel?.SwitchToTab(tabID, updateData);
}
/// <summary>
/// 인덱스로 특정 탭을 활성화합니다.
/// </summary>
public void ActivateTab(int tabIndex)
/// <param name="tabIndex">활성화할 탭의 인덱스</param>
/// <param name="updateData">탭에 전달할 데이터 (선택적)</param>
public void ActivateTab(int tabIndex, object? updateData = null)
{
_tabModel?.SwitchToTab(tabIndex);
_tabModel?.SwitchToTab(tabIndex, updateData);
}
/// <summary>

View File

@@ -37,7 +37,7 @@ namespace UVC.UI.Tab
/// <summary>
/// 탭이 변경될 때 발생하는 이벤트입니다.
/// </summary>
public event Action<int>? OnTabChanged;
public event Action<int, object?>? OnTabChanged;
/// <summary>
/// 새로운 탭을 모델에 추가합니다.
@@ -58,7 +58,8 @@ namespace UVC.UI.Tab
/// 탭 인덱스로 탭을 전환합니다.
/// </summary>
/// <param name="tabIndex">활성화할 탭의 인덱스</param>
public void SwitchToTab(int tabIndex)
/// <param name="updateData">탭 전환 시 전달할 데이터 (선택적)</param>
public void SwitchToTab(int tabIndex, object? updateData = null)
{
// 인덱스 범위 확인
if (tabIndex < 0 || tabIndex >= _tabs.Count)
@@ -79,20 +80,21 @@ namespace UVC.UI.Tab
_activeTabIndex = tabIndex;
// 이벤트 발생
OnTabChanged?.Invoke(_activeTabIndex);
OnTabChanged?.Invoke(_activeTabIndex, updateData);
}
/// <summary>
/// 탭 ID로 탭을 전환합니다.
/// </summary>
/// <param name="tabID">활성화할 탭의 ID</param>
public void SwitchToTab(string tabID)
/// <param name="updateData">탭 전환 시 전달할 데이터 (선택적)</param>
public void SwitchToTab(string tabID, object? updateData = null)
{
for (int i = 0; i < _tabs.Count; i++)
{
if (_tabs[i].tabID == tabID)
{
SwitchToTab(i);
SwitchToTab(i, updateData);
return;
}
}

View File

@@ -217,7 +217,8 @@ namespace UVC.UI.Tab
/// <param name="tabIndex">활성화할 탭 인덱스</param>
/// <param name="prevTabIndex">현재 활성화 된 탭 인덱스. 없으면 -1</param>
/// <param name="tabData">탭 데이터</param>
public async UniTask UpdateActiveTab(int tabIndex, int prevTabIndex, TabData tabData)
/// <param name="updateData">업데이트할 데이터 (선택적)</param>
public async UniTask UpdateActiveTab(int tabIndex, int prevTabIndex, TabData tabData, object? updateData = null)
{
if (tabIndex < 0 || tabIndex >= _tabConfigs.Count) return;
var config = _tabConfigs[tabIndex];
@@ -273,6 +274,7 @@ namespace UVC.UI.Tab
// 데이터 업데이트
ITabContent? tabContent = activeContent.GetComponent<ITabContent>();
tabContent?.SetContentData(tabData.contentData);
if(updateData != null) tabContent?.UpdateContentData(updateData);
}
// 탭 버튼 상태 업데이트