mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-25 17:52:02 +02:00
Adding powerline style tabs
This commit is contained in:
@@ -679,10 +679,10 @@ Which edge to show the tab bar on, top or bottom'''))
|
|||||||
o('tab_bar_margin_width', 0.0, option_type=positive_float, long_text=_('''
|
o('tab_bar_margin_width', 0.0, option_type=positive_float, long_text=_('''
|
||||||
The margin to the left and right of the tab bar (in pts)'''))
|
The margin to the left and right of the tab bar (in pts)'''))
|
||||||
|
|
||||||
o('tab_bar_style', 'fade', option_type=choices('fade', 'separator', 'hidden'), long_text=_('''
|
o('tab_bar_style', 'fade', option_type=choices('fade', 'separator', 'powerline', 'hidden'), long_text=_('''
|
||||||
The tab bar style, can be one of: :code:`fade`, :code:`separator` or :code:`hidden`. In the fade style,
|
The tab bar style, can be one of: :code:`fade`, :code:`separator`, :code:`powerline`, or :code:`hidden`.
|
||||||
each tab's edges fade into the background color, in the separator style, tabs are
|
In the fade style, each tab's edges fade into the background color, in the separator style, tabs are
|
||||||
separated by a configurable separator.
|
separated by a configurable separator, and the powerline shows the tabs as a continuous line.
|
||||||
'''))
|
'''))
|
||||||
|
|
||||||
o('tab_bar_min_tabs', 2, option_type=lambda x: max(1, positive_int(x)), long_text=_('''
|
o('tab_bar_min_tabs', 2, option_type=lambda x: max(1, positive_int(x)), long_text=_('''
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from .rgb import alpha_blend, color_from_int
|
|||||||
TabBarData = namedtuple('TabBarData', 'title is_active needs_attention')
|
TabBarData = namedtuple('TabBarData', 'title is_active needs_attention')
|
||||||
DrawData = namedtuple(
|
DrawData = namedtuple(
|
||||||
'DrawData', 'leading_spaces sep trailing_spaces bell_on_tab'
|
'DrawData', 'leading_spaces sep trailing_spaces bell_on_tab'
|
||||||
' bell_fg alpha active_bg inactive_bg default_bg title_template')
|
' bell_fg alpha active_fg active_bg inactive_fg inactive_bg default_bg title_template')
|
||||||
|
|
||||||
|
|
||||||
def as_rgb(x):
|
def as_rgb(x):
|
||||||
@@ -41,7 +41,7 @@ def draw_title(draw_data, screen, tab, index):
|
|||||||
screen.draw(title)
|
screen.draw(title)
|
||||||
|
|
||||||
|
|
||||||
def draw_tab_with_separator(draw_data, screen, tab, before, max_title_length, index):
|
def draw_tab_with_separator(draw_data, screen, tab, before, max_title_length, index, is_last):
|
||||||
if draw_data.leading_spaces:
|
if draw_data.leading_spaces:
|
||||||
screen.draw(' ' * draw_data.leading_spaces)
|
screen.draw(' ' * draw_data.leading_spaces)
|
||||||
draw_title(draw_data, screen, tab, index)
|
draw_title(draw_data, screen, tab, index)
|
||||||
@@ -60,7 +60,7 @@ def draw_tab_with_separator(draw_data, screen, tab, before, max_title_length, in
|
|||||||
return end
|
return end
|
||||||
|
|
||||||
|
|
||||||
def draw_tab_with_fade(draw_data, screen, tab, before, max_title_length, index):
|
def draw_tab_with_fade(draw_data, screen, tab, before, max_title_length, index, is_last):
|
||||||
tab_bg = draw_data.active_bg if tab.is_active else draw_data.inactive_bg
|
tab_bg = draw_data.active_bg if tab.is_active else draw_data.inactive_bg
|
||||||
fade_colors = [as_rgb(color_as_int(alpha_blend(tab_bg, draw_data.default_bg, alpha))) for alpha in draw_data.alpha]
|
fade_colors = [as_rgb(color_as_int(alpha_blend(tab_bg, draw_data.default_bg, alpha))) for alpha in draw_data.alpha]
|
||||||
for bg in fade_colors:
|
for bg in fade_colors:
|
||||||
@@ -87,6 +87,55 @@ def draw_tab_with_fade(draw_data, screen, tab, before, max_title_length, index):
|
|||||||
return end
|
return end
|
||||||
|
|
||||||
|
|
||||||
|
def draw_tab_with_powerline(draw_data, screen, tab, before, max_title_length, index, is_last):
|
||||||
|
tab_bg = as_rgb(color_as_int(draw_data.active_bg if tab.is_active else draw_data.inactive_bg))
|
||||||
|
tab_fg = as_rgb(color_as_int(draw_data.active_fg if tab.is_active else draw_data.inactive_fg))
|
||||||
|
inactive_bg = as_rgb(color_as_int(draw_data.inactive_bg))
|
||||||
|
default_bg = as_rgb(color_as_int(draw_data.default_bg))
|
||||||
|
|
||||||
|
min_title_length = 1 + 2
|
||||||
|
|
||||||
|
if screen.cursor.x + min_title_length >= screen.columns:
|
||||||
|
screen.cursor.x -= 2
|
||||||
|
screen.cursor.bg = default_bg
|
||||||
|
screen.cursor.fg = inactive_bg
|
||||||
|
screen.draw(' ')
|
||||||
|
return screen.cursor.x
|
||||||
|
|
||||||
|
if tab.is_active and screen.cursor.x >= 2:
|
||||||
|
screen.cursor.x -= 2
|
||||||
|
screen.cursor.fg = inactive_bg
|
||||||
|
screen.cursor.bg = tab_bg
|
||||||
|
screen.draw(' ')
|
||||||
|
screen.cursor.fg = tab_fg
|
||||||
|
elif screen.cursor.x == 0:
|
||||||
|
screen.draw(' ')
|
||||||
|
|
||||||
|
if min_title_length >= max_title_length:
|
||||||
|
screen.draw('…')
|
||||||
|
else:
|
||||||
|
draw_title(draw_data, screen, tab, index)
|
||||||
|
extra = screen.cursor.x + 2 - before - max_title_length
|
||||||
|
if extra > 0 and extra + 1 < screen.cursor.x:
|
||||||
|
screen.cursor.x -= extra + 1
|
||||||
|
screen.draw('…')
|
||||||
|
|
||||||
|
if tab.is_active or is_last:
|
||||||
|
screen.draw(' ')
|
||||||
|
screen.cursor.fg = tab_bg
|
||||||
|
if is_last:
|
||||||
|
screen.cursor.bg = default_bg
|
||||||
|
else:
|
||||||
|
screen.cursor.bg = inactive_bg
|
||||||
|
screen.draw('')
|
||||||
|
else:
|
||||||
|
screen.draw(' ')
|
||||||
|
|
||||||
|
end = screen.cursor.x
|
||||||
|
screen.draw(' ')
|
||||||
|
return end
|
||||||
|
|
||||||
|
|
||||||
class TabBar:
|
class TabBar:
|
||||||
|
|
||||||
def __init__(self, os_window_id, opts):
|
def __init__(self, os_window_id, opts):
|
||||||
@@ -123,10 +172,16 @@ class TabBar:
|
|||||||
self.bell_fg = as_rgb(0xff0000)
|
self.bell_fg = as_rgb(0xff0000)
|
||||||
self.draw_data = DrawData(
|
self.draw_data = DrawData(
|
||||||
self.leading_spaces, self.sep, self.trailing_spaces, self.opts.bell_on_tab, self.bell_fg,
|
self.leading_spaces, self.sep, self.trailing_spaces, self.opts.bell_on_tab, self.bell_fg,
|
||||||
self.opts.tab_fade, self.opts.active_tab_background, self.opts.inactive_tab_background,
|
self.opts.tab_fade, self.opts.active_tab_foreground, self.opts.active_tab_background,
|
||||||
|
self.opts.inactive_tab_foreground, self.opts.inactive_tab_background,
|
||||||
self.opts.background, self.opts.tab_title_template
|
self.opts.background, self.opts.tab_title_template
|
||||||
)
|
)
|
||||||
self.draw_func = draw_tab_with_separator if self.opts.tab_bar_style == 'separator' else draw_tab_with_fade
|
if self.opts.tab_bar_style == 'separator':
|
||||||
|
self.draw_func = draw_tab_with_separator
|
||||||
|
elif self.opts.tab_bar_style == 'powerline':
|
||||||
|
self.draw_func = draw_tab_with_powerline
|
||||||
|
else:
|
||||||
|
self.draw_func = draw_tab_with_fade
|
||||||
|
|
||||||
def patch_colors(self, spec):
|
def patch_colors(self, spec):
|
||||||
if 'active_tab_foreground' in spec:
|
if 'active_tab_foreground' in spec:
|
||||||
@@ -179,7 +234,7 @@ class TabBar:
|
|||||||
s.cursor.fg = self.active_fg if t.is_active else 0
|
s.cursor.fg = self.active_fg if t.is_active else 0
|
||||||
s.cursor.bold, s.cursor.italic = self.active_font_style if t.is_active else self.inactive_font_style
|
s.cursor.bold, s.cursor.italic = self.active_font_style if t.is_active else self.inactive_font_style
|
||||||
before = s.cursor.x
|
before = s.cursor.x
|
||||||
end = self.draw_func(self.draw_data, s, t, before, max_title_length, i + 1)
|
end = self.draw_func(self.draw_data, s, t, before, max_title_length, i + 1, t is last_tab)
|
||||||
cr.append((before, end))
|
cr.append((before, end))
|
||||||
if s.cursor.x > s.columns - max_title_length and t is not last_tab:
|
if s.cursor.x > s.columns - max_title_length and t is not last_tab:
|
||||||
s.draw('…')
|
s.draw('…')
|
||||||
|
|||||||
Reference in New Issue
Block a user