Merge pull request '3-keyboard-control' (#4) from 3-keyboard-control into master

Reviewed-on: #4
master
Felix Pankratz 5 months ago
commit 292bb56a8f

@ -1,6 +1,8 @@
from textual.reactive import reactive from textual.reactive import reactive
from textual.widget import Widget from textual.widget import Widget
from textual.app import ComposeResult from textual.app import ComposeResult
from textual.message import Message
from textual import events
from datetime import datetime from datetime import datetime
import random import random
@ -12,8 +14,11 @@ class BingoBoard(Widget):
fields = reactive([], recompose = True) fields = reactive([], recompose = True)
cursor_x, cursor_y = 2, 2
def __init__(self) -> None: def __init__(self) -> None:
self.fieldstate = [False for _ in range(25)] self.fieldstate = [False for _ in range(25)]
self.can_focus = True
super().__init__() super().__init__()
self.fields = [ self.fields = [
'Deko aufgehängt', 'Deko aufgehängt',
@ -45,6 +50,9 @@ class BingoBoard(Widget):
self.default_fields = self.fields self.default_fields = self.fields
self.roll_board(int(datetime.now().timestamp())) 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): def roll_board(self, seed):
self.seed = seed self.seed = seed
random.seed(seed) random.seed(seed)
@ -60,6 +68,31 @@ class BingoBoard(Widget):
for _ in range(25): for _ in range(25):
yield BingoField(_, self.fields[_]) 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: async def on_bingo_field_selected(self, message: BingoField.Selected) -> None:
self.fieldstate[message.num] = message.selected self.fieldstate[message.num] = message.selected
if self.is_bingo(): if self.is_bingo():

@ -5,7 +5,6 @@ from textual.reactive import reactive
class BingoField(Static): class BingoField(Static):
'''A Bingo field widget.''' '''A Bingo field widget.'''
cursor_x, cursor_y = 2, 2
text = reactive('') text = reactive('')
class Selected(Message): class Selected(Message):
@ -18,27 +17,26 @@ class BingoField(Static):
def __init__(self, num, text: str) -> None: def __init__(self, num, text: str) -> None:
self.num = num self.num = num
self.selected = False self.selected = False
self.highlighted = False
super().__init__() super().__init__()
self.text = text self.text = text
#def on_mount(self) -> None:
#self.styles.content_align = ('center', 'middle')
#self.styles.text_align = 'center'
#self.styles.border = ('blank', 'green')
#self.styles.height = '100%'
#self.styles.width = '100%'
def on_click(self) -> None: def on_click(self) -> None:
self.selected = not self.selected self.selected = not self.selected
if self.selected: if self.selected:
# self.styles.animate('background', 'green', duration=0.1)
self.add_class('field_selected') self.add_class('field_selected')
else: else:
self.remove_class('field_selected') self.remove_class('field_selected')
#self.styles.animate('background', '#1c1c1c', duration=0.1)
# The post_message method sends an event to be handled in the DOM # The post_message method sends an event to be handled in the DOM
self.post_message(self.Selected(self.num, self.selected)) self.post_message(self.Selected(self.num, self.selected))
def set_highlighted(self, new_highlight: bool) -> None:
self.highlighted = new_highlight
if self.highlighted:
self.add_class('field_highlighted')
else:
self.remove_class('field_highlighted')
def render(self) -> str: def render(self) -> str:
return str(self.text) return str(self.text)

@ -21,6 +21,10 @@ BingoField.field_selected {
background: $success; background: $success;
} }
BingoField.field_highlighted {
color: $secondary;
}
BingoDisplay { BingoDisplay {
layout: vertical; layout: vertical;
height: 100%; height: 100%;

Loading…
Cancel
Save