Files @ 52d1a214c032
Branch filter:

Location: OneEye/src/gui/boardview.py

Laman
refactoring and documenting API
from .resizablecanvas import ResizableCanvas
from go.core import BLACK,WHITE


## Handles and presents the game state as detected by the program.
class BoardView(ResizableCanvas):
	def __init__(self, master=None):
		super().__init__(master)

		self._padding=24
		self.configure(width=360,height=360,background="#ffcc00")

		self._drawGrid()

	def redrawState(self,gameState,labels=dict()):
		self.delete("black","white","label")
		for r,row in enumerate(gameState):
			for c,point in enumerate(row):
				self._drawStone(r, c, point, labels.get((r,c)))

	def configure(self,*args,**kwargs):
		super().configure(*args,**kwargs)
		self._cellWidth=(self._width-2*self._padding)/18
		self._cellHeight=(self._height-2*self._padding)/18

	def _drawGrid(self):
		padding=self._padding
		for i in range(19):
			self.create_line(padding,self._cellHeight*i+padding,self._width-padding,self._cellHeight*i+padding,tags="row",fill="#000000") # rows
			self.create_line(self._cellWidth*i+padding,padding,self._cellWidth*i+padding,self._height-padding,tags="col",fill="#000000") # cols

		self._drawStars()
		self._drawCoordinates()

	def _drawStars(self):
		radius=2

		for r in range(3,19,6):
			for c in range(3,19,6):
				x=c*self._cellHeight+self._padding
				y=r*self._cellWidth+self._padding
				self.create_oval(x-radius,y-radius,x+radius,y+radius,tags="star",fill='#000000')

	def _drawCoordinates(self):
		for i in range(19):
			letters="ABCDEFGHJKLMNOPQRST"
			textWidth=12
			# cols
			self.create_text(self._padding+i*self._cellWidth,self._padding-textWidth,text=letters[i],tags="coords")
			self.create_text(self._padding+i*self._cellWidth,self._height-self._padding+textWidth,text=letters[i],tags="coords")
			# rows
			self.create_text(self._padding-textWidth,self._padding+i*self._cellHeight,text=str(19-i),tags="coords")
			self.create_text(self._width-self._padding+textWidth,self._padding+i*self._cellHeight,text=str(19-i),tags="coords")

	## Draws a stone at provided coordinates.
	#
	#  For an unknown color draws nothing and returns False.
	#
	#  @param r row coordinate, [0-18], counted from top
	#  @param c column coordinate, [0-18], counted from left
	#  @param color color indicator, go.BLACK or go.WHITE
	def _drawStone(self, r, c, color, label=""):
		if color==BLACK:
			hexCode='#000000'
			altCode='#ffffff'
			tag="black"
		elif color==WHITE:
			hexCode='#ffffff'
			altCode='#000000'
			tag="white"
		else: return False

		x=c*self._cellWidth+self._padding
		y=r*self._cellHeight+self._padding
		radius=self._cellWidth/2
		self.create_oval(x-radius,y-radius,x+radius,y+radius,tags=tag,fill=hexCode)
		if label:
			self.create_text(x,y,text=label,tags="label",fill=altCode)

	def _onResize(self,event):
		super()._onResize(event)
		self._padding=24*self._width/360
		self._cellWidth=(self._width-2*self._padding)/18
		self._cellHeight=(self._height-2*self._padding)/18