summaryrefslogtreecommitdiff
path: root/src/tui/tui.go
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-12-31 17:03:18 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-12-31 17:05:14 +0900
commit9a2b7f559c88067c25a65a6a34c8e172bdf830dc (patch)
tree56bf93324f9096fc6772e64063c5f9ebc803e90a /src/tui/tui.go
parentb8d2b0df7e1241c09eff21dbb63ebcc841efc824 (diff)
downloadfzf-9a2b7f559c88067c25a65a6a34c8e172bdf830dc.tar.gz
Add --list-border for additional border around the list section
Close #4148
Diffstat (limited to 'src/tui/tui.go')
-rw-r--r--src/tui/tui.go83
1 files changed, 64 insertions, 19 deletions
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 {