Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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(' ');
            }
        }
Esempio n. 4
0
        // 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);
        }