#nullable enable
using UnityEngine;
using UnityEngine.UIElements;
using UVC.Core;
using UVC.Studio.Manager;
using UVC.UIToolkit;
using UVC.UIToolkit.Util;
namespace UVC.Studio
{
/// UIDocument 타입 충돌 방지용 마커 래퍼 — Static UI Document
public sealed class StaticUIDocument { public readonly UIDocument Value; public StaticUIDocument(UIDocument v) { Value = v; } }
/// UIDocument 타입 충돌 방지용 마커 래퍼 — Dynamic UI Document
public sealed class DynamicUIDocument { public readonly UIDocument Value; public DynamicUIDocument(UIDocument v) { Value = v; } }
/// UIDocument 타입 충돌 방지용 마커 래퍼 — Modal UI Document
public sealed class ModalUIDocument { public readonly UIDocument Value; public ModalUIDocument(UIDocument v) { Value = v; } }
public class StudioSceneContext : InjectorSceneContext
{
///
/// StudioSceneContext 인스턴스에 접근하기 위한 편의 프로퍼티
///
public static new StudioSceneContext? Instance => InjectorSceneContext.Instance as StudioSceneContext;
[SerializeField] private GizmoUndoBridge? gizmoUndoBridge;
[SerializeField] private UndoRedoManager? undoRedoManager;
[SerializeField] private UIDocument? staticUI;
[SerializeField] private UIDocument? dynamicUI;
[SerializeField] private UIDocument? modalUI;
///
/// Scene 라이프사이클 서비스들을 등록합니다.
/// 씬 로드 시 자동 호출되며, 씬 전환 시 자동으로 정리됩니다.
///
protected override void RegisterSceneServices()
{
base.RegisterSceneServices();
// 여기에 StudioSceneContext에 등록할 서비스들을 추가하세요.
Injector.RegisterSingleton();
if(gizmoUndoBridge != null) Injector.RegisterInstance(gizmoUndoBridge, ServiceLifetime.Scene);
if(undoRedoManager != null) Injector.RegisterInstance(undoRedoManager, ServiceLifetime.Scene);
if(staticUI != null) {
staticUI.name = "StaticUI";
UTKPointerBlocker.Register(staticUI.rootVisualElement);
Injector.RegisterInstance(new StaticUIDocument(staticUI), ServiceLifetime.Scene);
UTKTopMenu? topMenu = staticUI.rootVisualElement.Q("topMenu");
if(topMenu != null) {
Injector.RegisterInstance(topMenu, ServiceLifetime.Scene);
}
UTKToolBar? toolBar = staticUI.rootVisualElement.Q("toolBar");
if(toolBar != null) {
Injector.RegisterInstance(toolBar, ServiceLifetime.Scene);
}
UTKPropertyTabListWindow? propertyWindow = staticUI.rootVisualElement.Q("propertyWindow");
if(propertyWindow != null) {
Injector.RegisterInstance(propertyWindow, ServiceLifetime.Scene);
// StageObjectManager 등록
var stageObjectManager = new StageObjectManager();
Injector.RegisterInstance(stageObjectManager);
// SelectionManager 등록 (StageObjectManager, PropertyWindow 의존)
var selectionManager = new SelectionManager(stageObjectManager, propertyWindow);
Injector.RegisterInstance(selectionManager);
}
}
if(dynamicUI != null) {
dynamicUI.name = "DynamicUI";
Injector.RegisterInstance(new DynamicUIDocument(dynamicUI), ServiceLifetime.Scene);
}
if(modalUI != null) {
modalUI.name = "ModalUI";
Injector.RegisterInstance(new ModalUIDocument(modalUI), ServiceLifetime.Scene);
// 모달 UI를 사용하는 모든 UTK 컴포넌트에 루트 설정 필수
UTKAlert.SetRoot(modalUI.rootVisualElement);
UTKColorPicker.SetRoot(modalUI.rootVisualElement);
UTKDatePicker.SetRoot(modalUI.rootVisualElement);
UTKModal.SetRoot(modalUI.rootVisualElement);
UTKNotification.SetRoot(modalUI.rootVisualElement);
UTKToast.SetRoot(modalUI.rootVisualElement);
}
var explorerWindow = new UTKTreeListWindow();
explorerWindow.Title = "Explorer";
Injector.RegisterInstance(explorerWindow, ServiceLifetime.Scene);
var libraryWindow = new UTKAccordionListWindow();
libraryWindow.Title = "Library";
Injector.RegisterInstance(libraryWindow, ServiceLifetime.Scene);
}
}
}