mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Fixes #4440. TextView with ReadOnly as true, MoveRight doesn't select text up to the end of the line (#4441)
* Fixes #4440. TextView with ReadOnly as true, MoveRight doesn't select text up to the end of the line * Each character must return at least one column, with the exception of Tab. * Add unit test for the LeftColumn
This commit is contained in:
@@ -616,7 +616,8 @@ internal class TextModel
|
||||
for (; i < tCount; i++)
|
||||
{
|
||||
string text = t [i];
|
||||
size += text.GetColumns (false);
|
||||
int colWidth = text.GetColumns (false);
|
||||
size += colWidth;
|
||||
len += text.Length;
|
||||
|
||||
if (text == "\t")
|
||||
@@ -624,6 +625,10 @@ internal class TextModel
|
||||
size += tabWidth + 1;
|
||||
len += tabWidth - 1;
|
||||
}
|
||||
else if (colWidth == -1)
|
||||
{
|
||||
size += 2; // -1+2=1
|
||||
}
|
||||
|
||||
if (checkNextRune && i == tCount - 1 && t.Count > tCount && IsWideText (t [i + 1], tabWidth, out int s, out int l))
|
||||
{
|
||||
|
||||
@@ -3654,7 +3654,7 @@ public class TextView : View, IDesignable
|
||||
{
|
||||
List<Cell> currentLine = GetCurrentLine ();
|
||||
|
||||
if ((ReadOnly ? CurrentColumn + 1 : CurrentColumn) < currentLine.Count)
|
||||
if (CurrentColumn < currentLine.Count)
|
||||
{
|
||||
CurrentColumn++;
|
||||
}
|
||||
|
||||
@@ -2405,5 +2405,44 @@ public class TextViewTests
|
||||
Assert.Equal (expectedText, tv.SelectedText);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReadOnly_True_Move_Right_Moves_Until_The_End_Of_Text_More_One_Column ()
|
||||
{
|
||||
TextView tv = CreateTextView ();
|
||||
tv.Text = "Hi";
|
||||
tv.ReadOnly = true;
|
||||
|
||||
Assert.Equal (0, tv.CurrentColumn);
|
||||
|
||||
Assert.True (tv.NewKeyDownEvent (Key.CursorRight.WithShift));
|
||||
Assert.Equal (1, tv.CurrentColumn);
|
||||
Assert.Equal ("H", tv.SelectedText);
|
||||
|
||||
Assert.True (tv.NewKeyDownEvent (Key.CursorRight.WithShift));
|
||||
Assert.Equal (2, tv.CurrentColumn);
|
||||
Assert.Equal ("Hi", tv.SelectedText);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LeftColumn_Treat_Negative_Width_As_One_Column ()
|
||||
{
|
||||
TextView tv = new () { Width = 2, Height = 1, Text = "\u001B[" };
|
||||
|
||||
Assert.Equal (0, tv.LeftColumn);
|
||||
Assert.Equal (new (0, 0), tv.CursorPosition);
|
||||
|
||||
Assert.True (tv.NewKeyDownEvent (Key.CursorRight));
|
||||
Assert.Equal (0, tv.LeftColumn);
|
||||
Assert.Equal (new (1, 0), tv.CursorPosition);
|
||||
|
||||
Assert.True (tv.NewKeyDownEvent (Key.CursorRight));
|
||||
Assert.Equal (1, tv.LeftColumn);
|
||||
Assert.Equal (new (2, 0), tv.CursorPosition);
|
||||
|
||||
Assert.False (tv.NewKeyDownEvent (Key.CursorRight));
|
||||
Assert.Equal (1, tv.LeftColumn);
|
||||
Assert.Equal (new (2, 0), tv.CursorPosition);
|
||||
}
|
||||
|
||||
private TextView CreateTextView () { return new () { Width = 30, Height = 10 }; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user