mirror of https://github.com/JoshKarpel/spiel
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from rich.console import RenderableType
|
|
from rich.padding import Padding
|
|
from rich.table import Column, Table
|
|
from rich.text import Text
|
|
from textual.binding import Binding
|
|
|
|
from spiel.widgets.widget import SpielWidget
|
|
|
|
|
|
class AppBindingsTableWidget(SpielWidget):
|
|
DEFAULT_CSS = """
|
|
AppBindingsTableWidget {
|
|
width: auto;
|
|
height: auto;
|
|
}
|
|
"""
|
|
|
|
def render(self) -> RenderableType:
|
|
table = Table(
|
|
Column("Key", justify="left"),
|
|
Column("Description", justify="left"),
|
|
title="All Views",
|
|
)
|
|
|
|
for binding in self.app.BINDINGS:
|
|
if isinstance(binding, Binding):
|
|
table.add_row(binding.key, binding.description)
|
|
else:
|
|
raise TypeError(f"{binding} on {self.app} needs to be a {Binding.__name__}")
|
|
|
|
return Padding(table, pad=1)
|
|
|
|
|
|
class ScreenBindingsTableWidget(SpielWidget):
|
|
DEFAULT_CSS = """
|
|
ScreenBindingsTableWidget {
|
|
width: auto;
|
|
height: auto;
|
|
}
|
|
"""
|
|
|
|
def render(self) -> RenderableType:
|
|
if self.id is None:
|
|
return Text("")
|
|
|
|
screen = self.app.get_screen(self.id)
|
|
table = Table(
|
|
Column("Key", justify="left"),
|
|
Column("Description", justify="left"),
|
|
title=f"{self.id.title()} View",
|
|
)
|
|
|
|
for binding in screen.BINDINGS:
|
|
if isinstance(binding, Binding):
|
|
table.add_row(binding.key, binding.description)
|
|
else:
|
|
raise TypeError(f"{binding} on {screen} needs to be a {Binding.__name__}")
|
|
|
|
return Padding(table, pad=1)
|