Browse Source

Add whole word shift selection

pull/8471/head
Benedikt Stebner 4 years ago
parent
commit
6802722051
  1. 1
      samples/Sandbox/Sandbox.csproj
  2. 33
      src/Avalonia.Controls/RichTextBlock.cs
  3. 29
      src/Avalonia.Controls/TextBox.cs

1
samples/Sandbox/Sandbox.csproj

@ -10,7 +10,6 @@
<ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Controls.ColorPicker\Avalonia.Controls.ColorPicker.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Controls.DataGrid\Avalonia.Controls.DataGrid.csproj" />
<ProjectReference Include="..\..\src\Avalonia.NativeGraphics.Backend\Avalonia.NativeGraphics.Backend.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj" />
</ItemGroup>

33
src/Avalonia.Controls/RichTextBlock.cs

@ -338,6 +338,8 @@ namespace Avalonia.Controls
e.Handled = handled;
}
private bool _hasWordSelection;
protected override void OnPointerPressed(PointerPressedEventArgs e)
{
base.OnPointerPressed(e);
@ -363,8 +365,6 @@ namespace Avalonia.Controls
var hit = TextLayout.HitTestPoint(point);
var index = hit.TextPosition;
SelectionStart = SelectionEnd = index;
#pragma warning disable CS0618 // Type or member is obsolete
switch (e.ClickCount)
#pragma warning restore CS0618 // Type or member is obsolete
@ -372,16 +372,27 @@ namespace Avalonia.Controls
case 1:
if (clickToSelect)
{
SelectionStart = Math.Min(oldIndex, index);
SelectionEnd = Math.Max(oldIndex, index);
if (_hasWordSelection)
{
SelectionEnd = StringUtils.NextWord(text, index);
}
else
{
SelectionStart = Math.Min(oldIndex, index);
SelectionEnd = Math.Max(oldIndex, index);
}
}
else
{
_hasWordSelection = false;
SelectionStart = SelectionEnd = index;
}
break;
case 2:
_hasWordSelection = true;
if (!StringUtils.IsStartOfWord(text, index))
{
SelectionStart = StringUtils.PreviousWord(text, index);
@ -390,6 +401,8 @@ namespace Avalonia.Controls
SelectionEnd = StringUtils.NextWord(text, index);
break;
case 3:
_hasWordSelection = false;
SelectAll();
break;
}
@ -411,6 +424,7 @@ namespace Avalonia.Controls
// selection should not change during pointer move if the user right clicks
if (e.Pointer.Captured == this && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
{
var text = Text;
var padding = Padding;
var point = e.GetPosition(this) - new Point(padding.Left, padding.Top);
@ -421,7 +435,16 @@ namespace Avalonia.Controls
var hit = TextLayout.HitTestPoint(point);
SelectionEnd = hit.TextPosition;
if (text != null && _hasWordSelection)
{
SelectionEnd = StringUtils.NextWord(text, hit.TextPosition);
}
else
{
SelectionEnd = hit.TextPosition;
}
}
}

29
src/Avalonia.Controls/TextBox.cs

@ -202,6 +202,7 @@ namespace Avalonia.Controls
private string _newLine = Environment.NewLine;
private static readonly string[] invalidCharacters = new String[1] { "\u007f" };
private bool _hasWordSelection;
private int _selectedTextChangesMadeSinceLastUndoSnapshot;
private bool _hasDoneSnapshotOnce;
private const int _maxCharsBeforeUndoSnapshot = 7;
@ -1170,16 +1171,27 @@ namespace Avalonia.Controls
case 1:
if (clickToSelect)
{
SelectionStart = Math.Min(oldIndex, index);
SelectionEnd = Math.Max(oldIndex, index);
if (_hasWordSelection)
{
SelectionEnd = StringUtils.NextWord(text, index);
}
else
{
SelectionStart = Math.Min(oldIndex, index);
SelectionEnd = Math.Max(oldIndex, index);
}
}
else
{
_hasWordSelection = false;
SelectionStart = SelectionEnd = index;
}
break;
case 2:
_hasWordSelection = true;
if (!StringUtils.IsStartOfWord(text, index))
{
SelectionStart = StringUtils.PreviousWord(text, index);
@ -1188,6 +1200,8 @@ namespace Avalonia.Controls
SelectionEnd = StringUtils.NextWord(text, index);
break;
case 3:
_hasWordSelection = false;
SelectAll();
break;
}
@ -1215,7 +1229,16 @@ namespace Avalonia.Controls
_presenter.MoveCaretToPoint(point);
SelectionEnd = _presenter.CaretIndex;
var text = Text;
if (text != null && _hasWordSelection)
{
SelectionEnd = StringUtils.NextWord(text, _presenter.CaretIndex);
}
else
{
SelectionEnd = _presenter.CaretIndex;
}
}
}

Loading…
Cancel
Save