Skip to content
This repository was archived by the owner on Apr 11, 2022. It is now read-only.

Commit c296472

Browse files
committed
Merge branch 'fix-scroll'
2 parents 5af103b + dc5fc4f commit c296472

File tree

1 file changed

+52
-30
lines changed

1 file changed

+52
-30
lines changed

jsonui.go

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func layout(g *gocui.Gui) error {
164164
}
165165
if v.Name() == treeView {
166166
v.Highlight = true
167-
tree.draw(v, 2, 0)
167+
drawTree(g, v, tree)
168168
// v.Autoscroll = true
169169
}
170170
if v.Name() == textView {
@@ -198,11 +198,7 @@ func layout(g *gocui.Gui) error {
198198

199199
}
200200
func getPath(g *gocui.Gui, v *gocui.View) string {
201-
tv, err := g.View(treeView)
202-
if err != nil {
203-
log.Fatal("failed to get treeView", err)
204-
}
205-
p := findTreePosition(tv)
201+
p := findTreePosition(g)
206202
for i, s := range p {
207203
transformed := s
208204
if !strings.HasPrefix(s, "[") && !strings.HasSuffix(s, "]") {
@@ -228,11 +224,7 @@ func drawJSON(g *gocui.Gui, v *gocui.View) error {
228224
if err != nil {
229225
log.Fatal("failed to get textView", err)
230226
}
231-
tv, err := g.View(treeView)
232-
if err != nil {
233-
log.Fatal("failed to get treeView", err)
234-
}
235-
p := findTreePosition(tv)
227+
p := findTreePosition(g)
236228
treeTodraw := tree.find(p)
237229
if treeTodraw != nil {
238230
dv.Clear()
@@ -270,7 +262,11 @@ var cleanPatterns = []string{
270262
" (+)",
271263
}
272264

273-
func findTreePosition(v *gocui.View) treePosition {
265+
func findTreePosition(g *gocui.Gui) treePosition {
266+
v, err := g.View(treeView)
267+
if err != nil {
268+
log.Fatal("failed to get treeview", err)
269+
}
274270
path := treePosition{}
275271
ci := -1
276272
_, yOffset := v.Origin()
@@ -296,36 +292,62 @@ func findTreePosition(v *gocui.View) treePosition {
296292
return path[1:]
297293
}
298294

295+
// This is a workaround for not having a Buffer
296+
// function in gocui
297+
func bufferLen(v *gocui.View) int {
298+
s := v.Buffer()
299+
return len(strings.Split(s, "\n")) - 1
300+
}
301+
302+
func drawTree(g *gocui.Gui, v *gocui.View, tree treeNode) error {
303+
tv, err := g.View(treeView)
304+
if err != nil {
305+
log.Fatal("failed to get treeView", err)
306+
}
307+
tv.Clear()
308+
tree.draw(tv, 2, 0)
309+
maxY := bufferLen(tv)
310+
cx, cy := tv.Cursor()
311+
lastLine := maxY - 2
312+
if cy > lastLine {
313+
tv.SetCursor(cx, lastLine)
314+
tv.SetOrigin(0, 0)
315+
}
316+
317+
return nil
318+
}
319+
299320
func expandAll(g *gocui.Gui, v *gocui.View) error {
300321
tree.expandAll()
301-
v.Clear()
302-
tree.draw(v, 2, 0)
303-
return nil
322+
return drawTree(g, v, tree)
304323
}
324+
305325
func collapseAll(g *gocui.Gui, v *gocui.View) error {
306326
tree.collapseAll()
307-
v.Clear()
308-
tree.draw(v, 2, 0)
309-
return nil
327+
return drawTree(g, v, tree)
310328
}
329+
311330
func toggleExpand(g *gocui.Gui, v *gocui.View) error {
312-
tv, err := g.View(treeView)
313-
if err != nil {
314-
log.Fatal("failed to get treeView", err)
315-
}
316-
p := findTreePosition(tv)
331+
p := findTreePosition(g)
317332
subTree := tree.find(p)
318333
subTree.toggleExpanded()
319-
tv.Clear()
320-
tree.draw(tv, 2, 0)
321-
return nil
334+
return drawTree(g, v, tree)
322335
}
336+
323337
func cursorMovement(d int) func(g *gocui.Gui, v *gocui.View) error {
324338
return func(g *gocui.Gui, v *gocui.View) error {
325-
if lineBelow(v, d) {
326-
v.MoveCursor(0, d, false)
327-
drawJSON(g, v)
328-
drawPath(g, v)
339+
dir := 1
340+
if d < 0 {
341+
dir = -1
342+
}
343+
distance := int(math.Abs(float64(d)))
344+
for ; distance > 0; distance-- {
345+
if lineBelow(v, distance*dir) {
346+
v.MoveCursor(0, distance*dir, false)
347+
drawJSON(g, v)
348+
drawPath(g, v)
349+
return nil
350+
}
329351
}
330352
return nil
331353
}

0 commit comments

Comments
 (0)