Scrypt / scrypt /ui /deckview.py
IMJONEZZ's picture
SCRYPT: initial commit — game, sandbox, Warden, Space web layer
9fca766
Raw
History Blame Contribute Delete
1.59 kB
"""Deck viewer: what you're running, grouped and counted. Any key closes."""
from __future__ import annotations
from collections import Counter
from rich.table import Table
from rich.text import Text
from textual import events
from textual.app import ComposeResult
from textual.screen import ModalScreen
from textual.widgets import Static
from scrypt.engine.cards import Card
class DeckViewScreen(ModalScreen):
CSS = """
DeckViewScreen { align: center middle; }
#deck-table { width: 60; max-height: 80%; padding: 1 2; background: $surface;
border: solid grey; }
"""
def __init__(self, deck: list[Card], title: str = "your deck"):
super().__init__()
self.deck = deck
self.title = title
def compose(self) -> ComposeResult:
counts = Counter(c.id for c in self.deck)
specs = {c.id: c for c in self.deck}
table = Table(title=f"{self.title}{len(self.deck)} cards", expand=True)
table.add_column("card")
table.add_column("#", justify="right")
table.add_column("stats", justify="center")
table.add_column("cost")
table.add_column("sigils")
for cid, n in sorted(counts.items(), key=lambda kv: (-specs[kv[0]].power, kv[0])):
spec = specs[cid]
table.add_row(
spec.name, str(n), f"{spec.power}{spec.health}♥",
str(spec.cost), " ".join(spec.sigils),
)
yield Static(table, id="deck-table")
def on_key(self, event: events.Key) -> None:
self.dismiss(None)