Fix rendering of double-column borders

This commit is contained in:
Junegunn Choi 2023-01-16 19:34:28 +09:00
parent 3109b865d2
commit 8b299a29c7
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
2 changed files with 22 additions and 8 deletions

View File

@ -1064,6 +1064,7 @@ func (t *Terminal) resizeWindows(forcePreview bool) {
// Reset preview version so that full redraw occurs // Reset preview version so that full redraw occurs
t.previewed.version = 0 t.previewed.version = 0
bw := t.borderWidth
switch t.borderShape { switch t.borderShape {
case tui.BorderHorizontal: case tui.BorderHorizontal:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
@ -1071,7 +1072,7 @@ func (t *Terminal) resizeWindows(forcePreview bool) {
false, tui.MakeBorderStyle(tui.BorderHorizontal, t.unicode)) false, tui.MakeBorderStyle(tui.BorderHorizontal, t.unicode))
case tui.BorderVertical: case tui.BorderVertical:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
marginInt[0], marginInt[3]-2, width+4, height, marginInt[0], marginInt[3]-(1+bw), width+(1+bw)*2, height,
false, tui.MakeBorderStyle(tui.BorderVertical, t.unicode)) false, tui.MakeBorderStyle(tui.BorderVertical, t.unicode))
case tui.BorderTop: case tui.BorderTop:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
@ -1083,15 +1084,15 @@ func (t *Terminal) resizeWindows(forcePreview bool) {
false, tui.MakeBorderStyle(tui.BorderBottom, t.unicode)) false, tui.MakeBorderStyle(tui.BorderBottom, t.unicode))
case tui.BorderLeft: case tui.BorderLeft:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
marginInt[0], marginInt[3]-2, width+2, height, marginInt[0], marginInt[3]-(1+bw), width+(1+bw), height,
false, tui.MakeBorderStyle(tui.BorderLeft, t.unicode)) false, tui.MakeBorderStyle(tui.BorderLeft, t.unicode))
case tui.BorderRight: case tui.BorderRight:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
marginInt[0], marginInt[3], width+2, height, marginInt[0], marginInt[3], width+(1+bw), height,
false, tui.MakeBorderStyle(tui.BorderRight, t.unicode)) false, tui.MakeBorderStyle(tui.BorderRight, t.unicode))
case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble: case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble:
t.border = t.tui.NewWindow( t.border = t.tui.NewWindow(
marginInt[0]-1, marginInt[3]-2, width+4, height+2, marginInt[0]-1, marginInt[3]-(1+bw), width+(1+bw)*2, height+2,
false, tui.MakeBorderStyle(t.borderShape, t.unicode)) false, tui.MakeBorderStyle(t.borderShape, t.unicode))
} }
@ -1112,7 +1113,6 @@ func (t *Terminal) resizeWindows(forcePreview bool) {
return return
} }
hasThreshold := previewOpts.threshold > 0 && previewOpts.alternative != nil hasThreshold := previewOpts.threshold > 0 && previewOpts.alternative != nil
bw := t.borderWidth
createPreviewWindow := func(y int, x int, w int, h int) { createPreviewWindow := func(y int, x int, w int, h int) {
pwidth := w pwidth := w
pheight := h pheight := h

View File

@ -695,13 +695,26 @@ func (w *TcellWindow) drawBorder() {
hw := runewidth.RuneWidth(w.borderStyle.horizontal) hw := runewidth.RuneWidth(w.borderStyle.horizontal)
switch shape { switch shape {
case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderTop: case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderTop:
for x := left; x <= right-hw; x += hw { max := right - 2*hw
if shape == BorderHorizontal || shape == BorderTop {
max = right - hw
}
// tcell has an issue displaying two overlapping wide runes
// e.g. SetContent( HH )
// SetContent( TR )
// ==================
// ( HH ) => TR is ignored
for x := left; x <= max; x += hw {
_screen.SetContent(x, top, w.borderStyle.horizontal, nil, style) _screen.SetContent(x, top, w.borderStyle.horizontal, nil, style)
} }
} }
switch shape { switch shape {
case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderBottom: case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderBottom:
for x := left; x <= right-hw; x += hw { max := right - 2*hw
if shape == BorderHorizontal || shape == BorderBottom {
max = right - hw
}
for x := left; x <= max; x += hw {
_screen.SetContent(x, bot-1, w.borderStyle.horizontal, nil, style) _screen.SetContent(x, bot-1, w.borderStyle.horizontal, nil, style)
} }
} }
@ -713,8 +726,9 @@ func (w *TcellWindow) drawBorder() {
} }
switch shape { switch shape {
case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderVertical, BorderRight: case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderVertical, BorderRight:
vw := runewidth.RuneWidth(w.borderStyle.vertical)
for y := top; y < bot; y++ { for y := top; y < bot; y++ {
_screen.SetContent(right-hw, y, w.borderStyle.vertical, nil, style) _screen.SetContent(right-vw, y, w.borderStyle.vertical, nil, style)
} }
} }
switch shape { switch shape {