Beispiel #1
0
        /// <summary>
        /// Simple Label that displays text. See also <seealso cref="OpLabel(float, float, string, bool)"/> for lazier version.
        /// </summary>
        /// <param name="pos">BottomLeft Position</param>
        /// <param name="size">Size of the Box</param>
        /// <param name="text">Text you want to display; max length 600. See also <seealso cref="OpLabelLong"/><para>Leaving this as TEXT will call <see cref="LoremIpsum"/>.</para></param>
        /// <param name="alignment">Alignment. Left/Center/Right. Center is default.</param>
        /// <param name="bigText">Whether this uses bigFont or not</param>
        public OpLabel(Vector2 pos, Vector2 size, string text = "TEXT", FLabelAlignment alignment = FLabelAlignment.Center, bool bigText = false) : base(pos, size)
        {
            this._size    = new Vector2(Mathf.Max(size.x, 20f), Mathf.Max(size.y, 20f));
            this._bigText = bigText;
            this.autoWrap = false;
            if (text == "TEXT")
            { //Lorem Ipsum
                int lc      = this.IsLong ? Math.Max(1, Mathf.FloorToInt(_size.y * 0.65f / LabelTest.LineHeight(_bigText))) : 1;
                int charLim = Mathf.FloorToInt(_size.x / LabelTest.CharMean(_bigText)) * lc;
                int sentLim = charLim / LoremIpsum.meanCharPerSentence;
                if (this.IsLong)
                {
                    int pn = UnityEngine.Random.Range(1, Mathf.CeilToInt(lc / 1.5f));
                    text = LoremIpsum.Generate(Math.Max(1, (sentLim - 2) / pn), Math.Max(2, sentLim / pn), pn);
                    //charLim = Mathf.FloorToInt(charLim * 0.65f);
                }
                else
                {
                    text = LoremIpsum.Generate(Math.Max(1, sentLim - 2), Math.Max(1, sentLim));
                }
                text = text.Length > charLim?text.Substring(0, charLim - 2).TrimEnd() + "." : text;
            }
            if (this.IsLong)
            {
                this._text = text; _verticalAlignment = LabelVAlignment.Top;
            }
            else
            {
                this._text = text; _verticalAlignment = LabelVAlignment.Center;
            }
            //this.lineLength = Mathf.FloorToInt((size.x - 10f) / 6f);
            string cleanText = Regex.Replace(_text, @"\s+", "");

            this.isVFont = cleanText.Length > 0 && !LabelTest.HasNonASCIIChars(cleanText);
            if (!_init)
            {
                return;
            }
            this.color      = Menu.Menu.MenuRGB(Menu.Menu.MenuColors.MediumGrey);
            this._alignment = alignment;
            if (!this.IsLong)
            {
                this.label             = new MenuLabel(menu, owner, _text, this.pos, this.size, this._bigText);
                this.label.label.color = this.color;
                this.subObjects.Add(this.label);
                OnChange();
            }
        }
        public override void OnChange()
        {
            if (this.labels == null || !_init)
            {
                return;
            }
            base.OnChange();
            float lineHeight = LabelTest.LineHeight(false, isVFont);

            string[]      lines  = this._displayText.Replace(Environment.NewLine, "\n").Split(new char[] { '\n' });
            List <string> splits = new List <string>()
            {
                string.Empty
            };
            int num = 0, lblTxt = 0, lineMax = this.allowOverflow ? int.MaxValue : Mathf.FloorToInt(this.size.y / lineHeight);
            int sLines = 0;

            for (int l = 0; l < lines.Length; l++)
            {
                if (l > lineMax)
                {
                    break;
                }
                string a = lines[l].Trim('\n');
                if (string.IsNullOrEmpty(a))
                {
                    a = " ";
                }
                if (lblTxt + a.Length > LabelTest.CharLimit(false, isVFont) || sLines > 8)
                {
                    sLines = 0; lblTxt = 0; num++; splits.Add(string.Empty);
                }
                if (lblTxt > 0)
                {
                    splits[num] += '\n';
                }
                splits[num] += a;
                lblTxt      += a.Length + 1;
                sLines++;
            }
            while (this.labels.Count < splits.Count)
            {
                MenuLabel nl = new MenuLabel(this.menu, this.owner, isVFont ? "A" : "", this.pos, this.size, false)
                {
                    text = ""
                };
                this.labels.Add(nl);
                this.subObjects.Add(nl);
            }
            num = 0; // linebreak sum
            float lh = lineHeight * GetLineCount();

            for (int b = 0; b < labels.Count; b++)
            {
                if (splits.Count <= b)
                {
                    this.labels[b].text = string.Empty; continue;
                }
                int ln = 0; string[] s = splits[b].Split('\n');
                for (int i = 0; i < s.Length; i++)
                {
                    if (!string.IsNullOrEmpty(s[i]))
                    {
                        ln++;
                    }
                }
                switch (this._alignment)
                {
                default:
                case FLabelAlignment.Center:
                    this.labels[b].label.alignment = FLabelAlignment.Center;
                    this.labels[b].pos.x           = this.pos.x;
                    break;

                case FLabelAlignment.Left:
                    this.labels[b].label.alignment = FLabelAlignment.Left;
                    this.labels[b].pos.x           = this.pos.x - this.size.x * 0.5f;
                    break;

                case FLabelAlignment.Right:
                    this.labels[b].label.alignment = FLabelAlignment.Right;
                    this.labels[b].pos.x           = this.pos.x + this.size.x * 0.5f;
                    break;
                }
                this.labels[b].size.x = this._size.x;
                this.labels[b].size.y = ln * lineHeight;
                num += ln;
                switch (this.verticalAlignment)
                {
                default:
                case LabelVAlignment.Top:
                    this.labels[b].pos.y = this.pos.y + this.size.y - num * lineHeight;
                    break;

                case LabelVAlignment.Bottom:
                    this.labels[b].pos.y = this.pos.y + lh - num * lineHeight;
                    break;

                case LabelVAlignment.Center:
                    this.labels[b].pos.y = this.pos.y + (this.size.y + lh) / 2f - num * lineHeight;
                    break;
                }
                this.labels[b].text = splits[b];
            }
        }
