탐색기, 라이브러리, 화면 객체 배치
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
#nullable enable
|
||||
using UnityEngine;
|
||||
using UVC.UI.List.ComponentList;
|
||||
using UVC.Factory.Playback;
|
||||
@@ -8,14 +9,84 @@ using UVC.UI.Toolbar.View;
|
||||
using UVC.UI.Window;
|
||||
using UVC.Factory.Component;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace UVC.UI.Toolbar
|
||||
{
|
||||
/// <summary>
|
||||
/// 툴바 액션 타입을 나타내는 열거형입니다.
|
||||
/// </summary>
|
||||
public enum ToolbarActionType
|
||||
{
|
||||
/// <summary>
|
||||
/// 일반 버튼 클릭
|
||||
/// </summary>
|
||||
Standard,
|
||||
/// <summary>
|
||||
/// 라디오 버튼 선택 변경
|
||||
/// </summary>
|
||||
Radio,
|
||||
/// <summary>
|
||||
/// 토글 버튼 상태 변경
|
||||
/// </summary>
|
||||
Toggle,
|
||||
/// <summary>
|
||||
/// 확장 버튼의 하위 버튼 선택 변경
|
||||
/// </summary>
|
||||
Expandable
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 툴바 액션 정보를 담는 클래스입니다.
|
||||
/// </summary>
|
||||
public class ToolbarActionEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// 액션을 발생시킨 툴바 아이템의 텍스트입니다.
|
||||
/// </summary>
|
||||
public string Text { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 액션에 따른 값입니다.
|
||||
/// Standard: null
|
||||
/// Radio: 선택된 항목의 텍스트 (전부 해제 시 null)
|
||||
/// Toggle: true/false
|
||||
/// Expandable: 선택된 하위 버튼의 텍스트
|
||||
/// </summary>
|
||||
public object? Value { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 액션 타입입니다.
|
||||
/// </summary>
|
||||
public ToolbarActionType ActionType { get; set; }
|
||||
}
|
||||
|
||||
public class Toolbar : MonoBehaviour
|
||||
{
|
||||
protected ToolbarModel model;
|
||||
protected ToolbarView view;
|
||||
|
||||
/// <summary>
|
||||
/// 툴바의 버튼이 클릭되거나 상태가 변경될 때 발생하는 이벤트입니다.
|
||||
/// raiseEvent가 true일 때만 호출됩니다.
|
||||
/// </summary>
|
||||
public event Action<ToolbarActionEventArgs>? OnAction;
|
||||
|
||||
/// <summary>
|
||||
/// OnAction 이벤트를 발생시킵니다.
|
||||
/// </summary>
|
||||
/// <param name="text">액션을 발생시킨 툴바 아이템의 텍스트</param>
|
||||
/// <param name="actionType">액션 타입</param>
|
||||
/// <param name="value">액션에 따른 값 (Standard: null, Radio: 선택된 항목 텍스트 또는 null, Toggle: bool, Expandable: 선택된 하위 버튼 텍스트)</param>
|
||||
protected void RaiseOnAction(string text, ToolbarActionType actionType, object? value = null)
|
||||
{
|
||||
OnAction?.Invoke(new ToolbarActionEventArgs
|
||||
{
|
||||
Text = text,
|
||||
ActionType = actionType,
|
||||
Value = value
|
||||
});
|
||||
}
|
||||
|
||||
protected void Awake()
|
||||
{
|
||||
@@ -62,10 +133,61 @@ namespace UVC.UI.Toolbar
|
||||
return;
|
||||
}
|
||||
|
||||
// 모든 버튼 타입의 이벤트 구독
|
||||
SubscribeButtonEvents();
|
||||
|
||||
// ToolbarView 초기화 및 렌더링
|
||||
view.Initialize(model);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모델 내의 모든 버튼에 대해 이벤트를 구독합니다.
|
||||
/// </summary>
|
||||
private void SubscribeButtonEvents()
|
||||
{
|
||||
if (model?.Items == null) return;
|
||||
|
||||
foreach (var item in model.Items)
|
||||
{
|
||||
switch (item)
|
||||
{
|
||||
case ToolbarRadioButton radioButton:
|
||||
// 라디오 버튼의 선택 상태 변경 이벤트 구독
|
||||
radioButton.OnToggleStateChanged += (isSelected) =>
|
||||
{
|
||||
if (isSelected)
|
||||
{
|
||||
RaiseOnAction(radioButton.GroupName, ToolbarActionType.Radio, radioButton.Text);
|
||||
}
|
||||
};
|
||||
break;
|
||||
|
||||
case ToolbarToggleButton toggleButton:
|
||||
// 토글 버튼의 상태 변경 이벤트 구독
|
||||
toggleButton.OnToggleStateChanged += (isSelected) =>
|
||||
{
|
||||
RaiseOnAction(toggleButton.Text, ToolbarActionType.Toggle, isSelected);
|
||||
};
|
||||
break;
|
||||
|
||||
case ToolbarExpandableButton expandableButton:
|
||||
// 확장 버튼의 하위 버튼 선택 변경 이벤트 구독
|
||||
expandableButton.OnSubButtonSelectionChanged += (expandableText, selectedSubButtonText) =>
|
||||
{
|
||||
RaiseOnAction(expandableText, ToolbarActionType.Expandable, selectedSubButtonText);
|
||||
};
|
||||
break;
|
||||
|
||||
case ToolbarStandardButton standardButton:
|
||||
// 표준 버튼의 클릭 이벤트 구독
|
||||
standardButton.OnClicked += () =>
|
||||
{
|
||||
RaiseOnAction(standardButton.Text, ToolbarActionType.Standard, null);
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ToolbarModel generateModel()
|
||||
{
|
||||
@@ -175,6 +297,157 @@ namespace UVC.UI.Toolbar
|
||||
return toolbarModel;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정된 그룹 내에서 특정 라디오 버튼을 선택하거나, 모든 선택을 해제합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupName">라디오 버튼 그룹의 이름입니다.</param>
|
||||
/// <param name="buttonToSelect">선택할 라디오 버튼입니다. null을 전달하면 그룹 내 모든 버튼의 선택이 해제됩니다.</param>
|
||||
/// <param name="raiseEvent">true이면 OnAction 이벤트를 발생시키고, false이면 UI만 업데이트합니다. 기본값은 true입니다.</param>
|
||||
/// <returns>작업 성공 여부입니다. 모델이 없거나 그룹이 존재하지 않으면 false를 반환합니다.</returns>
|
||||
public bool SetRadioButtonSelection(string groupName, ToolbarRadioButton buttonToSelect, bool raiseEvent = false)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
Debug.LogError("Toolbar: ToolbarModel이 설정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
bool result = model.SetRadioButtonSelection(groupName, buttonToSelect, raiseEvent);
|
||||
if (result)
|
||||
{
|
||||
// Icon의 ImageColorChangeBehaviour 색상 상태 업데이트
|
||||
if (view != null)
|
||||
{
|
||||
view.UpdateRadioGroupIconColors(groupName, buttonToSelect);
|
||||
}
|
||||
|
||||
if (raiseEvent)
|
||||
{
|
||||
RaiseOnAction(groupName, ToolbarActionType.Radio, buttonToSelect?.Text);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹 이름으로 라디오 버튼 그룹 내 모든 선택을 해제합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupName">라디오 버튼 그룹의 이름입니다.</param>
|
||||
/// <param name="raiseEvent">true이면 OnAction 이벤트를 발생시키고, false이면 UI만 업데이트합니다. 기본값은 true입니다.</param>
|
||||
/// <returns>작업 성공 여부입니다. 모델이 없거나 그룹이 존재하지 않으면 false를 반환합니다.</returns>
|
||||
public bool ClearRadioButtonSelection(string groupName, bool raiseEvent = false)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
Debug.LogError("Toolbar: ToolbarModel이 설정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
bool result = model.ClearRadioButtonSelection(groupName, raiseEvent);
|
||||
if (result)
|
||||
{
|
||||
// Icon의 ImageColorChangeBehaviour 색상 상태 업데이트 (모두 비선택)
|
||||
if (view != null)
|
||||
{
|
||||
view.UpdateRadioGroupIconColors(groupName, null);
|
||||
}
|
||||
|
||||
if (raiseEvent)
|
||||
{
|
||||
RaiseOnAction(groupName, ToolbarActionType.Radio, null);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 지정된 토글 버튼의 선택 상태를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="toggleButton">상태를 변경할 토글 버튼입니다.</param>
|
||||
/// <param name="isSelected">설정할 선택 상태입니다.</param>
|
||||
/// <param name="raiseEvent">true이면 OnAction 이벤트를 발생시키고, false이면 UI만 업데이트합니다. 기본값은 true입니다.</param>
|
||||
public void SetToggleButtonState(ToolbarToggleButton toggleButton, bool isSelected, bool raiseEvent = false)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
Debug.LogError("Toolbar: ToolbarModel이 설정되지 않았습니다.");
|
||||
return;
|
||||
}
|
||||
model.SetToggleButtonState(toggleButton, isSelected, raiseEvent);
|
||||
|
||||
// Icon의 ImageColorChangeBehaviour 색상 상태 업데이트
|
||||
if (view != null)
|
||||
{
|
||||
view.UpdateIconColorState(toggleButton, isSelected);
|
||||
}
|
||||
|
||||
if (raiseEvent)
|
||||
{
|
||||
RaiseOnAction(toggleButton.Text, ToolbarActionType.Toggle, isSelected);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 텍스트로 라디오 버튼을 찾아 선택 상태를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="groupName">라디오 버튼 그룹의 이름입니다.</param>
|
||||
/// <param name="buttonText">선택할 라디오 버튼의 텍스트입니다. null 또는 빈 문자열을 전달하면 그룹 내 모든 버튼의 선택이 해제됩니다.</param>
|
||||
/// <param name="raiseEvent">true이면 OnAction 이벤트를 발생시키고, false이면 UI만 업데이트합니다. 기본값은 true입니다.</param>
|
||||
/// <returns>작업 성공 여부입니다. 모델이 없거나 버튼을 찾지 못하면 false를 반환합니다.</returns>
|
||||
public bool SetRadioButtonSelection(string groupName, string buttonText, bool raiseEvent = false)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
Debug.LogError("Toolbar: ToolbarModel이 설정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
var button = model.SetRadioButtonSelectionByText(groupName, buttonText, raiseEvent);
|
||||
bool result = button != null || string.IsNullOrEmpty(buttonText);
|
||||
if (result)
|
||||
{
|
||||
// Icon의 ImageColorChangeBehaviour 색상 상태 업데이트
|
||||
if (view != null)
|
||||
{
|
||||
view.UpdateRadioGroupIconColors(groupName, button);
|
||||
}
|
||||
|
||||
if (raiseEvent)
|
||||
{
|
||||
RaiseOnAction(groupName, ToolbarActionType.Radio, button?.Text);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 텍스트로 토글 버튼을 찾아 선택 상태를 설정합니다.
|
||||
/// </summary>
|
||||
/// <param name="buttonText">상태를 변경할 토글 버튼의 텍스트입니다.</param>
|
||||
/// <param name="isSelected">설정할 선택 상태입니다.</param>
|
||||
/// <param name="raiseEvent">true이면 OnAction 이벤트를 발생시키고, false이면 UI만 업데이트합니다. 기본값은 true입니다.</param>
|
||||
/// <returns>작업 성공 여부입니다. 모델이 없거나 버튼을 찾지 못하면 false를 반환합니다.</returns>
|
||||
public bool SetToggleButtonState(string buttonText, bool isSelected, bool raiseEvent = false)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
Debug.LogError("Toolbar: ToolbarModel이 설정되지 않았습니다.");
|
||||
return false;
|
||||
}
|
||||
var button = model.SetToggleButtonStateByText(buttonText, isSelected, raiseEvent);
|
||||
if (button != null)
|
||||
{
|
||||
// Icon의 ImageColorChangeBehaviour 색상 상태 업데이트
|
||||
if (view != null)
|
||||
{
|
||||
view.UpdateIconColorState(button, isSelected);
|
||||
}
|
||||
|
||||
if (raiseEvent)
|
||||
{
|
||||
RaiseOnAction(buttonText, ToolbarActionType.Toggle, isSelected);
|
||||
}
|
||||
}
|
||||
return button != null;
|
||||
}
|
||||
|
||||
protected void OnDestroy()
|
||||
{
|
||||
model = null;
|
||||
|
||||
Reference in New Issue
Block a user