1 from re import compile as re_compile
2 from os import path as os_path, listdir
3 from MenuList import MenuList
4 from Components.Harddisk import harddiskmanager
6 from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename, fileExists
8 from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \
9 eServiceReference, eServiceCenter, gFont
10 from Tools.LoadPixmap import LoadPixmap
43 def FileEntryComponent(name, absolute = None, isDir = False):
44 res = [ (absolute, isDir) ]
45 res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
47 png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
49 extension = name.split('.')
50 extension = extension[-1].lower()
51 if EXTENSIONS.has_key(extension):
52 png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
56 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))
60 class FileList(MenuList):
61 def __init__(self, directory, showDirectories = True, showFiles = True, showMountpoints = True, matchingPattern = None, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, isTop = False, enableWrapAround = False, additionalExtensions = None):
62 MenuList.__init__(self, list, enableWrapAround, eListboxPythonMultiContent)
63 self.additional_extensions = additionalExtensions
65 self.current_directory = None
66 self.current_mountpoint = None
67 self.useServiceRef = useServiceRef
68 self.showDirectories = showDirectories
69 self.showMountpoints = showMountpoints
70 self.showFiles = showFiles
72 # example: matching .nfi and .ts files: "^.*\.(nfi|ts)"
73 self.matchingPattern = matchingPattern
74 self.inhibitDirs = inhibitDirs or []
75 self.inhibitMounts = inhibitMounts or []
77 self.refreshMountpoints()
78 self.changeDir(directory)
79 self.l.setFont(0, gFont("Regular", 18))
80 self.l.setItemHeight(23)
81 self.serviceHandler = eServiceCenter.getInstance()
83 def refreshMountpoints(self):
84 self.mountpoints = [os_path.join(p.mountpoint, "") for p in harddiskmanager.getMountedPartitions()]
85 self.mountpoints.sort(reverse = True)
87 def getMountpoint(self, file):
88 file = os_path.join(os_path.realpath(file), "")
89 for m in self.mountpoints:
90 if file.startswith(m):
94 def getMountpointLink(self, file):
95 if os_path.realpath(file) == file:
96 return self.getMountpoint(file)
100 mp = self.getMountpoint(file)
102 file = os_path.dirname(file)
103 while last != "/" and mp == self.getMountpoint(file):
105 file = os_path.dirname(file)
106 return os_path.join(last, "")
108 def getSelection(self):
109 if self.l.getCurrentSelection() is None:
111 return self.l.getCurrentSelection()[0]
113 def getCurrentEvent(self):
114 l = self.l.getCurrentSelection()
115 if not l or l[0][1] == True:
118 return self.serviceHandler.info(l[0][0]).getEvent(l[0][0])
120 def getFileList(self):
123 def inParentDirs(self, dir, parents):
124 dir = os_path.realpath(dir)
126 if dir.startswith(p):
130 def changeDir(self, directory, select = None):
133 # if we are just entering from the list of mount points:
134 if self.current_directory is None:
135 if directory and self.showMountpoints:
136 self.current_mountpoint = self.getMountpointLink(directory)
138 self.current_mountpoint = None
139 self.current_directory = directory
143 if directory is None and self.showMountpoints: # present available mountpoints
144 for p in harddiskmanager.getMountedPartitions():
145 path = os_path.join(p.mountpoint, "")
146 if path not in self.inhibitMounts and not self.inParentDirs(path, self.inhibitDirs):
147 self.list.append(FileEntryComponent(name = p.description, absolute = path, isDir = True))
150 elif directory is None:
153 elif self.useServiceRef:
154 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)
155 if self.additional_extensions:
156 root.setName(self.additional_extensions)
157 serviceHandler = eServiceCenter.getInstance()
158 list = serviceHandler.list(root)
165 if s.flags & s.mustDescent:
166 directories.append(s.getPath())
172 if fileExists(directory):
174 files = listdir(directory)
180 if os_path.isdir(directory + x):
181 directories.append(directory + x + "/")
184 if directory is not None and self.showDirectories and not self.isTop:
185 if directory == self.current_mountpoint and self.showMountpoints:
186 self.list.append(FileEntryComponent(name = "<" +_("List of Storage Devices") + ">", absolute = None, isDir = True))
187 elif (directory != "/") and not (self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts):
188 self.list.append(FileEntryComponent(name = "<" +_("Parent Directory") + ">", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
190 if self.showDirectories:
191 for x in directories:
192 if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs(x, self.inhibitDirs):
193 name = x.split('/')[-2]
194 self.list.append(FileEntryComponent(name = name, absolute = x, isDir = True))
198 if self.useServiceRef:
200 name = path.split('/')[-1]
205 if (self.matchingPattern is None) or re_compile(self.matchingPattern).search(path):
206 self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
208 if self.showMountpoints and len(self.list) == 0:
209 self.list.append(FileEntryComponent(name = _("nothing connected"), absolute = None, isDir = False))
211 self.l.setList(self.list)
213 if select is not None:
219 if isinstance(p, eServiceReference):
226 def getCurrentDirectory(self):
227 return self.current_directory
229 def canDescent(self):
230 if self.getSelection() is None:
232 return self.getSelection()[1]
235 if self.getSelection() is None:
237 self.changeDir(self.getSelection()[0], select = self.current_directory)
239 def getFilename(self):
240 if self.getSelection() is None:
242 x = self.getSelection()[0]
243 if isinstance(x, eServiceReference):
247 def getServiceRef(self):
248 if self.getSelection() is None:
250 x = self.getSelection()[0]
251 if isinstance(x, eServiceReference):
256 harddiskmanager.on_partition_list_change.append(self.partitionListChanged)
259 harddiskmanager.on_partition_list_change.remove(self.partitionListChanged)
262 self.changeDir(self.current_directory, self.getFilename())
264 def partitionListChanged(self, action, device):
265 self.refreshMountpoints()
266 if self.current_directory is None:
270 def MultiFileSelectEntryComponent(name, absolute = None, isDir = False, selected = False):
271 res = [ (absolute, isDir, selected, name) ]
272 res.append((eListboxPythonMultiContent.TYPE_TEXT, 55, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
274 png = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "extensions/directory.png"))
276 extension = name.split('.')
277 extension = extension[-1].lower()
278 if EXTENSIONS.has_key(extension):
279 png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "extensions/" + EXTENSIONS[extension] + ".png"))
283 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 30, 2, 20, 20, png))
285 if not name.startswith('<'):
286 if selected is False:
287 icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_off.png"))
288 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
290 icon = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/lock_on.png"))
291 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 2, 0, 25, 25, icon))
296 class MultiFileSelectList(FileList):
297 def __init__(self, preselectedFiles, directory, showMountpoints = False, matchingPattern = None, showDirectories = True, showFiles = True, useServiceRef = False, inhibitDirs = False, inhibitMounts = False, isTop = False, enableWrapAround = False, additionalExtensions = None):
298 self.selectedFiles = preselectedFiles
299 if self.selectedFiles is None:
300 self.selectedFiles = []
301 FileList.__init__(self, directory, showMountpoints = showMountpoints, matchingPattern = matchingPattern, showDirectories = showDirectories, showFiles = showFiles, useServiceRef = useServiceRef, inhibitDirs = inhibitDirs, inhibitMounts = inhibitMounts, isTop = isTop, enableWrapAround = enableWrapAround, additionalExtensions = additionalExtensions)
302 self.changeDir(directory)
303 self.l.setItemHeight(25)
304 self.l.setFont(0, gFont("Regular", 20))
305 self.onSelectionChanged = [ ]
307 def selectionChanged(self):
308 for f in self.onSelectionChanged:
311 def changeSelectionState(self):
312 idx = self.l.getCurrentSelectionIndex()
317 if x[0][3].startswith('<'):
321 realPathname = x[0][0]
323 realPathname = self.current_directory + x[0][0]
326 for entry in self.selectedFiles:
327 if entry == realPathname:
328 self.selectedFiles.remove(entry)
332 alreadyinList = False
333 for entry in self.selectedFiles:
334 if entry == realPathname:
336 if not alreadyinList:
337 self.selectedFiles.append(realPathname)
338 newList.append(MultiFileSelectEntryComponent(name = x[0][3], absolute = x[0][0], isDir = x[0][1], selected = SelectState ))
345 self.l.setList(self.list)
347 def getSelectedList(self):
348 return self.selectedFiles
350 def changeDir(self, directory, select = None):
353 # if we are just entering from the list of mount points:
354 if self.current_directory is None:
355 if directory and self.showMountpoints:
356 self.current_mountpoint = self.getMountpointLink(directory)
358 self.current_mountpoint = None
359 self.current_directory = directory
363 if directory is None and self.showMountpoints: # present available mountpoints
364 for p in harddiskmanager.getMountedPartitions():
365 path = os_path.join(p.mountpoint, "")
366 if path not in self.inhibitMounts and not self.inParentDirs(path, self.inhibitDirs):
367 self.list.append(MultiFileSelectEntryComponent(name = p.description, absolute = path, isDir = True))
370 elif directory is None:
373 elif self.useServiceRef:
374 root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)
375 if self.additional_extensions:
376 root.setName(self.additional_extensions)
377 serviceHandler = eServiceCenter.getInstance()
378 list = serviceHandler.list(root)
385 if s.flags & s.mustDescent:
386 directories.append(s.getPath())
392 if fileExists(directory):
394 files = listdir(directory)
400 if os_path.isdir(directory + x):
401 directories.append(directory + x + "/")
404 if directory is not None and self.showDirectories and not self.isTop:
405 if directory == self.current_mountpoint and self.showMountpoints:
406 self.list.append(MultiFileSelectEntryComponent(name = "<" +_("List of Storage Devices") + ">", absolute = None, isDir = True))
407 elif (directory != "/") and not (self.inhibitMounts and self.getMountpoint(directory) in self.inhibitMounts):
408 self.list.append(MultiFileSelectEntryComponent(name = "<" +_("Parent Directory") + ">", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
410 if self.showDirectories:
411 for x in directories:
412 if not (self.inhibitMounts and self.getMountpoint(x) in self.inhibitMounts) and not self.inParentDirs(x, self.inhibitDirs):
413 name = x.split('/')[-2]
414 alreadySelected = False
415 for entry in self.selectedFiles:
417 alreadySelected = True
419 self.list.append(MultiFileSelectEntryComponent(name = name, absolute = x, isDir = True, selected = True))
421 self.list.append(MultiFileSelectEntryComponent(name = name, absolute = x, isDir = True, selected = False))
425 if self.useServiceRef:
427 name = path.split('/')[-1]
432 if (self.matchingPattern is None) or re_compile(self.matchingPattern).search(path):
433 alreadySelected = False
434 for entry in self.selectedFiles:
435 if os_path.basename(entry) == x:
436 alreadySelected = True
438 self.list.append(MultiFileSelectEntryComponent(name = name, absolute = x , isDir = False, selected = True))
440 self.list.append(MultiFileSelectEntryComponent(name = name, absolute = x , isDir = False, selected = False))
442 self.l.setList(self.list)
444 if select is not None:
450 if isinstance(p, eServiceReference):