Beispiel #1
0
 /// <summary>
 /// Lazier version of Label. Auto-calculates the size (assuming text is single line), and aligned to Left.
 /// <para>Use <seealso cref="OpLabel(Vector2, Vector2, string, FLabelAlignment, bool)"/> for more complicated setup.</para>
 /// </summary>
 /// <param name="posX">Leftmost Position</param>
 /// <param name="posY">Bottom Position</param>
 /// <param name="text">Max length is limited to 200 for this constructor.</param>
 /// <param name="bigText">Whether this uses bigFont or not</param>
 public OpLabel(float posX, float posY, string text = "TEXT", bool bigText = false)
     : this(new Vector2(posX, posY), new Vector2(100f, 20f), text, FLabelAlignment.Left, bigText)
 {
     this._text = text.Length < LabelTest.CharLimit(_bigText) / 3 ? text : text.Substring(0, LabelTest.CharLimit(_bigText) / 3);
     this._size = new Vector2((this._bigText ? 10f : 7f) * text.Length + 10f, this._bigText ? 30f : 20f);
     if (!_init)
     {
         return;
     }
     this.label.size = this._size;
     this.label.text = this._text;
     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;
            }
        }