1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-20 21:43:06 +01:00

Fix deleting characters in the middle of the text

This commit is contained in:
ζeh Matt
2023-02-23 22:45:40 +02:00
parent ec2f332b92
commit dc97eb5bbd

View File

@@ -264,7 +264,7 @@ void TextComposition::InsertCodepoint(codepoint_t codepoint)
_session.Buffer->resize(_session.Buffer->size() + codepointLength);
// FIXME: Just insert the codepoint into the string, don't use memmove
utf8* buffer = _session.Buffer->data();
utf8* insertPtr = buffer + _session.SelectionStart;
if (_session.SelectionStart < bufSize)
@@ -293,6 +293,8 @@ void TextComposition::Delete()
{
size_t selectionOffset = _session.SelectionStart;
size_t selectionMaxOffset = _session.Buffer->size();
if (selectionOffset >= selectionMaxOffset)
return;
// Find out how many bytes to delete.
const utf8* ch = _session.Buffer->c_str() + _session.SelectionStart;
@@ -302,20 +304,14 @@ void TextComposition::Delete()
selectionOffset++;
} while (!UTF8IsCodepointStart(ch) && selectionOffset < selectionMaxOffset);
// FIXME: Just erase the range with iterators.
utf8* buffer = _session.Buffer->data();
utf8* targetShiftPtr = buffer + _session.SelectionStart;
utf8* sourceShiftPtr = targetShiftPtr + _session.SelectionSize;
size_t bytesToSkip = selectionOffset - _session.SelectionStart;
if (bytesToSkip == 0)
return;
// std::min() is used to ensure that shiftSize doesn't underflow; it should be between 0 and _session.Size
size_t shiftSize = _session.Buffer->size()
- std::min(_session.Buffer->size(), (_session.SelectionStart - _session.SelectionSize + bytesToSkip));
memmove(targetShiftPtr, sourceShiftPtr, shiftSize);
_session.Buffer->erase(
_session.Buffer->begin() + _session.SelectionStart, _session.Buffer->begin() + _session.SelectionStart + bytesToSkip);
_session.SelectionSize = 0;
_session.Buffer->resize(_session.Buffer->size() - shiftSize);
RecalculateLength();
}