def _draw_board_base_layer(self, canvas: BoardCanvas) -> int: id_: int = canvas.create_rectangle( *canvas.idxs_to_xy(0, 0), *canvas.idxs_to_xy(NUM_COLS, NUM_ROWS), fill="#ffffff", ) self.board_rect = id_ return id_
def draw_promotion_cover(self, canvas: BoardCanvas) -> int: img = self.board_img_cache.get_dict( board_sized=True)["semi-transparent"] id_: int id_ = canvas.create_image( *canvas.idxs_to_xy(0, 0), image=img, anchor="nw", tags="promotion_prompt", ) return id_
def draw_text_koma( self, canvas: BoardCanvas, text: str, invert: bool, row_idx: int, col_idx: int, ) -> None: canvas.itemconfig( self.koma_text_layer.tiles[row_idx][col_idx], text=text, angle=180 if invert else 0, ) return
def draw_layer(self, canvas: BoardCanvas, tag: str = "") -> None: for row_idx in range(NUM_ROWS): for col_idx in range(NUM_COLS): id_ = canvas.create_image( *canvas.idxs_to_xy( col_idx, row_idx, centering="xy" if self.is_centered else "", ), image="", anchor="center" if self.is_centered else "nw", tags=tag, ) self.tiles[row_idx][col_idx] = id_ return
def draw_layer(self, canvas: BoardCanvas, tag: str = "") -> None: for row_idx in range(NUM_ROWS): for col_idx in range(NUM_COLS): id_ = canvas.create_text( *canvas.idxs_to_xy( col_idx, row_idx, centering="xy" if self.is_centered else "", ), text="", font=("", canvas.measurements.sq_text_size), anchor="center" if self.is_centered else "nw", tags=tag, ) self.tiles[row_idx][col_idx] = id_ return
def draw_promotion_prompt_koma( self, canvas: BoardCanvas, ktype: KomaType, invert: bool, row_idx: int, col_idx: int, ) -> int: artist = canvas.make_koma_artist(invert, False) return artist.draw_koma( canvas, *canvas.idxs_to_xy(col_idx, row_idx, centering="xy"), ktype, anchor="center", tags=("promotion_prompt"), )
def _draw_board_grid_lines(self, canvas: BoardCanvas) -> None: for i in range(NUM_COLS + 1): canvas.create_line( *canvas.idxs_to_xy(i, 0), *canvas.idxs_to_xy(i, NUM_ROWS), fill="black", width=1, ) for j in range(NUM_ROWS + 1): canvas.create_line( *canvas.idxs_to_xy(0, j), *canvas.idxs_to_xy(NUM_COLS, j), fill="black", width=1, ) return
def draw_koma( self, canvas: BoardCanvas, x: float, y: float, ktype: KomaType, anchor: str = "center", tags: Tuple[str, ...] = ("", ), ) -> int: if ktype == KomaType.NONE: return None img = self.koma_dict[ktype] id_: int id_ = canvas.create_image(x, y, image=img, anchor=anchor, tags=tags) return id_
def _draw_board_coordinates(self, canvas: BoardCanvas) -> None: coords_text_size = canvas.measurements.coords_text_size for row_idx in range(NUM_ROWS): row_num = canvas.row_idx_to_num(row_idx) row_label = " " + KanjiNumber(row_num).name canvas.create_text( *canvas.idxs_to_xy(NUM_COLS, row_idx, centering="y"), text=" " + row_label, font=("", coords_text_size), anchor="w", ) for col_idx in range(9): col_num = canvas.col_idx_to_num(col_idx) canvas.create_text( *canvas.idxs_to_xy(col_idx, 0, centering="x"), text=str(col_num), font=("", coords_text_size), anchor="s", ) return
def __init__(self, board_canvas: BoardCanvas) -> None: self.observers: List[evt.IObserver] = [] self.position: Position self.focused_sq = Square.NONE self.focused_ktype = KomaType.NONE # Move input handling logic uses a state machine. self.states: Dict[str, MoveInputHandlerState] = { "ready": ReadyState(), "hand": HandState(), "board": BoardState(), "wait_for_promotion": WaitForPromotionState(), "disabled": DisabledState(), } self.active_state: MoveInputHandlerState = ReadyState() # sync with board canvas self.board_canvas = board_canvas board_canvas.move_input_handler = self self.position = board_canvas.position return
def draw_koma( self, canvas: BoardCanvas, x: float, y: float, ktype: KomaType, anchor: str = "center", tags: Tuple[str, ...] = ("", ), ) -> int: if ktype == KomaType.NONE: return None id_: int id_ = canvas.create_text(x, y, text=str(KANJI_FROM_KTYPE[ktype]), font=("", self._text_size), angle=self._text_angle, anchor=anchor, tags=tags) return id_
def apply_skin(self, canvas: BoardCanvas, skin: BoardSkin) -> None: canvas.itemconfig(self.board_rect, fill=skin.colour) self.board_img_cache.load(skin) return
def lift_click_layer(self, canvas: BoardCanvas) -> None: canvas.lift("click_tile") return
def clear_promotion_prompts(self, canvas: BoardCanvas) -> None: canvas.delete("promotion_prompt") return
def _update_board_base_colour(self, canvas: BoardCanvas) -> None: canvas.itemconfig(self.board_rect, fill=self.board_img_cache.skin.colour) return
def update_all_tiles(self, canvas: BoardCanvas, img: ImageTk.PhotoImage) -> None: for row in self.tiles: for tile in row: canvas.itemconfig(tile, image=img) return
def update_tile(self, canvas: BoardCanvas, img: ImageTk.PhotoImage, row_idx: int, col_idx: int) -> None: canvas.itemconfig(self.tiles[row_idx][col_idx], image=img) return