mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-08-06 11:02:41 +03:00
If the hunk to be selected was partially scrolled offscreen, the view wouldn't scroll enough to make it completely visible (the last line of the hunk was still offscreen). This is only a minimal fix for a pressing problem. The code to handle scrolling after selection changes has lots of problems, and is also inconsistent between list views and the patch explorer, but cleaning this up needs more time than I have right now.
48 lines
1.7 KiB
Go
48 lines
1.7 KiB
Go
package patch_exploring
|
|
|
|
func calculateOrigin(currentOrigin int, bufferHeight int, numLines int, firstLineIdx int, lastLineIdx int, selectedLineIdx int, mode selectMode) int {
|
|
needToSeeIdx, wantToSeeIdx := getNeedAndWantLineIdx(firstLineIdx, lastLineIdx, selectedLineIdx, mode)
|
|
|
|
return calculateNewOriginWithNeededAndWantedIdx(currentOrigin, bufferHeight, numLines, needToSeeIdx, wantToSeeIdx)
|
|
}
|
|
|
|
// we want to scroll our origin so that the index we need to see is in view
|
|
// and the other index we want to see (e.g. the other side of a line range)
|
|
// is as close to being in view as possible.
|
|
func calculateNewOriginWithNeededAndWantedIdx(currentOrigin int, bufferHeight int, numLines int, needToSeeIdx int, wantToSeeIdx int) int {
|
|
origin := currentOrigin
|
|
if needToSeeIdx < currentOrigin || needToSeeIdx >= currentOrigin+bufferHeight {
|
|
origin = max(min(needToSeeIdx-bufferHeight/2, numLines-bufferHeight), 0)
|
|
}
|
|
|
|
bottom := origin + bufferHeight
|
|
|
|
if wantToSeeIdx < origin {
|
|
requiredChange := origin - wantToSeeIdx
|
|
allowedChange := bottom - needToSeeIdx
|
|
return origin - min(requiredChange, allowedChange)
|
|
} else if wantToSeeIdx >= bottom {
|
|
requiredChange := wantToSeeIdx + 1 - bottom
|
|
allowedChange := needToSeeIdx - origin
|
|
return origin + min(requiredChange, allowedChange)
|
|
}
|
|
return origin
|
|
}
|
|
|
|
func getNeedAndWantLineIdx(firstLineIdx int, lastLineIdx int, selectedLineIdx int, mode selectMode) (int, int) {
|
|
switch mode {
|
|
case LINE:
|
|
return selectedLineIdx, selectedLineIdx
|
|
case RANGE:
|
|
if selectedLineIdx == firstLineIdx {
|
|
return firstLineIdx, lastLineIdx
|
|
}
|
|
return lastLineIdx, firstLineIdx
|
|
case HUNK:
|
|
return firstLineIdx, lastLineIdx
|
|
default:
|
|
// we should never land here
|
|
panic("unknown mode")
|
|
}
|
|
}
|