From 65d8141d1827b17b7cb82613b7bca81f24c384ea Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Mon, 23 Jan 2023 17:54:18 +0100 Subject: [PATCH] Simplify algorithm for message input paging --- ...{MessagePaging.cs => PagedMessageInput.cs} | 2 +- tgcli/Util.cs | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) rename tgcli.Tests/{MessagePaging.cs => PagedMessageInput.cs} (97%) diff --git a/tgcli.Tests/MessagePaging.cs b/tgcli.Tests/PagedMessageInput.cs similarity index 97% rename from tgcli.Tests/MessagePaging.cs rename to tgcli.Tests/PagedMessageInput.cs index 75dcdee..f420297 100644 --- a/tgcli.Tests/MessagePaging.cs +++ b/tgcli.Tests/PagedMessageInput.cs @@ -1,6 +1,6 @@ namespace tgcli.Tests; -public class MessagePaging { +public class PagedMessageInput { [Theory] [InlineData(0)] [InlineData(76)] diff --git a/tgcli/Util.cs b/tgcli/Util.cs index 511e23f..1fb1165 100644 --- a/tgcli/Util.cs +++ b/tgcli/Util.cs @@ -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); }