def load_board(self): ''' (Play) -> None Sets the current instance of BoardModel that will be used in this instance of the view in board_model ''' self.board_model = BoardModel()
def __init__(self): # Load widgets from Glade file self.widgets = gtk.glade.XML("interface.glade") # Shorcuts for exhaustive use of widgets self.window = self.widgets.get_widget("windowMain") self.drawingarea = self.widgets.get_widget("drawingarea") self.toolbuttonShowHint = self.widgets.get_widget("toolbuttonShowHint") # Show main window # self.window.maximize() self.window.show() # Initialize self.boardmodel = BoardModel(8) self.pending_drawings = list() self.drawingarea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0, 0)) self.loadResources() self.resizeDrawingArea(None, None) self.updateStatusBar() # Connect signals to slots dic = { "on_imagemenuitemConnect_activate": self.showDialogConnect, "on_imagemenuitemDisconnect_activate": self.disconnect, "on_imagemenuitemAbout_activate": self.showDialogAbout, "on_toolbuttonConnect_clicked": self.showDialogConnect, "on_toolbuttonDisconnect_clicked": self.disconnect, "on_windowMain_destroy": self.quit, "on_imagemenuitemQuit_activate": self.quit, "on_buttonAboutClose_clicked": self.hideDialogAbout, "on_buttonConnectCancel_clicked": self.hideDialogConnect, "on_buttonConnectOk_clicked": self.connect, "on_drawingarea_expose_event": self.draw, "on_drawingarea_size_allocate": self.resizeDrawingArea, "on_drawingarea_button_press_event": self.clicked, "on_drawingarea_motion_notify_event": self.moved, "on_toolbuttonShowHint_toggled": self.draw, } self.widgets.signal_autoconnect(dic)
class ReversiOffline(object): yourturn = True player = Player.WHITE boardmodel = None pending_drawings = None widgets = None window = None drawingarea = None toolbuttonShowHint = None background = None white = None black = None hint = None scaledbackground = None scaledwhite = None scaledblack = None scaledhint = None width = None height = None size = None ratio = None cellsize = None shift_x = None shift_y = None shift_border = None selection_row = None selection_column = None selection_valid = False def __init__(self): # Load widgets from Glade file self.widgets = gtk.glade.XML("interface.glade") # Shorcuts for exhaustive use of widgets self.window = self.widgets.get_widget("windowMain") self.drawingarea = self.widgets.get_widget("drawingarea") self.toolbuttonShowHint = self.widgets.get_widget("toolbuttonShowHint") # Show main window # self.window.maximize() self.window.show() # Initialize self.boardmodel = BoardModel(8) self.pending_drawings = list() self.drawingarea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0, 0)) self.loadResources() self.resizeDrawingArea(None, None) self.updateStatusBar() # Connect signals to slots dic = { "on_imagemenuitemConnect_activate": self.showDialogConnect, "on_imagemenuitemDisconnect_activate": self.disconnect, "on_imagemenuitemAbout_activate": self.showDialogAbout, "on_toolbuttonConnect_clicked": self.showDialogConnect, "on_toolbuttonDisconnect_clicked": self.disconnect, "on_windowMain_destroy": self.quit, "on_imagemenuitemQuit_activate": self.quit, "on_buttonAboutClose_clicked": self.hideDialogAbout, "on_buttonConnectCancel_clicked": self.hideDialogConnect, "on_buttonConnectOk_clicked": self.connect, "on_drawingarea_expose_event": self.draw, "on_drawingarea_size_allocate": self.resizeDrawingArea, "on_drawingarea_button_press_event": self.clicked, "on_drawingarea_motion_notify_event": self.moved, "on_toolbuttonShowHint_toggled": self.draw, } self.widgets.signal_autoconnect(dic) def start(self): gtk.main() def quit(self, widget): gtk.main_quit() def showDialogConnect(self, widget): self.widgets.get_widget("dialogConnect").show() def hideDialogConnect(self, widget): self.widgets.get_widget("dialogConnect").hide() def showDialogAbout(self, widget): self.widgets.get_widget("dialogAbout").show() def hideDialogAbout(self, widget): self.widgets.get_widget("dialogAbout").hide() def connect(self, widget): ip = self.widgets.get_widget("entryIp").get_text() port = self.widgets.get_widget("spinbuttonPort").get_value_as_int() connected = True print "TODO connect to server " + ip + ":" + str(port) if connected: self.widgets.get_widget("dialogConnect").hide() self.widgets.get_widget("toolbuttonConnect").set_sensitive(False) self.widgets.get_widget("toolbuttonDisconnect").set_sensitive(True) self.widgets.get_widget("imagemenuitemConnect").set_sensitive(False) self.widgets.get_widget("imagemenuitemDisconnect").set_sensitive(True) def disconnect(self, widget): print "TODO disconnect from server" self.widgets.get_widget("toolbuttonConnect").set_sensitive(True) self.widgets.get_widget("toolbuttonDisconnect").set_sensitive(False) self.widgets.get_widget("imagemenuitemConnect").set_sensitive(True) self.widgets.get_widget("imagemenuitemDisconnect").set_sensitive(False) def loadResources(self): self.background = gtk.gdk.pixbuf_new_from_file("res/background.png") self.white = gtk.gdk.pixbuf_new_from_file("res/white.png") self.black = gtk.gdk.pixbuf_new_from_file("res/black.png") self.hint = gtk.gdk.pixbuf_new_from_file("res/hint.png") # Scales images every time the area is resized and stores some variables to be used in draw method def resizeDrawingArea(self, widgets, events): self.width, self.height = self.drawingarea.window.get_size() self.size = max(1, min(self.width, self.height)) self.ratio = self.size / float(self.background.get_width()) self.cellsize = self.white.get_width() * self.ratio self.scaledbackground = self.background.scale_simple( int(round(self.size)), int(round(self.size)), gtk.gdk.INTERP_BILINEAR) self.scaledwhite = self.white.scale_simple( int(round(self.cellsize)), int(round(self.cellsize)), gtk.gdk.INTERP_BILINEAR) self.scaledblack = self.black.scale_simple( int(round(self.cellsize)), int(round(self.cellsize)), gtk.gdk.INTERP_BILINEAR) self.scaledhint = self.hint.scale_simple(int(round(self.cellsize)), int(round(self.cellsize)), gtk.gdk.INTERP_BILINEAR) self.shift_x = abs(self.width - self.scaledbackground.get_width()) / 2.0 self.shift_y = abs(self.height - self.scaledbackground.get_height()) / 2.0 self.shift_border = 96 * self.ratio # 96px is the width of the border built-in the image def draw(self, widget=None, events=None): self.drawingarea.window.draw_pixbuf( None, self.scaledbackground, 0, 0, int(round(self.shift_x)), int(round(self.shift_y))) for i in range(self.boardmodel.get_size()): for j in range(self.boardmodel.get_size()): player = self.boardmodel.get(i, j) if player == Player.WHITE: self.drawCell(i, j, self.scaledwhite) elif player == Player.BLACK: self.drawCell(i, j, self.scaledblack) elif self.yourturn and self.toolbuttonShowHint.get_active() and GameLogic.is_valid_position(self.boardmodel, i, j, self.player): self.drawCell(i, j, self.scaledhint) if self.yourturn and self.selection_row is not None and self.selection_column is not None and self.selection_valid: self.drawingarea.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) self.drawCell(self.selection_row, self.selection_column, self.scaledwhite if self.player == Player.WHITE else self.scaledblack) else: self.drawingarea.window.set_cursor(None) def drawCell(self, row, column, image): self.drawingarea.window.draw_pixbuf(None, image, 0, 0, int( round(self.shift_x + self.shift_border + column * self.cellsize)), int(round(self.shift_y + self.shift_border + row * self.cellsize))) def moved(self, widget, event): if len(self.pending_drawings) > 0: return previous_row = self.selection_row previous_column = self.selection_column previous_valid = self.selection_valid noshift_x = event.x - self.shift_x - self.shift_border noshift_y = event.y - self.shift_y - self.shift_border if 0 <= noshift_x and noshift_x < self.size - 2 * self.shift_border and 0 <= noshift_y and noshift_y < self.size - 2 * self.shift_border: self.selection_column = int((noshift_x / self.cellsize) % 8.0) self.selection_row = int((noshift_y / self.cellsize) % 8.0) self.selection_valid = GameLogic.is_valid_position( self.boardmodel, self.selection_row, self.selection_column, self.player) else: self.selection_column = None self.selection_row = None self.selection_valid = False if previous_valid != self.selection_valid or ((previous_row != self.selection_row or previous_column != self.selection_column) and self.selection_valid): if self.selection_valid and previous_valid is False: self.drawingarea.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) self.drawCell(self.selection_row, self.selection_column, self.scaledwhite if self.player == Player.WHITE else self.scaledblack) else: self.draw() def clicked(self, widget, event): if self.selection_row is not None and self.selection_column is not None: print "[" + str(self.selection_row) + ", " + str(self.selection_column) + "]" positions = GameLogic.get_affected_positions( self.boardmodel, self.selection_row, self.selection_column, self.player) if len(positions) > 0: self.boardmodel.set(self.selection_row, self.selection_column, self.player) for i, j in positions: self.boardmodel.set(i, j, self.player) self.pending_drawings.append([self.selection_row, self.selection_column]) self.pending_drawings.extend(positions) gobject.timeout_add(100, self.drawAffectedPositions) self.drawingarea.window.set_cursor(None) self.selection_row = None self.selection_column = None self.selection_valid = False def drawAffectedPositions(self): if len(self.pending_drawings) == 0: self.player = Player.WHITE if self.player == Player.BLACK else Player.BLACK self.updateStatusBar() if self.toolbuttonShowHint.get_active(): self.draw() return False row, column = self.pending_drawings.pop(0) self.drawCell(row, column, self.scaledwhite if self.player == Player.WHITE else self.scaledblack) return True def updateStatusBar(self): white_count, black_count = self.boardmodel.count_disks() if self.player == Player.WHITE: self.widgets.get_widget("labelWhiteCount").set_text("You (" + str(white_count) + " disks)") self.widgets.get_widget("labelBlackCount").set_text("Opponent (" + str(black_count) + " disks)") else: self.widgets.get_widget("labelWhiteCount").set_text("Opponent (" + str(white_count) + " disks)") self.widgets.get_widget("labelBlackCount").set_text("You (" + str(black_count) + " disks)") self.widgets.get_widget("labelTurn").set_text("Your turn" if self.yourturn else "Opponent's turn")