< Summary

Class:UIDialog
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/UI/UIDialog.cs
Covered lines:4
Uncovered lines:123
Coverable lines:127
Total lines:217
Line coverage:3.1% (4 of 127)
Covered branches:0
Total branches:0
Covered methods:1
Total methods:18
Method coverage:5.5% (1 of 18)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
UIDialog()0%110100%
Start()0%20400%
GetContentHandle()0%2100%
IsOpen()0%2100%
OnEnable()0%2100%
OnDisable()0%2100%
GetTabWidth()0%2100%
GetTabHeight()0%2100%
GetTitleBarHeight()0%2100%
AddDialogTab(...)0%2100%
AddTabButton(...)0%2100%
AddTabText(...)0%2100%
CreateSelectableEntry()0%2100%
ClearDialogEntries()0%20400%
SetDialogEntries(...)0%6200%
SetDialogEntries(...)0%2100%
RecursiveContentPrint(...)0%12300%
Update()0%2100%

File(s)

/github/workspace/Assets/Scripts/UI/UIDialog.cs

#LineLine coverage
 1using System.Collections;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using TMPro;
 5using System;
 6using UnityEngine.UI;
 7
 8public class UIDialog : MonoBehaviour {
 9  [SerializeField]
 10  private string dialogTitle;
 11
 12  [SerializeField]
 13  private TextMeshProUGUI dialogTitleHandle;
 14  [SerializeField]
 15  private RectTransform contentHandle;
 16
 17  /// TABS
 18  [SerializeField]
 119  private float tabWidth = 15f;
 20  [SerializeField]
 121  private float tabHeight = 8f;
 22  // List of dialog tabs
 23  private List<GameObject> dialogTabs;
 24
 25  /// ENTRIES
 26  private List<UISelectableEntry> entries;
 27
 28  [SerializeField]
 129  private float entryHeight = 8f;
 30  [SerializeField]
 131  private float entryIndentWidth = 4f;
 32
 33  private List<UISelectableEntry> cleanupPool;
 34
 35  private bool isOpen;
 36
 37  // Start is called before the first frame update
 038  public virtual void Start() {
 039    dialogTitleHandle.text = dialogTitle;
 040    dialogTitleHandle.font = UIManager.Instance.Font;
 041    isOpen = gameObject.activeSelf;
 042    if (dialogTabs != null) {
 043      foreach (GameObject tab in dialogTabs) {
 044        Destroy(tab);
 045      }
 046    }
 47
 048    if (cleanupPool != null) {
 049      ClearDialogEntries();
 050    }
 51    /*
 52    if(entries != null) {
 53      foreach(UISelectableEntry entry in entries) {
 54        Destroy(entry.gameObject);
 55      }
 56    }
 57    */
 058    dialogTabs = new List<GameObject>();
 059    entries = new List<UISelectableEntry>();
 060    cleanupPool = new List<UISelectableEntry>();
 061  }
 62
 063  internal RectTransform GetContentHandle() {
 064    return contentHandle;
 065  }
 66
 067  public bool IsOpen() {
 068    return isOpen;
 069  }
 70
 071  protected virtual void OnEnable() {
 072    isOpen = true;
 073  }
 074  protected virtual void OnDisable() {
 075    isOpen = false;
 076  }
 77
 078  public float GetTabWidth() {
 079    return tabWidth;
 080  }
 081  public float GetTabHeight() {
 082    return tabHeight;
 083  }
 84
 85  /// <summary>
 86  /// Returns the height of the dialog title bar
 87  /// </summary>
 088  public float GetTitleBarHeight() {
 089    return dialogTitleHandle.rectTransform.sizeDelta.y;
 090  }
 91
 92  /// <summary>
 93  /// Adds a new tab to the dialog, when clicked it will call the given callback
 94  /// </summary>
 095  public void AddDialogTab(string tabName, Action onClick) {
 096    dialogTabs.Add(AddTabButton(tabName, onClick));
 097  }
 98
 99  /// <summary>
 100  /// Add the tab button to the right of the existing tabs
 101  /// </summary>
 0102  private GameObject AddTabButton(string tabName, Action onClick) {
 0103    GameObject tabButton = new GameObject("TabButton", typeof(RectTransform));
 0104    tabButton.transform.SetParent(transform);  // worldPositionStays ?
 105    // RectTransform anchors to the right of the content handle
 0106    RectTransform rTransform = tabButton.GetComponent<RectTransform>();
 0107    rTransform.anchorMin = new Vector2(0, 1);
 0108    rTransform.anchorMax = new Vector2(0, 1);
 0109    rTransform.pivot = new Vector2(0, 1);
 0110    rTransform.sizeDelta = new Vector2(tabWidth, tabHeight);
 111    // Count tabs * tabSize to get the position from the left
 0112    rTransform.anchoredPosition =
 113        new Vector2((tabWidth / 2) * dialogTabs.Count, -(GetTitleBarHeight()));
 114
 115    // Add the onClick callback to the button
 0116    Button button = tabButton.AddComponent<Button>();
 0117    button.onClick.AddListener(() => onClick());
 118    // Add the image to the button and link it to the tab
 0119    button.targetGraphic = tabButton.AddComponent<Image>();
 120
 0121    AddTabText(tabName, tabButton);
 0122    return tabButton;
 0123  }
 124
 125  /// <summary>
 126  /// Add text as a child of the tab's button object
 127  /// </summary>
 0128  private void AddTabText(string tabName, GameObject tabButton) {
 0129    GameObject tabText = new GameObject("TabText", typeof(RectTransform));
 0130    tabText.transform.SetParent(tabButton.transform);
 131    // RectTransform anchors to the center of the button
 0132    RectTransform textRectTransform = tabText.GetComponent<RectTransform>();
 0133    textRectTransform.anchorMin = new Vector2(0.5f, 0.5f);
 0134    textRectTransform.anchorMax = new Vector2(0.5f, 0.5f);
 0135    textRectTransform.pivot = new Vector2(0.5f, 0.5f);
 0136    textRectTransform.sizeDelta = new Vector2(tabWidth, tabHeight);
 137    // Text position
 0138    textRectTransform.anchoredPosition = new Vector2(0, 0);
 139
 0140    TextMeshProUGUI buttonText = tabText.AddComponent<TextMeshProUGUI>();
 0141    buttonText.text = tabName;
 0142    buttonText.font = UIManager.Instance.Font;
 0143    buttonText.fontSize = 10;
 0144    buttonText.color = Color.black;
 0145    buttonText.alignment = TextAlignmentOptions.Center;
 0146    buttonText.verticalAlignment = VerticalAlignmentOptions.Middle;
 0147  }
 148
 0149  public virtual UISelectableEntry CreateSelectableEntry() {
 150    // Create a new entry object with content handle as parent
 0151    GameObject go = Instantiate(Resources.Load<GameObject>("Prefabs/EmptyObject"), contentHandle);
 0152    go.name = "UISelectableEntry";
 0153    UISelectableEntry entry = go.AddComponent<UISelectableEntry>();
 0154    entry.SetParent(this);
 155    // add to cleanup pool so we can clear later in clear dialog entries
 0156    cleanupPool.Add(entry);
 0157    return entry;
 0158  }
 159
 0160  public void ClearDialogEntries() {
 0161    if (cleanupPool == null)
 0162      return;
 0163    foreach (UISelectableEntry entry in cleanupPool) {
 0164      GameObject.Destroy(entry.gameObject);
 0165    }
 0166    cleanupPool.Clear();
 0167    if (entries != null)
 0168      entries.Clear();
 0169  }
 170
 171  /// <summary>
 172  /// Clears, sets, and prints the dialog entries in the order they were added
 173  /// </summary>
 0174  public virtual void SetDialogEntries(List<UISelectableEntry> entries) {
 0175    this.entries = entries;
 176    // calculate total height of the content
 0177    float heightHead = -1 * GetTabHeight();
 0178    int count = 0;
 0179    foreach (UISelectableEntry entry in this.entries) {
 0180      (heightHead, count) = RecursiveContentPrint(entry, 1, heightHead, count);
 0181    }
 0182    contentHandle.sizeDelta =
 183        new Vector2(contentHandle.sizeDelta.x, count * entryHeight + Mathf.Abs(heightHead));
 0184  }
 185
 0186  public virtual void SetDialogEntries(UISelectableEntry entry) {
 0187    SetDialogEntries(new List<UISelectableEntry>() { entry });
 0188  }
 189
 190  private (float, int)
 0191      RecursiveContentPrint(UISelectableEntry entry, int depth, float heightHead, int count) {
 0192    RectTransform rTransform = entry.GetComponent<RectTransform>();
 0193    rTransform.anchorMin = new Vector2(0, 1);
 0194    rTransform.anchorMax = new Vector2(1, 1);
 0195    rTransform.pivot = new Vector2(0.5f, 1f);
 196
 0197    rTransform.anchoredPosition = new Vector2(0, heightHead);  // positioning from top
 0198    rTransform.sizeDelta = new Vector2(0, entryHeight);
 0199    float padding = 5f;
 0200    rTransform.SetRight(padding);
 0201    rTransform.SetLeft(padding);
 202    // actually indent the text
 0203    entry.GetTextTransform(0).anchoredPosition = new Vector2(entryIndentWidth * depth, 0);
 0204    heightHead -= entryHeight;
 0205    count++;
 206    // Print the children
 0207    if (entry.GetChildEntries() != null) {
 0208      foreach (UISelectableEntry child in entry.GetChildEntries()) {
 0209        (heightHead, count) = RecursiveContentPrint(child, depth + 1, heightHead, count);
 0210      }
 0211    }
 0212    return (heightHead, count);
 0213  }
 214
 215  // Update is called once per frame
 0216  void Update() {}
 217}