From 74610b8cd74dd02c3f618ca6c745fa3ddc5147d9 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Wed, 26 Oct 2016 12:29:23 -0400 Subject: [PATCH] Fix problem with calculation Bottomline Fixes #432 --- cmd/micro/view.go | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/cmd/micro/view.go b/cmd/micro/view.go index b91805ee..0208bc4f 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -27,8 +27,7 @@ type View struct { Cursor *Cursor // The topmost line, used for vertical scrolling - Topline int - Bottomline int + Topline int // The leftmost column, used for horizontal scrolling leftCol int @@ -292,7 +291,7 @@ func (v *View) GetSoftWrapLocation(vx, vy int) (int, int) { } screenX, screenY := 0, v.Topline - for lineN := v.Topline; lineN < v.Bottomline; lineN++ { + for lineN := v.Topline; lineN < v.height; lineN++ { line := v.Buf.Line(lineN) colN := 0 @@ -323,10 +322,41 @@ func (v *View) GetSoftWrapLocation(vx, vy int) (int, int) { return 0, 0 } +func (v *View) Bottomline() int { + screenX, screenY := 0, 0 + numLines := 0 + for lineN := v.Topline; lineN < v.Topline+v.height; lineN++ { + line := v.Buf.Line(lineN) + + colN := 0 + for _, ch := range line { + if screenX >= v.width-v.lineNumOffset { + screenX = 0 + screenY++ + } + + if ch == '\t' { + screenX += int(v.Buf.Settings["tabsize"].(float64)) - 1 + } + + screenX++ + colN++ + } + screenX = 0 + screenY++ + numLines++ + + if screenY >= v.height { + break + } + } + return numLines + v.Topline +} + // Relocate moves the view window so that the cursor is in view // This is useful if the user has scrolled far away, and then starts typing func (v *View) Relocate() bool { - height := v.Bottomline - v.Topline + height := v.Bottomline() - v.Topline ret := false cy := v.Cursor.Y scrollmargin := int(v.Buf.Settings["scrollmargin"].(float64)) @@ -911,10 +941,6 @@ func (v *View) DisplayView() { } } } - v.Bottomline = curLineN - if !v.Buf.Settings["softwrap"].(bool) { - v.Bottomline++ - } } // DisplayCursor draws the current buffer's cursor to the screen