Simplify algorithm for message input paging

This commit is contained in:
Laura Hausmann 2023-01-23 17:54:18 +01:00
parent d660339433
commit 65d8141d18
Signed by: zotan
GPG key ID: D044E84C5BE01605
2 changed files with 11 additions and 13 deletions

View file

@ -1,6 +1,6 @@
namespace tgcli.Tests;
public class MessagePaging {
public class PagedMessageInput {
[Theory]
[InlineData(0)]
[InlineData(76)]

View file

@ -380,24 +380,22 @@ public static class Util {
const int wraparoundOffsetPostW = wraparoundOffsetPost + 1; // offset + 1 (character on the edge), for easier calculations
if (absoluteCursorPosition > message.Length)
throw new ArgumentOutOfRangeException();
throw new ArgumentOutOfRangeException(nameof(absoluteCursorPosition), "Cursor position exceeds message length");
if (message.Length < bufferWidth)
return (message, absoluteCursorPosition);
if (message.Length < bufferWidth) // entire message fits in buffer
return (message, absoluteCursorPosition); // return input as-is
if (absoluteCursorPosition < bufferWidth - wraparoundOffsetPre - 1)
return (TruncateString(message, bufferWidth, $"{Ansi.Inverse}>{Ansi.InverseOff}"), absoluteCursorPosition);
if (absoluteCursorPosition < bufferWidth - wraparoundOffsetPre - 1) // message is longer than buffer but we're on the first page
return (TruncateString(message, bufferWidth, $"{Ansi.Inverse}>{Ansi.InverseOff}"), absoluteCursorPosition); // return input as-is but truncated and with a > indicator
var finalCursorPos = absoluteCursorPosition - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW;
var wraparounds = (finalCursorPos - wraparoundOffsetPostW) / (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW);
finalCursorPos += wraparoundOffsetPostW * wraparounds;
var wraparounds = (absoluteCursorPosition - wraparoundOffsetPostW) / (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW);
var finalCursorPos = absoluteCursorPosition - bufferWidth + wraparoundOffsetPreW + wraparoundOffsetPostW * wraparounds;
finalCursorPos %= bufferWidth - wraparoundOffsetPreW;
var messageOffset = (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW) * wraparounds;
var finalMessage = message[(bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPost)..];
finalMessage = finalMessage[messageOffset..];
var messageOffset = (bufferWidth - wraparoundOffsetPreW - wraparoundOffsetPostW) * wraparounds + 1; // +1 to account for the first wrap not having a < indicator
var finalMessage = message[messageOffset..];
finalMessage = TruncateString(finalMessage, bufferWidth - 1, $"{Ansi.Inverse}>{Ansi.InverseOff}");
finalMessage = TruncateString(finalMessage, bufferWidth - 1, $"{Ansi.Inverse}>{Ansi.InverseOff}"); // replace the last character with a > indicator if required
return ($"{Ansi.Inverse}<{Ansi.InverseOff}" + finalMessage, finalCursorPos);
}