Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/boardwidget.py
diff options
context:
space:
mode:
authorGerard J. Cerchio <gjpc@circlesoft.com>2007-12-22 00:40:48 (GMT)
committer Gerard J. Cerchio <gjpc@circlesoft.com>2007-12-22 00:40:48 (GMT)
commita00adc5a129e6914723b4fcfe206f11ad9754e97 (patch)
treecc7ed1b5d8e463eedca05abba7f09f5fe01df6fb /boardwidget.py
parentb0d743df24d7d567d3c15febc983f03011eea652 (diff)
Local mode on an XO works
Diffstat (limited to 'boardwidget.py')
-rwxr-xr-xboardwidget.py177
1 files changed, 109 insertions, 68 deletions
diff --git a/boardwidget.py b/boardwidget.py
index c15c1c3..4c0d29b 100755
--- a/boardwidget.py
+++ b/boardwidget.py
@@ -18,6 +18,12 @@ class BoardWidget(gtk.EventBox):
}
def __init__( self, aBoard ):
+ """
+ Startup the board widget
+ 1. setup our signals: expose, insert, button and mouse movement
+ 2. initialize the tracking variables
+ 3. read in the stone source bitmaps
+ """
gtk.EventBox.__init__( self )
@@ -29,27 +35,20 @@ class BoardWidget(gtk.EventBox):
self.connect('button-release-event', self.__class__.button_release_cb)
self.connect('motion-notify-event', self.__class__.motion_cb)
+ #self.connect('size-request', self.__class__.sizeRequest_cb)
self.drawCoords = 1
- self.columns = aBoard.size
- self.rows = aBoard.size
+ self.size = aBoard.size
self.lastUnit = 0
- self.lastDat = 0
+ self.lastDat = -1
self.lastX = 0
self.lastY = 0
- self.lastCmap = None
self.myBoard = aBoard
self.myGame = None
- self.lastColor = 1
-
- # get the bitmap for genuine simulated wooden board
-# input = open("./images/board.gif")
-# imagebuf = input.read()
-# pixbufloader = gtk.gdk.PixbufLoader()
-# pixbufloader.write(imagebuf)
-# pixbufloader.close()
-# self.pixBoard = pixbufloader.get_pixbuf()
+ self.lastColor = 2
+
+ logger.setLevel( logging.DEBUG )
# get the bitmap for genuine simulated white stone
input = open("./images/white.gif")
@@ -68,15 +67,16 @@ class BoardWidget(gtk.EventBox):
self.pixBlack = pixbufloader.get_pixbuf()
logger.debug( "baord widget starts" )
-
-# for x in range( 19 ):
-# for y in range( 19 ):
-# self.myBoard.setPointi(x, y, random.randint( 0, 3 ) )
-
+ def sizeRequest_cb(self, requistion ):
+ requistion.width = 8
+ requistion.height = 8
- def check_coord (self, i, j):
- return i >= 0 and i < self.rows and j >= 0 and j < self.columns
+ def check_coord (self, x, y):
+ """
+ check to see if x and y are within the board grid
+ """
+ return x >= 0 and x < self.size and y >= 0 and y < self.size
def insert(self, dat, value):
"""Return:
@@ -84,8 +84,8 @@ class BoardWidget(gtk.EventBox):
0, 1: player 0/1 wins the game
"""
color = dat >> 16
- y = dat & 0xff
- x = ( dat >> 8 ) & 0xff
+ x = dat & 0xff
+ y = ( dat >> 8 ) & 0xff
logger.debug( 'stone event x=%d y=%d col=%d value=%d', x,y, dat, color )
@@ -93,8 +93,6 @@ class BoardWidget(gtk.EventBox):
assert y < self.myBoard.size
self.myBoard.setPointi( x, y, color )
-
-
return None
@@ -116,6 +114,9 @@ class BoardWidget(gtk.EventBox):
def draw_background(self, rect, unit, ctx):
+ """
+ set the board windows background to the board image
+ """
ct = gtk.gdk.CairoContext(ctx)
ct.set_source_pixbuf(self.pixBoard,0,0)
@@ -124,27 +125,30 @@ class BoardWidget(gtk.EventBox):
def draw_lines(self, rect, unit, ctx):
+ """
+ draw the grid and star points on the board bitmap
+ """
# single width balck lines
ctx.set_line_width(1)
ctx.set_source_rgba(0, 0, 0, 1)
- for i in xrange(self.rows + 1):
+ for i in xrange(self.size + 1):
ctx.move_to( unit, i * unit)
- ctx.line_to(self.columns * unit, i * unit )
+ ctx.line_to(self.size * unit, i * unit )
- for i in xrange(self.columns + 1):
+ for i in xrange(self.size + 1):
ctx.move_to(i * unit, unit )
- ctx.line_to(i * unit, self.rows * unit)
+ ctx.line_to(i * unit, self.size * unit)
ctx.stroke()
# star point coords per board size
- if self.columns == 19 :
+ if self.size == 19 :
seq = [ 4, 10, 16 ]
- elif self.columns == 13 :
+ elif self.size == 13 :
seq = [ 4, 7, 10 ]
- elif self.columns == 9 :
+ elif self.size == 9 :
seq = [ 3, 7 ]
# set the middle singleton
ctx.arc( unit * 5, unit * 5, 3, 0, -1e-10)
@@ -160,7 +164,9 @@ class BoardWidget(gtk.EventBox):
ctx.stroke()
def draw_stone(self, x, y, color, unit, ctx):
-
+ """
+ paint a single stone on a point
+ """
x = x + 1
y = y + 1
ct = gtk.gdk.CairoContext(ctx)
@@ -173,6 +179,9 @@ class BoardWidget(gtk.EventBox):
def draw_stones( self, ctx ):
+ """
+ paint all the stones on the board
+ """
for x in self.myBoard.status.keys() :
if self.myBoard.status[x] == 'B' :
@@ -183,65 +192,92 @@ class BoardWidget(gtk.EventBox):
ctx.stroke()
def get_mouse_event_col(self, event):
+ """
+ calculate the x and y position on the board given pixel address
+ """
unit, x0, y0 = self.get_coordinates(self.get_allocation())
- col = ( ( event.x - x0 ) / unit ) - 0.5
- row = ( ( event.y - y0 ) / unit ) - 0.5
- return int(row), int(col)
+ x = ( ( event.x - x0 ) / unit ) - 0.5
+ y = ( ( event.y - y0 ) / unit ) - 0.5
+ return int(x), int(y)
+
def motion_cb(self, event):
+ """
+ When the mouse moves, find out if it is a legal point
+ if it is a legal point place the transparent stone on
+ the point and erase the previously placed transparent
+ stone
+ """
- y, x = self.get_mouse_event_col(event)
+ x, y = self.get_mouse_event_col(event)
dat = ( y << 8 ) + x
+ if not self.check_coord( x, y ) :
+ return
+
if dat == self.lastDat :
return
- if self.lastX :
+ if self.lastX is not -1 :
self.myWidget.window.clear_area( int(self.lastX - self.lastUnit/2), int(self.lastY - self.lastUnit/2), int(self.lastUnit), int(self.lastUnit) )
if self.myBoard.status.has_key( (x,y) ) :
- self.lastX = 0
+ self.lastX = -1
return
+ # the board is zero based and there is a 1 unit border so bump x&y
x += 1
y += 1
- dat = self.lastDat
+
+ # we need a cario context for drawing on top of the board bitmap
ctx = self.myWidget.window.cairo_create()
-
+ # decide whether black or white and set transparent
if ( ( self.myGame is None ) and ( self.lastColor == 2 ) ) or \
( self.myGame and not self.myGame.is_initiator ) :
ctx.set_source_rgba(0, 0, 0, .5 )
else :
ctx.set_source_rgba(0xff, 0xff, 0xff, .5 )
-
+ # rember our state
+ self.lastDat = dat
self.lastX = self.lastUnit * x
- self.lastY = self.lastUnit * y
- ctx.arc( self.lastX, self.lastY, 16, 0, -1e-10)
+ self.lastY = self.lastUnit * y
+
+ # now draw a transparent stone a 4 pixels smaller than the unit
+ ctx.arc( self.lastX, self.lastY, self.lastUnit/2 -4, 0, -1e-10)
ctx.fill_preserve()
ctx.stroke()
del ctx
+
def button_release_cb(self, event):
+ """
+ When the mouse button is released drop a stone on the board
+ """
x, y = self.get_mouse_event_col(event)
dat = ( y << 8 ) + x
+ logger.debug( 'Button release event x=%d y=%d, pixx=%d pixy=%d', x,y, event.x, event.y )
+
if self.myGame is None :
- if event.button != 3 :
- if self.lastColor is 1:
- dat = dat | 0x10000
- self.lastColor = 2;
+ if ( event.button != 3 ) :
+ if self.myBoard.status.has_key( (x,y) ) :
+ return
else :
- dat = dat | 0x20000
- self.lastColor = 1;
+ if self.lastColor is 1:
+ dat = dat | 0x10000
+ self.lastColor = 2;
+ else :
+ dat = dat | 0x20000
+ self.lastColor = 1;
+
+ self.lastX = 0;
+ self.insert( dat, 1 )
- self.lastX = 0;
- self.insert( dat, 1 )
-
else:
if event.button != 3 :
@@ -250,11 +286,9 @@ class BoardWidget(gtk.EventBox):
else :
dat = dat | 0x20000
- self.lastX = 0;
+ self.lastX = -1;
self.emit('insert-requested', dat )
- logger.debug( 'mouse up button event x=%d y=%d row=%d col=%d value=%x', event.x, event.y, x, y, dat )
-
self.window.invalidate_rect(self.get_allocation(), True)
def queue_draw(self):
@@ -265,20 +299,24 @@ class BoardWidget(gtk.EventBox):
a grid within @rect."""
rect = self.get_allocation()
+
+ unit = rect.height / float(self.size )
+ x0 = rect.x + (rect.width - self.size * unit) / 2.0
+ y0 = rect.y
- if rect.height / float(self.rows) < rect.width / float(self.columns):
- # wide
- unit = rect.height / float(self.rows)
- x0 = rect.x + (rect.width - self.columns * unit) / 2.0
- y0 = rect.y
- else:
- # narrow
- unit = rect.width / float(self.columns)
- x0 = rect.x
- y0 = rect.y + (rect.height - self.rows * unit) / 2.0
-
+# if rect.height / float(self.rows) < rect.width / float(self.size):
+# # wide
+# unit = rect.height / float(self.rows)
+# x0 = rect.x + (rect.width - self.size * unit) / 2.0
+# y0 = rect.y
+# else:
+# # narrow
+# unit = rect.width / float(self.size)
+# x0 = rect.x
+# y0 = rect.y + (rect.height - self.rows * unit) / 2.0
+#
# now shrink the size for a 1 unit border
- unit = unit - unit / self.rows
+ unit = unit - unit / self.size
#return unit, x0, y0
return unit, 0, 0
@@ -322,7 +360,10 @@ class BoardWidget(gtk.EventBox):
def expose_cb(self, widget, event):
rect = self.get_allocation()
- if rect.height != rect.width :
+ unit, x0, y0 = self.get_coordinates(rect)
+ if self.lastUnit != unit :
+ logger.debug( 'resizing the window to %d', rect.height )
+ self.lastUnit = -1
if rect.height > rect.width :
widget.window.resize( rect.width, rect.width )
else :