// Returns the left column in a range of the string. internal static int CalculateLeftColumn(List <Rune> t, int start, int end, int width, int currentColumn) { if (t == null) { return(0); } (var dSize, _) = TextModel.DisplaySize(t, start, end); if (dSize < width) { return(start); } int size = 0; int tcount = end > t.Count - 1 ? t.Count - 1 : end; int col = 0; for (int i = tcount; i > start; i--) { var rune = t [i]; var s = Rune.ColumnWidth(rune); size += s; if (size >= dSize - width) { col = tcount - i + start; if (start == 0 || col == start || (currentColumn == t.Count && (currentColumn - col > width))) { col++; } break; } } return(col); }
internal static int GetColFromX(List <Rune> t, int start, int x) { if (x < 0) { return(x); } int size = start; var pX = x + start; for (int i = start; i < t.Count; i++) { var r = t [i]; size += Rune.ColumnWidth(r); if (i == pX || (size > pX)) { return(i - start); } } return(t.Count - start); }
void RenderUstr(ConsoleDriver driver, ustring ustr, int col, int line, int width) { int byteLen = ustr.Length; int used = 0; for (int i = 0; i < byteLen;) { (var rune, var size) = Utf8.DecodeRune(ustr, i, i - byteLen); var count = Rune.ColumnWidth(rune); if (used + count >= width) { break; } driver.AddRune(rune); used += count; i += size; } for (; used < width; used++) { driver.AddRune(' '); } }
// Returns the size and length in a range of the string. internal static (int size, int length) DisplaySize(List <Rune> t, int start = -1, int end = -1, bool checkNextRune = true) { if (t == null || t.Count == 0) { return(0, 0); } int size = 0; int len = 0; int tcount = end == -1 ? t.Count : end > t.Count ? t.Count : end; int i = start == -1 ? 0 : start; for (; i < tcount; i++) { var rune = t [i]; size += Rune.ColumnWidth(rune); len += Rune.RuneLen(rune); if (checkNextRune && i == tcount - 1 && t.Count > tcount && Rune.ColumnWidth(t [i + 1]) > 1) { size += Rune.ColumnWidth(t [i + 1]); len += Rune.RuneLen(t [i + 1]); } } return(size, len); }