You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/Services/Implementation/DebugPanelServiceImpl.cs

162 lines
4.4 KiB
C#

3 months ago
namespace SRDebugger.Services.Implementation
{
using System;
using Internal;
using SRF;
using SRF.Service;
using UI;
using UnityEngine;
[Service(typeof (IDebugPanelService))]
public class DebugPanelServiceImpl : ScriptableObject, IDebugPanelService, IDisposable
{
private DebugPanelRoot _debugPanelRootObject;
public event Action<IDebugPanelService, bool> VisibilityChanged;
private bool _isVisible;
private bool? _cursorWasVisible;
private CursorLockMode? _cursorLockMode;
public DebugPanelRoot RootObject
{
get { return _debugPanelRootObject; }
}
public bool IsLoaded
{
get { return _debugPanelRootObject != null; }
}
public bool IsVisible
{
get { return IsLoaded && _isVisible; }
set
{
if (_isVisible == value)
{
return;
}
if (value)
{
if (!IsLoaded)
{
Load();
}
SRDebuggerUtil.EnsureEventSystemExists();
_debugPanelRootObject.CanvasGroup.alpha = 1.0f;
_debugPanelRootObject.CanvasGroup.interactable = true;
_debugPanelRootObject.CanvasGroup.blocksRaycasts = true;
_cursorWasVisible = Cursor.visible;
_cursorLockMode = Cursor.lockState;
if (Settings.Instance.AutomaticallyShowCursor)
{
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
}
}
else
{
if (IsLoaded)
{
_debugPanelRootObject.CanvasGroup.alpha = 0.0f;
_debugPanelRootObject.CanvasGroup.interactable = false;
_debugPanelRootObject.CanvasGroup.blocksRaycasts = false;
}
if (_cursorWasVisible.HasValue)
{
Cursor.visible = _cursorWasVisible.Value;
_cursorWasVisible = null;
}
if (_cursorLockMode.HasValue)
{
Cursor.lockState = _cursorLockMode.Value;
_cursorLockMode = null;
}
}
_isVisible = value;
if (VisibilityChanged != null)
{
VisibilityChanged(this, _isVisible);
}
}
}
public DefaultTabs? ActiveTab
{
get
{
if (_debugPanelRootObject == null)
{
return null;
}
return _debugPanelRootObject.TabController.ActiveTab;
}
}
public void OpenTab(DefaultTabs tab)
{
if (!IsVisible)
{
IsVisible = true;
}
_debugPanelRootObject.TabController.OpenTab(tab);
}
public void Unload()
{
if (_debugPanelRootObject == null)
{
return;
}
IsVisible = false;
_debugPanelRootObject.CachedGameObject.SetActive(false);
Destroy(_debugPanelRootObject.CachedGameObject);
_debugPanelRootObject = null;
}
private void Load()
{
var prefab = Resources.Load<DebugPanelRoot>(SRDebugPaths.DebugPanelPrefabPath);
if (prefab == null)
{
Debug.LogError("[SRDebugger] Error loading debug panel prefab");
return;
}
_debugPanelRootObject = SRInstantiate.Instantiate(prefab);
_debugPanelRootObject.name = "Panel";
DontDestroyOnLoad(_debugPanelRootObject);
_debugPanelRootObject.CachedTransform.SetParent(Hierarchy.Get("SRDebugger"), true);
SRDebuggerUtil.EnsureEventSystemExists();
}
public void Dispose()
{
if (_debugPanelRootObject != null)
{
DestroyImmediate(_debugPanelRootObject.gameObject);
}
}
}
}