diff --git a/src/gui/boardview.py b/src/gui/boardview.py --- a/src/gui/boardview.py +++ b/src/gui/boardview.py @@ -1,37 +1,46 @@ import tkinter as tk -import go +from go import BLACK,WHITE ## Handles and presents the game state as detected by the program. class BoardView(tk.Canvas): def __init__(self, master=None): - tk.Canvas.__init__(self, master) - self.configure(width=360,height=360,background="#ffcc00") + self._master=master + tk.Canvas.__init__(self, master, highlightthickness=0) + + self.width=360 + self.height=360 + self.padding=18 + self.cellWidth=(self.width-2*self.padding)/18 + self.cellHeight=(self.height-2*self.padding)/18 + self.configure(width=self.width,height=self.height,background="#ffcc00") self.drawGrid() - - self.grid() + master.bind("", self._onResize) def redrawState(self,gameState): - # !! will need to remove old stones or redraw the widget completely + self.delete("black","white") for r,row in enumerate(gameState): for c,point in enumerate(row): self.drawStone(r,c,point) - self.grid() - def drawGrid(self): + padding=self.padding for i in range(19): - self.create_line(18,18*(i+1),360-18,18*(i+1),fill="#000000") # rows - self.create_line(18*(i+1),18,18*(i+1),360-18,fill="#000000") # cols + self.create_line(padding,18*i+padding,self.width-padding,18*i+padding,tags="row",fill="#000000") # rows + self.create_line(18*i+padding,padding,18*i+padding,self.height-padding,tags="col",fill="#000000") # cols self.drawStars() def drawStars(self): - for r in range(4,19,6): - for c in range(4,19,6): - self.create_oval(r*18-2,c*18-2,r*18+2,c*18+2,fill='#000000') + 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') ## Draws a stone at provided coordinates. # @@ -41,9 +50,31 @@ class BoardView(tk.Canvas): # @param c column coordinate, [0-18], counted from left # @param color color indicator, go.BLACK or go.WHITE def drawStone(self,r,c,color): - if color==go.BLACK: hexCode='#000000' - elif color==go.WHITE: hexCode='#ffffff' + if color==BLACK: + hexCode='#000000' + tag="black" + elif color==WHITE: + hexCode='#ffffff' + tag="white" else: return False - r+=1 - c+=1 - self.create_oval(c*18-9,r*18-9,c*18+9,r*18+9,fill=hexCode) + + 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) + + def _onResize(self, event): + wScale=float(event.width)/self.width + hScale=float(event.height)/self.height + scale=min(wScale,hScale) + + self.width*=scale + self.height*=scale + self.scale("all",0,0,scale,scale) # rescale all the objects tagged with the "all" tag + + x=(event.width-self.width)/2 + y=(event.height-self.height)/2 + + # place the window, giving it an explicit size + self.place(in_=self._master, x=x, y=y, + width=self.width, height=self.height)