/*
------------------- Code Monkey -------------------
Thank you for downloading the Code Monkey Utilities
I hope you find them useful in your projects
If you have any questions use the contact form
Cheers!
unitycodemonkey.com
--------------------------------------------------
*/
using UnityEngine;
using UnityEngine.UI;
namespace CodeMonkey.Utils {
/*
* Displays text with icons in between the text
* */
public class UI_TextComplex {
private static Transform GetCanvasTransform() {
return UtilsClass.GetCanvasTransform();
}
public struct Icon {
public Sprite sprite;
public Vector2 size;
public Color color;
public Icon(Sprite sprite, Vector2 size, Color? color = null) {
this.sprite = sprite;
this.size = size;
if (color == null) {
this.color = Color.white;
} else {
this.color = (Color) color;
}
}
}
public GameObject gameObject;
private Transform transform;
private RectTransform rectTransform;
// iconChar prepends the iconArr index;
// Example using iconChar '#':
// test #0 asdf
// Displays "test [iconArr[0]] asdf"
public UI_TextComplex(Transform parent, Vector2 anchoredPosition, int fontSize, char iconChar, string text, Icon[] iconArr, Font font) {
SetupParent(parent, anchoredPosition);
string tmp = text;
float textPosition = 0f;
while (tmp.IndexOf(iconChar) != -1) {
string untilTmp = tmp.Substring(0, tmp.IndexOf(iconChar));
string iconNumber = tmp.Substring(tmp.IndexOf(iconChar)+1);
int indexOfSpaceAfterIconNumber = iconNumber.IndexOf(" ");
if (indexOfSpaceAfterIconNumber != -1) {
// Still has more space after iconNumber
iconNumber = iconNumber.Substring(0, indexOfSpaceAfterIconNumber);
} else {
// No more space after iconNumber
}
tmp = tmp.Substring(tmp.IndexOf(iconChar+iconNumber) + (iconChar+iconNumber).Length);
if (untilTmp.Trim() != "") {
Text uiText = UtilsClass.DrawTextUI(untilTmp, transform, new Vector2(textPosition,0), fontSize, font);
textPosition += uiText.preferredWidth;
}
// Draw Icon
int iconIndex = UtilsClass.Parse_Int(iconNumber, 0);
Icon icon = iconArr[iconIndex];
UtilsClass.DrawSprite(icon.sprite, transform, new Vector2(textPosition + icon.size.x / 2f, 0), icon.size);
textPosition += icon.size.x;
}
if (tmp.Trim() != "") {
UtilsClass.DrawTextUI(tmp, transform, new Vector2(textPosition,0), fontSize, font);
}
}
private void SetupParent(Transform parent, Vector2 anchoredPosition) {
gameObject = new GameObject("UI_TextComplex", typeof(RectTransform));
transform = gameObject.transform;
rectTransform = gameObject.GetComponent<RectTransform>();
rectTransform.SetParent(parent, false);
rectTransform.sizeDelta = new Vector2(0, 0);
rectTransform.anchorMin = new Vector2(0, .5f);
rectTransform.anchorMax = new Vector2(0, .5f);
rectTransform.pivot = new Vector2(0, .5f);
rectTransform.anchoredPosition = anchoredPosition;
}
public void SetTextColor(Color color) {
foreach (Transform trans in transform) {
Text text = trans.GetComponent<Text>();
if (text != null) {
text.color = color;
}
}
}
public float GetTotalWidth() {
float textPosition = 0f;
foreach (Transform trans in transform) {
Text text = trans.GetComponent<Text>();
if (text != null) {
textPosition += text.preferredWidth;
}
Image image = trans.GetComponent<Image>();
if (image != null) {
textPosition += image.GetComponent<RectTransform>().sizeDelta.x;
}
}
return textPosition;
}
public float GetTotalHeight() {
foreach (Transform trans in transform) {
Text text = trans.GetComponent<Text>();
if (text != null) {
return text.preferredHeight;
}
}
return 0f;
}
public void AddTextOutline(Color color, float size) {
foreach (Transform textComplexTrans in transform) {
if (textComplexTrans.GetComponent<Text>() != null) {
Outline outline = textComplexTrans.gameObject.AddComponent<Outline>();
outline.effectColor = color;
outline.effectDistance = new Vector2(size, size);
}
}
}
public void SetAnchorMiddle() {
rectTransform.anchorMin = new Vector2(.5f, .5f);
rectTransform.anchorMax = new Vector2(.5f, .5f);
}
public void CenterOnPosition(Vector2 position) {
rectTransform.anchoredPosition = position + new Vector2(-GetTotalWidth() / 2f, 0);
}
public void DestroySelf() {
Object.Destroy(gameObject);
}
}
}