pygo/widgets/gogame.py

126 lines
3.5 KiB
Python

# This is a widget that handles a go game
# It needs a goban object, and handles it from beginning to end
import os
import gtk
import goban
class GoGame(gtk.HBox):
"""
This class draws a board and some information about the game (turn, captures, etc).
It also handles moves and other operations on the goban.
"""
_img_res = None
def __init__(self, goban):
super(GoGame, self).__init__()
self.goban = goban
if GoGame._img_res is None:
GoGame._img_res = _build_img_res()
self._init_widgets()
def _init_widgets(self):
self.board_area = gtk.DrawingArea()
# All of this is to create the info box along the right side of the board
info_box = gtk.VBox()
info_rows = []
for i in range(3):
info_rows.append(gtk.HBox())
to_move_label = gtk.Label('To Move:')
black_cap_label = gtk.Label('Black Captures:')
white_cap_label = gtk.Label('White Captures:')
self.to_move_value = gtk.Label('None')
self.black_cap_value = gtk.Label('0')
self.white_cap_value = gtk.Label('0')
info_rows[0].pack_start(to_move_label, expand=False, padding=5)
info_rows[1].pack_start(black_cap_label, expand=False, padding=5)
info_rows[2].pack_start(white_cap_label, expand=False, padding=5)
info_rows[0].pack_end(self.to_move_value, expand=False, padding=5)
info_rows[1].pack_end(self.black_cap_value, expand=False, padding=5)
info_rows[2].pack_end(self.white_cap_value, expand=False, padding=5)
for row in info_rows:
info_box.pack_start(row, expand=False)
self.pass_button = gtk.Button('Pass')
self.resign_button = gtk.Button('Resign')
self.pass_button.connect('clicked', self._on_pass)
self.resign_button.connect('clicked', self._on_resign)
info_box.pack_start(self.pass_button, expand=False, padding=10)
info_box.pack_start(self.resign_button, expand=False, padding=10)
self.pack_start(self.board_area)
self.pack_end(info_box, expand=False)
def _draw_board(self):
gc = self.board_area.get_style().fg_gc[gtk.STATE_NORMAL]
# gtk.gdk.gdk_pixbuf_scale_simple(img, new_width, new_height, GDK_INTERP_BILINEAR)
def _on_pass(self, widget):
print 'GoGame._on_pass(): stub'
def _on_resign(self, widget):
print 'GoGame._on_resign(): stub'
# pixmap.draw_pixbuf(None, pixbuf, 0, 0, x, y, -1, -1, gtk.gdk.RGB_DITHER_NONE, 0, 0)
def _magnitude(vector):
x,y = vector
return math.sqrt(x*x + y*y)
def _build_img_res():
ret = {}
triangle = _load_png('go_t.png')
ret['w'] = _load_png('go_w.png')
ret['wT'] = _load_png('go_w.png')
# ret['wT'].blit(triangle, (0,0))
ret['wH'] = _load_png('go_w.png', 128)
ret['b'] = _load_png('go_b.png')
ret['bT'] = _load_png('go_b.png')
# ret['bT'].blit(triangle, (0,0))
ret['bH'] = _load_png('go_b.png', 128)
circle = _load_png('go_c.png')
for d in ('u', 'd', 'l', 'r', 'm', 'dl', 'dr', 'ul', 'ur', 'h'):
ret[d] = _load_png('go_' + d + '.png')
ret[d + 'C'] = _load_png('go_' + d + '.png')
# ret[d + 'C'].blit(circle, (0,0))
return ret
def _load_png(name, alpha=None):
""" Load image and return image object"""
fullname = os.path.join('ui/res/', name)
image = gtk.gdk.pixbuf_new_from_file(fullname)
# if alpha is not None:
# image.set_alpha(alpha)
return image