Esempio n. 1
0
class MainWindow:
    def __init__(self, app):
        self.app = app
        self.filename = ""
        self.data = Data()
        self.current_game = 0

        self.UNSEEN_SCORE = 0
        self.DONT_KNOW_SCORE = 1
        self.FUZZY_SCORE = 2
        self.GOT_IT_SCORE = 3
    
        widgets = gtk.glade.XML(utils.locate_data_dir() + "chessmemory.glade")
        widgets.signal_autoconnect(self)
        
        self.window = widgets.get_widget("mainwindow")
        self.boardbox = widgets.get_widget("alignment_board_display")
        self.hpane = widgets.get_widget("hpane")
        self.vpane = widgets.get_widget("vpane")
        
        self.hpane.set_position(680)
        self.vpane.set_position(350)

        self.window.set_size_request(1440, 800)

        self.window.connect("key_press_event", self.key_press_event)
        self.window.set_events(gtk.gdk.KEY_PRESS_MASK)
        
        try:
            icon = gtk.icon_theme_get_default().load_icon("chessmemory", 48, 0)
            self.window.set_icon(icon)
        except:
            print "Warning:", sys.exc_info()[1]
                    
        # Move control buttons
        self.button_move_first = widgets.get_widget("button_move_first")
        self.button_move_back = widgets.get_widget("button_move_back")
        self.button_move_takeback = widgets.get_widget("button_move_takeback")
        self.button_move_forward = widgets.get_widget("button_move_forward")
        self.button_move_last = widgets.get_widget("button_move_last")
        self.button_dont_know = widgets.get_widget("button_dont_know")
        self.button_fuzzy = widgets.get_widget("button_fuzzy")
        self.button_got_it = widgets.get_widget("button_got_it")
        
        self.boardview = BoardView(self)
        #self.board = self.boardview.board
        self.boardbox.add(self.boardview)
        
        self.boardview.board.connect('position-changed-event', self.position_changed_event)
        
        self.notationview = NotationView()
        self.notationview.board = self.boardview.board
        self.boardview.board.connect('position-changed-event', self.notationview.position_changed_event) 
        widgets.get_widget('sw_notation').add(self.notationview)
        
        self.gamelist = GameList(self)
                
        #self.notebook = gtk.Notebook()
        #widgets.get_widget("notebook_box").add(self.notebook)
        #self.notebook.append_page(self.gamelist)
        widgets.get_widget("sw_gamelist").add(self.gamelist)
        
        self.window.show_all()        
        self.button_move_takeback.hide() # TODO: reconsider
        
    def on_resize(self, widget):
        #self.boardview.on_resize()
        pass
        
    def on_rotate(self, widget):
        self.boardview.flip()

    def key_press_event(self, widget, event):
        if gtk.gdk.keyval_name(event.keyval) == "Right":
            self.boardview.board.move_forward()
        elif gtk.gdk.keyval_name(event.keyval) == "Left":
            self.boardview.board.move_back()
        elif gtk.gdk.keyval_name(event.keyval) == "question":
            self.load_random_game()
        elif gtk.gdk.keyval_name(event.keyval) == "Return":
            self.on_button_got_it_clicked(self)
        elif gtk.gdk.keyval_name(event.keyval) == "space":
            self.on_button_fuzzy_clicked(self)
        elif gtk.gdk.keyval_name(event.keyval) == "Shift_L":
            self.on_button_dont_know_clicked(self)

    def on_show_coordinates_toggle(self, widget):
        self.boardview.toggle_coordinates()
    
    def on_button_move_back_clicked(self, widget):
        self.boardview.board.move_back()
    
    def on_button_move_forward_clicked(self, widget):
        self.boardview.board.move_forward()
        
    def on_button_move_first_clicked(self, widget):
        self.boardview.board.move_first()
    
    def on_button_move_last_clicked(self, widget):
        self.boardview.board.move_last()

    def on_button_dont_know_clicked(self, widget):
        self.data.set_score(self.current_game, self.DONT_KNOW_SCORE)
        self.gamelist.store[self.current_game][1] = self.DONT_KNOW_SCORE
        self.save_state()
        self.load_random_game()
        
    def on_button_fuzzy_clicked(self, widget):
        self.data.set_score(self.current_game, self.FUZZY_SCORE)
        self.gamelist.store[self.current_game][1] = self.FUZZY_SCORE
        self.save_state()
        self.load_random_game()
        
    def on_button_got_it_clicked(self, widget):
        self.data.set_score(self.current_game, self.GOT_IT_SCORE)
        self.gamelist.store[self.current_game][1] = self.GOT_IT_SCORE
        self.save_state()
        self.load_random_game()
        
    def load_random_game(self):
        random_index = randrange(0,len(self.gamelist.games))
        self.open_game(self.gamelist.games[random_index])

    def save_state(self):
        save_filename = self.filename + ".dat"
        f = open(save_filename, 'w')
        pickle.dump(self.data, f)

    def load_state(self):
        load_filename = self.filename + ".dat"
        try:
            f = open(load_filename)
            unpickler = pickle.Unpickler(f)
            self.data = unpickler.load()
        except:
            pass

    def open_game(self, game):
        game.notation.nodes = PGN.parse_string(game.notation_string)
        self.boardview.board.set_game(game)
        #self.boardview.update()
        self.notationview.update()
        self.current_game = game.index
        self.gamelist.set_cursor(game.index)
        self.data.inc_seen()

        # TODO P3: check for list of player names
        if game.keys['Black'] == 'Player' and self.boardview._flipped is False:
            self.boardview.flip()
        
    def load_games(self, filename):
        self.filename = filename
        self.load_state()
        self.gamelist.load(filename)
        #self.open_game(self.gamelist.games[0])
        self.load_random_game()
        filebase = os.path.splitext(os.path.basename(filename))[0]
        self.window.set_title(filebase)
        
    def on_open(self, sender):
        fc = gtk.FileChooserDialog(title="Open", parent=self.window,
                                   buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                                            gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))
        if self.filename:
            fc.set_filename(self.filename)
        result = fc.run()
        fc.hide()
        if result == gtk.RESPONSE_ACCEPT:
            self.load_games(fc.get_filename())
            
    def on_save_board_image(self, sender):
        fc = gtk.FileChooserDialog(title="Save Image", parent=self.window,
                                   action=gtk.FILE_CHOOSER_ACTION_SAVE,
                                   buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                                            gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))
        result = fc.run()
        fc.hide()
        if result == gtk.RESPONSE_ACCEPT:
            self.boardview.save_png(fc.get_filename())
            
    def on_about(self, sender):
        ad = gtk.AboutDialog()
        ad.set_name("Chessmemory")
        ad.set_comments("Open Source Chess Viewer and Database Tool")
        ad.set_version(utils.get_version())
        ad.set_copyright("Copyright © 2006 Daniel Borgmann")
        ad.set_authors([
            "Daniel Borgmann <*****@*****.**>",
            "Nils R Grotnes <*****@*****.**>",
        ])
        ad.set_license(utils.get_license())
        ad.set_logo_icon_name("chessmemory")
        ad.run()
        
    def on_close(self, sender=None, event=None):
        gtk.main_quit()
            
    def position_changed_event(self, sender, new_position=None):
        print self.app.eco.get_name(new_position.get_FEN())