summaryrefslogtreecommitdiffstats
path: root/src/tui/tui.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/tui/tui.go')
-rw-r--r--src/tui/tui.go170
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
}