Improve preview window rendering

- Fix incorrect display of the last line when more than a line is
  wrapped above
- Avoid unnecessary flickering of the window
This commit is contained in:
Junegunn Choi 2017-07-19 22:46:16 +09:00
parent 28810c178f
commit bc9d2abdb6
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
4 changed files with 21 additions and 6 deletions

View File

@ -962,6 +962,7 @@ func (t *Terminal) printPreview() {
} }
reader := bufio.NewReader(strings.NewReader(t.previewer.text)) reader := bufio.NewReader(strings.NewReader(t.previewer.text))
lineNo := -t.previewer.offset lineNo := -t.previewer.offset
height := t.pwindow.Height()
var ansi *ansiState var ansi *ansiState
for { for {
line, err := reader.ReadString('\n') line, err := reader.ReadString('\n')
@ -970,7 +971,8 @@ func (t *Terminal) printPreview() {
line = line[:len(line)-1] line = line[:len(line)-1]
} }
lineNo++ lineNo++
if lineNo > t.pwindow.Height() { if lineNo > height ||
t.pwindow.Y() == height-1 && t.pwindow.X() > 0 {
break break
} else if lineNo > 0 { } else if lineNo > 0 {
var fillRet tui.FillReturn var fillRet tui.FillReturn
@ -1000,7 +1002,7 @@ func (t *Terminal) printPreview() {
} }
} }
t.pwindow.FinishFill() t.pwindow.FinishFill()
if t.previewer.lines > t.pwindow.Height() { if t.previewer.lines > height {
offset := fmt.Sprintf("%d/%d", t.previewer.offset+1, t.previewer.lines) offset := fmt.Sprintf("%d/%d", t.previewer.offset+1, t.previewer.lines)
pos := t.pwindow.Width() - len(offset) pos := t.pwindow.Width() - len(offset)
if t.tui.DoesAutoWrap() { if t.tui.DoesAutoWrap() {

View File

@ -705,6 +705,10 @@ func (w *LightWindow) X() int {
return w.posx return w.posx
} }
func (w *LightWindow) Y() int {
return w.posy
}
func (w *LightWindow) Enclose(y int, x int) bool { func (w *LightWindow) Enclose(y int, x int) bool {
return x >= w.left && x < (w.left+w.width) && return x >= w.left && x < (w.left+w.width) &&
y >= w.top && y < (w.top+w.height) y >= w.top && y < (w.top+w.height)
@ -839,17 +843,20 @@ func (w *LightWindow) fill(str string, onMove func()) FillReturn {
for j, wl := range lines { for j, wl := range lines {
if w.posx >= w.Width()-1 && wl.displayWidth == 0 { if w.posx >= w.Width()-1 && wl.displayWidth == 0 {
if w.posy < w.height-1 { if w.posy < w.height-1 {
w.MoveAndClear(w.posy+1, 0) w.Move(w.posy+1, 0)
} }
return FillNextLine return FillNextLine
} }
w.stderrInternal(wl.text, false) w.stderrInternal(wl.text, false)
w.posx += wl.displayWidth w.posx += wl.displayWidth
// Wrap line
if j < len(lines)-1 || i < len(allLines)-1 { if j < len(lines)-1 || i < len(allLines)-1 {
if w.posy+1 >= w.height { if w.posy+1 >= w.height {
return FillSuspend return FillSuspend
} }
w.MoveAndClear(w.posy+1, 0) w.MoveAndClear(w.posy, w.posx)
w.Move(w.posy+1, 0)
onMove() onMove()
} }
} }
@ -864,13 +871,13 @@ func (w *LightWindow) setBg() {
} }
func (w *LightWindow) Fill(text string) FillReturn { func (w *LightWindow) Fill(text string) FillReturn {
w.MoveAndClear(w.posy, w.posx) w.Move(w.posy, w.posx)
w.setBg() w.setBg()
return w.fill(text, w.setBg) return w.fill(text, w.setBg)
} }
func (w *LightWindow) CFill(fg Color, bg Color, attr Attr, text string) FillReturn { func (w *LightWindow) CFill(fg Color, bg Color, attr Attr, text string) FillReturn {
w.MoveAndClear(w.posy, w.posx) w.Move(w.posy, w.posx)
if bg == colDefault { if bg == colDefault {
bg = w.bg bg = w.bg
} }
@ -882,6 +889,7 @@ func (w *LightWindow) CFill(fg Color, bg Color, attr Attr, text string) FillRetu
} }
func (w *LightWindow) FinishFill() { func (w *LightWindow) FinishFill() {
w.MoveAndClear(w.posy, w.posx)
for y := w.posy + 1; y < w.height; y++ { for y := w.posy + 1; y < w.height; y++ {
w.MoveAndClear(y, 0) w.MoveAndClear(y, 0)
} }

View File

@ -164,6 +164,10 @@ func (w *TcellWindow) X() int {
return w.lastX return w.lastX
} }
func (w *TcellWindow) Y() int {
return w.lastY
}
func (r *FullscreenRenderer) DoesAutoWrap() bool { func (r *FullscreenRenderer) DoesAutoWrap() bool {
return false return false
} }

View File

@ -236,6 +236,7 @@ type Window interface {
Close() Close()
X() int X() int
Y() int
Enclose(y int, x int) bool Enclose(y int, x int) bool
Move(y int, x int) Move(y int, x int)