def running_display(self): # get running display rd = engine.rdisp() self.gui.set_panel_text(rd) if self.thinking: return True else: return False
def key_press_event(self, widget, event): kp = Gdk.keyval_name(event.keyval) kp = kp.lower() # treat ctrl+= same as ctrl++ (i.e. increase board size) if kp == "equal" and event.get_state() & Gdk.ModifierType.CONTROL_MASK: self.board.resize_board(widget) return # If in position edit mode don't allow key presses except 'Delete' if self.board.get_pos_edit(): if kp == 'delete': self.board.position_edit_clear_board() return # if computer is thinking don't allow key presses except for 'm' if self.thinking: # 'm' to interrupt computers thinking and make it move now if kp == "m" or kp == "g": engine.movenow() return if kp == "r": self.board.retract() elif kp == "bracketleft": self.board.rewind() elif kp == "bracketright": self.board.forward() elif kp == "braceleft": self.board.rewind_to_start() elif kp == "braceright": self.board.forward_to_end() elif kp == "g": self.go() elif kp == "2" or kp == "3" or kp == "4" or kp == "6" or kp == "k" or kp == "s": if kp == "2": kp = 2 if kp == "3": kp = 3 if kp == "4": kp = 4 if kp == "6": kp = 6 if kp == "c": kp = 7 if kp == "s": kp = 8 # add/delete/save from opening book opening_book_path = os.path.expanduser("~") + "/.samuel/opening.gbk" engine.openingbook(kp, opening_book_path) msg = engine.rdisp() self.gui.set_panel_text(msg)
def build_gui(self): # Create Main Window self.window = Gtk.Window(Gtk.WindowType.TOPLEVEL) # self.window.set_resizable(False) self.window.set_title(NAME + " " + VERSION) self.window.set_default_size(550, 550) # startup size self.window.set_size_request(400, 400) # minimum size # Set a handler for delete_event that immediately # exits GTK. self.window.connect("delete_event", self.game.delete_event) self.window.connect("key_press_event", self.game.key_press_event) self.window.connect("configure_event", self.configure_event) main_vbox = Gtk.VBox(False, 0) self.window.add(main_vbox) main_vbox.show() # 1 eventbox per board square self.eb = [ [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], [ Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), Gtk.EventBox(), ], ] # menu # Create a UIManager instance uimanager = Gtk.UIManager() # Add the accelerator group to the toplevel window accelgroup = uimanager.get_accel_group() self.window.add_accel_group(accelgroup) # Create ActionGroups # main action group actiongroup = Gtk.ActionGroup("UIManagerAG") self.actiongroup = actiongroup # action group for setting search depth level search_depth_actiongroup = Gtk.ActionGroup("AGSearchDepth") search_depth_actiongroup.add_radio_actions( [ ("Beginner", None, "_Beginner", None, None, 0), ("Advanced", None, "_Advanced", None, None, 1), ("Expert", None, "_Expert", None, None, 2), ("Custom", None, "_User-defined", None, None, 3), ], 0, self.game.set_level, ) # action group for showing/hiding panel panel_action_group = Gtk.ActionGroup("AGPanel") panel_action_group.add_toggle_actions( [("showpanel", None, "_Information Panel", None, None, self.set_info_panel)] ) panel_action_group.add_toggle_actions([("statusbar", None, "_Status Bar", None, None, self.set_status_bar)]) self.panel_action_group = panel_action_group # Computer Player computer_player_action_group = Gtk.ActionGroup("ComputerPlayer") computer_player_action_group.add_radio_actions( [ ("ComputerPlaysWhite", None, "_Computer Plays White", None, None, 0), ("ComputerPlaysRed", None, "_Computer Plays Red", None, None, 1), ("ComputerPlaysWhiteAndRed", None, "_Computer Plays White and Red", None, None, 2), ("ComputerOff", None, "_Computer Off", None, None, 3), ], 0, self.game.set_computer_player, ) self.computer_player_action_group = computer_player_action_group # Create a ToggleAction for flipping the board flip_the_board_action_group = Gtk.ActionGroup("FlipTheBoard") flip_the_board_action_group.add_toggle_actions( [("FlipTheBoard", None, "_Flip the Board", None, "Flip the Board", self.game.flip_the_board)] ) self.flip_the_board_action_group = flip_the_board_action_group # Create actions actiongroup.add_actions( [ ("Quit", Gtk.STOCK_QUIT, "_Quit", None, "Quit the Program", self.game.quit_game), ("NewGame", Gtk.STOCK_NEW, "_New Game", None, "New Game", self.game.new_game), ("LoadGame", Gtk.STOCK_OPEN, "_Load Game", None, "Load Game", self.game.load_game), ("SaveGame", Gtk.STOCK_SAVE, "_Save Game", None, "Save Game", self.game.save_game), ("MoveNow", None, "_Move Now (m)", None, "Move Now", self.game.move_now), ("Game", None, "_Game"), ("PositionEdit", None, "_Position Edit", None, "Position Edit", self.board.position_edit_init), ( "CopyFenToCB", None, "_Copy FEN to clipboard", None, "Copy FEN to clipboard", self.game.copy_FEN_to_clipboard, ), ( "PasteFenFromCB", None, "_Paste FEN from clipboard", None, "Paste FEN from clipboard", self.game.paste_FEN_from_clipboard, ), ( "CopyPDNToCB", Gtk.STOCK_COPY, "_Copy PDN to clipboard", None, "Copy PDN to clipboard", self.game.copy_PDN_to_clipboard, ), ( "PastePDNFromCB", Gtk.STOCK_PASTE, "_Paste PDN from clipboard", None, "Paste PDN from clipboard", self.game.paste_PDN_from_clipboard, ), ("Edit", None, "_Edit"), ( "SetCustomLevelDepth", None, "_Set User-defined Level", None, "Set Custom Level Depth", self.game.set_custom_search_depth, ), ("Level", None, "_Level"), ("Options", None, "_Options"), ("About", Gtk.STOCK_ABOUT, "_About", None, "Show About Box", self.about_box), ("samhelp", Gtk.STOCK_HELP, "_Help (online)", None, "Samuel Help (Online)", self.game.open_help), ("Help", None, "_Help"), ] ) actiongroup.get_action("Quit").set_property("short-label", "_Quit") actiongroup.get_action("MoveNow").set_sensitive(False) # Add the actiongroups to the uimanager uimanager.insert_action_group(actiongroup, 0) uimanager.insert_action_group(search_depth_actiongroup, 1) uimanager.insert_action_group(panel_action_group, 2) uimanager.insert_action_group(computer_player_action_group, 3) uimanager.insert_action_group(flip_the_board_action_group, 4) # Action groups that need settings to be saved/restored on program exit/startup self.save_action_groups = [ search_depth_actiongroup, panel_action_group, flip_the_board_action_group, computer_player_action_group, ] ui = """<ui> <menubar name="MenuBar"> <menu action="Game"> <menuitem action="NewGame"/> <separator/> <menuitem action="LoadGame"/> <menuitem action="SaveGame"/> <separator/> <menuitem action="MoveNow"/> <separator/> <menuitem action="Quit"/> </menu> <menu action="Edit"> <menuitem action="PositionEdit"/> <separator/> <menuitem action="CopyFenToCB"/> <menuitem action="PasteFenFromCB"/> <separator/> <menuitem action="CopyPDNToCB"/> <menuitem action="PastePDNFromCB"/> </menu> <menu action="Level"> <menuitem action="Beginner"/> <menuitem action="Advanced"/> <menuitem action="Expert"/> <menuitem action="Custom"/> <separator/> <menuitem action="SetCustomLevelDepth"/> <separator/> </menu> <menu action="Options"> <menuitem action="ComputerPlaysWhite"/> <menuitem action="ComputerPlaysRed"/> <menuitem action="ComputerPlaysWhiteAndRed"/> <menuitem action="ComputerOff"/> <separator/> <menuitem action="showpanel"/> <menuitem action="statusbar"/> <separator/> <menuitem action="FlipTheBoard"/> </menu> <menu action="Help"> <menuitem action="samhelp"/> <separator/> <menuitem action="About"/> </menu> </menubar> </ui>""" # Add a UI description uimanager.add_ui_from_string(ui) # Create a MenuBar menubar = uimanager.get_widget("/MenuBar") main_vbox.pack_start(menubar, False, True, 0) self.load_images() # Create a 8x8 table self.table = Gtk.Table(8, 8, True) self.table.set_border_width(25) aspect_frame = Gtk.AspectFrame(label=None, xalign=0.5, yalign=0.5, ratio=1.0, obey_child=False) aspect_frame.add(self.table) eb = Gtk.EventBox() # eb.add(self.table) eb.add(aspect_frame) eb.show() eb.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("darkslategrey")) main_vbox.pack_start(eb, True, True, 0) bot_hbox = Gtk.HBox(False, 0) main_vbox.pack_start(bot_hbox, False, True, 7) bot_hbox.show() vbox = Gtk.VBox(False, 0) bot_hbox.pack_end(vbox, False, False, 5) hbox1 = Gtk.HBox(False, 0) vbox.pack_start(hbox1, True, False, 0) hbox2 = Gtk.HBox(False, 0) vbox.pack_start(hbox2, True, False, 7) frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.IN) frame.show() vp = Gtk.Viewport() vp.add(frame) vp.show() vp.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("#EDECEB")) bot_hbox.pack_end(vp, True, True, 7) self.bot_hbox = bot_hbox self.infolabel = Gtk.Label() self.infolabel.modify_font(Pango.FontDescription("monospace 8")) frame.add(self.infolabel) self.infolabel.show() # get positions loaded msg msg = engine.rdisp() self.infolabel.set_text(msg) # go button self.go_button = Gtk.Button("Go") self.go_button.connect("clicked", self.game.callback, "Go") hbox1.pack_start(self.go_button, True, False, 0) self.go_button.show() # retract button self.retract_button = Gtk.Button("Retract") self.retract_button.connect("clicked", self.game.callback, "Retract") hbox1.pack_start(self.retract_button, True, False, 0) self.retract_button.show() # rewind to start button self.rts_button = Gtk.Button("<|") self.rts_button.connect("clicked", self.game.callback, "<|") hbox2.pack_start(self.rts_button, True, False, 0) self.rts_button.show() # rewind 1 move buttton self.rom_button = Gtk.Button("<") self.rom_button.connect("clicked", self.game.callback, "<") hbox2.pack_start(self.rom_button, True, False, 0) self.rom_button.show() # forward 1 move buttton self.fom_button = Gtk.Button(">") self.fom_button.connect("clicked", self.game.callback, ">") hbox2.pack_start(self.fom_button, True, False, 0) self.fom_button.show() # forward to end of game button self.fteog_button = Gtk.Button("|>") self.fteog_button.connect("clicked", self.game.callback, "|>") hbox2.pack_start(self.fteog_button, True, False, 0) self.fteog_button.show() vbox.show() hbox1.show() hbox2.show() # # widgets for position edit # self.posedit_hbox = Gtk.HBox(False, 0) main_vbox.pack_start(self.posedit_hbox, False, True, 7) vbox = Gtk.VBox(False, 0) self.posedit_hbox.pack_end(vbox, False, False, 5) hbox1 = Gtk.HBox(False, 0) vbox.pack_start(hbox1, True, False, 0) label = Gtk.Label() label.set_text("Side to Move") label.show() vbox.pack_start(label, True, False, 7) hbox2 = Gtk.HBox(False, 0) vbox.pack_start(hbox2, True, False, 0) frame = Gtk.Frame() frame.set_shadow_type(Gtk.ShadowType.IN) frame.show() vp = Gtk.Viewport() vp.add(frame) vp.show() vp.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("#EDECEB")) self.posedit_hbox.pack_end(vp, True, True, 7) self.infolabel2 = Gtk.Label() self.infolabel2.modify_font(Pango.FontDescription("monospace 8")) frame.add(self.infolabel2) self.infolabel2.show() self.cancel_button = Gtk.Button("Cancel") self.cancel_button.connect("clicked", self.game.callback, "Cancel") hbox1.pack_start(self.cancel_button, True, False, 0) self.cancel_button.show() button = Gtk.Button("OK") button.connect("clicked", self.game.callback, "OK") hbox1.pack_start(button, True, False, 0) button.show() self.radio_button_red = Gtk.RadioButton.new_with_label_from_widget(None, "Red") hbox2.pack_start(self.radio_button_red, True, False, 0) self.radio_button_red.show() self.radio_button_white = Gtk.RadioButton.new_with_label_from_widget(self.radio_button_red, "White") hbox2.pack_start(self.radio_button_white, True, False, 0) self.radio_button_white.show() vbox.show() hbox1.show() hbox2.show() # status bar self.status_bar = Gtk.Statusbar() main_vbox.pack_start(self.status_bar, False, False, 0) self.context_id = self.status_bar.get_context_id("samuel statusbar") self.set_status_bar_msg("Red to Move") self.window.show_all() self.posedit_hbox.hide() panel_action_group.get_action("showpanel").set_active(True) panel_action_group.get_action("statusbar").set_active(True)