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