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 _loadedSinglePanels = new(); private Dictionary> _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()); _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(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 TryGetMultiplePanels(UIPanelType panelType) => _loadedMultiplePanels.GetValueOrDefault(panelType); } }