@@ -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}
200200func 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+
299320func 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+
305325func 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+
311330func 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+
323337func 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