def __init__(self, initial=None, filter=filesel_filter, folders=None): super(FileSelector, self).__init__() self.__filter = filter if initial and os.path.isfile(initial): initial = os.path.dirname(initial) dirlist = DirectoryTree(initial, folders=folders) filelist = AllTreeView(gtk.ListStore(str)) column = TreeViewColumn(_("Songs")) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) render = gtk.CellRendererPixbuf() render.set_property('stock_id', gtk.STOCK_FILE) render.props.xpad = 3 column.pack_start(render, expand=False) render = gtk.CellRendererText() column.pack_start(render) column.set_cell_data_func(render, self.cell_data) column.set_attributes(render, text=0) filelist.append_column(column) filelist.set_rules_hint(True) filelist.get_selection().set_mode(gtk.SELECTION_MULTIPLE) filelist.set_search_equal_func(search_func, False) self.__sig = filelist.get_selection().connect( 'changed', self.__changed) dirlist.get_selection().connect( 'changed', self.__fill, filelist) dirlist.get_selection().emit('changed') def select_all_files(view, path, col, fileselection): view.expand_row(path, False) fileselection.select_all() dirlist.connect('row-activated', select_all_files, filelist.get_selection()) sw = ScrolledWindow() sw.add(dirlist) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) self.pack1(sw, resize=True) sw = ScrolledWindow() sw.add(filelist) sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) self.pack2(sw, resize=True)
def __init__(self, initial=None, folders=None): super(DirectoryTree, self).__init__(gtk.TreeStore(str)) column = TreeViewColumn(_("Folders")) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) render = gtk.CellRendererPixbuf() render.set_property('stock_id', gtk.STOCK_DIRECTORY) column.pack_start(render, expand=False) render = gtk.CellRendererText() column.pack_start(render) column.set_cell_data_func(render, self.cell_data) column.set_attributes(render, text=0) self.append_column(column) self.set_search_equal_func(search_func, True) if folders is None: folders = [] if os.name == "nt": try: from win32com.shell import shell, shellcon as con import pywintypes except ImportError: pass else: if folders: folders.append(None) try: desktop = shell.SHGetFolderPath(0, con.CSIDL_DESKTOP, 0, 0) except pywintypes.com_error: pass else: folders.append(desktop) folders.append(const.HOME) try: music = shell.SHGetFolderPath(0, con.CSIDL_MYMUSIC, 0, 0) except pywintypes.com_error: pass else: folders.append(music) if folders: folders.append(None) drives = [letter + ":\\" for letter in "CDEFGHIJKLMNOPQRSTUVWXYZ"] map(folders.append, filter(os.path.isdir, drives)) else: if folders: folders.append(None) folders.extend([const.HOME, "/"]) # Read in the GTK bookmarks list; gjc says this is the right way try: f = file(os.path.join(const.HOME, ".gtk-bookmarks")) except EnvironmentError: pass else: folders.append(None) for line in (l for l in f.readlines() if l.strip()): folder_url = line.split()[0] folders.append(urlparse.urlsplit(folder_url)[2]) def is_folder(filename): return filename is None or os.path.isdir(filename) folders = filter(is_folder, folders) if folders[-1] is None: folders.pop() for path in folders: niter = self.get_model().append(None, [path]) if path is not None: self.get_model().append(niter, ["dummy"]) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.connect( 'test-expand-row', DirectoryTree.__expanded, self.get_model()) self.set_row_separator_func(lambda model, iter: model[iter][0] is None) if initial: self.go_to(initial) menu = gtk.Menu() m = qltk.MenuItem(_("_New Folder..."), gtk.STOCK_NEW) m.connect('activate', self.__mkdir) menu.append(m) m = gtk.ImageMenuItem(gtk.STOCK_DELETE) m.connect('activate', self.__rmdir) menu.append(m) m = gtk.ImageMenuItem(gtk.STOCK_REFRESH) m.connect('activate', self.__refresh) menu.append(m) m = qltk.MenuItem(_("_Select All Subfolders"), gtk.STOCK_DIRECTORY) m.connect('activate', self.__expand) menu.append(m) menu.show_all() self.connect_object('popup-menu', self.__popup_menu, menu)