1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-19 00:20:25 +02:00

Improved right-cursor movement over utf8 codepoints

This commit is contained in:
Brian Fiete 2024-01-22 08:39:53 -05:00
parent 04f1802303
commit f96de4722e
3 changed files with 41 additions and 4 deletions

View file

@ -2226,15 +2226,18 @@ namespace Beefy.widgets
else if (lineIdx < GetLineCount() - 1) else if (lineIdx < GetLineCount() - 1)
MoveCursorTo(lineIdx + 1, 0, false, 0, .SelectRight); MoveCursorTo(lineIdx + 1, 0, false, 0, .SelectRight);
if (!mWidgetWindow.IsKeyDown(KeyCode.Control))
break;
GetLineCharAtIdx(CursorTextPos, out lineIdx, out lineChar); GetLineCharAtIdx(CursorTextPos, out lineIdx, out lineChar);
anIndex = GetTextIdx(lineIdx, lineChar); anIndex = GetTextIdx(lineIdx, lineChar);
if (anIndex == mData.mTextLength) if (anIndex == mData.mTextLength)
break; break;
char8 c = (char8)mData.mText[anIndex].mChar; char8 c = (char8)mData.mText[anIndex].mChar;
if ((uint8)c & 0xC0 == 0x80)
continue;
if (!mWidgetWindow.IsKeyDown(KeyCode.Control))
break;
CharType char8Type = GetCharType(c); CharType char8Type = GetCharType(c);
if (char8Type == .Opening) if (char8Type == .Opening)
break; break;

View file

@ -359,6 +359,23 @@ namespace System
} }
} }
public int NumCodePoints
{
get
{
char8* ptr = Ptr;
int count = 0;
for (int i < mLength)
{
char8 c = ptr[i];
if (((uint8)c & 0xC0) != 0x80)
count++;
}
return count;
}
}
public int AllocSize public int AllocSize
{ {
[Inline] [Inline]
@ -3594,6 +3611,23 @@ namespace System
} }
} }
public int NumCodePoints
{
get
{
char8* ptr = Ptr;
int count = 0;
for (int i < mLength)
{
char8 c = ptr[i];
if (((uint8)c & 0xC0) != 0x80)
count++;
}
return count;
}
}
private int GetRangeStart(IndexRange range) private int GetRangeStart(IndexRange range)
{ {
switch (range.Start) switch (range.Start)

View file

@ -5366,7 +5366,7 @@ namespace IDE.ui
String curLineStr = scope String(); String curLineStr = scope String();
GetLineText(line, curLineStr); GetLineText(line, curLineStr);
int32 lineEnd = (int32)curLineStr.Length; int32 lineEnd = (int32)curLineStr.NumCodePoints;
mVirtualCursorPos.ValueRef.mColumn = (.)Math.Min(mVirtualCursorPos.Value.mColumn, Math.Max(virtualEnd, lineEnd)); mVirtualCursorPos.ValueRef.mColumn = (.)Math.Min(mVirtualCursorPos.Value.mColumn, Math.Max(virtualEnd, lineEnd));
} }