278 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
namespace SRDebugger.Services.Implementation
 | 
						|
{
 | 
						|
    using System;
 | 
						|
    using System.Collections.Generic;
 | 
						|
    using System.ComponentModel;
 | 
						|
    using System.Linq;
 | 
						|
    using Internal;
 | 
						|
    using SRF;
 | 
						|
    using SRF.Service;
 | 
						|
    using UI.Controls;
 | 
						|
    using UI.Other;
 | 
						|
    using UnityEngine;
 | 
						|
 | 
						|
    [Service(typeof (IPinnedUIService))]
 | 
						|
    public class PinnedUIServiceImpl : SRServiceBase<IPinnedUIService>, IPinnedUIService
 | 
						|
    {
 | 
						|
        private readonly List<OptionsControlBase> _controlList = new List<OptionsControlBase>();
 | 
						|
 | 
						|
        private readonly Dictionary<OptionDefinition, OptionsControlBase> _pinnedObjects =
 | 
						|
            new Dictionary<OptionDefinition, OptionsControlBase>();
 | 
						|
 | 
						|
        private bool _queueRefresh;
 | 
						|
        private PinnedUIRoot _uiRoot;
 | 
						|
 | 
						|
        public DockConsoleController DockConsoleController
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_uiRoot == null)
 | 
						|
                {
 | 
						|
                    Load();
 | 
						|
                }
 | 
						|
                return _uiRoot.DockConsoleController;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public event Action<OptionDefinition, bool> OptionPinStateChanged;
 | 
						|
        public event Action<RectTransform> OptionsCanvasCreated;
 | 
						|
 | 
						|
        public bool IsProfilerPinned
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_uiRoot == null)
 | 
						|
                {
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
                return _uiRoot.Profiler.activeSelf;
 | 
						|
            }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_uiRoot == null)
 | 
						|
                {
 | 
						|
                    Load();
 | 
						|
                }
 | 
						|
                _uiRoot.Profiler.SetActive(value);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void Pin(OptionDefinition obj, int order = -1)
 | 
						|
        {
 | 
						|
            if (_uiRoot == null)
 | 
						|
            {
 | 
						|
                Load();
 | 
						|
            }
 | 
						|
 | 
						|
            if (_pinnedObjects.ContainsKey(obj))
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            var control = OptionControlFactory.CreateControl(obj);
 | 
						|
 | 
						|
            control.CachedTransform.SetParent(_uiRoot.Container, false);
 | 
						|
 | 
						|
            if (order >= 0)
 | 
						|
            {
 | 
						|
                control.CachedTransform.SetSiblingIndex(order);
 | 
						|
            }
 | 
						|
 | 
						|
            _pinnedObjects.Add(obj, control);
 | 
						|
            _controlList.Add(control);
 | 
						|
 | 
						|
            OnPinnedStateChanged(obj, true);
 | 
						|
        }
 | 
						|
 | 
						|
        public void Unpin(OptionDefinition obj)
 | 
						|
        {
 | 
						|
            if (!_pinnedObjects.ContainsKey(obj))
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            var control = _pinnedObjects[obj];
 | 
						|
 | 
						|
            _pinnedObjects.Remove(obj);
 | 
						|
            _controlList.Remove(control);
 | 
						|
 | 
						|
            Destroy(control.CachedGameObject);
 | 
						|
 | 
						|
            OnPinnedStateChanged(obj, false);
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnPinnedStateChanged(OptionDefinition option, bool isPinned)
 | 
						|
        {
 | 
						|
            if (OptionPinStateChanged != null)
 | 
						|
            {
 | 
						|
                OptionPinStateChanged(option, isPinned);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void UnpinAll()
 | 
						|
        {
 | 
						|
            foreach (var op in _pinnedObjects)
 | 
						|
            {
 | 
						|
                Destroy(op.Value.CachedGameObject);
 | 
						|
            }
 | 
						|
 | 
						|
            _pinnedObjects.Clear();
 | 
						|
            _controlList.Clear();
 | 
						|
        }
 | 
						|
 | 
						|
        public bool HasPinned(OptionDefinition option)
 | 
						|
        {
 | 
						|
            return _pinnedObjects.ContainsKey(option);
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Awake()
 | 
						|
        {
 | 
						|
            base.Awake();
 | 
						|
 | 
						|
            CachedTransform.SetParent(Hierarchy.Get("SRDebugger"));
 | 
						|
        }
 | 
						|
 | 
						|
        private void Load()
 | 
						|
        {
 | 
						|
            var prefab = Resources.Load<PinnedUIRoot>(SRDebugPaths.PinnedUIPrefabPath);
 | 
						|
 | 
						|
            if (prefab == null)
 | 
						|
            {
 | 
						|
                Debug.LogError("[SRDebugger.PinnedUI] Error loading ui prefab");
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            var instance = SRInstantiate.Instantiate(prefab);
 | 
						|
            instance.CachedTransform.SetParent(CachedTransform, false);
 | 
						|
 | 
						|
            _uiRoot = instance;
 | 
						|
            UpdateAnchors();
 | 
						|
            SRDebug.Instance.PanelVisibilityChanged += OnDebugPanelVisibilityChanged;
 | 
						|
 | 
						|
            Service.Options.OptionsUpdated += OnOptionsUpdated;
 | 
						|
            Service.Options.OptionsValueUpdated += OptionsOnPropertyChanged;
 | 
						|
 | 
						|
            if (OptionsCanvasCreated != null)
 | 
						|
            {
 | 
						|
                OptionsCanvasCreated(_uiRoot.Canvas.GetComponent<RectTransform>());
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateAnchors()
 | 
						|
        {
 | 
						|
            // Setup alignment of Profiler/Options splitter
 | 
						|
            switch (Settings.Instance.ProfilerAlignment)
 | 
						|
            {
 | 
						|
                case PinAlignment.BottomLeft:
 | 
						|
                case PinAlignment.TopLeft:
 | 
						|
                case PinAlignment.CenterLeft:
 | 
						|
                    _uiRoot.Profiler.transform.SetSiblingIndex(0);
 | 
						|
                    break;
 | 
						|
 | 
						|
                case PinAlignment.BottomRight:
 | 
						|
                case PinAlignment.TopRight:
 | 
						|
                case PinAlignment.CenterRight:
 | 
						|
                    _uiRoot.Profiler.transform.SetSiblingIndex(1);
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
 | 
						|
            // Setup alignment of Profiler vertical layout group
 | 
						|
            switch (Settings.Instance.ProfilerAlignment)
 | 
						|
            {
 | 
						|
                case PinAlignment.TopRight:
 | 
						|
                case PinAlignment.TopLeft:
 | 
						|
                    _uiRoot.ProfilerVerticalLayoutGroup.childAlignment = TextAnchor.UpperCenter;
 | 
						|
                    break;
 | 
						|
 | 
						|
                case PinAlignment.BottomRight:
 | 
						|
                case PinAlignment.BottomLeft:
 | 
						|
                    _uiRoot.ProfilerVerticalLayoutGroup.childAlignment = TextAnchor.LowerCenter;
 | 
						|
                    break;
 | 
						|
 | 
						|
                case PinAlignment.CenterLeft:
 | 
						|
                case PinAlignment.CenterRight:
 | 
						|
                    _uiRoot.ProfilerVerticalLayoutGroup.childAlignment = TextAnchor.MiddleCenter;
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
 | 
						|
            _uiRoot.ProfilerHandleManager.SetAlignment(Settings.Instance.ProfilerAlignment);
 | 
						|
 | 
						|
            // Setup alignment of options flow layout group
 | 
						|
            switch (Settings.Instance.OptionsAlignment)
 | 
						|
            {
 | 
						|
                case PinAlignment.BottomLeft: // OptionsBottomLeft
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.LowerLeft;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.TopLeft:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.UpperLeft;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.BottomRight:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.LowerRight;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.TopRight:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.UpperRight;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.BottomCenter:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.LowerCenter;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.TopCenter:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.UpperCenter;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.CenterLeft:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.MiddleLeft;
 | 
						|
                    break;
 | 
						|
                case PinAlignment.CenterRight:
 | 
						|
                    _uiRoot.OptionsLayoutGroup.childAlignment = TextAnchor.MiddleRight;
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void Update()
 | 
						|
        {
 | 
						|
            base.Update();
 | 
						|
 | 
						|
            if (_queueRefresh)
 | 
						|
            {
 | 
						|
                _queueRefresh = false;
 | 
						|
                Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnOptionsUpdated(object sender, EventArgs eventArgs)
 | 
						|
        {
 | 
						|
            // Check for removed options.
 | 
						|
            var pinned = _pinnedObjects.Keys.ToList();
 | 
						|
 | 
						|
            foreach (var op in pinned)
 | 
						|
            {
 | 
						|
                if (!Service.Options.Options.Contains(op))
 | 
						|
                {
 | 
						|
                    Unpin(op);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void OptionsOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
 | 
						|
        {
 | 
						|
            _queueRefresh = true;
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnDebugPanelVisibilityChanged(bool isVisible)
 | 
						|
        {
 | 
						|
            // Refresh bindings when debug panel is no longer visible
 | 
						|
            if (!isVisible)
 | 
						|
            {
 | 
						|
                _queueRefresh = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void Refresh()
 | 
						|
        {
 | 
						|
            for (var i = 0; i < _controlList.Count; i++)
 | 
						|
            {
 | 
						|
                _controlList[i].Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |