Remove while loop in GetViewIntoMessageBuffer, closes #12

This commit is contained in:
Laura Hausmann 2023-01-22 23:26:43 +01:00
parent 82678907ba
commit 65bf58731f
Signed by: zotan
GPG key ID: D044E84C5BE01605

View file

@ -388,20 +388,14 @@ namespace tgcli {
if (absoluteCursorPosition < bufferWidth - wraparoundOffsetPre - 1)
return (TruncateString(message, bufferWidth, $"{Ansi.Inverse}>{Ansi.InverseOff}"), absoluteCursorPosition);
// now we can be sure the message needs at least one wrap
// first wrap
// get rid of the content shown on the zeroth wrap, which is buf width minus wraparoundPreW (respects > character on screen edge)
var finalMessage = message[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPost)..];
var finalCursorPos = absoluteCursorPosition - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW;
var wraparounds = (finalCursorPos - wraparoundOffsetPostW) / (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW);
finalCursorPos += wraparoundOffsetPostW * wraparounds;
finalCursorPos %= bufferWidth - wraparoundOffsetPreW;
// successive wraps
// repeat above steps (but respective of the new < character) until the string fits into the buffer
// it fits into the buffer when cursorPos >= bufferwidth minus wraparound (this time respecting > character absent on first wrap)
while (finalCursorPos >= bufferWidth - wraparoundOffsetPreW) {
finalMessage = finalMessage[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW)..];
finalCursorPos = finalCursorPos - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW;
}
var messageOffset = (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW) * wraparounds;
var finalMessage = message[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPost)..];
finalMessage = finalMessage[messageOffset..];
finalMessage = TruncateString(finalMessage, bufferWidth - 1, $"{Ansi.Inverse}>{Ansi.InverseOff}");