4 runewidth "github.com/mattn/go-runewidth"
5 "github.com/zyedidia/micro/v2/internal/buffer"
6 "github.com/zyedidia/micro/v2/internal/config"
7 "github.com/zyedidia/micro/v2/internal/screen"
8 "github.com/zyedidia/micro/v2/internal/util"
11 type TabWindow struct {
19 func NewTabWindow(w int, y int) *TabWindow {
26 func (w *TabWindow) Resize(width, height int) {
30 func (w *TabWindow) LocFromVisual(vloc buffer.Loc) int {
33 for i, n := range w.Names {
35 s := util.CharacterCountInString(n)
36 if vloc.Y == w.Y && vloc.X < x+s {
48 func (w *TabWindow) Scroll(amt int) {
51 w.hscroll = util.Clamp(w.hscroll, 0, s-w.Width)
58 func (w *TabWindow) TotalSize() int {
60 for _, n := range w.Names {
61 sum += runewidth.StringWidth(n) + 4
66 func (w *TabWindow) Active() int {
70 func (w *TabWindow) SetActive(a int) {
75 for i, n := range w.Names {
76 c := util.CharacterCountInString(n)
78 if x+c >= w.hscroll+w.Width {
79 w.hscroll = util.Clamp(x+c+1-w.Width, 0, s-w.Width)
80 } else if x < w.hscroll {
81 w.hscroll = util.Clamp(x-4, 0, s-w.Width)
93 func (w *TabWindow) Display() {
97 tabBarStyle := config.DefStyle.Reverse(true)
98 if style, ok := config.Colorscheme["tabbar"]; ok {
101 tabBarActiveStyle := tabBarStyle
102 if style, ok := config.Colorscheme["tabbar.active"]; ok {
103 tabBarActiveStyle = style
106 draw := func(r rune, n int, active bool) {
109 style = tabBarActiveStyle
111 for i := 0; i < n; i++ {
112 rw := runewidth.RuneWidth(r)
113 for j := 0; j < rw; j++ {
118 if x == w.Width-1 && !done {
119 screen.SetContent(w.Width-1, w.Y, '>', nil, tabBarStyle)
122 } else if x == 0 && w.hscroll > 0 {
123 screen.SetContent(0, w.Y, '<', nil, tabBarStyle)
124 } else if x >= 0 && x < w.Width {
125 screen.SetContent(x, w.Y, c, nil, style)
132 for i, n := range w.Names {
138 for _, c := range n {
139 draw(c, 1, i == w.active)
141 if i == len(w.Names)-1 {
156 draw(' ', w.Width-x, false)