from textual.widgets import Input, Static, Button from textual.containers import Horizontal from textual.validation import Number from textual.app import ComposeResult from datetime import datetime from BingoBoard import BingoBoard class BingoDisplay(Static): ''' A Widget to represent the bingo UI. Contains the board, input field and re-roll button. Attributes ---------- board : BingoBoard The BingoBoard object input_field : Input User input for game seed ''' def compose(self) -> ComposeResult: '''Create child widgets for the app.''' self.board = BingoBoard() yield self.board self.input_field = Input( str(self.board.seed), type='integer', placeholder='UNIX timestamp', max_length=10, classes='seed_input', validators=[ Number(minimum=1000000000, maximum = 2000000000) ] ) self.input_field.border_title = 'Seed' yield Horizontal( self.input_field, Button.error(':game_die: re-roll', classes='roll_btn'), classes='bottom_line' ) def on_button_pressed(self, event: Button.Pressed) -> None: '''Re-roll the board state with current time as seed''' self.board.roll_board(int(datetime.now().timestamp())) self.input_field.value = str(self.board.seed) def on_input_submitted(self, event: Input.Submitted) -> None: '''Re-roll the board state with the seed from the input''' if event.validation_result.is_valid: self.board.roll_board(int(event.value))