6 runewidth "github.com/mattn/go-runewidth"
7 "github.com/zyedidia/micro/internal/buffer"
8 "github.com/zyedidia/micro/internal/config"
9 "github.com/zyedidia/micro/internal/screen"
10 "github.com/zyedidia/micro/internal/util"
13 type TabWindow struct {
21 func NewTabWindow(w int, y int) *TabWindow {
28 func (w *TabWindow) Resize(width, height int) {
32 func (w *TabWindow) LocFromVisual(vloc buffer.Loc) int {
35 for i, n := range w.Names {
37 s := utf8.RuneCountInString(n)
38 if vloc.Y == w.Y && vloc.X < x+s {
50 func (w *TabWindow) Scroll(amt int) {
53 w.hscroll = util.Clamp(w.hscroll, 0, s-w.Width)
60 func (w *TabWindow) TotalSize() int {
62 for _, n := range w.Names {
63 sum += runewidth.StringWidth(n) + 4
68 func (w *TabWindow) Active() int {
72 func (w *TabWindow) SetActive(a int) {
77 for i, n := range w.Names {
78 c := utf8.RuneCountInString(n)
80 if x+c >= w.hscroll+w.Width {
81 w.hscroll = util.Clamp(x+c+1-w.Width, 0, s-w.Width)
82 } else if x < w.hscroll {
83 w.hscroll = util.Clamp(x-4, 0, s-w.Width)
95 func (w *TabWindow) Display() {
99 tabBarStyle := config.DefStyle.Reverse(true)
100 if style, ok := config.Colorscheme["tabbar"]; ok {
104 draw := func(r rune, n int) {
105 for i := 0; i < n; i++ {
106 rw := runewidth.RuneWidth(r)
107 for j := 0; j < rw; j++ {
112 if x == w.Width-1 && !done {
113 screen.SetContent(w.Width-1, w.Y, '>', nil, tabBarStyle)
116 } else if x == 0 && w.hscroll > 0 {
117 screen.SetContent(0, w.Y, '<', nil, tabBarStyle)
118 } else if x >= 0 && x < w.Width {
119 screen.SetContent(x, w.Y, c, nil, tabBarStyle)
126 for i, n := range w.Names {
132 for _, c := range n {
135 if i == len(w.Names)-1 {