/usr/share/pyshared/pychess/widgets/BoardPreview.py is in pychess 0.10.1~beta1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | # -*- coding: UTF-8 -*-
import os
import gtk, gtk.glade, gobject
from pychess.Utils.const import reprResult, BLACK, FEN_EMPTY
from pychess.Utils.Board import Board
from pychess.System.uistuff import GladeWidgets
from pychess.System.protoopen import protoopen, splitUri
from pychess.widgets.BoardView import BoardView
from pychess.Savers.ChessFile import LoadingError
def ellipsize (string, maxlen):
if len(string) <= maxlen or maxlen < 4:
return string
return string[:maxlen-1] + "…"
class BoardPreview:
def __init__ (self, widgets, fcbutton, opendialog, enddir):
self.position = 0
self.gameno = 0
self.filename = None
self.chessfile = None
self.widgets = widgets
self.fcbutton = fcbutton
self.enddir = enddir
# Treeview
self.list = self.widgets["gamesTree"]
self.list.set_model(gtk.ListStore(str, str,str,str))
# GTK_SELECTION_BROWSE - exactly one item is always selected
self.list.get_selection().set_mode(gtk.SELECTION_BROWSE)
self.list.get_selection().connect_after(
'changed', self.on_selection_changed)
# Add columns
renderer = gtk.CellRendererText()
renderer.set_property("xalign",0)
self.list.append_column(gtk.TreeViewColumn(None, renderer, text=0))
self.list.append_column(gtk.TreeViewColumn(None, renderer, text=1))
self.list.append_column(gtk.TreeViewColumn(None, renderer, text=2))
renderer = gtk.CellRendererText()
renderer.set_property("xalign",1)
self.list.append_column(gtk.TreeViewColumn(None, renderer, text=3))
# Connect buttons
self.widgets["first_button"].connect("clicked", self.on_first_button)
self.widgets["back_button"].connect("clicked", self.on_back_button)
self.widgets["forward_button"].connect("clicked", self.on_forward_button)
self.widgets["last_button"].connect("clicked", self.on_last_button)
# Add the board
self.boardview = BoardView()
self.boardview.set_size_request(170,170)
self.widgets["boardPreviewDock"].add(self.boardview)
self.boardview.show()
self.gamemodel = self.boardview.model
self.boardview.gotStarted = True
# Connect label showing possition
self.boardview.connect('shown_changed', self.shown_changed)
self.boardview.autoUpdateShown = False
# Add the filechooserbutton
self.widgets["fileChooserDock"].add(fcbutton)
# Connect doubleclicking a file to on_file_activated
fcbutton.connect("file-activated", self.on_file_activated)
# Connect the openbutton in the dialog to on_file_activated
openbut = opendialog.get_children()[0].get_children()[1].get_children()[0]
openbut.connect("clicked", self.on_file_activated)
# The first time the button is opened, the player has just opened
# his/her file, before we connected the dialog.
if self._retrieve_filename():
self.on_file_activated(fcbutton)
def on_file_activated (self, *args):
filename = self._retrieve_filename()
if filename:
if filename == self.get_filename():
return
self.set_filename(filename)
elif self.get_filename():
filename = self.get_filename()
else:
return
if os.path.isdir(filename):
return
ending = filename[filename.rfind(".")+1:]
loader = self.enddir[ending]
self.chessfile = chessfile = loader.load(protoopen(filename))
self.list.get_model().clear()
for gameno in range(len(chessfile)):
names = chessfile.get_player_names (gameno)
names = [ellipsize (name, 9) for name in names]
result = reprResult[chessfile.get_result (gameno)]
result = result.replace("1/2","½")
self.list.get_model().append (["%s." % (gameno+1)]+names+[result])
self.lastSel = -1 # The row that was last selected
self.list.set_cursor((0,))
def on_selection_changed (self, selection):
iter = selection.get_selected()[1]
if iter == None:
self.gamemodel.boards = [Board(FEN_EMPTY)]
del self.gamemodel.moves[:]
self.boardview.shown = 0
self.boardview.redraw_canvas()
return
sel = self.list.get_model().get_path(iter)[0]
if sel == self.lastSel: return
self.lastSel = sel
self.boardview.animationLock.acquire()
try:
try:
self.chessfile.loadToModel(sel, -1, self.gamemodel, False)
except LoadingError, e:
#TODO: Pressent this a little nicer
print e
self.boardview.lastMove = None
self.boardview._shown = self.gamemodel.lowply
last = self.gamemodel.ply
finally:
self.boardview.animationLock.release()
self.boardview.redraw_canvas()
self.boardview.shown = last
self.shown_changed(self.boardview, last)
def on_first_button (self, button):
self.boardview.showFirst()
def on_back_button (self, button):
self.boardview.showPrevious()
def on_forward_button (self, button):
self.boardview.showNext()
def on_last_button (self, button):
self.boardview.showLast()
def shown_changed (self, boardView, shown):
pos = "%d." % (shown/2+1)
if shown & 1:
pos += ".."
self.widgets["posLabel"].set_text(pos)
def set_filename (self, filename):
asPath = splitUri(filename)[-1]
if os.path.isfile(asPath):
self.fcbutton.show()
if filename != self._retrieve_filename():
self.fcbutton.set_filename(os.path.abspath(asPath))
else:
self.fcbutton.set_uri("")
self.fcbutton.hide()
self.filename = filename
def get_filename (self):
return self.filename
def is_empty (self):
return not self.chessfile or not len(self.chessfile)
def _retrieve_filename (self):
#if self.fcbutton.get_filename():
# return self.fcbutton.get_filename()
if self.fcbutton.get_preview_filename():
return self.fcbutton.get_preview_filename()
elif self.fcbutton.get_uri():
return self.fcbutton.get_uri()[7:]
def get_position (self):
return self.boardview.shown
def get_gameno (self):
iter = self.list.get_selection().get_selected()[1]
if iter == None: return -1
return self.list.get_model().get_path(iter)[0]
|