Fixes #2659. Cursor always invisible with NetDriver on Windows. (#2660)

* Fixes #2659. Cursor always invisible with NetDriver on Windows.

* Prefix private members with underscore and rename Initialize to SetInitialProperties.

* Reset _visibility private member after validation.

* Hide cursor during screen update.
This commit is contained in:
BDisp
2023-05-22 23:03:51 +01:00
committed by GitHub
parent 59a7ff95b3
commit 24ce90812f
2 changed files with 214 additions and 203 deletions

View File

@@ -909,7 +909,8 @@ namespace Terminal.Gui {
int redrawAttr = -1;
var lastCol = -1;
Console.CursorVisible = false;
GetCursorVisibility (out CursorVisibility savedVisibitity);
SetCursorVisibility (CursorVisibility.Invisible);
for (int row = top; row < rows; row++) {
if (Console.WindowHeight < 1) {
@@ -967,6 +968,7 @@ namespace Terminal.Gui {
}
}
SetCursorPosition (0, 0);
SetCursorVisibility (savedVisibitity);
}
void SetVirtualCursorPosition (int col, int row)
@@ -1444,7 +1446,13 @@ namespace Terminal.Gui {
public override bool SetCursorVisibility (CursorVisibility visibility)
{
savedCursorVisibility = visibility;
return Console.CursorVisible = visibility == CursorVisibility.Default;
var isVisible = Console.CursorVisible = visibility == CursorVisibility.Default;
if (isVisible) {
Console.Out.Write ("\x1b[?25h");
} else {
Console.Out.Write ("\x1b[?25l");
}
return isVisible;
}
/// <inheritdoc/>

View File

@@ -22,12 +22,12 @@ namespace Terminal.Gui {
/// The <see cref="TextField"/> <see cref="View"/> provides editing functionality and mouse support.
/// </remarks>
public class TextField : View {
List<Rune> text;
int first, point;
int selectedStart = -1; // -1 represents there is no text selection.
string selectedText;
HistoryText historyText = new HistoryText ();
CultureInfo currentCulture;
List<Rune> _text;
int _first, _point;
int _selectedStart = -1; // -1 represents there is no text selection.
string _selectedText;
HistoryText _historyText = new HistoryText ();
CultureInfo _currentCulture;
/// <summary>
/// Gets or sets the text to render in control when no value has
@@ -79,7 +79,7 @@ namespace Terminal.Gui {
/// <param name="text">Initial text contents.</param>
public TextField (string text) : base (text)
{
Initialize (text, text.GetRuneCount () + 1);
SetInitialProperties (text, text.GetRuneCount () + 1);
}
/// <summary>
@@ -91,25 +91,25 @@ namespace Terminal.Gui {
/// <param name="text">Initial text contents.</param>
public TextField (int x, int y, int w, string text) : base (new Rect (x, y, w, 1))
{
Initialize (text, w);
SetInitialProperties (text, w);
}
void Initialize (string text, int w)
void SetInitialProperties (string text, int w)
{
Height = 1;
if (text == null)
text = "";
this.text = TextModel.ToRunes (text.Split ("\n") [0]);
point = text.GetRuneCount ();
first = point > w + 1 ? point - w + 1 : 0;
this._text = TextModel.ToRunes (text.Split ("\n") [0]);
_point = text.GetRuneCount ();
_first = _point > w + 1 ? _point - w + 1 : 0;
CanFocus = true;
Used = true;
WantMousePositionReports = true;
savedCursorVisibility = desiredCursorVisibility;
_savedCursorVisibility = _desiredCursorVisibility;
historyText.ChangeText += HistoryText_ChangeText;
_historyText.ChangeText += HistoryText_ChangeText;
Initialized += TextField_Initialized;
@@ -214,7 +214,7 @@ namespace Terminal.Gui {
AddKeyBinding (Key.R | Key.CtrlMask, Command.DeleteAll);
AddKeyBinding (Key.D | Key.CtrlMask | Key.ShiftMask, Command.DeleteAll);
currentCulture = Thread.CurrentThread.CurrentUICulture;
_currentCulture = Thread.CurrentThread.CurrentUICulture;
ContextMenu = new ContextMenu (this, BuildContextMenuBarItem ());
ContextMenu.KeyChanged += ContextMenu_KeyChanged;
@@ -304,36 +304,36 @@ namespace Terminal.Gui {
/// </remarks>
public new string Text {
get {
return StringExtensions.ToString (text);
return StringExtensions.ToString (_text);
}
set {
var oldText = StringExtensions.ToString (text);
var oldText = StringExtensions.ToString (_text);
if (oldText == value)
return;
var newText = OnTextChanging (value.Replace ("\t", "").Split ("\n") [0]);
if (newText.Cancel) {
if (point > text.Count) {
point = text.Count;
if (_point > _text.Count) {
_point = _text.Count;
}
return;
}
ClearAllSelection ();
text = TextModel.ToRunes (newText.NewText);
_text = TextModel.ToRunes (newText.NewText);
if (!Secret && !historyText.IsFromHistory) {
historyText.Add (new List<List<Rune>> () { oldText.ToRuneList () },
new Point (point, 0));
historyText.Add (new List<List<Rune>> () { text }, new Point (point, 0)
if (!Secret && !_historyText.IsFromHistory) {
_historyText.Add (new List<List<Rune>> () { oldText.ToRuneList () },
new Point (_point, 0));
_historyText.Add (new List<List<Rune>> () { _text }, new Point (_point, 0)
, HistoryText.LineStatus.Replaced);
}
TextChanged?.Invoke (this, new TextChangedEventArgs (oldText));
if (point > text.Count) {
point = Math.Max (TextModel.DisplaySize (text, 0).size - 1, 0);
if (_point > _text.Count) {
_point = Math.Max (TextModel.DisplaySize (_text, 0).size - 1, 0);
}
Adjust ();
@@ -353,35 +353,35 @@ namespace Terminal.Gui {
/// Sets or gets the current cursor position.
/// </summary>
public virtual int CursorPosition {
get { return point; }
get { return _point; }
set {
if (value < 0) {
point = 0;
} else if (value > text.Count) {
point = text.Count;
_point = 0;
} else if (value > _text.Count) {
_point = _text.Count;
} else {
point = value;
_point = value;
}
PrepareSelection (selectedStart, point - selectedStart);
PrepareSelection (_selectedStart, _point - _selectedStart);
}
}
/// <summary>
/// Gets the left offset position.
/// </summary>
public int ScrollOffset => first;
public int ScrollOffset => _first;
/// <summary>
/// Indicates whatever the text was changed or not.
/// <see langword="true"/> if the text was changed <see langword="false"/> otherwise.
/// </summary>
public bool IsDirty => historyText.IsDirty (Text);
public bool IsDirty => _historyText.IsDirty (Text);
/// <summary>
/// Indicates whatever the text has history changes or not.
/// <see langword="true"/> if the text has history changes <see langword="false"/> otherwise.
/// </summary>
public bool HasHistoryChanges => historyText.HasHistoryChanges;
public bool HasHistoryChanges => _historyText.HasHistoryChanges;
/// <summary>
/// Get the <see cref="ContextMenu"/> for this view.
@@ -394,13 +394,13 @@ namespace Terminal.Gui {
public override void PositionCursor ()
{
var col = 0;
for (int idx = first < 0 ? 0 : first; idx < text.Count; idx++) {
if (idx == point)
for (int idx = _first < 0 ? 0 : _first; idx < _text.Count; idx++) {
if (idx == _point)
break;
var cols = text [idx].GetColumns ();
var cols = _text [idx].GetColumns ();
TextModel.SetCol (ref col, Frame.Width - 1, cols);
}
var pos = point - first + Math.Min (Frame.X, 0);
var pos = _point - _first + Math.Min (Frame.X, 0);
var offB = OffSetBackground ();
var containerFrame = SuperView?.ViewToScreen (SuperView.Bounds) ?? default;
var thisFrame = ViewToScreen (Bounds);
@@ -418,19 +418,22 @@ namespace Terminal.Gui {
}
}
CursorVisibility savedCursorVisibility;
CursorVisibility _savedCursorVisibility;
void HideCursorVisibility ()
{
if (desiredCursorVisibility != CursorVisibility.Invisible) {
if (_desiredCursorVisibility != CursorVisibility.Invisible) {
DesiredCursorVisibility = CursorVisibility.Invisible;
}
}
CursorVisibility _visibility;
void RestoreCursorVisibility ()
{
if (desiredCursorVisibility != savedCursorVisibility) {
DesiredCursorVisibility = savedCursorVisibility;
Application.Driver.GetCursorVisibility (out _visibility);
if (_desiredCursorVisibility != _savedCursorVisibility || _visibility != _savedCursorVisibility) {
DesiredCursorVisibility = _savedCursorVisibility;
}
}
@@ -443,24 +446,24 @@ namespace Terminal.Gui {
Driver.SetAttribute (GetNormalColor ());
Move (0, 0);
int p = first;
int p = _first;
int col = 0;
int width = Frame.Width + OffSetBackground ();
var tcount = text.Count;
var tcount = _text.Count;
var roc = GetReadOnlyColor ();
for (int idx = p; idx < tcount; idx++) {
var rune = text [idx];
var rune = _text [idx];
var cols = ((Rune)rune).GetColumns ();
if (idx == point && HasFocus && !Used && length == 0 && !ReadOnly) {
if (idx == _point && HasFocus && !Used && _length == 0 && !ReadOnly) {
Driver.SetAttribute (selColor);
} else if (ReadOnly) {
Driver.SetAttribute (idx >= start && length > 0 && idx < start + length ? selColor : roc);
Driver.SetAttribute (idx >= _start && _length > 0 && idx < _start + _length ? selColor : roc);
} else if (!HasFocus && Enabled) {
Driver.SetAttribute (ColorScheme.Focus);
} else if (!Enabled) {
Driver.SetAttribute (roc);
} else {
Driver.SetAttribute (idx >= start && length > 0 && idx < start + length ? selColor : ColorScheme.Focus);
Driver.SetAttribute (idx >= _start && _length > 0 && idx < _start + _length ? selColor : ColorScheme.Focus);
}
if (col + cols <= width) {
Driver.AddRune ((Rune)(Secret ? CM.Glyphs.Dot : rune));
@@ -468,7 +471,7 @@ namespace Terminal.Gui {
if (!TextModel.SetCol (ref col, width, cols)) {
break;
}
if (idx + 1 < tcount && col + text [idx + 1].GetColumns () > width) {
if (idx + 1 < tcount && col + _text [idx + 1].GetColumns () > width) {
break;
}
}
@@ -545,13 +548,13 @@ namespace Terminal.Gui {
return;
int offB = OffSetBackground ();
if (point < first) {
first = point;
} else if (Frame.Width > 0 && (first + point - (Frame.Width + offB) == 0 ||
TextModel.DisplaySize (text, first, point).size >= Frame.Width + offB)) {
if (_point < _first) {
_first = _point;
} else if (Frame.Width > 0 && (_first + _point - (Frame.Width + offB) == 0 ||
TextModel.DisplaySize (_text, _first, _point).size >= Frame.Width + offB)) {
first = Math.Max (TextModel.CalculateLeftColumn (text, first,
point, Frame.Width + offB), 0);
_first = Math.Max (TextModel.CalculateLeftColumn (_text, _first,
_point, Frame.Width + offB), 0);
}
SetNeedsDisplay ();
}
@@ -588,7 +591,7 @@ namespace Terminal.Gui {
Clipboard.Contents = StringExtensions.ToString (text.ToList ());
}
int oldCursorPos;
int _oldCursorPos;
/// <summary>
/// Processes key presses for the <see cref="TextField"/>.
@@ -613,7 +616,7 @@ namespace Terminal.Gui {
// remember current cursor position
// because the new calculated cursor position is needed to be set BEFORE the change event is triggest
// Needed for the Elmish Wrapper issue https://github.com/DieselMeister/Terminal.Gui.Elmish/issues/2
oldCursorPos = point;
_oldCursorPos = _point;
// Give autocomplete first opportunity to respond to key presses
if (SelectedLength == 0 && Autocomplete.Suggestions.Count > 0 && Autocomplete.ProcessKey (kb)) {
@@ -639,30 +642,30 @@ namespace Terminal.Gui {
void InsertText (KeyEvent kb, bool useOldCursorPos = true)
{
historyText.Add (new List<List<Rune>> () { text }, new Point (point, 0));
_historyText.Add (new List<List<Rune>> () { _text }, new Point (_point, 0));
List<Rune> newText = text;
if (length > 0) {
List<Rune> newText = _text;
if (_length > 0) {
newText = DeleteSelectedText ();
oldCursorPos = point;
_oldCursorPos = _point;
}
if (!useOldCursorPos) {
oldCursorPos = point;
_oldCursorPos = _point;
}
var kbstr = TextModel.ToRunes (((Rune)(uint)kb.Key).ToString ());
if (Used) {
point++;
if (point == newText.Count + 1) {
_point++;
if (_point == newText.Count + 1) {
SetText (newText.Concat (kbstr).ToList ());
} else {
if (oldCursorPos > newText.Count) {
oldCursorPos = newText.Count;
if (_oldCursorPos > newText.Count) {
_oldCursorPos = newText.Count;
}
SetText (newText.GetRange (0, oldCursorPos).Concat (kbstr).Concat (newText.GetRange (oldCursorPos, Math.Min (newText.Count - oldCursorPos, newText.Count))));
SetText (newText.GetRange (0, _oldCursorPos).Concat (kbstr).Concat (newText.GetRange (_oldCursorPos, Math.Min (newText.Count - _oldCursorPos, newText.Count))));
}
} else {
SetText (newText.GetRange (0, oldCursorPos).Concat (kbstr).Concat (newText.GetRange (Math.Min (oldCursorPos + 1, newText.Count), Math.Max (newText.Count - oldCursorPos - 1, 0))));
point++;
SetText (newText.GetRange (0, _oldCursorPos).Concat (kbstr).Concat (newText.GetRange (Math.Min (_oldCursorPos + 1, newText.Count), Math.Max (newText.Count - _oldCursorPos - 1, 0))));
_point++;
}
Adjust ();
}
@@ -686,11 +689,11 @@ namespace Terminal.Gui {
public virtual void KillWordBackwards ()
{
ClearAllSelection ();
var newPos = GetModel ().WordBackward (point, 0);
var newPos = GetModel ().WordBackward (_point, 0);
if (newPos == null) return;
if (newPos.Value.col != -1) {
SetText (text.GetRange (0, newPos.Value.col).Concat (text.GetRange (point, text.Count - point)));
point = newPos.Value.col;
SetText (_text.GetRange (0, newPos.Value.col).Concat (_text.GetRange (_point, _text.Count - _point)));
_point = newPos.Value.col;
}
Adjust ();
}
@@ -701,10 +704,10 @@ namespace Terminal.Gui {
public virtual void KillWordForwards ()
{
ClearAllSelection ();
var newPos = GetModel ().WordForward (point, 0);
var newPos = GetModel ().WordForward (_point, 0);
if (newPos == null) return;
if (newPos.Value.col != -1) {
SetText (text.GetRange (0, point).Concat (text.GetRange (newPos.Value.col, text.Count - newPos.Value.col)));
SetText (_text.GetRange (0, _point).Concat (_text.GetRange (newPos.Value.col, _text.Count - newPos.Value.col)));
}
Adjust ();
}
@@ -712,20 +715,20 @@ namespace Terminal.Gui {
void MoveWordRight ()
{
ClearAllSelection ();
var newPos = GetModel ().WordForward (point, 0);
var newPos = GetModel ().WordForward (_point, 0);
if (newPos == null) return;
if (newPos.Value.col != -1)
point = newPos.Value.col;
_point = newPos.Value.col;
Adjust ();
}
void MoveWordLeft ()
{
ClearAllSelection ();
var newPos = GetModel ().WordBackward (point, 0);
var newPos = GetModel ().WordBackward (_point, 0);
if (newPos == null) return;
if (newPos.Value.col != -1)
point = newPos.Value.col;
_point = newPos.Value.col;
Adjust ();
}
@@ -734,7 +737,7 @@ namespace Terminal.Gui {
if (ReadOnly)
return;
historyText.Redo ();
_historyText.Redo ();
//if (string.IsNullOrEmpty (Clipboard.Contents))
// return true;
@@ -757,7 +760,7 @@ namespace Terminal.Gui {
if (ReadOnly)
return;
historyText.Undo ();
_historyText.Undo ();
}
void KillToStart ()
@@ -766,11 +769,11 @@ namespace Terminal.Gui {
return;
ClearAllSelection ();
if (point == 0)
if (_point == 0)
return;
SetClipboard (text.GetRange (0, point));
SetText (text.GetRange (point, text.Count - point));
point = 0;
SetClipboard (_text.GetRange (0, _point));
SetText (_text.GetRange (_point, _text.Count - _point));
_point = 0;
Adjust ();
}
@@ -780,19 +783,19 @@ namespace Terminal.Gui {
return;
ClearAllSelection ();
if (point >= text.Count)
if (_point >= _text.Count)
return;
SetClipboard (text.GetRange (point, text.Count - point));
SetText (text.GetRange (0, point));
SetClipboard (_text.GetRange (_point, _text.Count - _point));
SetText (_text.GetRange (0, _point));
Adjust ();
}
void MoveRight ()
{
ClearAllSelection ();
if (point == text.Count)
if (_point == _text.Count)
return;
point++;
_point++;
Adjust ();
}
@@ -802,40 +805,40 @@ namespace Terminal.Gui {
public void MoveEnd ()
{
ClearAllSelection ();
point = text.Count;
_point = _text.Count;
Adjust ();
}
void MoveLeft ()
{
ClearAllSelection ();
if (point > 0) {
point--;
if (_point > 0) {
_point--;
Adjust ();
}
}
void MoveWordRightExtend ()
{
if (point < text.Count) {
int x = start > -1 && start > point ? start : point;
if (_point < _text.Count) {
int x = _start > -1 && _start > _point ? _start : _point;
var newPos = GetModel ().WordForward (x, 0);
if (newPos == null) return;
if (newPos.Value.col != -1)
point = newPos.Value.col;
_point = newPos.Value.col;
PrepareSelection (x, newPos.Value.col - x);
}
}
void MoveWordLeftExtend ()
{
if (point > 0) {
int x = Math.Min (start > -1 && start > point ? start : point, text.Count);
if (_point > 0) {
int x = Math.Min (_start > -1 && _start > _point ? _start : _point, _text.Count);
if (x > 0) {
var newPos = GetModel ().WordBackward (x, 0);
if (newPos == null) return;
if (newPos.Value.col != -1)
point = newPos.Value.col;
_point = newPos.Value.col;
PrepareSelection (x, newPos.Value.col - x);
}
}
@@ -843,40 +846,40 @@ namespace Terminal.Gui {
void MoveRightExtend ()
{
if (point < text.Count) {
PrepareSelection (point++, 1);
if (_point < _text.Count) {
PrepareSelection (_point++, 1);
}
}
void MoveLeftExtend ()
{
if (point > 0) {
PrepareSelection (point--, -1);
if (_point > 0) {
PrepareSelection (_point--, -1);
}
}
void MoveHome ()
{
ClearAllSelection ();
point = 0;
_point = 0;
Adjust ();
}
void MoveEndExtend ()
{
if (point <= text.Count) {
int x = point;
point = text.Count;
PrepareSelection (x, point - x);
if (_point <= _text.Count) {
int x = _point;
_point = _text.Count;
PrepareSelection (x, _point - x);
}
}
void MoveHomeExtend ()
{
if (point > 0) {
int x = point;
point = 0;
PrepareSelection (x, point - x);
if (_point > 0) {
int x = _point;
_point = 0;
PrepareSelection (x, _point - x);
}
}
@@ -888,20 +891,20 @@ namespace Terminal.Gui {
if (ReadOnly)
return;
historyText.Add (new List<List<Rune>> () { text }, new Point (point, 0));
_historyText.Add (new List<List<Rune>> () { _text }, new Point (_point, 0));
if (length == 0) {
if (point == 0)
if (_length == 0) {
if (_point == 0)
return;
if (!useOldCursorPos) {
oldCursorPos = point;
_oldCursorPos = _point;
}
point--;
if (oldCursorPos < text.Count) {
SetText (text.GetRange (0, oldCursorPos - 1).Concat (text.GetRange (oldCursorPos, text.Count - oldCursorPos)));
_point--;
if (_oldCursorPos < _text.Count) {
SetText (_text.GetRange (0, _oldCursorPos - 1).Concat (_text.GetRange (_oldCursorPos, _text.Count - _oldCursorPos)));
} else {
SetText (text.GetRange (0, oldCursorPos - 1));
SetText (_text.GetRange (0, _oldCursorPos - 1));
}
Adjust ();
} else {
@@ -919,13 +922,13 @@ namespace Terminal.Gui {
if (ReadOnly)
return;
historyText.Add (new List<List<Rune>> () { text }, new Point (point, 0));
_historyText.Add (new List<List<Rune>> () { _text }, new Point (_point, 0));
if (length == 0) {
if (text.Count == 0 || text.Count == point)
if (_length == 0) {
if (_text.Count == 0 || _text.Count == _point)
return;
SetText (text.GetRange (0, point).Concat (text.GetRange (point + 1, text.Count - (point + 1))));
SetText (_text.GetRange (0, _point).Concat (_text.GetRange (_point + 1, _text.Count - (_point + 1))));
Adjust ();
} else {
var newText = DeleteSelectedText ();
@@ -936,9 +939,9 @@ namespace Terminal.Gui {
void ShowContextMenu ()
{
if (currentCulture != Thread.CurrentThread.CurrentUICulture) {
if (_currentCulture != Thread.CurrentThread.CurrentUICulture) {
currentCulture = Thread.CurrentThread.CurrentUICulture;
_currentCulture = Thread.CurrentThread.CurrentUICulture;
ContextMenu.MenuItems = BuildContextMenuBarItem ();
}
@@ -950,11 +953,11 @@ namespace Terminal.Gui {
/// </summary>
public void SelectAll ()
{
if (text.Count == 0) {
if (_text.Count == 0) {
return;
}
selectedStart = 0;
_selectedStart = 0;
MoveEndExtend ();
SetNeedsDisplay ();
}
@@ -964,11 +967,11 @@ namespace Terminal.Gui {
/// </summary>
public void DeleteAll ()
{
if (text.Count == 0) {
if (_text.Count == 0) {
return;
}
selectedStart = 0;
_selectedStart = 0;
MoveEndExtend ();
DeleteCharLeft ();
SetNeedsDisplay ();
@@ -978,35 +981,35 @@ namespace Terminal.Gui {
/// Start position of the selected text.
/// </summary>
public int SelectedStart {
get => selectedStart;
get => _selectedStart;
set {
if (value < -1) {
selectedStart = -1;
} else if (value > text.Count) {
selectedStart = text.Count;
_selectedStart = -1;
} else if (value > _text.Count) {
_selectedStart = _text.Count;
} else {
selectedStart = value;
_selectedStart = value;
}
PrepareSelection (selectedStart, point - selectedStart);
PrepareSelection (_selectedStart, _point - _selectedStart);
}
}
/// <summary>
/// Length of the selected text.
/// </summary>
public int SelectedLength { get => length; }
public int SelectedLength { get => _length; }
/// <summary>
/// The selected text.
/// </summary>
public string SelectedText {
get => Secret ? null : selectedText;
private set => selectedText = value;
get => Secret ? null : _selectedText;
private set => _selectedText = value;
}
int start, length;
bool isButtonPressed;
bool isButtonReleased = true;
int _start, _length;
bool _isButtonPressed;
bool _isButtonReleased = true;
///<inheritdoc/>
public override bool MouseEvent (MouseEvent ev)
@@ -1033,28 +1036,28 @@ namespace Terminal.Gui {
if (ev.Flags == MouseFlags.Button1Pressed) {
EnsureHasFocus ();
PositionCursor (ev);
if (isButtonReleased) {
if (_isButtonReleased) {
ClearAllSelection ();
}
isButtonReleased = true;
isButtonPressed = true;
} else if (ev.Flags == (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition) && isButtonPressed) {
_isButtonReleased = true;
_isButtonPressed = true;
} else if (ev.Flags == (MouseFlags.Button1Pressed | MouseFlags.ReportMousePosition) && _isButtonPressed) {
int x = PositionCursor (ev);
isButtonReleased = false;
_isButtonReleased = false;
PrepareSelection (x);
if (Application.MouseGrabView == null) {
Application.GrabMouse (this);
}
} else if (ev.Flags == MouseFlags.Button1Released) {
isButtonReleased = true;
isButtonPressed = false;
_isButtonReleased = true;
_isButtonPressed = false;
Application.UngrabMouse ();
} else if (ev.Flags == MouseFlags.Button1DoubleClicked) {
EnsureHasFocus ();
int x = PositionCursor (ev);
int sbw = x;
if (x == text.Count || (x > 0 && (char)text [x - 1].Value != ' ')
|| (x > 0 && (char)text [x].Value == ' ')) {
if (x == _text.Count || (x > 0 && (char)_text [x - 1].Value != ' ')
|| (x > 0 && (char)_text [x].Value == ' ')) {
var newPosBw = GetModel ().WordBackward (x, 0);
if (newPosBw == null) return true;
@@ -1068,14 +1071,14 @@ namespace Terminal.Gui {
if (newPosFw == null) return true;
ClearAllSelection ();
if (newPosFw.Value.col != -1 && sbw != -1) {
point = newPosFw.Value.col;
_point = newPosFw.Value.col;
}
PrepareSelection (sbw, newPosFw.Value.col - sbw);
} else if (ev.Flags == MouseFlags.Button1TripleClicked) {
EnsureHasFocus ();
PositionCursor (0);
ClearAllSelection ();
PrepareSelection (0, text.Count);
PrepareSelection (0, _text.Count);
} else if (ev.Flags == ContextMenu.MouseFlags) {
ShowContextMenu ();
}
@@ -1095,8 +1098,8 @@ namespace Terminal.Gui {
{
// We could also set the cursor position.
int x;
var pX = TextModel.GetColFromX (text, first, ev.X);
if (text.Count == 0) {
var pX = TextModel.GetColFromX (_text, _first, ev.X);
if (_text.Count == 0) {
x = pX - ev.OfX;
} else {
x = pX;
@@ -1108,36 +1111,36 @@ namespace Terminal.Gui {
{
int pX = x;
if (getX) {
pX = TextModel.GetColFromX (text, first, x);
pX = TextModel.GetColFromX (_text, _first, x);
}
if (first + pX > text.Count) {
point = text.Count;
} else if (first + pX < first) {
point = 0;
if (_first + pX > _text.Count) {
_point = _text.Count;
} else if (_first + pX < _first) {
_point = 0;
} else {
point = first + pX;
_point = _first + pX;
}
return point;
return _point;
}
void PrepareSelection (int x, int direction = 0)
{
x = x + first < -1 ? 0 : x;
selectedStart = selectedStart == -1 && text.Count > 0 && x >= 0 && x <= text.Count ? x : selectedStart;
if (selectedStart > -1) {
length = Math.Abs (x + direction <= text.Count ? x + direction - selectedStart : text.Count - selectedStart);
x = x + _first < -1 ? 0 : x;
_selectedStart = _selectedStart == -1 && _text.Count > 0 && x >= 0 && x <= _text.Count ? x : _selectedStart;
if (_selectedStart > -1) {
_length = Math.Abs (x + direction <= _text.Count ? x + direction - _selectedStart : _text.Count - _selectedStart);
SetSelectedStartSelectedLength ();
if (start > -1 && length > 0) {
selectedText = length > 0 ? StringExtensions.ToString (text.GetRange (
start < 0 ? 0 : start, length > text.Count ? text.Count : length)) : "";
if (first > start) {
first = start;
if (_start > -1 && _length > 0) {
_selectedText = _length > 0 ? StringExtensions.ToString (_text.GetRange (
_start < 0 ? 0 : _start, _length > _text.Count ? _text.Count : _length)) : "";
if (_first > _start) {
_first = _start;
}
} else if (start > -1 && length == 0) {
selectedText = null;
} else if (_start > -1 && _length == 0) {
_selectedText = null;
}
} else if (length > 0 || selectedText != null) {
} else if (_length > 0 || _selectedText != null) {
ClearAllSelection ();
}
Adjust ();
@@ -1148,23 +1151,23 @@ namespace Terminal.Gui {
/// </summary>
public void ClearAllSelection ()
{
if (selectedStart == -1 && length == 0 && selectedText == "")
if (_selectedStart == -1 && _length == 0 && _selectedText == "")
return;
selectedStart = -1;
length = 0;
selectedText = null;
start = 0;
length = 0;
_selectedStart = -1;
_length = 0;
_selectedText = null;
_start = 0;
_length = 0;
SetNeedsDisplay ();
}
void SetSelectedStartSelectedLength ()
{
if (SelectedStart > -1 && point < SelectedStart) {
start = point;
if (SelectedStart > -1 && _point < SelectedStart) {
_start = _point;
} else {
start = SelectedStart;
_start = SelectedStart;
}
}
@@ -1173,7 +1176,7 @@ namespace Terminal.Gui {
/// </summary>
public virtual void Copy ()
{
if (Secret || length == 0)
if (Secret || _length == 0)
return;
Clipboard.Contents = SelectedText;
@@ -1184,7 +1187,7 @@ namespace Terminal.Gui {
/// </summary>
public virtual void Cut ()
{
if (ReadOnly || Secret || length == 0)
if (ReadOnly || Secret || _length == 0)
return;
Clipboard.Contents = SelectedText;
@@ -1197,14 +1200,14 @@ namespace Terminal.Gui {
{
string actualText = Text;
SetSelectedStartSelectedLength ();
int selStart = SelectedStart > -1 ? start : point;
(var size, var _) = TextModel.DisplaySize (text, 0, selStart, false);
(var size2, var _) = TextModel.DisplaySize (text, selStart, selStart + length, false);
(var size3, var _) = TextModel.DisplaySize (text, selStart + length, actualText.GetRuneCount (), false);
int selStart = SelectedStart > -1 ? _start : _point;
(var size, var _) = TextModel.DisplaySize (_text, 0, selStart, false);
(var size2, var _) = TextModel.DisplaySize (_text, selStart, selStart + _length, false);
(var size3, var _) = TextModel.DisplaySize (_text, selStart + _length, actualText.GetRuneCount (), false);
var newText = actualText [..size] +
actualText.Substring (size + size2, size3);
ClearAllSelection ();
point = selStart >= newText.GetRuneCount () ? newText.GetRuneCount () : selStart;
_point = selStart >= newText.GetRuneCount () ? newText.GetRuneCount () : selStart;
return newText.ToRuneList ();
}
@@ -1218,16 +1221,16 @@ namespace Terminal.Gui {
}
SetSelectedStartSelectedLength ();
int selStart = start == -1 ? CursorPosition : start;
int selStart = _start == -1 ? CursorPosition : _start;
string actualText = Text;
(int size, int _) = TextModel.DisplaySize (text, 0, selStart, false);
(var size2, var _) = TextModel.DisplaySize (text, selStart, selStart + length, false);
(var size3, var _) = TextModel.DisplaySize (text, selStart + length, actualText.GetRuneCount (), false);
(int size, int _) = TextModel.DisplaySize (_text, 0, selStart, false);
(var size2, var _) = TextModel.DisplaySize (_text, selStart, selStart + _length, false);
(var size3, var _) = TextModel.DisplaySize (_text, selStart + _length, actualText.GetRuneCount (), false);
string cbTxt = Clipboard.Contents.Split ("\n") [0] ?? "";
Text = actualText [..size] +
cbTxt +
actualText.Substring (size + size2, size3);
point = selStart + cbTxt.GetRuneCount ();
_point = selStart + cbTxt.GetRuneCount ();
ClearAllSelection ();
SetNeedsDisplay ();
Adjust ();
@@ -1245,19 +1248,19 @@ namespace Terminal.Gui {
return ev;
}
CursorVisibility desiredCursorVisibility = CursorVisibility.Default;
CursorVisibility _desiredCursorVisibility = CursorVisibility.Default;
/// <summary>
/// Get / Set the wished cursor when the field is focused
/// </summary>
public CursorVisibility DesiredCursorVisibility {
get => desiredCursorVisibility;
get => _desiredCursorVisibility;
set {
if (desiredCursorVisibility != value && HasFocus) {
if ((_desiredCursorVisibility != value || _visibility != value) && HasFocus) {
Application.Driver.SetCursorVisibility (value);
}
desiredCursorVisibility = value;
_desiredCursorVisibility = _visibility = value;
}
}
@@ -1266,7 +1269,7 @@ namespace Terminal.Gui {
/// exactly as if the user had just typed it
/// </summary>
/// <param name="toAdd">Text to add</param>
/// <param name="useOldCursorPos">If uses the <see cref="oldCursorPos"/>.</param>
/// <param name="useOldCursorPos">If uses the <see cref="_oldCursorPos"/>.</param>
public void InsertText (string toAdd, bool useOldCursorPos = true)
{
foreach (var ch in toAdd) {
@@ -1289,7 +1292,7 @@ namespace Terminal.Gui {
/// </summary>
public void ClearHistoryChanges ()
{
historyText.Clear (Text);
_historyText.Clear (Text);
}
/// <summary>