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.go250
1 files changed, 250 insertions, 0 deletions
diff --git a/src/tui/tui.go b/src/tui/tui.go
new file mode 100644
index 00000000..a33baa4a
--- /dev/null
+++ b/src/tui/tui.go
@@ -0,0 +1,250 @@
+package tui
+
+import (
+ "time"
+)
+
+// Types of user action
+const (
+ Rune = iota
+
+ CtrlA
+ CtrlB
+ CtrlC
+ CtrlD
+ CtrlE
+ CtrlF
+ CtrlG
+ CtrlH
+ Tab
+ CtrlJ
+ CtrlK
+ CtrlL
+ CtrlM
+ CtrlN
+ CtrlO
+ CtrlP
+ CtrlQ
+ CtrlR
+ CtrlS
+ CtrlT
+ CtrlU
+ CtrlV
+ CtrlW
+ CtrlX
+ CtrlY
+ CtrlZ
+ ESC
+
+ Invalid
+ Mouse
+ DoubleClick
+
+ BTab
+ BSpace
+
+ Del
+ PgUp
+ PgDn
+
+ Up
+ Down
+ Left
+ Right
+ Home
+ End
+
+ SLeft
+ SRight
+
+ F1
+ F2
+ F3
+ F4
+ F5
+ F6
+ F7
+ F8
+ F9
+ F10
+
+ AltEnter
+ AltSpace
+ AltSlash
+ AltBS
+ AltA
+ AltB
+ AltC
+ AltD
+ AltE
+ AltF
+
+ AltZ = AltA + 'z' - 'a'
+)
+
+const (
+ doubleClickDuration = 500 * time.Millisecond
+)
+
+type Color int16
+
+const (
+ colUndefined Color = -2
+ colDefault = -1
+)
+
+const (
+ colBlack Color = iota
+ colRed
+ colGreen
+ colYellow
+ colBlue
+ colMagenta
+ colCyan
+ colWhite
+)
+
+type ColorTheme struct {
+ Fg Color
+ Bg Color
+ DarkBg Color
+ Prompt Color
+ Match Color
+ Current Color
+ CurrentMatch Color
+ Spinner Color
+ Info Color
+ Cursor Color
+ Selected Color
+ Header Color
+ Border Color
+}
+
+type Event struct {
+ Type int
+ Char rune
+ MouseEvent *MouseEvent
+}
+
+type MouseEvent struct {
+ Y int
+ X int
+ S int
+ Down bool
+ Double bool
+ Mod bool
+}
+
+var (
+ _buf []byte
+ _color bool
+ _prevDownTime time.Time
+ _clickY []int
+ Default16 *ColorTheme
+ Dark256 *ColorTheme
+ Light256 *ColorTheme
+)
+
+type Window struct {
+ impl *WindowImpl
+ Top int
+ Left int
+ Width int
+ Height int
+}
+
+func EmptyTheme() *ColorTheme {
+ return &ColorTheme{
+ Fg: colUndefined,
+ Bg: colUndefined,
+ DarkBg: colUndefined,
+ Prompt: colUndefined,
+ Match: colUndefined,
+ Current: colUndefined,
+ CurrentMatch: colUndefined,
+ Spinner: colUndefined,
+ Info: colUndefined,
+ Cursor: colUndefined,
+ Selected: colUndefined,
+ Header: colUndefined,
+ Border: colUndefined}
+}
+
+func init() {
+ _prevDownTime = time.Unix(0, 0)
+ _clickY = []int{}
+ Default16 = &ColorTheme{
+ Fg: colDefault,
+ Bg: colDefault,
+ DarkBg: colBlack,
+ Prompt: colBlue,
+ Match: colGreen,
+ Current: colYellow,
+ CurrentMatch: colGreen,
+ Spinner: colGreen,
+ Info: colWhite,
+ Cursor: colRed,
+ Selected: colMagenta,
+ Header: colCyan,
+ Border: colBlack}
+ Dark256 = &ColorTheme{
+ Fg: colDefault,
+ Bg: colDefault,
+ DarkBg: 236,
+ Prompt: 110,
+ Match: 108,
+ Current: 254,
+ CurrentMatch: 151,
+ Spinner: 148,
+ Info: 144,
+ Cursor: 161,
+ Selected: 168,
+ Header: 109,
+ Border: 59}
+ Light256 = &ColorTheme{
+ Fg: colDefault,
+ Bg: colDefault,
+ DarkBg: 251,
+ Prompt: 25,
+ Match: 66,
+ Current: 237,
+ CurrentMatch: 23,
+ Spinner: 65,
+ Info: 101,
+ Cursor: 161,
+ Selected: 168,
+ Header: 31,
+ Border: 145}
+}
+
+func InitTheme(theme *ColorTheme, black bool) {
+ _color = theme != nil
+ if !_color {
+ return
+ }
+
+ baseTheme := DefaultTheme()
+ if black {
+ theme.Bg = colBlack
+ }
+
+ o := func(a Color, b Color) Color {
+ if b == colUndefined {
+ return a
+ }
+ return b
+ }
+ theme.Fg = o(baseTheme.Fg, theme.Fg)
+ theme.Bg = o(baseTheme.Bg, theme.Bg)
+ theme.DarkBg = o(baseTheme.DarkBg, theme.DarkBg)
+ theme.Prompt = o(baseTheme.Prompt, theme.Prompt)
+ theme.Match = o(baseTheme.Match, theme.Match)
+ theme.Current = o(baseTheme.Current, theme.Current)
+ theme.CurrentMatch = o(baseTheme.CurrentMatch, theme.CurrentMatch)
+ theme.Spinner = o(baseTheme.Spinner, theme.Spinner)
+ theme.Info = o(baseTheme.Info, theme.Info)
+ theme.Cursor = o(baseTheme.Cursor, theme.Cursor)
+ theme.Selected = o(baseTheme.Selected, theme.Selected)
+ theme.Header = o(baseTheme.Header, theme.Header)
+ theme.Border = o(baseTheme.Border, theme.Border)
+}