50 lines
1.3 KiB
Python
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]
|