some picplayer fixes
[vuplus_dvbapp] / lib / python / Components / FileList.py
1 from HTMLComponent import *
2 from GUIComponent import *
3 import re
4
5 from MenuList import MenuList
6 from Components.Harddisk import harddiskmanager
7
8 from Tools.Directories import *
9
10 from enigma import *
11
12 RT_HALIGN_LEFT = 0
13 RT_HALIGN_RIGHT = 1
14 RT_HALIGN_CENTER = 2
15 RT_HALIGN_BLOCK = 4
16
17 RT_VALIGN_TOP = 0
18 RT_VALIGN_CENTER = 8
19 RT_VALIGN_BOTTOM = 16
20
21 EXTENSIONS = {
22                 "mp3": "music",
23                 "wav": "music",
24                 "ogg": "music",
25                 "jpg": "picture",
26                 "jpeg": "picture",
27                 "png": "picture",
28                 "bmp": "picture",
29                 "ts": "movie",
30                 "avi": "movie",
31                 "mpg": "movie",
32                 "mpeg": "movie",
33         }
34
35 def FileEntryComponent(name, absolute = None, isDir = False):
36         res = [ (absolute, isDir) ]
37         res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 470, 20, 0, RT_HALIGN_LEFT, name))
38         if isDir:
39                 png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/directory.png"))
40         else:
41                 extension = name.split('.')
42                 extension = extension[-1].lower()
43                 if EXTENSIONS.has_key(extension):
44                         png = loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "extensions/" + EXTENSIONS[extension] + ".png"))
45                 else:
46                         png = None
47         if png is not None:
48                 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png))
49         
50         return res
51
52 class FileList(MenuList, HTMLComponent, GUIComponent):
53         def __init__(self, directory, showDirectories = True, showFiles = True, matchingPattern = None, useServiceRef = False, isTop = False):
54                 GUIComponent.__init__(self)
55                 self.l = eListboxPythonMultiContent()
56                 
57                 self.mount_point = None
58                 self.current_directory = None
59                 self.useServiceRef = useServiceRef
60                 self.showDirectories = showDirectories
61                 self.showFiles = showFiles
62                 self.isTop = isTop
63                 # example: matching .nfi and .ts files: "^.*\.(nfi|ts)"
64                 self.matchingPattern = matchingPattern
65                 self.changeDir(directory)
66
67                 self.l.setFont(0, gFont("Regular", 18))
68                 
69         def getSelection(self):
70                 if self.l.getCurrentSelection() is None:
71                         return None
72                 return self.l.getCurrentSelection()[0]
73         
74         def getFileList(self):
75                 return self.list
76         
77         def changeDir(self, directory, select = None):
78                 self.list = []
79                 
80                 # if we are just entering from the list of mount points:
81                 if self.current_directory is None:
82                         self.mount_point = directory
83                 self.current_directory = directory
84                 directories = []
85                 files = []
86                 
87                 if directory is None: # present available mountpoints
88                         print "listing partitions:"
89                         for p in harddiskmanager.getMountedPartitions():
90                                 if p.mountpoint == "/":
91                                         self.list.append(FileEntryComponent(name = p.description, absolute = p.mountpoint, isDir = True))
92                                 else:
93                                         self.list.append(FileEntryComponent(name = p.description, absolute = p.mountpoint + "/", isDir = True))
94                         files = [ ]
95                         directories = [ ]
96                 elif self.useServiceRef:
97                         root = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + directory)
98                         serviceHandler = eServiceCenter.getInstance()
99                         list = serviceHandler.list(root)
100                         
101                         while 1:
102                                 s = list.getNext()
103                                 if not s.valid():
104                                         del list
105                                         break
106                                 if s.flags & s.mustDescent:
107                                         directories.append(s.getPath())
108                                 else:
109                                         files.append(s)
110                                 print s.getName(), s.flags
111                         directories.sort()
112                         files.sort()
113                 else:
114                         files = os.listdir(directory)
115                         files.sort()
116                         tmpfiles = files[:]
117                         for x in tmpfiles:
118                                 if os.path.isdir(directory + x):
119                                         directories.append(directory + x + "/")
120                                         files.remove(x)
121                 
122                 if directory is not None and self.showDirectories and not self.isTop:
123                         if directory == self.mount_point:
124                                 self.list.append(FileEntryComponent(name = ".. (" +_("List of Storage Devices") + ")", absolute = None, isDir = True))
125                         else:
126                                 self.list.append(FileEntryComponent(name = "..", absolute = '/'.join(directory.split('/')[:-2]) + '/', isDir = True))
127
128                 if self.showDirectories:
129                         for x in directories:
130                                 name = x.split('/')[-2]
131                                 self.list.append(FileEntryComponent(name = name, absolute = x, isDir = True))
132
133                 if self.showFiles:
134                         for x in files:
135                                 if self.useServiceRef:
136                                         path = x.getPath()
137                                         name = path.split('/')[-1]
138                                 else:
139                                         path = directory + x
140                                         name = x
141                                 
142                                 if self.matchingPattern is not None:
143                                         if re.compile(self.matchingPattern).search(path):
144                                                 self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
145                                 else:
146                                         self.list.append(FileEntryComponent(name = name, absolute = x , isDir = False))
147
148                 self.l.setList(self.list)
149                 
150                 if select is not None:
151                         i = 0
152                         self.moveToIndex(0)
153                         for x in self.list:
154                                 p = x[0][0]
155                                 
156                                 if isinstance(p, eServiceReference):
157                                         p = p.getPath()
158                                 
159                                 if p == select:
160                                         self.moveToIndex(i)
161                                 i += 1
162
163         def getCurrentDirectory(self):
164                 return self.current_directory
165
166         def canDescent(self):
167                 if self.getSelection() is None:
168                         return False
169                 return self.getSelection()[1]
170         
171         def descent(self):
172                 if self.getSelection() is None:
173                         return
174                 self.changeDir(self.getSelection()[0], select = self.current_directory)
175                 
176         def getFilename(self):
177                 if self.getSelection() is None:
178                         return None
179                 x = self.getSelection()[0]
180                 if isinstance(x, eServiceReference):
181                         x = x.getPath()
182                 return x
183
184         def getServiceRef(self):
185                 if self.getSelection() is None:
186                         return None
187                 x = self.getSelection()[0]
188                 if isinstance(x, eServiceReference):
189                         return x
190                 return None
191
192         GUI_WIDGET = eListbox
193
194         def postWidgetCreate(self, instance):
195                 instance.setContent(self.l)
196                 instance.setItemHeight(23)