enigma2 (20120309 rel32 -> 20120321 rel32)
[enigma2.git] / usr / lib / enigma2 / python / Plugins / Extensions / PicturePlayer / plugin.py
1 from enigma import ePicLoad, eTimer, getDesktop
2
3 from Screens.Screen import Screen
4 from Tools.Directories import resolveFilename, pathExists, fileExists, SCOPE_MEDIA
5 from Plugins.Plugin import PluginDescriptor
6
7 from Components.Pixmap import Pixmap, MovingPixmap
8 from Components.ActionMap import ActionMap, NumberActionMap
9 from Components.Sources.StaticText import StaticText
10 from Components.FileList import FileList
11 from Components.AVSwitch import AVSwitch
12 from Components.Sources.List import List
13 from Components.ConfigList import ConfigList, ConfigListScreen
14
15 from Components.config import config, ConfigSubsection, ConfigInteger, ConfigSelection, ConfigText, ConfigEnableDisable, KEY_LEFT, KEY_RIGHT, KEY_0, getConfigListEntry
16
17 def getScale():
18         return AVSwitch().getFramebufferScale()
19
20 config.pic = ConfigSubsection()
21 config.pic.framesize = ConfigInteger(default=30, limits=(5, 99))
22 config.pic.slidetime = ConfigInteger(default=10, limits=(10, 60))
23 config.pic.resize = ConfigSelection(default="1", choices = [("0", _("simple")), ("1", _("better"))])
24 config.pic.cache = ConfigEnableDisable(default=True)
25 config.pic.lastDir = ConfigText(default=resolveFilename(SCOPE_MEDIA))
26 config.pic.infoline = ConfigEnableDisable(default=True)
27 config.pic.loop = ConfigEnableDisable(default=True)
28 config.pic.bgcolor = ConfigSelection(default="#00000000", choices = [("#00000000", _("black")),("#009eb9ff", _("blue")),("#00ff5a51", _("red")), ("#00ffe875", _("yellow")), ("#0038FF48", _("green"))])
29 config.pic.textcolor = ConfigSelection(default="#0038FF48", choices = [("#00000000", _("black")),("#009eb9ff", _("blue")),("#00ff5a51", _("red")), ("#00ffe875", _("yellow")), ("#0038FF48", _("green"))])
30
31 class picshow(Screen):
32         skin = """
33                 <screen name="picshow" position="center,center" size="560,440" title="PicturePlayer" >
34                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
35                         <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
36                         <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
37                         <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
38                         <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
39                         <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
40                         <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
41                         <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
42                         <widget source="label" render="Label" position="5,55" size="350,140" font="Regular;19" backgroundColor="#25062748" transparent="1"  />
43                         <widget name="thn" position="360,40" size="180,160" alphatest="on" />
44                         <widget name="filelist" position="5,205" zPosition="2" size="550,230" scrollbarMode="showOnDemand" />
45                 </screen>"""
46
47         def __init__(self, session):
48                 Screen.__init__(self, session)
49
50                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions"],
51                 {
52                         "cancel": self.KeyExit,
53                         "red": self.KeyExit,
54                         "green": self.KeyGreen,
55                         "yellow": self.KeyYellow,
56                         "blue": self.KeyBlue,
57                         "ok": self.KeyOk
58                 }, -1)
59
60                 self["key_red"] = StaticText(_("Close"))
61                 self["key_green"] = StaticText(_("Thumbnails"))
62                 self["key_yellow"] = StaticText("")
63                 self["key_blue"] = StaticText(_("Setup"))
64                 self["label"] = StaticText("")
65                 self["thn"] = Pixmap()
66
67                 currDir = config.pic.lastDir.value
68                 if not pathExists(currDir):
69                         currDir = "/"
70
71                 self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)")
72                 self["filelist"] = self.filelist
73                 self["filelist"].onSelectionChanged.append(self.selectionChanged)
74
75                 self.ThumbTimer = eTimer()
76                 self.ThumbTimer.callback.append(self.showThumb)
77
78                 self.picload = ePicLoad()
79                 self.picload.PictureData.get().append(self.showPic)
80
81                 self.onLayoutFinish.append(self.setConf)
82
83         def showPic(self, picInfo=""):
84                 ptr = self.picload.getData()
85                 if ptr != None:
86                         self["thn"].instance.setPixmap(ptr.__deref__())
87                         self["thn"].show()
88
89                 text = picInfo.split('\n',1)
90                 self["label"].setText(text[1])
91                 self["key_yellow"].setText(_("Exif"))
92
93         def showThumb(self):
94                 if not self.filelist.canDescent():
95                         if self.filelist.getCurrentDirectory() and self.filelist.getFilename():
96                                 if self.picload.getThumbnail(self.filelist.getCurrentDirectory() + self.filelist.getFilename()) == 1:
97                                         self.ThumbTimer.start(500, True)
98
99         def selectionChanged(self):
100                 if not self.filelist.canDescent():
101                         self.ThumbTimer.start(500, True)
102                 else:
103                         self["label"].setText("")
104                         self["thn"].hide()
105                         self["key_yellow"].setText("")
106
107         def KeyGreen(self):
108                 #if not self.filelist.canDescent():
109                 self.session.openWithCallback(self.callbackView, Pic_Thumb, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory())
110
111         def KeyYellow(self):
112                 if not self.filelist.canDescent():
113                         self.session.open(Pic_Exif, self.picload.getInfo(self.filelist.getCurrentDirectory() + self.filelist.getFilename()))
114
115         def KeyBlue(self):
116                 self.session.openWithCallback(self.setConf ,Pic_Setup)
117
118         def KeyOk(self):
119                 if self.filelist.canDescent():
120                         self.filelist.descent()
121                 else:
122                         self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist.getFileList(), self.filelist.getSelectionIndex(), self.filelist.getCurrentDirectory())
123
124         def setConf(self):
125                 self.setTitle(_("PicturePlayer"))
126                 sc = getScale()
127                 #0=Width 1=Height 2=Aspect 3=use_cache 4=resize_type 5=Background(#AARRGGBB)
128                 self.picload.setPara((self["thn"].instance.size().width(), self["thn"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), "#00000000"))
129
130         def callbackView(self, val=0):
131                 if val > 0:
132                         self.filelist.moveToIndex(val)
133
134         def KeyExit(self):
135                 del self.picload
136
137                 if self.filelist.getCurrentDirectory() is None:
138                         config.pic.lastDir.value = "/"
139                 else:
140                         config.pic.lastDir.value = self.filelist.getCurrentDirectory()
141
142                 config.pic.save()
143                 self.close()
144
145 #------------------------------------------------------------------------------------------
146
147 class Pic_Setup(Screen, ConfigListScreen):
148
149         def __init__(self, session):
150                 Screen.__init__(self, session)
151                 # for the skin: first try MediaPlayerSettings, then Setup, this allows individual skinning
152                 self.skinName = ["PicturePlayerSetup", "Setup" ]
153                 self.setup_title = _("Settings")
154                 self.onChangedEntry = [ ]
155                 self.session = session
156
157                 self["actions"] = ActionMap(["SetupActions"],
158                         {
159                                 "cancel": self.keyCancel,
160                                 "save": self.keySave,
161                                 "ok": self.keySave,
162                         }, -2)
163
164                 self["key_red"] = StaticText(_("Cancel"))
165                 self["key_green"] = StaticText(_("OK"))
166
167                 self.list = []
168                 ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry)
169                 self.createSetup()
170                 self.onLayoutFinish.append(self.layoutFinished)
171
172         def layoutFinished(self):
173                 self.setTitle(self.setup_title)
174
175         def createSetup(self):
176                 self.list = []
177                 self.list.append(getConfigListEntry(_("Slideshow Interval (sec.)"), config.pic.slidetime))
178                 self.list.append(getConfigListEntry(_("Scaling Mode"), config.pic.resize))
179                 self.list.append(getConfigListEntry(_("Cache Thumbnails"), config.pic.cache))
180                 self.list.append(getConfigListEntry(_("show Infoline"), config.pic.infoline))
181                 self.list.append(getConfigListEntry(_("Frame size in full view"), config.pic.framesize))
182                 self.list.append(getConfigListEntry(_("slide picture in loop"), config.pic.loop))
183                 self.list.append(getConfigListEntry(_("backgroundcolor"), config.pic.bgcolor))
184                 self.list.append(getConfigListEntry(_("textcolor"), config.pic.textcolor))
185                 self["config"].list = self.list
186                 self["config"].l.setList(self.list)
187
188         def keyLeft(self):
189                 ConfigListScreen.keyLeft(self)
190
191         def keyRight(self):
192                 ConfigListScreen.keyRight(self)
193
194         # for summary:
195         def changedEntry(self):
196                 for x in self.onChangedEntry:
197                         x()
198
199         def getCurrentEntry(self):
200                 return self["config"].getCurrent()[0]
201
202         def getCurrentValue(self):
203                 return str(self["config"].getCurrent()[1].getText())
204
205         def createSummary(self):
206                 from Screens.Setup import SetupSummary
207                 return SetupSummary
208
209 #---------------------------------------------------------------------------
210
211 class Pic_Exif(Screen):
212         skin = """
213                 <screen name="Pic_Exif" position="center,center" size="560,360" title="Info" >
214                         <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
215                         <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
216                         <widget source="menu" render="Listbox" position="5,50" size="550,310" scrollbarMode="showOnDemand" selectionDisabled="1" >
217                                 <convert type="TemplatedMultiContent">
218                                 {
219                                         "template": [  MultiContentEntryText(pos = (5, 5), size = (250, 30), flags = RT_HALIGN_LEFT, text = 0), MultiContentEntryText(pos = (260, 5), size = (290, 30), flags = RT_HALIGN_LEFT, text = 1)],
220                                         "fonts": [gFont("Regular", 20)],
221                                         "itemHeight": 30
222                                 }
223                                 </convert>
224                         </widget>
225                 </screen>"""
226
227         def __init__(self, session, exiflist):
228                 Screen.__init__(self, session)
229
230                 self["actions"] = ActionMap(["SetupActions", "ColorActions"],
231                 {
232                         "cancel": self.close
233                 }, -1)
234
235                 self["key_red"] = StaticText(_("Close"))
236
237                 exifdesc = [_("filename")+':', "EXIF-Version:", "Make:", "Camera:", "Date/Time:", "Width / Height:", "Flash used:", "Orientation:", "User Comments:", "Metering Mode:", "Exposure Program:", "Light Source:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"]
238                 list = []
239
240                 for x in range(len(exiflist)):
241                         if x>0:
242                                 list.append((exifdesc[x], exiflist[x]))
243                         else:
244                                 name = exiflist[x].split('/')[-1]
245                                 list.append((exifdesc[x], name))
246                 self["menu"] = List(list)
247                 self.onLayoutFinish.append(self.layoutFinished)
248
249         def layoutFinished(self):
250                 self.setTitle(_("Info"))
251
252 #----------------------------------------------------------------------------------------
253
254 T_INDEX = 0
255 T_FRAME_POS = 1
256 T_PAGE = 2
257 T_NAME = 3
258 T_FULL = 4
259
260 class Pic_Thumb(Screen):
261         def __init__(self, session, piclist, lastindex, path):
262
263                 self.textcolor = config.pic.textcolor.value
264                 self.color = config.pic.bgcolor.value
265                 textsize = 20
266                 self.spaceX = 35
267                 self.picX = 190
268                 self.spaceY = 30
269                 self.picY = 200
270
271                 size_w = getDesktop(0).size().width()
272                 size_h = getDesktop(0).size().height()
273                 self.thumbsX = size_w / (self.spaceX + self.picX) # thumbnails in X
274                 self.thumbsY = size_h / (self.spaceY + self.picY) # thumbnails in Y
275                 self.thumbsC = self.thumbsX * self.thumbsY # all thumbnails
276
277                 self.positionlist = []
278                 skincontent = ""
279
280                 posX = -1
281                 for x in range(self.thumbsC):
282                         posY = x / self.thumbsX
283                         posX += 1
284                         if posX >= self.thumbsX:
285                                 posX = 0
286
287                         absX = self.spaceX + (posX*(self.spaceX + self.picX))
288                         absY = self.spaceY + (posY*(self.spaceY + self.picY))
289                         self.positionlist.append((absX, absY))
290                         skincontent += "<widget source=\"label" + str(x) + "\" render=\"Label\" position=\"" + str(absX+5) + "," + str(absY+self.picY-textsize) + "\" size=\"" + str(self.picX - 10) + ","  + str(textsize) + "\" font=\"Regular;14\" zPosition=\"2\" transparent=\"1\" noWrap=\"1\" foregroundColor=\"" + self.textcolor + "\" />"
291                         skincontent += "<widget name=\"thumb" + str(x) + "\" position=\"" + str(absX+5)+ "," + str(absY+5) + "\" size=\"" + str(self.picX -10) + "," + str(self.picY - (textsize*2)) + "\" zPosition=\"2\" transparent=\"1\" alphatest=\"on\" />"
292
293                 # Screen, backgroundlabel and MovingPixmap
294                 self.skin = "<screen position=\"0,0\" size=\"" + str(size_w) + "," + str(size_h) + "\" flags=\"wfNoBorder\" > \
295                         <eLabel position=\"0,0\" zPosition=\"0\" size=\""+ str(size_w) + "," + str(size_h) + "\" backgroundColor=\"" + self.color + "\" /><widget name=\"frame\" position=\"35,30\" size=\"190,200\" pixmap=\"pic_frame.png\" zPosition=\"1\" alphatest=\"on\" />"  + skincontent + "</screen>"
296
297                 Screen.__init__(self, session)
298
299                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "MovieSelectionActions"],
300                 {
301                         "cancel": self.Exit,
302                         "ok": self.KeyOk,
303                         "left": self.key_left,
304                         "right": self.key_right,
305                         "up": self.key_up,
306                         "down": self.key_down,
307                         "showEventInfo": self.StartExif,
308                 }, -1)
309
310                 self["frame"] = MovingPixmap()
311                 for x in range(self.thumbsC):
312                         self["label"+str(x)] = StaticText()
313                         self["thumb"+str(x)] = Pixmap()
314
315                 self.Thumbnaillist = []
316                 self.filelist = []
317                 self.currPage = -1
318                 self.dirlistcount = 0
319                 self.path = path
320
321                 index = 0
322                 framePos = 0
323                 Page = 0
324                 for x in piclist:
325                         if x[0][1] == False:
326                                 self.filelist.append((index, framePos, Page, x[0][0],  path + x[0][0]))
327                                 index += 1
328                                 framePos += 1
329                                 if framePos > (self.thumbsC -1):
330                                         framePos = 0
331                                         Page += 1
332                         else:
333                                 self.dirlistcount += 1
334
335                 self.maxentry = len(self.filelist)-1
336                 self.index = lastindex - self.dirlistcount
337                 if self.index < 0:
338                         self.index = 0
339
340                 self.picload = ePicLoad()
341                 self.picload.PictureData.get().append(self.showPic)
342
343                 self.onLayoutFinish.append(self.setPicloadConf)
344
345                 self.ThumbTimer = eTimer()
346                 self.ThumbTimer.callback.append(self.showPic)
347
348         def setPicloadConf(self):
349                 sc = getScale()
350                 self.picload.setPara([self["thumb0"].instance.size().width(), self["thumb0"].instance.size().height(), sc[0], sc[1], config.pic.cache.value, int(config.pic.resize.value), self.color])
351                 self.paintFrame()
352
353         def paintFrame(self):
354                 #print "index=" + str(self.index)
355                 if self.maxentry < self.index or self.index < 0:
356                         return
357
358                 pos = self.positionlist[self.filelist[self.index][T_FRAME_POS]]
359                 self["frame"].moveTo( pos[0], pos[1], 1)
360                 self["frame"].startMoving()
361
362                 if self.currPage != self.filelist[self.index][T_PAGE]:
363                         self.currPage = self.filelist[self.index][T_PAGE]
364                         self.newPage()
365
366         def newPage(self):
367                 self.Thumbnaillist = []
368                 #clear Labels and Thumbnail
369                 for x in range(self.thumbsC):
370                         self["label"+str(x)].setText("")
371                         self["thumb"+str(x)].hide()
372                 #paint Labels and fill Thumbnail-List
373                 for x in self.filelist:
374                         if x[T_PAGE] == self.currPage:
375                                 self["label"+str(x[T_FRAME_POS])].setText("(" + str(x[T_INDEX]+1) + ") " + x[T_NAME])
376                                 self.Thumbnaillist.append([0, x[T_FRAME_POS], x[T_FULL]])
377
378                 #paint Thumbnail start
379                 self.showPic()
380
381         def showPic(self, picInfo=""):
382                 for x in range(len(self.Thumbnaillist)):
383                         if self.Thumbnaillist[x][0] == 0:
384                                 if self.picload.getThumbnail(self.Thumbnaillist[x][2]) == 1: #zu tun probier noch mal
385                                         self.ThumbTimer.start(500, True)
386                                 else:
387                                         self.Thumbnaillist[x][0] = 1
388                                 break
389                         elif self.Thumbnaillist[x][0] == 1:
390                                 self.Thumbnaillist[x][0] = 2
391                                 ptr = self.picload.getData()
392                                 if ptr != None:
393                                         self["thumb" + str(self.Thumbnaillist[x][1])].instance.setPixmap(ptr.__deref__())
394                                         self["thumb" + str(self.Thumbnaillist[x][1])].show()
395
396         def key_left(self):
397                 self.index -= 1
398                 if self.index < 0:
399                         self.index = self.maxentry
400                 self.paintFrame()
401
402         def key_right(self):
403                 self.index += 1
404                 if self.index > self.maxentry:
405                         self.index = 0
406                 self.paintFrame()
407
408         def key_up(self):
409                 self.index -= self.thumbsX
410                 if self.index < 0:
411                         self.index =self.maxentry
412                 self.paintFrame()
413
414         def key_down(self):
415                 self.index += self.thumbsX
416                 if self.index > self.maxentry:
417                         self.index = 0
418                 self.paintFrame()
419
420         def StartExif(self):
421                 if self.maxentry < 0:
422                         return
423                 self.session.open(Pic_Exif, self.picload.getInfo(self.filelist[self.index][T_FULL]))
424
425         def KeyOk(self):
426                 if self.maxentry < 0:
427                         return
428                 self.old_index = self.index
429                 self.session.openWithCallback(self.callbackView, Pic_Full_View, self.filelist, self.index, self.path)
430
431         def callbackView(self, val=0):
432                 self.index = val
433                 if self.old_index != self.index:
434                         self.paintFrame()
435         def Exit(self):
436                 del self.picload
437                 self.close(self.index + self.dirlistcount)
438
439 #---------------------------------------------------------------------------
440
441 class Pic_Full_View(Screen):
442         def __init__(self, session, filelist, index, path):
443
444                 self.textcolor = config.pic.textcolor.value
445                 self.bgcolor = config.pic.bgcolor.value
446                 space = config.pic.framesize.value
447                 size_w = getDesktop(0).size().width()
448                 size_h = getDesktop(0).size().height()
449
450                 self.skin = "<screen position=\"0,0\" size=\"" + str(size_w) + "," + str(size_h) + "\" flags=\"wfNoBorder\" > \
451                         <eLabel position=\"0,0\" zPosition=\"0\" size=\""+ str(size_w) + "," + str(size_h) + "\" backgroundColor=\""+ self.bgcolor +"\" /><widget name=\"pic\" position=\"" + str(space) + "," + str(space) + "\" size=\"" + str(size_w-(space*2)) + "," + str(size_h-(space*2)) + "\" zPosition=\"1\" alphatest=\"on\" /> \
452                         <widget name=\"point\" position=\""+ str(space+5) + "," + str(space+2) + "\" size=\"20,20\" zPosition=\"2\" pixmap=\"skin_default/icons/record.png\" alphatest=\"on\" /> \
453                         <widget name=\"play_icon\" position=\""+ str(space+25) + "," + str(space+2) + "\" size=\"20,20\" zPosition=\"2\" pixmap=\"skin_default/icons/ico_mp_play.png\"  alphatest=\"on\" /> \
454                         <widget source=\"file\" render=\"Label\" position=\""+ str(space+45) + "," + str(space) + "\" size=\""+ str(size_w-(space*2)-50) + ",25\" font=\"Regular;20\" halign=\"left\" foregroundColor=\"" + self.textcolor + "\" zPosition=\"2\" noWrap=\"1\" transparent=\"1\" /></screen>"
455
456                 Screen.__init__(self, session)
457
458                 self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "DirectionActions", "MovieSelectionActions"],
459                 {
460                         "cancel": self.Exit,
461                         "green": self.PlayPause,
462                         "yellow": self.PlayPause,
463                         "blue": self.nextPic,
464                         "red": self.prevPic,
465                         "left": self.prevPic,
466                         "right": self.nextPic,
467                         "showEventInfo": self.StartExif,
468                 }, -1)
469
470                 self["point"] = Pixmap()
471                 self["pic"] = Pixmap()
472                 self["play_icon"] = Pixmap()
473                 self["file"] = StaticText(_("please wait, loading picture..."))
474
475                 self.old_index = 0
476                 self.filelist = []
477                 self.lastindex = index
478                 self.currPic = []
479                 self.shownow = True
480                 self.dirlistcount = 0
481
482                 for x in filelist:
483                         if len(filelist[0]) == 3: #orig. filelist
484                                 if x[0][1] == False:
485                                         self.filelist.append(path + x[0][0])
486                                 else:
487                                         self.dirlistcount += 1
488                         elif len(filelist[0]) == 2: #scanlist
489                                 if x[0][1] == False:
490                                         self.filelist.append(x[0][0])
491                                 else:
492                                         self.dirlistcount += 1
493                         else: # thumbnaillist
494                                 self.filelist.append(x[T_FULL])
495
496                 self.maxentry = len(self.filelist)-1
497                 self.index = index - self.dirlistcount
498                 if self.index < 0:
499                         self.index = 0
500
501                 self.picload = ePicLoad()
502                 self.picload.PictureData.get().append(self.finish_decode)
503
504                 self.slideTimer = eTimer()
505                 self.slideTimer.callback.append(self.slidePic)
506
507                 if self.maxentry >= 0:
508                         self.onLayoutFinish.append(self.setPicloadConf)
509
510         def setPicloadConf(self):
511                 sc = getScale()
512                 self.picload.setPara([self["pic"].instance.size().width(), self["pic"].instance.size().height(), sc[0], sc[1], 0, int(config.pic.resize.value), self.bgcolor])
513
514                 self["play_icon"].hide()
515                 if not config.pic.infoline.value:
516                         self["file"].setText("")
517                 self.start_decode()
518
519         def ShowPicture(self):
520                 if self.shownow and len(self.currPic):
521                         self.shownow = False
522                         if not config.pic.infoline.value:
523                                 self["play_icon"].hide()
524                                 self["file"].setText("")
525                         else:                   
526                                 self["file"].setText(self.currPic[0])
527                         self.lastindex = self.currPic[1]
528                         self["pic"].instance.setPixmap(self.currPic[2].__deref__())
529                         self.currPic = []
530
531                         self.next()
532                         self.start_decode()
533
534         def finish_decode(self, picInfo=""):
535                 self["point"].hide()
536                 ptr = self.picload.getData()
537                 if ptr != None:
538                         text = ""
539                         try:
540                                 text = picInfo.split('\n',1)
541                                 text = "(" + str(self.index+1) + "/" + str(self.maxentry+1) + ") " + text[0].split('/')[-1]
542                         except:
543                                 pass
544                         self.currPic = []
545                         self.currPic.append(text)
546                         self.currPic.append(self.index)
547                         self.currPic.append(ptr)
548                         self.ShowPicture()
549
550         def start_decode(self):
551                 self.picload.startDecode(self.filelist[self.index])
552                 self["point"].show()
553
554         def next(self):
555                 self.index += 1
556                 if self.index > self.maxentry:
557                         self.index = 0
558
559         def prev(self):
560                 self.index -= 1
561                 if self.index < 0:
562                         self.index = self.maxentry
563
564         def slidePic(self):
565                 print "slide to next Picture index=" + str(self.lastindex)
566                 if config.pic.loop.value==False and self.lastindex == self.maxentry:
567                         self.PlayPause()
568                 self.shownow = True
569                 self.ShowPicture()
570
571         def PlayPause(self):
572                 if self.slideTimer.isActive():
573                         self.slideTimer.stop()
574                         self["play_icon"].hide()
575                 else:
576                         self.slideTimer.start(config.pic.slidetime.value*1000)
577                         self["play_icon"].show()
578                         self.nextPic()
579
580         def prevPic(self):
581                 self.currPic = []
582                 self.index = self.lastindex
583                 self.prev()
584                 self.start_decode()
585                 self.shownow = True
586
587         def nextPic(self):
588                 self.shownow = True
589                 self.ShowPicture()
590
591         def StartExif(self):
592                 if self.maxentry < 0:
593                         return
594                 self.session.open(Pic_Exif, self.picload.getInfo(self.filelist[self.lastindex]))
595
596         def Exit(self):
597                 del self.picload
598                 self.close(self.lastindex + self.dirlistcount)
599
600 #------------------------------------------------------------------------------------------
601
602 def main(session, **kwargs):
603         session.open(picshow)
604
605 def filescan_open(list, session, **kwargs):
606         # Recreate List as expected by PicView
607         filelist = [((file.path, False), None) for file in list]
608         session.open(Pic_Full_View, filelist, 0, file.path)
609
610 def filescan(**kwargs):
611         from Components.Scanner import Scanner, ScanPath
612
613         # Overwrite checkFile to only detect local
614         class LocalScanner(Scanner):
615                 def checkFile(self, file):
616                         return fileExists(file.path)
617
618         return \
619                 LocalScanner(mimetypes = ["image/jpeg", "image/png", "image/gif", "image/bmp"],
620                         paths_to_scan = 
621                                 [
622                                         ScanPath(path = "DCIM", with_subdirs = True),
623                                         ScanPath(path = "", with_subdirs = False),
624                                 ],
625                         name = "Pictures", 
626                         description = _("View Photos..."),
627                         openfnc = filescan_open,
628                 )
629
630 def Plugins(**kwargs):
631         return \
632                 [PluginDescriptor(name=_("PicturePlayer"), description=_("fileformats (BMP, PNG, JPG, GIF)"), icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = False, fnc=main),
633                  PluginDescriptor(name=_("PicturePlayer"), where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan)]