예제 #1
0
 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_
예제 #2
0
 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_
예제 #3
0
 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
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
 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"),
     )
예제 #7
0
 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
예제 #8
0
 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_
예제 #9
0
 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
예제 #10
0
 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
예제 #11
0
 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_
예제 #12
0
 def apply_skin(self, canvas: BoardCanvas, skin: BoardSkin) -> None:
     canvas.itemconfig(self.board_rect, fill=skin.colour)
     self.board_img_cache.load(skin)
     return
예제 #13
0
 def lift_click_layer(self, canvas: BoardCanvas) -> None:
     canvas.lift("click_tile")
     return
예제 #14
0
 def clear_promotion_prompts(self, canvas: BoardCanvas) -> None:
     canvas.delete("promotion_prompt")
     return
예제 #15
0
 def _update_board_base_colour(self, canvas: BoardCanvas) -> None:
     canvas.itemconfig(self.board_rect,
                       fill=self.board_img_cache.skin.colour)
     return
예제 #16
0
 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
예제 #17
0
 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