/// <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]; } }
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; } }