Simplify border drawing code
This commit is contained in:
parent
f324697c7c
commit
31d9f663fc
@ -69,6 +69,7 @@ class Borders:
|
|||||||
self.os_window_id = os_window_id
|
self.os_window_id = os_window_id
|
||||||
self.tab_id = tab_id
|
self.tab_id = tab_id
|
||||||
self.draw_active_borders = opts.active_border_color is not None
|
self.draw_active_borders = opts.active_border_color is not None
|
||||||
|
self.draw_minimal_borders = opts.draw_minimal_borders
|
||||||
|
|
||||||
def __call__(
|
def __call__(
|
||||||
self,
|
self,
|
||||||
@ -88,29 +89,24 @@ class Borders:
|
|||||||
if groups:
|
if groups:
|
||||||
bw = groups[0].effective_border()
|
bw = groups[0].effective_border()
|
||||||
draw_borders = bw > 0 and draw_window_borders
|
draw_borders = bw > 0 and draw_window_borders
|
||||||
if draw_borders:
|
|
||||||
border_data = current_layout.resolve_borders(all_windows)
|
|
||||||
active_group = all_windows.active_group
|
active_group = all_windows.active_group
|
||||||
|
|
||||||
for i, wg in enumerate(groups):
|
for i, wg in enumerate(groups):
|
||||||
window_bg = wg.default_bg
|
window_bg = wg.default_bg
|
||||||
window_bg = (window_bg << 8) | BorderColor.window_bg
|
window_bg = (window_bg << 8) | BorderColor.window_bg
|
||||||
if draw_borders:
|
if draw_borders and not self.draw_minimal_borders:
|
||||||
# Draw the border rectangles
|
# Draw the border rectangles
|
||||||
if wg is active_group and self.draw_active_borders:
|
if wg is active_group and self.draw_active_borders:
|
||||||
color = BorderColor.active
|
color = BorderColor.active
|
||||||
else:
|
else:
|
||||||
color = BorderColor.bell if wg.needs_attention else BorderColor.inactive
|
color = BorderColor.bell if wg.needs_attention else BorderColor.inactive
|
||||||
try:
|
draw_edges(self.os_window_id, self.tab_id, (color, color, color, color), wg, borders=True)
|
||||||
colors = tuple(color if needed else window_bg for needed in next(border_data))
|
|
||||||
draw_edges(self.os_window_id, self.tab_id, colors, wg, borders=True)
|
|
||||||
except StopIteration:
|
|
||||||
pass
|
|
||||||
if not has_background_image:
|
if not has_background_image:
|
||||||
# Draw the background rectangles over the padding region
|
# Draw the background rectangles over the padding region
|
||||||
colors = window_bg, window_bg, window_bg, window_bg
|
colors = window_bg, window_bg, window_bg, window_bg
|
||||||
draw_edges(self.os_window_id, self.tab_id, colors, wg)
|
draw_edges(self.os_window_id, self.tab_id, colors, wg)
|
||||||
|
|
||||||
for border_line in current_layout.window_independent_borders(all_windows):
|
if self.draw_minimal_borders:
|
||||||
left, top, right, bottom = border_line.edges
|
for border_line in current_layout.minimal_borders(all_windows):
|
||||||
add_borders_rect(self.os_window_id, self.tab_id, left, top, right, bottom, border_line.color)
|
left, top, right, bottom = border_line.edges
|
||||||
|
add_borders_rect(self.os_window_id, self.tab_id, left, top, right, bottom, border_line.color)
|
||||||
|
|||||||
@ -19,13 +19,6 @@ from kitty.window_list import WindowGroup, WindowList
|
|||||||
from kitty.borders import BorderColor
|
from kitty.borders import BorderColor
|
||||||
|
|
||||||
|
|
||||||
class Borders(NamedTuple):
|
|
||||||
left: bool
|
|
||||||
top: bool
|
|
||||||
right: bool
|
|
||||||
bottom: bool
|
|
||||||
|
|
||||||
|
|
||||||
class BorderLine(NamedTuple):
|
class BorderLine(NamedTuple):
|
||||||
edges: Edges = Edges()
|
edges: Edges = Edges()
|
||||||
color: BorderColor = BorderColor.inactive
|
color: BorderColor = BorderColor.inactive
|
||||||
@ -45,8 +38,6 @@ class LayoutData(NamedTuple):
|
|||||||
content_size: int = 0
|
content_size: int = 0
|
||||||
|
|
||||||
|
|
||||||
all_borders = Borders(True, True, True, True)
|
|
||||||
no_borders = Borders(False, False, False, False)
|
|
||||||
DecorationPairs = Sequence[Tuple[int, int]]
|
DecorationPairs = Sequence[Tuple[int, int]]
|
||||||
LayoutDimension = Generator[LayoutData, None, None]
|
LayoutDimension = Generator[LayoutData, None, None]
|
||||||
ListOfWindows = List[WindowType]
|
ListOfWindows = List[WindowType]
|
||||||
@ -211,7 +202,6 @@ class Layout:
|
|||||||
name: Optional[str] = None
|
name: Optional[str] = None
|
||||||
needs_window_borders = True
|
needs_window_borders = True
|
||||||
must_draw_borders = False # can be overridden to customize behavior from kittens
|
must_draw_borders = False # can be overridden to customize behavior from kittens
|
||||||
no_minimal_window_borders = False # if True means minimal borders are drawn in window_independent_borders
|
|
||||||
layout_opts = LayoutOpts({})
|
layout_opts = LayoutOpts({})
|
||||||
only_active_window_visible = False
|
only_active_window_visible = False
|
||||||
|
|
||||||
@ -384,22 +374,9 @@ class Layout:
|
|||||||
def compute_needs_borders_map(self, all_windows: WindowList) -> Dict[int, bool]:
|
def compute_needs_borders_map(self, all_windows: WindowList) -> Dict[int, bool]:
|
||||||
return all_windows.compute_needs_borders_map(lgd.draw_active_borders)
|
return all_windows.compute_needs_borders_map(lgd.draw_active_borders)
|
||||||
|
|
||||||
def resolve_borders(self, all_windows: WindowList) -> Generator[Borders, None, None]:
|
def minimal_borders(self, windows: WindowList) -> Generator[BorderLine, None, None]:
|
||||||
if lgd.draw_minimal_borders:
|
|
||||||
needs_borders_map = self.compute_needs_borders_map(all_windows)
|
|
||||||
yield from self.minimal_borders(all_windows, needs_borders_map)
|
|
||||||
else:
|
|
||||||
for i in range(all_windows.num_groups):
|
|
||||||
yield all_borders
|
|
||||||
|
|
||||||
def window_independent_borders(self, windows: WindowList) -> Generator[BorderLine, None, None]:
|
|
||||||
return
|
return
|
||||||
yield BorderLine() # type: ignore
|
yield BorderLine() # type: ignore
|
||||||
|
|
||||||
def minimal_borders(self, windows: WindowList, needs_borders_map: Dict[int, bool]) -> Generator[Borders, None, None]:
|
|
||||||
if not self.no_minimal_window_borders:
|
|
||||||
for needs_border in needs_borders_map.values():
|
|
||||||
yield all_borders if needs_border else no_borders
|
|
||||||
|
|
||||||
def layout_action(self, action_name: str, args: Sequence[str], all_windows: WindowList) -> Optional[bool]:
|
def layout_action(self, action_name: str, args: Sequence[str], all_windows: WindowList) -> Optional[bool]:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -178,7 +178,7 @@ class Grid(Layout):
|
|||||||
n, nrows, ncols, special_rows, special_col, on_col_done):
|
n, nrows, ncols, special_rows, special_col, on_col_done):
|
||||||
position_window_in_grid_cell(window_idx, xl, yl)
|
position_window_in_grid_cell(window_idx, xl, yl)
|
||||||
|
|
||||||
def window_independent_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
def minimal_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
||||||
n = all_windows.num_groups
|
n = all_windows.num_groups
|
||||||
if not lgd.draw_minimal_borders or n < 2:
|
if not lgd.draw_minimal_borders or n < 2:
|
||||||
return
|
return
|
||||||
|
|||||||
@ -487,7 +487,7 @@ class Splits(Layout):
|
|||||||
pair.bias = 0.5
|
pair.bias = 0.5
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def window_independent_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
def minimal_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
||||||
groups = tuple(all_windows.iter_all_layoutable_groups())
|
groups = tuple(all_windows.iter_all_layoutable_groups())
|
||||||
window_count = len(groups)
|
window_count = len(groups)
|
||||||
if not lgd.draw_minimal_borders or window_count < 2:
|
if not lgd.draw_minimal_borders or window_count < 2:
|
||||||
|
|||||||
@ -202,7 +202,7 @@ class Tall(Layout):
|
|||||||
self.layout_opts.full_size -= 1
|
self.layout_opts.full_size -= 1
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def window_independent_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
def minimal_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
||||||
num = all_windows.num_groups
|
num = all_windows.num_groups
|
||||||
if num == 1 or not lgd.draw_minimal_borders:
|
if num == 1 or not lgd.draw_minimal_borders:
|
||||||
return
|
return
|
||||||
|
|||||||
@ -10,7 +10,7 @@ from kitty.typing import WindowType
|
|||||||
from kitty.window_list import WindowGroup, WindowList
|
from kitty.window_list import WindowGroup, WindowList
|
||||||
|
|
||||||
from .base import (
|
from .base import (
|
||||||
BorderLine, Borders, Layout, LayoutData, LayoutDimension, NeighborsMap,
|
BorderLine, Layout, LayoutData, LayoutDimension, NeighborsMap,
|
||||||
lgd, variable_bias
|
lgd, variable_bias
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -63,7 +63,6 @@ class Vertical(Layout):
|
|||||||
|
|
||||||
name = 'vertical'
|
name = 'vertical'
|
||||||
main_is_horizontal = False
|
main_is_horizontal = False
|
||||||
only_between_border = Borders(False, False, False, True)
|
|
||||||
no_minimal_window_borders = True
|
no_minimal_window_borders = True
|
||||||
main_axis_layout = Layout.ylayout
|
main_axis_layout = Layout.ylayout
|
||||||
perp_axis_layout = Layout.xlayout
|
perp_axis_layout = Layout.xlayout
|
||||||
@ -111,7 +110,7 @@ class Vertical(Layout):
|
|||||||
for wg, xl, yl in self.generate_layout_data(all_windows):
|
for wg, xl, yl in self.generate_layout_data(all_windows):
|
||||||
self.set_window_group_geometry(wg, xl, yl)
|
self.set_window_group_geometry(wg, xl, yl)
|
||||||
|
|
||||||
def window_independent_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
def minimal_borders(self, all_windows: WindowList) -> Generator[BorderLine, None, None]:
|
||||||
window_count = all_windows.num_groups
|
window_count = all_windows.num_groups
|
||||||
if window_count == 1 or not lgd.draw_minimal_borders:
|
if window_count == 1 or not lgd.draw_minimal_borders:
|
||||||
return
|
return
|
||||||
@ -133,6 +132,5 @@ class Horizontal(Vertical):
|
|||||||
|
|
||||||
name = 'horizontal'
|
name = 'horizontal'
|
||||||
main_is_horizontal = True
|
main_is_horizontal = True
|
||||||
only_between_border = Borders(False, False, True, False)
|
|
||||||
main_axis_layout = Layout.xlayout
|
main_axis_layout = Layout.xlayout
|
||||||
perp_axis_layout = Layout.ylayout
|
perp_axis_layout = Layout.ylayout
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user