X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FComponents%2FFileList.py;h=5824747d0a95f571f67c009e78a2629b7f161f4e;hp=d0ca59ffc453be1f2717668759e63ea32eb06b6e;hb=04f4636324ab06c5a3a4f618100048e159eaf6f9;hpb=e91e864a3a432663706356c342d4d382a5bc0d3b diff --git a/lib/python/Components/FileList.py b/lib/python/Components/FileList.py index d0ca59f..5824747 100644 --- a/lib/python/Components/FileList.py +++ b/lib/python/Components/FileList.py @@ -1,86 +1,243 @@ -from HTMLComponent import * -from GUIComponent import * import re +from os import path as os_path, listdir from MenuList import MenuList +from Components.Harddisk import harddiskmanager -from Tools.Directories import * +from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename -from enigma import * - -RT_HALIGN_LEFT = 0 -RT_HALIGN_RIGHT = 1 -RT_HALIGN_CENTER = 2 -RT_HALIGN_BLOCK = 4 - -RT_VALIGN_TOP = 0 -RT_VALIGN_CENTER = 8 -RT_VALIGN_BOTTOM = 16 +from enigma import RT_HALIGN_LEFT, eListbox, eListboxPythonMultiContent, \ + eServiceReference, eServiceCenter, gFont +from Tools.LoadPixmap import LoadPixmap EXTENSIONS = { "mp3": "music", "wav": "music", + "ogg": "music", "jpg": "picture", "jpeg": "picture", "png": "picture", + "bmp": "picture", "ts": "movie", "avi": "movie", "mpg": "movie", "mpeg": "movie", } -def FileEntryComponent(name, absolute, isDir = False): +def FileEntryComponent(name, absolute = None, isDir = False): res = [ (absolute, isDir) ] - res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, RT_HALIGN_LEFT ,name)) + res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name)) if isDir: - png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "/extensions/directory.png")) + png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png")) else: extension = name.split('.') - extension = extension[len(extension) - 1] + extension = extension[-1].lower() if EXTENSIONS.has_key(extension): - png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "/extensions/" + EXTENSIONS[extension] + ".png")) + png = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png")) + else: + png = None if png is not None: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png)) return res -class FileList(HTMLComponent, GUIComponent, MenuList): - def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None): - GUIComponent.__init__(self) - self.l = eListboxPythonMultiContent() - +class FileList(MenuList): + def __init__(self, directory, showDirectories = True, showFiles = True, showMountpoints = True, matchingPattern = None, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, enableWrapAround = False, additionalExtensions = None): + MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent) + self.additional_extensions = additionalExtensions + self.mountpoints = [] + self.current_directory = None + self.current_mountpoint = None + self.useServiceRef = useServiceRef self.showDirectories = showDirectories + self.showMountpoints = showMountpoints self.showFiles = showFiles # example: matching .nfi and .ts files: "^.*\.(nfi|ts)" self.matchingPattern = matchingPattern - self.changeDir(directory) + self.inhibitDirs = inhibitDirs or [] + self.inhibitMounts = inhibitMounts or [] + self.refreshMountpoints() + self.changeDir(directory) self.l.setFont(0, gFont("Regular", 18)) - + self.l.setItemHeight(23) + self.serviceHandler = eServiceCenter.getInstance() + + def refreshMountpoints(self): + self.mountpoints = [os_path.join(p.mountpoint, "") for p in harddiskmanager.getMountedPartitions()] + self.mountpoints.sort(reverse = True) + + def getMountpoint(self, file): + file = os_path.join(os_path.realpath(file), "") + for m in self.mountpoints: + if file.startswith(m): + return m + return False + + def getMountpointLink(self, file): + if os_path.realpath(file) == file: + return self.getMountpoint(file) + else: + if file[-1] == "/": + file = file[:-1] + mp = self.getMountpoint(file) + last = file + file = os_path.dirname(file) + while last != "/" and mp == self.getMountpoint(file): + last = file + file = os_path.dirname(file) + return os_path.join(last, "") + def getSelection(self): + if self.l.getCurrentSelection() is None: + return None return self.l.getCurrentSelection()[0] - - def changeDir(self, directory): + + def getCurrentEvent(self): + l = self.l.getCurrentSelection() + if not l or l[0][1] == True: + return None + else: + return self.serviceHandler.info(l[0][0]).getEvent(l[0][0]) + + def getFileList(self): + return self.list + + def inParentDirs(self, dir, parents): + dir = os_path.realpath(dir) + for p in parents: + if dir.startswith(p): + return True + return False + + def changeDir(self, directory, select = None): self.list = [] - - directories = os.listdir(directory) - - if directory != "/" and self.showDirectories: - self.list.append(FileEntryComponent(name = "..", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True)) - for x in directories: - if os.path.isdir(directory + x): - if self.showDirectories: - self.list.append(FileEntryComponent(name = x, absolute = directory + x + "/" , isDir = True)) - elif self.showFiles: - if self.matchingPattern is not None: - if re.compile(self.matchingPattern).search(x): - self.list.append(FileEntryComponent(name = x, absolute = directory + x , isDir = False)) + + if directory and not os_path.isdir(directory): + directory = None + # if we are just entering from the list of mount points: + if self.current_directory is None: + if directory and self.showMountpoints: + self.current_mountpoint = self.getMountpointLink(directory) + else: + self.current_mountpoint = None + self.current_directory = directory + directories = [] + files = [] + + if directory is None and self.showMountpoints: # present available mountpoints + for p in harddiskmanager.getMountedPartitions(): + path = os_path.join(p.mountpoint,"") + if not self.inhibitMounts or ((not path in self.inhibitMounts) and (not self.inParentDirs(path, self.inhibitDirs))): + self.list.append(FileEntryComponent(name = p.description, absolute = path, isDir = True)) + files = [ ] + directories = [ ] + elif self.useServiceRef: + root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory) + if self.additional_extensions: + root.setName(self.additional_extensions) + serviceHandler = eServiceCenter.getInstance() + list = serviceHandler.list(root) + + while 1: + s = list.getNext() + if not s.valid(): + del list + break + if s.flags & s.mustDescent: + directories.append(s.getPath()) else: - self.list.append(FileEntryComponent(name = x, absolute = directory + x , isDir = False)) - + files.append(s) + directories.sort() + files.sort() + else: + if os_path.exists(directory): + files = listdir(directory) + files.sort() + tmpfiles = files[:] + for x in tmpfiles: + if os_path.isdir(directory + x): + directories.append(directory + x + "/") + files.remove(x) + + if directory is not None and self.showDirectories: + if directory == self.current_mountpoint and self.showMountpoints: + self.list.append(FileEntryComponent(name = "<" +_("List of Storage Devices") + ">", absolute = None, isDir = True)) + elif (directory != "/") and not (self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts): + self.list.append(FileEntryComponent(name = "<" +_("Parent Directory") + ">", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True)) + + if self.showDirectories: + for x in directories: + if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs(x, self.inhibitDirs): + name = x.split('/')[-2] + self.list.append(FileEntryComponent(name = name, absolute = x, isDir = True)) + + if self.showFiles: + for x in files: + if self.useServiceRef: + path = x.getPath() + name = path.split('/')[-1] + else: + path = directory + x + name = x + + if (self.matchingPattern is None) or re.compile(self.matchingPattern).search(path): + self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False)) + self.l.setList(self.list) + + if select is not None: + i = 0 + self.moveToIndex(0) + for x in self.list: + p = x[0][0] - def GUIcreate(self, parent): - self.instance = eListbox(parent) - self.instance.setContent(self.l) - self.instance.setItemHeight(23) \ No newline at end of file + if isinstance(p, eServiceReference): + p = p.getPath() + + if p == select: + self.moveToIndex(i) + i += 1 + + def getCurrentDirectory(self): + return self.current_directory + + def canDescent(self): + if self.getSelection() is None: + return False + return self.getSelection()[1] + + def descent(self): + if self.getSelection() is None: + return + self.changeDir(self.getSelection()[0], select = self.current_directory) + + def getFilename(self): + if self.getSelection() is None: + return None + x = self.getSelection()[0] + if isinstance(x, eServiceReference): + x = x.getPath() + return x + + def getServiceRef(self): + if self.getSelection() is None: + return None + x = self.getSelection()[0] + if isinstance(x, eServiceReference): + return x + return None + + def execBegin(self): + harddiskmanager.on_partition_list_change.append(self.partitionListChanged) + + def execEnd(self): + harddiskmanager.on_partition_list_change.remove(self.partitionListChanged) + + def refresh(self): + self.changeDir(self.current_directory, self.getFilename()) + + def partitionListChanged(self, action, device): + self.refreshMountpoints() + if self.current_directory is None: + self.refresh()