Dan Anglin
9bb23b6c6d
Move the path drawing functionality to the Graphics class. The Cell class no longer needs to reference an instance of the Graphics class.
67 lines
1.8 KiB
Python
67 lines
1.8 KiB
Python
from typing import Dict
|
|
from time import sleep
|
|
from tkinter import Canvas
|
|
from line import Line, Point
|
|
from cell import CellWallLabels, CellWall
|
|
|
|
|
|
class Graphics(Canvas):
|
|
def __init__(self, container, background="white", width=800, height=800) -> None:
|
|
super().__init__(container)
|
|
self.config(
|
|
bg=background,
|
|
width=width,
|
|
height=height,
|
|
)
|
|
|
|
def _redraw(self) -> None:
|
|
"""
|
|
redraw redraws all the graphics in the window.
|
|
"""
|
|
self.update_idletasks()
|
|
self.update()
|
|
sleep(0.05)
|
|
|
|
def _draw_line(
|
|
self,
|
|
line: Line,
|
|
fill_colour: str = "black",
|
|
width: int = 2
|
|
) -> None:
|
|
"""
|
|
draws a line onto the canvas.
|
|
"""
|
|
self.create_line(
|
|
line.point_a.x, line.point_a.y,
|
|
line.point_b.x, line.point_b.y,
|
|
fill=fill_colour,
|
|
width=width,
|
|
)
|
|
|
|
def draw_cell_walls(self, walls: Dict[CellWallLabels, CellWall]) -> None:
|
|
"""
|
|
draws the walls of a cell onto the canvas.
|
|
"""
|
|
for label in CellWallLabels:
|
|
self._draw_line(
|
|
line=walls[label].get_line(),
|
|
fill_colour=walls[label].get_line_colour(),
|
|
)
|
|
self._redraw()
|
|
|
|
def draw_path(
|
|
self,
|
|
from_cell_centre: Point,
|
|
to_cell_centre: Point,
|
|
undo: bool = False
|
|
) -> None:
|
|
"""
|
|
draws a path between the centre of this cell and
|
|
the centre of the given cell.
|
|
"""
|
|
line = Line(from_cell_centre, to_cell_centre)
|
|
fill_colour = "red"
|
|
if undo:
|
|
fill_colour = "grey"
|
|
self._draw_line(line, fill_colour)
|
|
self._redraw()
|