kitty/kitty/layout/interface.py

50 lines
1.3 KiB
Python

#!/usr/bin/env python
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>
from typing import Dict, Tuple, Type
from .base import Layout
from .grid import Grid
from .splits import Splits
from .stack import Stack
from .tall import Fat, Tall
from .vertical import Horizontal, Vertical
all_layouts: Dict[str, Type[Layout]] = {
Stack.name: Stack,
Tall.name: Tall,
Fat.name: Fat,
Vertical.name: Vertical,
Horizontal.name: Horizontal,
Grid.name: Grid,
Splits.name: Splits,
}
class CreateLayoutObjectFor:
cache: Dict[Tuple, Layout] = {}
def __call__(
self,
name: str,
os_window_id: int,
tab_id: int,
layout_opts: str = ''
) -> Layout:
key = name, os_window_id, tab_id, layout_opts
ans = create_layout_object_for.cache.get(key)
if ans is None:
name, layout_opts = name.partition(':')[::2]
ans = create_layout_object_for.cache[key] = all_layouts[name](
os_window_id, tab_id, layout_opts)
return ans
create_layout_object_for = CreateLayoutObjectFor()
def evict_cached_layouts(tab_id: int) -> None:
remove = [key for key in create_layout_object_for.cache if key[2] == tab_id]
for key in remove:
del create_layout_object_for.cache[key]