Files
Infratest/Assets/Code/Infrastructure/UI/UIService.cs
T

145 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Code.Infrastructure.EventBus;
using Reflex.Core;
using Reflex.Extensions;
using Reflex.Injectors;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Code.Infrastructure.UI
{
public interface IUIService
{
void OpenPanel(UIPanelType uiPanelType);
void ClosePanel(UIPanelType uiPanelType);
void TryLoadCreatePanel(UIPanelType uiPanelType, Transform parent = null);
void TryRemovePanel(UIPanelType uiPanelType);
void SetCanvasCamera(UnityEngine.Camera camera);
UIPanel TryGetSinglePanel(UIPanelType panelType);
void TryRemovePanel(UIPanel panel);
}
// Крайне неудобно пользоваться
public class UIService : IUIPanelLoadedHandle, IUIService
{
private Dictionary<UIPanelType, UIPanel> _loadedSinglePanels = new();
private Dictionary<UIPanelType, List<UIPanel>> _loadedMultiplePanels = new();
private EventBus.EventBus _eventBus;
private IUIFactory _factory;
public UIService(EventBus.EventBus eventBus, IUIFactory factory)
{
_eventBus = eventBus;
_factory = factory;
eventBus.Subscribe(this);
}
public void SetCanvasCamera(UnityEngine.Camera camera)
{
_factory.Canvas.worldCamera = camera;
_factory.Canvas.planeDistance = 0.3f;
}
public void OpenPanel(UIPanelType uiPanelType)
{
_loadedSinglePanels[uiPanelType].gameObject.SetActive(true);
_loadedSinglePanels[uiPanelType].Open();
}
// TODO Close event
public void ClosePanel(UIPanelType uiPanelType)
{
_loadedSinglePanels[uiPanelType].Close(() =>
{
_loadedSinglePanels[uiPanelType].gameObject.SetActive(false);
});
}
public void TryLoadCreatePanel(UIPanelType uiPanelType, Transform parent = null) => _factory.LoadPanel(uiPanelType, parent);
public void UIPanelLoaded(UIPanel panel, UIPanelType panelType)
{
panel.PanelType = panelType;
if (!_factory.CheckIsMultiple(panelType))
_loadedSinglePanels.Add(panelType, panel);
else
{
if (!_loadedMultiplePanels.ContainsKey(panelType))
_loadedMultiplePanels.Add(panelType, new List<UIPanel>());
_loadedMultiplePanels[panelType].Add(panel);
}
if (panel.InjectMeSenpai)
GameObjectInjector.InjectRecursive(panel.gameObject, Container.RootContainer);
else
GameObjectInjector.InjectSingle(panel.gameObject, Container.RootContainer);
// GameObjectInjector.InjectRecursive(panel.gameObject, SceneManager.GetActiveScene().GetSceneContainer()); // Скорее всего будут нужны компоненты текущей сцены
panel.FireCreatedEvent();
}
public void TryRemovePanel(UIPanelType uiPanelType)
{
if (_factory.CheckIsMultiple(uiPanelType))
{
UnityEngine.Debug.LogError("Это для единичных панелей олух");
return;
}
_loadedSinglePanels[uiPanelType].Close(() =>
{
_loadedSinglePanels[uiPanelType].gameObject.SetActive(false);
RemovePanel(uiPanelType);
});
}
public void TryRemovePanel(UIPanel panel)
{
panel.Close(() =>
{
panel.gameObject.SetActive(false);
RemovePanel(panel);
// _eventBus.RaiseEvent<IUIMultiplePanelHandle>(x=> x.UIMultiplePanelRemoved(panel));
});
}
private void RemovePanel(UIPanelType panelType)
{
if (!_factory.CheckIsMultiple(panelType))
{
var temp = _loadedSinglePanels[panelType];
_loadedSinglePanels.Remove(panelType);
temp.FireRemovedEvent();
_factory.ReleasePanel(temp);
}
else
{
var temp = _loadedMultiplePanels[panelType];
_loadedMultiplePanels.Remove(panelType);
foreach (var panel in temp)
{
panel.FireRemovedEvent();
_factory.ReleasePanel(panel);
}
}
}
private void RemovePanel(UIPanel panel)
{
_loadedMultiplePanels[panel.PanelType].Remove(panel);
panel.FireRemovedEvent();
_factory.ReleasePanel(panel);
if(_loadedMultiplePanels[panel.PanelType].Count == 0) _loadedMultiplePanels.Remove(panel.PanelType);
}
public UIPanel TryGetSinglePanel(UIPanelType panelType) => _loadedSinglePanels.GetValueOrDefault(panelType);
public List<UIPanel> TryGetMultiplePanels(UIPanelType panelType) => _loadedMultiplePanels.GetValueOrDefault(panelType);
}
}