|
|
|
from textual.widgets import Static
|
|
|
|
from textual.message import Message
|
|
|
|
from textual.reactive import reactive
|
|
|
|
|
|
|
|
class BingoField(Static):
|
|
|
|
'''
|
|
|
|
A Bingo field widget.
|
|
|
|
|
|
|
|
Attributes
|
|
|
|
----------
|
|
|
|
text : str
|
|
|
|
The text displayed in the field
|
|
|
|
num : int
|
|
|
|
The running number of this field (0-24)
|
|
|
|
selected : bool
|
|
|
|
Wether the bingo field has been checked or not
|
|
|
|
highlighted : bool
|
|
|
|
Wether the cursor is currently on this field or not
|
|
|
|
|
|
|
|
Methods
|
|
|
|
-------
|
|
|
|
set_highlighted(new_highlight):
|
|
|
|
Sets the highlighted state (cursor) of this field
|
|
|
|
'''
|
|
|
|
|
|
|
|
text = reactive('')
|
|
|
|
|
|
|
|
class Selected(Message):
|
|
|
|
'''Send message to the board containing clicked field info'''
|
|
|
|
def __init__(self, num: int, selected: bool) -> None:
|
|
|
|
self.num = num
|
|
|
|
self.selected = selected
|
|
|
|
super().__init__()
|
|
|
|
|
|
|
|
def __init__(self, num, text: str) -> None:
|
|
|
|
self.num = num
|
|
|
|
self.selected = False
|
|
|
|
self.highlighted = False
|
|
|
|
super().__init__()
|
|
|
|
self.text = text
|
|
|
|
|
|
|
|
def on_click(self) -> None:
|
|
|
|
'''Add CSS class field_selected to self and POST to BingoBoard'''
|
|
|
|
self.selected = not self.selected
|
|
|
|
if self.selected:
|
|
|
|
self.add_class('field_selected')
|
|
|
|
else:
|
|
|
|
self.remove_class('field_selected')
|
|
|
|
|
|
|
|
# The post_message method sends an event to be handled in the DOM
|
|
|
|
self.post_message(self.Selected(self.num, self.selected))
|
|
|
|
|
|
|
|
def set_highlighted(self, new_highlight: bool) -> None:
|
|
|
|
'''Add or remove the field_highlighted CSS class from self'''
|
|
|
|
self.highlighted = new_highlight
|
|
|
|
if self.highlighted:
|
|
|
|
self.add_class('field_highlighted')
|
|
|
|
else:
|
|
|
|
self.remove_class('field_highlighted')
|
|
|
|
|
|
|
|
def render(self) -> str:
|
|
|
|
'''Return the fields text'''
|
|
|
|
return str(self.text)
|