Simplify algorithm for message input paging
This commit is contained in:
parent
d660339433
commit
65d8141d18
|
@ -1,6 +1,6 @@
|
|||
namespace tgcli.Tests;
|
||||
|
||||
public class MessagePaging {
|
||||
public class PagedMessageInput {
|
||||
[Theory]
|
||||
[InlineData(0)]
|
||||
[InlineData(76)]
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue