|
| 1 | +Tabs = { |
| 2 | + _id = "tabs", |
| 3 | + _offsets = {}, |
| 4 | +} |
| 5 | + |
| 6 | +function Tabs:new(area) |
| 7 | + return setmetatable({ |
| 8 | + _area = area, |
| 9 | + }, { __index = self }) |
| 10 | +end |
| 11 | + |
| 12 | +function Tabs:reflow() return { self } end |
| 13 | + |
| 14 | +function Tabs:redraw() |
| 15 | + local len = #cx.tabs |
| 16 | + if len < 2 then |
| 17 | + return {} |
| 18 | + end |
| 19 | + |
| 20 | + local lines = { |
| 21 | + ui.Line(th.tabs.sep_outer.open):fg(th.tabs.inactive.bg), |
| 22 | + } |
| 23 | + |
| 24 | + local pos = lines[1]:width() |
| 25 | + local max = math.floor(self:inner_width() / len) |
| 26 | + for i = 1, len do |
| 27 | + local name = ya.truncate(string.format(" %d %s ", i, cx.tabs[i].name), { max = max }) |
| 28 | + if i == cx.tabs.idx then |
| 29 | + lines[#lines + 1] = ui.Line { |
| 30 | + ui.Span(th.tabs.sep_inner.open):style(th.tabs.inactive), |
| 31 | + ui.Span(name):style(th.tabs.active), |
| 32 | + ui.Span(th.tabs.sep_inner.close):style(th.tabs.inactive), |
| 33 | + } |
| 34 | + else |
| 35 | + lines[#lines + 1] = ui.Line(name):style(th.tabs.inactive) |
| 36 | + end |
| 37 | + self._offsets[i], pos = pos, pos + lines[#lines]:width() |
| 38 | + end |
| 39 | + |
| 40 | + lines[#lines + 1] = ui.Line(th.tabs.sep_outer.close):fg(th.tabs.inactive.bg) |
| 41 | + return { ui.Line(lines):area(self._area) } |
| 42 | +end |
| 43 | + |
| 44 | +function Tabs:inner_width() |
| 45 | + local si, so = th.tabs.sep_inner, th.tabs.sep_outer |
| 46 | + return math.max(0, self._area.w - ui.Line({ si.open, si.close, so.open, so.close }):width()) |
| 47 | +end |
| 48 | + |
| 49 | +-- Mouse events |
| 50 | +function Tabs:click(event, up) |
| 51 | + if up or event.is_middle then |
| 52 | + return |
| 53 | + end |
| 54 | + for i = #self._offsets, 1, -1 do |
| 55 | + if event.x >= self._offsets[i] then |
| 56 | + ya.emit("tab_switch", { i - 1 }) |
| 57 | + break |
| 58 | + end |
| 59 | + end |
| 60 | +end |
| 61 | + |
| 62 | +function Tabs:scroll(event, step) end |
| 63 | + |
| 64 | +function Tabs:touch(event, step) end |
0 commit comments