From 9a2b7f559c88067c25a65a6a34c8e172bdf830dc Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 31 Dec 2024 17:03:18 +0900 Subject: Add --list-border for additional border around the list section Close #4148 --- src/tui/tui.go | 83 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 19 deletions(-) (limited to 'src/tui/tui.go') diff --git a/src/tui/tui.go b/src/tui/tui.go index 902d13fe..e2a891d0 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -303,6 +303,8 @@ type ColorTheme struct { Disabled ColorAttr Fg ColorAttr Bg ColorAttr + ListFg ColorAttr + ListBg ColorAttr SelectedFg ColorAttr SelectedBg ColorAttr SelectedMatch ColorAttr @@ -323,9 +325,11 @@ type ColorTheme struct { Scrollbar ColorAttr Border ColorAttr PreviewBorder ColorAttr + PreviewLabel ColorAttr PreviewScrollbar ColorAttr BorderLabel ColorAttr - PreviewLabel ColorAttr + ListLabel ColorAttr + ListBorder ColorAttr } type Event struct { @@ -395,6 +399,10 @@ func (s BorderShape) HasBottom() bool { return true } +func (s BorderShape) Visible() bool { + return s != BorderNone +} + type BorderStyle struct { shape BorderShape top rune @@ -525,7 +533,16 @@ type TermSize struct { PxHeight int } +type WindowType int + +const ( + WindowBase WindowType = iota + WindowList + WindowPreview +) + type Renderer interface { + DefaultTheme() *ColorTheme Init() error Resize(maxHeightFunc func(int) int) Pause(clear bool) @@ -546,7 +563,7 @@ type Renderer interface { Size() TermSize - NewWindow(top int, left int, width int, height int, preview bool, borderStyle BorderStyle) Window + NewWindow(top int, left int, width int, height int, windowType WindowType, borderStyle BorderStyle, erase bool) Window } type Window interface { @@ -627,6 +644,8 @@ var ( ColPreviewLabel ColorPair ColPreviewScrollbar ColorPair ColPreviewSpinner ColorPair + ColListBorder ColorPair + ColListLabel ColorPair ) func EmptyTheme() *ColorTheme { @@ -635,6 +654,8 @@ func EmptyTheme() *ColorTheme { Input: ColorAttr{colUndefined, AttrUndefined}, Fg: ColorAttr{colUndefined, AttrUndefined}, Bg: ColorAttr{colUndefined, AttrUndefined}, + ListFg: ColorAttr{colUndefined, AttrUndefined}, + ListBg: ColorAttr{colUndefined, AttrUndefined}, SelectedFg: ColorAttr{colUndefined, AttrUndefined}, SelectedBg: ColorAttr{colUndefined, AttrUndefined}, SelectedMatch: ColorAttr{colUndefined, AttrUndefined}, @@ -650,6 +671,8 @@ func EmptyTheme() *ColorTheme { Header: ColorAttr{colUndefined, AttrUndefined}, Border: ColorAttr{colUndefined, AttrUndefined}, BorderLabel: ColorAttr{colUndefined, AttrUndefined}, + ListLabel: ColorAttr{colUndefined, AttrUndefined}, + ListBorder: ColorAttr{colUndefined, AttrUndefined}, Disabled: ColorAttr{colUndefined, AttrUndefined}, PreviewFg: ColorAttr{colUndefined, AttrUndefined}, PreviewBg: ColorAttr{colUndefined, AttrUndefined}, @@ -668,6 +691,8 @@ func NoColorTheme() *ColorTheme { Input: ColorAttr{colDefault, AttrUndefined}, Fg: ColorAttr{colDefault, AttrUndefined}, Bg: ColorAttr{colDefault, AttrUndefined}, + ListFg: ColorAttr{colDefault, AttrUndefined}, + ListBg: ColorAttr{colDefault, AttrUndefined}, SelectedFg: ColorAttr{colDefault, AttrUndefined}, SelectedBg: ColorAttr{colDefault, AttrUndefined}, SelectedMatch: ColorAttr{colDefault, AttrUndefined}, @@ -690,6 +715,8 @@ func NoColorTheme() *ColorTheme { PreviewBorder: ColorAttr{colDefault, AttrUndefined}, PreviewScrollbar: ColorAttr{colDefault, AttrUndefined}, PreviewLabel: ColorAttr{colDefault, AttrUndefined}, + ListLabel: ColorAttr{colDefault, AttrUndefined}, + ListBorder: ColorAttr{colDefault, AttrUndefined}, Separator: ColorAttr{colDefault, AttrUndefined}, Scrollbar: ColorAttr{colDefault, AttrUndefined}, } @@ -701,6 +728,8 @@ func init() { Input: ColorAttr{colDefault, AttrUndefined}, Fg: ColorAttr{colDefault, AttrUndefined}, Bg: ColorAttr{colDefault, AttrUndefined}, + ListFg: ColorAttr{colUndefined, AttrUndefined}, + ListBg: ColorAttr{colUndefined, AttrUndefined}, SelectedFg: ColorAttr{colUndefined, AttrUndefined}, SelectedBg: ColorAttr{colUndefined, AttrUndefined}, SelectedMatch: ColorAttr{colUndefined, AttrUndefined}, @@ -723,6 +752,8 @@ func init() { PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + ListLabel: ColorAttr{colUndefined, AttrUndefined}, + ListBorder: ColorAttr{colUndefined, AttrUndefined}, Separator: ColorAttr{colUndefined, AttrUndefined}, Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } @@ -731,6 +762,8 @@ func init() { Input: ColorAttr{colDefault, AttrUndefined}, Fg: ColorAttr{colDefault, AttrUndefined}, Bg: ColorAttr{colDefault, AttrUndefined}, + ListFg: ColorAttr{colUndefined, AttrUndefined}, + ListBg: ColorAttr{colUndefined, AttrUndefined}, SelectedFg: ColorAttr{colUndefined, AttrUndefined}, SelectedBg: ColorAttr{colUndefined, AttrUndefined}, SelectedMatch: ColorAttr{colUndefined, AttrUndefined}, @@ -753,6 +786,8 @@ func init() { PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + ListLabel: ColorAttr{colUndefined, AttrUndefined}, + ListBorder: ColorAttr{colUndefined, AttrUndefined}, Separator: ColorAttr{colUndefined, AttrUndefined}, Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } @@ -761,6 +796,8 @@ func init() { Input: ColorAttr{colDefault, AttrUndefined}, Fg: ColorAttr{colDefault, AttrUndefined}, Bg: ColorAttr{colDefault, AttrUndefined}, + ListFg: ColorAttr{colUndefined, AttrUndefined}, + ListBg: ColorAttr{colUndefined, AttrUndefined}, SelectedFg: ColorAttr{colUndefined, AttrUndefined}, SelectedBg: ColorAttr{colUndefined, AttrUndefined}, SelectedMatch: ColorAttr{colUndefined, AttrUndefined}, @@ -783,12 +820,14 @@ func init() { PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + ListLabel: ColorAttr{colUndefined, AttrUndefined}, + ListBorder: ColorAttr{colUndefined, AttrUndefined}, Separator: ColorAttr{colUndefined, AttrUndefined}, Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } } -func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { +func InitTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { if forceBlack { theme.Bg = ColorAttr{colBlack, AttrUndefined} } @@ -820,8 +859,10 @@ func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { theme.BorderLabel = o(baseTheme.BorderLabel, theme.BorderLabel) // These colors are not defined in the base themes - theme.SelectedFg = o(theme.Fg, theme.SelectedFg) - theme.SelectedBg = o(theme.Bg, theme.SelectedBg) + theme.ListFg = o(theme.Fg, theme.ListFg) + theme.ListBg = o(theme.Bg, theme.ListBg) + theme.SelectedFg = o(theme.ListFg, theme.SelectedFg) + theme.SelectedBg = o(theme.ListBg, theme.SelectedBg) theme.SelectedMatch = o(theme.Match, theme.SelectedMatch) theme.Disabled = o(theme.Input, theme.Disabled) theme.Gutter = o(theme.DarkBg, theme.Gutter) @@ -829,8 +870,10 @@ func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { theme.PreviewBg = o(theme.Bg, theme.PreviewBg) theme.PreviewLabel = o(theme.BorderLabel, theme.PreviewLabel) theme.PreviewBorder = o(theme.Border, theme.PreviewBorder) - theme.Separator = o(theme.Border, theme.Separator) - theme.Scrollbar = o(theme.Border, theme.Scrollbar) + theme.ListLabel = o(theme.BorderLabel, theme.ListLabel) + theme.ListBorder = o(theme.Border, theme.ListBorder) + theme.Separator = o(theme.ListBorder, theme.Separator) + theme.Scrollbar = o(theme.ListBorder, theme.Scrollbar) theme.PreviewScrollbar = o(theme.PreviewBorder, theme.PreviewScrollbar) initPalette(theme) @@ -843,19 +886,19 @@ func initPalette(theme *ColorTheme) { } return ColorPair{fg.Color, bg.Color, fg.Attr} } - blank := theme.Fg + blank := theme.ListFg blank.Attr = AttrRegular - ColPrompt = pair(theme.Prompt, theme.Bg) - ColNormal = pair(theme.Fg, theme.Bg) + ColPrompt = pair(theme.Prompt, theme.ListBg) + ColNormal = pair(theme.ListFg, theme.ListBg) ColSelected = pair(theme.SelectedFg, theme.SelectedBg) - ColInput = pair(theme.Input, theme.Bg) - ColDisabled = pair(theme.Disabled, theme.Bg) - ColMatch = pair(theme.Match, theme.Bg) + ColInput = pair(theme.Input, theme.ListBg) + ColDisabled = pair(theme.Disabled, theme.ListBg) + ColMatch = pair(theme.Match, theme.ListBg) ColSelectedMatch = pair(theme.SelectedMatch, theme.SelectedBg) ColCursor = pair(theme.Cursor, theme.Gutter) ColCursorEmpty = pair(blank, theme.Gutter) - if theme.SelectedBg.Color != theme.Bg.Color { + if theme.SelectedBg.Color != theme.ListBg.Color { ColMarker = pair(theme.Marker, theme.SelectedBg) } else { ColMarker = pair(theme.Marker, theme.Gutter) @@ -866,11 +909,11 @@ func initPalette(theme *ColorTheme) { ColCurrentCursorEmpty = pair(blank, theme.DarkBg) ColCurrentMarker = pair(theme.Marker, theme.DarkBg) ColCurrentSelectedEmpty = pair(blank, theme.DarkBg) - ColSpinner = pair(theme.Spinner, theme.Bg) - ColInfo = pair(theme.Info, theme.Bg) - ColHeader = pair(theme.Header, theme.Bg) - ColSeparator = pair(theme.Separator, theme.Bg) - ColScrollbar = pair(theme.Scrollbar, theme.Bg) + ColSpinner = pair(theme.Spinner, theme.ListBg) + ColInfo = pair(theme.Info, theme.ListBg) + ColHeader = pair(theme.Header, theme.ListBg) + ColSeparator = pair(theme.Separator, theme.ListBg) + ColScrollbar = pair(theme.Scrollbar, theme.ListBg) ColBorder = pair(theme.Border, theme.Bg) ColBorderLabel = pair(theme.BorderLabel, theme.Bg) ColPreviewLabel = pair(theme.PreviewLabel, theme.PreviewBg) @@ -878,6 +921,8 @@ func initPalette(theme *ColorTheme) { ColPreviewBorder = pair(theme.PreviewBorder, theme.PreviewBg) ColPreviewScrollbar = pair(theme.PreviewScrollbar, theme.PreviewBg) ColPreviewSpinner = pair(theme.Spinner, theme.PreviewBg) + ColListLabel = pair(theme.ListLabel, theme.ListBg) + ColListBorder = pair(theme.ListBorder, theme.ListBg) } func runeWidth(r rune) int { -- cgit v1.2.3