|
| 1 | +package gui |
| 2 | + |
| 3 | +import ( |
| 4 | + "time" |
| 5 | + |
| 6 | + "github.com/jesseduffield/gocui" |
| 7 | +) |
| 8 | + |
| 9 | +// This function is a modified version of |
| 10 | +// https://github.com/jesseduffield/lazydocker/blob/fa6460b8ab3486b7e84c3a7d4c64fbd8e3f4be21/pkg/gui/gui.go#L227 |
| 11 | +func (gui *Gui) goEvery(interval time.Duration, function func() error) { |
| 12 | + _ = function() // time.Tick doesn't run immediately so we'll do that here // TODO: maybe change |
| 13 | + go func() { |
| 14 | + ticker := time.NewTicker(interval) |
| 15 | + defer ticker.Stop() |
| 16 | + for range ticker.C { |
| 17 | + _ = function() |
| 18 | + } |
| 19 | + }() |
| 20 | +} |
| 21 | + |
| 22 | +// This function is a modified version of |
| 23 | +// https://github.com/jesseduffield/lazydocker/blob/a14e6400cbbd7e2aa9ef22166b085b0678f9ca3a/pkg/gui/view_helpers.go#L361 |
| 24 | +func (gui *Gui) FindSelectedLine(v *gocui.View, itemCount int) int { |
| 25 | + _, cy := v.Cursor() |
| 26 | + _, oy := v.Origin() |
| 27 | + |
| 28 | + selectedLine := cy - oy |
| 29 | + |
| 30 | + if selectedLine < 0 { |
| 31 | + return 0 |
| 32 | + } |
| 33 | + |
| 34 | + if selectedLine > itemCount-1 { |
| 35 | + return itemCount - 1 |
| 36 | + } |
| 37 | + return selectedLine |
| 38 | +} |
| 39 | + |
| 40 | +// This function was copied from |
| 41 | +// https://github.com/jesseduffield/lazydocker/blob/a14e6400cbbd7e2aa9ef22166b085b0678f9ca3a/pkg/gui/view_helpers.go#L319 |
| 42 | +func (gui *Gui) changeSelectedLine(line *int, total int, up bool) { |
| 43 | + if up { |
| 44 | + if *line == -1 || *line == 0 { |
| 45 | + return |
| 46 | + } |
| 47 | + |
| 48 | + *line -= 1 |
| 49 | + } else { |
| 50 | + if *line == -1 || *line == total-1 { |
| 51 | + return |
| 52 | + } |
| 53 | + |
| 54 | + *line += 1 |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +// This function was copied from |
| 59 | +// https://github.com/jesseduffield/lazydocker/blob/a14e6400cbbd7e2aa9ef22166b085b0678f9ca3a/pkg/gui/view_helpers.go#L168 |
| 60 | +func (gui *Gui) focusPoint(selectedX int, selectedY int, lineCount int, v *gocui.View) error { |
| 61 | + if selectedY < 0 || selectedY > lineCount { |
| 62 | + return nil |
| 63 | + } |
| 64 | + ox, oy := v.Origin() |
| 65 | + originalOy := oy |
| 66 | + cx, cy := v.Cursor() |
| 67 | + originalCy := cy |
| 68 | + _, height := v.Size() |
| 69 | + |
| 70 | + ly := Max(height-1, 0) |
| 71 | + |
| 72 | + windowStart := oy |
| 73 | + windowEnd := oy + ly |
| 74 | + |
| 75 | + if selectedY < windowStart { |
| 76 | + oy = Max(oy-(windowStart-selectedY), 0) |
| 77 | + } else if selectedY > windowEnd { |
| 78 | + oy += (selectedY - windowEnd) |
| 79 | + } |
| 80 | + |
| 81 | + if windowEnd > lineCount-1 { |
| 82 | + shiftAmount := (windowEnd - (lineCount - 1)) |
| 83 | + oy = Max(oy-shiftAmount, 0) |
| 84 | + } |
| 85 | + |
| 86 | + if originalOy != oy { |
| 87 | + _ = v.SetOrigin(ox, oy) |
| 88 | + } |
| 89 | + |
| 90 | + cy = selectedY - oy |
| 91 | + if originalCy != cy { |
| 92 | + _ = v.SetCursor(cx, selectedY-oy) |
| 93 | + } |
| 94 | + return nil |
| 95 | +} |
| 96 | + |
| 97 | +func Max(x, y int) int { |
| 98 | + if x > y { |
| 99 | + return x |
| 100 | + } |
| 101 | + return y |
| 102 | +} |
0 commit comments