diff options
Diffstat (limited to 'src/tui/tui.go')
-rw-r--r-- | src/tui/tui.go | 170 |
1 files changed, 149 insertions, 21 deletions
diff --git a/src/tui/tui.go b/src/tui/tui.go index 125611cf..859eed7a 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -115,6 +115,32 @@ const ( colWhite ) +type ColorPair struct { + fg Color + bg Color + id int16 +} + +func NewColorPair(fg Color, bg Color) ColorPair { + return ColorPair{fg, bg, -1} +} + +func (p ColorPair) Fg() Color { + return p.fg +} + +func (p ColorPair) Bg() Color { + return p.bg +} + +func (p ColorPair) key() int { + return (int(p.Fg()) << 8) + int(p.Bg()) +} + +func (p ColorPair) is24() bool { + return p.Fg().is24() || p.Bg().is24() +} + type ColorTheme struct { Fg Color Bg Color @@ -146,23 +172,84 @@ type MouseEvent struct { Mod bool } -var ( - _color bool - _prevDownTime time.Time - _clickY []int - Default16 *ColorTheme - Dark256 *ColorTheme - Light256 *ColorTheme -) +type Renderer interface { + Init() + Pause() + Resume() bool + Clear() + RefreshWindows(windows []Window) + Refresh() + Close() + + GetChar() Event + + MaxX() int + MaxY() int + DoesAutoWrap() bool + + NewWindow(top int, left int, width int, height int, border bool) Window +} -type Window struct { - impl *WindowImpl - Top int - Left int - Width int - Height int +type Window interface { + Top() int + Left() int + Width() int + Height() int + + Refresh() + FinishFill() + Close() + + X() int + Enclose(y int, x int) bool + + Move(y int, x int) + MoveAndClear(y int, x int) + Print(text string) + CPrint(color ColorPair, attr Attr, text string) + Fill(text string) bool + CFill(fg Color, bg Color, attr Attr, text string) bool + Erase() +} + +type FullscreenRenderer struct { + theme *ColorTheme + mouse bool + forceBlack bool + prevDownTime time.Time + clickY []int } +func NewFullscreenRenderer(theme *ColorTheme, forceBlack bool, mouse bool) Renderer { + r := &FullscreenRenderer{ + theme: theme, + mouse: mouse, + forceBlack: forceBlack, + prevDownTime: time.Unix(0, 0), + clickY: []int{}} + return r +} + +var ( + Default16 *ColorTheme + Dark256 *ColorTheme + Light256 *ColorTheme + + ColDefault ColorPair + ColNormal ColorPair + ColPrompt ColorPair + ColMatch ColorPair + ColCurrent ColorPair + ColCurrentMatch ColorPair + ColSpinner ColorPair + ColInfo ColorPair + ColCursor ColorPair + ColSelected ColorPair + ColHeader ColorPair + ColBorder ColorPair + ColUser ColorPair +) + func EmptyTheme() *ColorTheme { return &ColorTheme{ Fg: colUndefined, @@ -181,8 +268,6 @@ func EmptyTheme() *ColorTheme { } func init() { - _prevDownTime = time.Unix(0, 0) - _clickY = []int{} Default16 = &ColorTheme{ Fg: colDefault, Bg: colDefault, @@ -227,14 +312,13 @@ func init() { Border: 145} } -func InitTheme(theme *ColorTheme, black bool) { - _color = theme != nil - if !_color { +func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { + if theme == nil { + initPalette(theme) return } - baseTheme := DefaultTheme() - if black { + if forceBlack { theme.Bg = colBlack } @@ -257,4 +341,48 @@ func InitTheme(theme *ColorTheme, black bool) { theme.Selected = o(baseTheme.Selected, theme.Selected) theme.Header = o(baseTheme.Header, theme.Header) theme.Border = o(baseTheme.Border, theme.Border) + + initPalette(theme) +} + +func initPalette(theme *ColorTheme) { + ColDefault = ColorPair{colDefault, colDefault, 0} + if theme != nil { + ColNormal = ColorPair{theme.Fg, theme.Bg, 1} + ColPrompt = ColorPair{theme.Prompt, theme.Bg, 2} + ColMatch = ColorPair{theme.Match, theme.Bg, 3} + ColCurrent = ColorPair{theme.Current, theme.DarkBg, 4} + ColCurrentMatch = ColorPair{theme.CurrentMatch, theme.DarkBg, 5} + ColSpinner = ColorPair{theme.Spinner, theme.Bg, 6} + ColInfo = ColorPair{theme.Info, theme.Bg, 7} + ColCursor = ColorPair{theme.Cursor, theme.DarkBg, 8} + ColSelected = ColorPair{theme.Selected, theme.DarkBg, 9} + ColHeader = ColorPair{theme.Header, theme.Bg, 10} + ColBorder = ColorPair{theme.Border, theme.Bg, 11} + } else { + ColNormal = ColorPair{colDefault, colDefault, 1} + ColPrompt = ColorPair{colDefault, colDefault, 2} + ColMatch = ColorPair{colDefault, colDefault, 3} + ColCurrent = ColorPair{colDefault, colDefault, 4} + ColCurrentMatch = ColorPair{colDefault, colDefault, 5} + ColSpinner = ColorPair{colDefault, colDefault, 6} + ColInfo = ColorPair{colDefault, colDefault, 7} + ColCursor = ColorPair{colDefault, colDefault, 8} + ColSelected = ColorPair{colDefault, colDefault, 9} + ColHeader = ColorPair{colDefault, colDefault, 10} + ColBorder = ColorPair{colDefault, colDefault, 11} + } + ColUser = ColorPair{colDefault, colDefault, 12} +} + +func attrFor(color ColorPair, attr Attr) Attr { + switch color { + case ColCurrent: + return attr | Reverse + case ColMatch: + return attr | Underline + case ColCurrentMatch: + return attr | Underline | Reverse + } + return attr } |