From ec7e9f92283117eb0eeb7e4e16cd540f4e8cb2be Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sat, 5 Aug 2023 16:09:02 +1000 Subject: [PATCH] Fix confirmation view sizing The proper fix is to actually have these two functions share code, or for views to be able to manage their own heights based on their contents. But I want to get this out for the sake of a Lazygit Anniversary release. --- .../helpers/confirmation_helper.go | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/pkg/gui/controllers/helpers/confirmation_helper.go b/pkg/gui/controllers/helpers/confirmation_helper.go index fe18dd638bd..c920df39fe3 100644 --- a/pkg/gui/controllers/helpers/confirmation_helper.go +++ b/pkg/gui/controllers/helpers/confirmation_helper.go @@ -61,17 +61,45 @@ func (self *ConfirmationHelper) DeactivateConfirmationPrompt() { self.clearConfirmationViewKeyBindings() } +// Temporary hack: we're just duplicating the logic in `gocui.lineWrap` func getMessageHeight(wrap bool, message string, width int) int { - lines := strings.Split(message, "\n") + if !wrap { + return len(strings.Split(message, "\n")) + } + lineCount := 0 - // if we need to wrap, calculate height to fit content within view's width - if wrap { - for _, line := range lines { - lineCount += runewidth.StringWidth(line)/width + 1 + lines := strings.Split(message, "\n") + + for _, line := range lines { + n := 0 + lastWhitespaceIndex := -1 + for i, currChr := range line { + rw := runewidth.RuneWidth(currChr) + n += rw + + if n > width { + if currChr == ' ' { + n = 0 + } else if currChr == '-' { + n = rw + } else if lastWhitespaceIndex != -1 && lastWhitespaceIndex+1 != i { + if line[lastWhitespaceIndex] == '-' { + n = i - lastWhitespaceIndex + } else { + n = i - lastWhitespaceIndex + 1 + } + } else { + n = rw + } + lineCount++ + lastWhitespaceIndex = -1 + } else if currChr == ' ' || currChr == '-' { + lastWhitespaceIndex = i + } } - } else { - lineCount = len(lines) + lineCount++ } + return lineCount }