""" FileView handles a view using a FileReader, gtk treeview, and a PathBar. It does all of the logic of moving around within a filesystem and should also do all of the error reporting. """ import gtk, pango import pathbar, mime _MULTIPLE = gtk.SELECTION_MULTIPLE _RIGHT_ALIGN = pango.AttrList() _RIGHT_ALIGN.insert(pango.AttrStyle(pango.Alignment(pango.ALIGN_RIGHT), 0, -1)) class FileView: def __init__(self, reader, treeview, showHidden=False): self.view = treeview self.showHidden = showHidden self.store = None self.columns = self.makeColumns() for column in self.columns: self.view.append_column(column) # if you have pygtk 2.10, this will work: if hasattr(self.view, 'set_rubber_banding'): self.view.set_rubber_banding(True) self.view.get_selection().set_mode(_MULTIPLE) #TODO: drag & drop self.reader = reader self.pathbar = self.makePathBar() self.setSignals() def makeColumns(self): scr = gtk.CellRendererText() i = gtk.TreeViewColumn('Name') s = gtk.TreeViewColumn('Size') t = gtk.TreeViewColumn('Type') i.pack_start(gtk.CellRendererPixbuf(), False) i.pack_start(gtk.CellRendererText(), True) i.set_attributes(i.get_cell_renderers()[0], pixbuf=0) i.set_attributes(i.get_cell_renderers()[1], text=1) s.pack_start(gtk.CellRendererText(), True) s.set_attributes(s.get_cell_renderers()[0], text=2) s.get_cell_renderers()[0].set_property('xalign', 1.0) s.set_alignment(1.0) t.pack_start(gtk.CellRendererText(), True) for tvc in (s, t): tvc.resizeable = False t.set_property('visible', False) i.set_property('sort-indicator', True) # SIDE EFFECTS YAY return [i, s, t] def makePathBar(self): # the first parent is a scrolled window vbox = self.view.get_parent().get_parent() pbox = '' for child in vbox.get_children(): if child.name.rfind('PathBar') > -1: pbox = child break return pathbar.PathBar(pbox, self.reader.cwd, self) def setSignals(self): # we are fully initialized at this point... self.view.connect('row_activated', self.on_row_activated) def chdir(self, path): self.reader.chdir(path) self.refresh() def refresh(self): if not self.store: self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, str, str) else: # is this proper? self.store.clear() for entry in self.reader.directories: if not entry.isHidden or self.showHidden: self.store.append((entry.icon, entry.name, entry.humanSize(), 'd')) for entry in self.reader.files: if not entry.isHidden or self.showHidden: self.store.append((entry.icon, entry.name, entry.humanSize(), 'f')) self.view.set_model(self.store) self.view.columns_autosize() # signal handlers def on_row_activated(self, view, positions, column): for pos in positions: model = view.get_model() iter = model.get_iter(pos) name = self.store.get_value(iter, 1) type = self.store.get_value(iter, 3) if type == 'd': print self.reader.dirhash[name] elif type == 'f': print self.reader.filehash[name] else: # If this happens, check that the numbers above correspond # to 'name' and 'type' raise "User double clicked something that should not exist."