|
|
|
@ -1,6 +1,8 @@
|
|
|
|
|
from textual.reactive import reactive
|
|
|
|
|
from textual.widget import Widget
|
|
|
|
|
from textual.app import ComposeResult
|
|
|
|
|
from textual.message import Message
|
|
|
|
|
from textual import events
|
|
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
import random
|
|
|
|
@ -12,8 +14,11 @@ class BingoBoard(Widget):
|
|
|
|
|
|
|
|
|
|
fields = reactive([], recompose = True)
|
|
|
|
|
|
|
|
|
|
cursor_x, cursor_y = 2, 2
|
|
|
|
|
|
|
|
|
|
def __init__(self) -> None:
|
|
|
|
|
self.fieldstate = [False for _ in range(25)]
|
|
|
|
|
self.can_focus = True
|
|
|
|
|
super().__init__()
|
|
|
|
|
self.fields = [
|
|
|
|
|
'Deko aufgehängt',
|
|
|
|
@ -45,6 +50,9 @@ class BingoBoard(Widget):
|
|
|
|
|
self.default_fields = self.fields
|
|
|
|
|
self.roll_board(int(datetime.now().timestamp()))
|
|
|
|
|
|
|
|
|
|
def fieldnum_from_cursor(self) -> int:
|
|
|
|
|
return self.cursor_x + ( self.cursor_y * 5)
|
|
|
|
|
|
|
|
|
|
def roll_board(self, seed):
|
|
|
|
|
self.seed = seed
|
|
|
|
|
random.seed(seed)
|
|
|
|
@ -60,6 +68,31 @@ class BingoBoard(Widget):
|
|
|
|
|
for _ in range(25):
|
|
|
|
|
yield BingoField(_, self.fields[_])
|
|
|
|
|
|
|
|
|
|
def on_focus(self, message: Message) -> None:
|
|
|
|
|
fields = self.query(BingoField)
|
|
|
|
|
fields[self.fieldnum_from_cursor()].set_highlighted(True)
|
|
|
|
|
|
|
|
|
|
def on_blur(self, message: Message) -> None:
|
|
|
|
|
fields = self.query(BingoField)
|
|
|
|
|
fields[self.fieldnum_from_cursor()].set_highlighted(False)
|
|
|
|
|
|
|
|
|
|
def on_key(self, event: events.Key) -> None:
|
|
|
|
|
fields = self.query(BingoField)
|
|
|
|
|
fields[self.fieldnum_from_cursor()].set_highlighted(False)
|
|
|
|
|
match event.key:
|
|
|
|
|
case 'up':
|
|
|
|
|
self.cursor_y -= 1 if self.cursor_y > 0 else 0
|
|
|
|
|
case 'down':
|
|
|
|
|
self.cursor_y += 1 if self.cursor_y < 4 else 0
|
|
|
|
|
case 'left':
|
|
|
|
|
self.cursor_x -= 1 if self.cursor_x > 0 else 0
|
|
|
|
|
case 'right':
|
|
|
|
|
self.cursor_x += 1 if self.cursor_x < 4 else 0
|
|
|
|
|
case 'enter':
|
|
|
|
|
fields[self.fieldnum_from_cursor()].on_click()
|
|
|
|
|
fields[self.fieldnum_from_cursor()].set_highlighted(True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def on_bingo_field_selected(self, message: BingoField.Selected) -> None:
|
|
|
|
|
self.fieldstate[message.num] = message.selected
|
|
|
|
|
if self.is_bingo():
|
|
|
|
|