summaryrefslogtreecommitdiffstats
path: root/pkg/gui/lbl/focus.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/lbl/focus.go')
-rw-r--r--pkg/gui/lbl/focus.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/pkg/gui/lbl/focus.go b/pkg/gui/lbl/focus.go
new file mode 100644
index 000000000..ea70fbb3d
--- /dev/null
+++ b/pkg/gui/lbl/focus.go
@@ -0,0 +1,52 @@
+package lbl
+
+import "github.com/jesseduffield/lazygit/pkg/utils"
+
+func calculateOrigin(currentOrigin int, bufferHeight int, firstLineIdx int, lastLineIdx int, selectedLineIdx int, mode selectMode) int {
+ needToSeeIdx, wantToSeeIdx := getNeedAndWantLineIdx(firstLineIdx, lastLineIdx, selectedLineIdx, mode)
+
+ return calculateNewOriginWithNeededAndWantedIdx(currentOrigin, bufferHeight, 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 in as close to being in view as possible.
+func calculateNewOriginWithNeededAndWantedIdx(currentOrigin int, bufferHeight int, needToSeeIdx int, wantToSeeIdx int) int {
+ origin := currentOrigin
+ if needToSeeIdx < currentOrigin {
+ origin = needToSeeIdx
+ } else if needToSeeIdx > currentOrigin+bufferHeight {
+ origin = needToSeeIdx - bufferHeight
+ }
+
+ bottom := origin + bufferHeight
+
+ if wantToSeeIdx < origin {
+ requiredChange := origin - wantToSeeIdx
+ allowedChange := bottom - needToSeeIdx
+ return origin - utils.Min(requiredChange, allowedChange)
+ } else if wantToSeeIdx > origin+bufferHeight {
+ requiredChange := wantToSeeIdx - bottom
+ allowedChange := needToSeeIdx - origin
+ return origin + utils.Min(requiredChange, allowedChange)
+ } else {
+ 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
+ } else {
+ return lastLineIdx, firstLineIdx
+ }
+ case HUNK:
+ return firstLineIdx, lastLineIdx
+ default:
+ panic("unknown mode")
+ }
+}