Beispiel #3
0
        public override void OnChange()
        {
            this._size = new Vector2(Mathf.Max(this._size.x, 20f), Mathf.Max(this._size.y, 20f));
            base.OnChange();
            if (!_init)
            {
                return;
            }

            if (string.IsNullOrEmpty(this._text))
            {
                this._displayText = ""; goto displaySkip;
            }
            if (!this.autoWrap)
            {
                if (this.IsLong)
                {
                    this._displayText = _text;
                }
                else
                {
                    this._displayText = _text.Length < LabelTest.CharLimit(_bigText, isVFont) ? _text : _text.Substring(0, LabelTest.CharLimit(_bigText, isVFont));
                }
            }
            else
            {
                string ml;
                if (this.IsLong)
                {
                    ml = _text;
                }
                else
                {
                    ml = _text.Length < LabelTest.CharLimit(_bigText, isVFont) ? _text : _text.Substring(0, LabelTest.CharLimit(_bigText, isVFont));
                }

                this._displayText = LabelTest.WrapText(ml, _bigText, _size.x, isVFont);
            }
displaySkip:
            if (this.IsLong)
            {
                return;
            }
            if (this.GetLineCount() > 10)
            {
                int IndexOfOccurence(int occurence)
                {
                    int i     = 1;
                    int index = 0;

                    while (i <= occurence && (index = _displayText.IndexOf('\n', index + 1)) != -1)
                    {
                        if (i == occurence)
                        {
                            return(index);
                        }
                        i++;
                    }
                    return(-1);
                }

                int sp = IndexOfOccurence(10);
                if (sp > 0)
                {
                    _displayText = _displayText.Substring(0, sp);
                }
            }
            this.label.text = this._displayText;
            this.label.size = this.size;
            switch (this._alignment)
            {
            default:
            case FLabelAlignment.Center:
                this.label.label.alignment = FLabelAlignment.Center;
                this.label.pos             = this.pos;
                break;

            case FLabelAlignment.Left:
                this.label.label.alignment = FLabelAlignment.Left;
                this.label.pos             = this.pos - new Vector2(this.size.x * 0.5f, 0f);
                break;

            case FLabelAlignment.Right:
                this.label.label.alignment = FLabelAlignment.Right;
                this.label.pos             = this.pos + new Vector2(this.size.x * 0.5f, 0f);
                break;
            }

            float lh = LabelTest.LineHeight(_bigText, isVFont) * GetLineCount();

            switch (this._verticalAlignment)
            {
            default:
            case LabelVAlignment.Center:
                break;

            case LabelVAlignment.Top:
                this.label.size.y = lh;
                this.label.pos.y  = this.pos.y + this.size.y - lh;
                break;

            case LabelVAlignment.Bottom:
                this.label.size.y = lh;
                this.label.pos.y  = this.pos.y + lh;
                break;
            }
        }