113 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRDebugger.UI.Tabs
 | |
| {
 | |
|     using System.Collections.Generic;
 | |
|     using System.Text;
 | |
|     using Controls;
 | |
|     using Services;
 | |
|     using SRF;
 | |
|     using SRF.Service;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     public class InfoTabController : SRMonoBehaviourEx
 | |
|     {
 | |
|         public const char Tick = '\u2713';
 | |
|         public const char Cross = '\u00D7';
 | |
|         public const string NameColor = "#BCBCBC";
 | |
|         private Dictionary<string, InfoBlock> _infoBlocks = new Dictionary<string, InfoBlock>();
 | |
| 
 | |
|         [RequiredField] public InfoBlock InfoBlockPrefab;
 | |
| 
 | |
|         [RequiredField] public RectTransform LayoutContainer;
 | |
| 
 | |
|         protected override void OnEnable()
 | |
|         {
 | |
|             base.OnEnable();
 | |
|             Refresh();
 | |
|         }
 | |
| 
 | |
|         public void Refresh()
 | |
|         {
 | |
|             var s = SRServiceManager.GetService<ISystemInformationService>();
 | |
| 
 | |
|             foreach (var category in s.GetCategories())
 | |
|             {
 | |
|                 if (!_infoBlocks.ContainsKey(category))
 | |
|                 {
 | |
|                     var block = CreateBlock(category);
 | |
|                     _infoBlocks.Add(category, block);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             foreach (var kv in _infoBlocks)
 | |
|             {
 | |
|                 FillInfoBlock(kv.Value, s.GetInfo(kv.Key));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void FillInfoBlock(InfoBlock block, IList<InfoEntry> info)
 | |
|         {
 | |
|             var sb = new StringBuilder();
 | |
| 
 | |
|             var maxTitleLength = 0;
 | |
| 
 | |
|             foreach (var systemInfo in info)
 | |
|             {
 | |
|                 if (systemInfo.Title.Length > maxTitleLength)
 | |
|                 {
 | |
|                     maxTitleLength = systemInfo.Title.Length;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             maxTitleLength += 2;
 | |
| 
 | |
|             var first = true;
 | |
|             foreach (var i in info)
 | |
|             {
 | |
|                 if (first)
 | |
|                 {
 | |
|                     first = false;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     sb.AppendLine();
 | |
|                 }
 | |
| 
 | |
|                 sb.Append("<color=");
 | |
|                 sb.Append(NameColor);
 | |
|                 sb.Append(">");
 | |
| 
 | |
|                 sb.Append(i.Title);
 | |
|                 sb.Append(": ");
 | |
| 
 | |
|                 sb.Append("</color>");
 | |
| 
 | |
|                 for (var j = i.Title.Length; j <= maxTitleLength; ++j)
 | |
|                 {
 | |
|                     sb.Append(' ');
 | |
|                 }
 | |
| 
 | |
|                 if (i.Value is bool)
 | |
|                 {
 | |
|                     sb.Append((bool) i.Value ? Tick : Cross);
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     sb.Append(i.Value);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             block.Content.text = sb.ToString();
 | |
|         }
 | |
| 
 | |
|         private InfoBlock CreateBlock(string title)
 | |
|         {
 | |
|             var block = SRInstantiate.Instantiate(InfoBlockPrefab);
 | |
|             block.Title.text = title;
 | |
| 
 | |
|             block.CachedTransform.SetParent(LayoutContainer, false);
 | |
| 
 | |
|             return block;
 | |
|         }
 | |
|     }
 | |
| }
 |