from enigma import * from Screens.Screen import Screen from Screens.ServiceInfo import ServiceInfoList, ServiceInfoListEntry from Components.ActionMap import ActionMap, NumberActionMap from Components.Pixmap import Pixmap, MovingPixmap from Components.Label import Label from Components.ConfigList import ConfigList from Components.config import * from Tools.Directories import resolveFilename, SCOPE_MEDIA from Components.FileList import FileEntryComponent, FileList from Components.AVSwitch import AVSwitch from Plugins.Plugin import PluginDescriptor import os config.pic = ConfigSubsection() config.pic.slidetime = ConfigInteger(default=10, limits=(5, 60)) config.pic.resize = ConfigSelection(default="0", choices = [("0", _("simple")), ("1", _("better"))]) config.pic.cache = ConfigEnableDisable(default=True) config.pic.lastDir = ConfigText(default=resolveFilename(SCOPE_MEDIA)) config.pic.rotate = ConfigSelection(default="0", choices = [("0", _("none")), ("1", _("manual")), ("2", _("by Exif"))]) def getAspect(): val = AVSwitch().getAspectRatioSetting() return val/2 #------------------------------------------------------------------------------------------ class ThumbView(Screen): skin = """ """ def __init__(self, session, filelist, name, path): self.skin = ThumbView.skin Screen.__init__(self, session) self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "MovieSelectionActions"], { "cancel": self.Exit, "ok": self.KeyOk, "showEventInfo": self.StartExif, "right": self.key_right, "left": self.key_left, "up": self.key_up, "down": self.key_down }, -1) for x in range(6): self["label"+str(x)] = Label() self["thumb"+str(x)] = Pixmap() self["frame"] = MovingPixmap() self.aspect = getAspect() self.path = path self.filelist = filelist self.currPage = -1 self.index = 0 self.old_index = 0 self.thumblist = [] self.thumbindex = 0 self.list = [] self.poslist = [[50,63],[265,63],[480,63],[50,288],[265,288],[480,288]] count=0 pos=0 for x in self.filelist: if x[0][1] == False: self.list.append((x[0][0], self.path + x[0][0], count/6, pos, "(" + str(count+1) + ") ")) pos += 1 if pos == 6: pos = 0 if x[0][0] == name: self.index = count count += 1 self.maxentry = len(self.list)-1 if self.maxentry < 0: self["label0"].setText(_("no Picture found")) self.ThumbTimer = eTimer() self.ThumbTimer.timeout.get().append(self.showThumb) self.fillPage() def key_left(self): self.index -= 1 if self.index < 0: self.index = self.maxentry self.fillPage() def key_right(self): self.index += 1 if self.index > self.maxentry: self.index = 0 self.fillPage() def key_up(self): self.index -= 3 if self.index < 0: self.index = 0 self.fillPage() def key_down(self): self.index += 3 if self.index > self.maxentry: self.index = self.maxentry self.fillPage() def fillPage(self): if self.maxentry < 0: return self["frame"].moveTo(self.poslist[self.list[self.index][3]][0], self.poslist[self.list[self.index][3]][1], 1) self["frame"].startMoving() if self.list[self.index][2] != self.currPage: self.currPage = self.list[self.index][2] textlist = ["","","","","",""] self.thumblist = ["","","","","",""] for x in self.list: if x[2] == self.currPage: textlist[x[3]] = x[4] + x[0] self.thumblist[x[3]] = x[0] for x in range(6): self["label"+str(x)].setText(textlist[x]) self["thumb"+str(x)].hide() self.ThumbTimer.start(500, True) def showThumb(self): if self.thumblist[self.thumbindex] != "": cachefile = "" if config.pic.cache.value: cachedir = self.path + ".Thumbnails/" if not os.path.exists(cachedir): os.mkdir(cachedir) cachefile = cachedir + self.thumblist[self.thumbindex] + str(180) + str(160) + str(self.aspect) ptr = loadPic(self.path + self.thumblist[self.thumbindex], 180, 160, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value),1, cachefile) if ptr != None: self["thumb"+str(self.thumbindex)].show() self["thumb"+str(self.thumbindex)].instance.setPixmap(ptr.__deref__()) self.thumbindex += 1 if self.thumbindex < 6: self.ThumbTimer.start(500, True) else: self.thumbindex = 0 else: self.thumbindex = 0 def StartExif(self): if self.maxentry < 0: return self.session.open(ExifView, self.list[self.index][1], self.list[self.index][0]) def KeyOk(self): if self.maxentry < 0: return self.old_index = self.index self.session.openWithCallback(self.returnView ,PicView, self.filelist, self.list[self.index][0], self.path) def returnView(self, val=0): self.index = val if self.old_index != self.index: self.fillPage() def Exit(self): self.close(self.index) #------------------------------------------------------------------------------------------ class PicView(Screen): skin = """ """ def __init__(self, session, filelist, name, path): self.skin = PicView.skin Screen.__init__(self, session) self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MovieSelectionActions"], { "cancel": self.Exit, "showEventInfo": self.StartExif, "green": self.Play, "yellow": self.Pause, "blue": self.nextPic, "red": self.prevPic }, -1) self.aspect = getAspect() self.blinking = False self.autoShow = True self.slideOn = False self.pauseOn = False self.index = 0 self.old = 0 self.list = [] count=0 for x in filelist: if x[0][1] == False: self.list.append((x[0][0], path + x[0][0], 0)) if x[0][0] == name: self.index = count count += 1 self.maxentry = len(self.list)-1 self["file"] = Label(_("please wait, loading picture...")) self["picture"] = Pixmap() self["point"] = Pixmap() self["play"] = Pixmap() self["pause"] = Pixmap() self.decodeTimer = eTimer() self.decodeTimer.timeout.get().append(self.decodePic) self.decodeTimer.start(300, True) self.slideTimer = eTimer() self.slideTimer.timeout.get().append(self.slidePic) def Pause(self): if self.slideOn: if self.pauseOn: self.pauseOn=False self["pause"].show() else: self.pauseOn=True self["play"].show() self.slideValue = 0 def Play(self): if self.pauseOn == False: if self.slideOn: self.slideOn=False self["play"].show() else: self.slideOn=True self.slideTimer.start(1000, True) self.slideValue = int(config.pic.slidetime.value) def slidePic(self): if self.slideOn == True and self.pauseOn == False: self.blinkingWidget("play") self.slideValue -= 1 if self.slideValue <= 0: self.slideValue = int(config.pic.slidetime.value) self.nextPic() self.slideTimer.start(1000, True) if self.pauseOn: self.blinkingWidget("pause") self.slideTimer.start(1000, True) def decodePic(self): self.currPic = loadPic(self.list[self.index][1], 560, 450, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value),1) self["point"].hide() if self.autoShow: self.showPic() self.autoShow = False def showPic(self): if self.currPic != None: self.old = self.index self["file"].setText(self.list[self.old][0] + " (" + str(self.old+1) + "/" + str(self.maxentry+1) + ")") self["picture"].instance.setPixmap(self.currPic.__deref__()) self.next() self["point"].show() self.decodeTimer.start(300, True) def nextPic(self): self.showPic() def prevPic(self): self.index = self.old self.prev() self.autoShow = True self["point"].show() self.decodeTimer.start(300, True) def next(self): self.index += 1 if self.index > self.maxentry: self.index = 0 def prev(self): self.index -= 1 if self.index < 0: self.index = self.maxentry def blinkingWidget(self, name): if self.blinking: self.blinking=False self[name].show() else: self.blinking=True self[name].hide() def StartExif(self): if self.pauseOn == False: self.Pause() self.session.openWithCallback(self.StopExif ,ExifView, self.list[self.old][1], self.list[self.old][0]) def StopExif(self): if self.pauseOn: self.Pause() def Exit(self): self.close(self.old) #------------------------------------------------------------------------------------------ class ExifView(Screen): skin = """ """ def __init__(self, session, fullname, name): self.skin = ExifView.skin Screen.__init__(self, session) self["actions"] = ActionMap(["OkCancelActions"], { "cancel": self.close }, -1) dlist = ["Name:", "EXIF-Version:", "Camera-Make:", "Camera-Model:", "Date/Time:", "User Comments:", "Width / Height:", "Orientation:", "Metering Mode:", "Exposure Program:", "Light Source:", "Flash used:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] tlist = [ ] self["exiflist"] = ServiceInfoList(tlist) tlist.append(ServiceInfoListEntry(dlist[0], name)) count=1 for x in getExif(fullname): tlist.append(ServiceInfoListEntry(dlist[count], x)) count += 1 #------------------------------------------------------------------------------------------ class PicSetup(Screen): skin = """ """ def __init__(self, session): self.skin = PicSetup.skin Screen.__init__(self, session) self["actions"] = NumberActionMap(["SetupActions"], { "cancel": self.close, "left": self.keyLeft, "right": self.keyRight, "0": self.keyNumber, "1": self.keyNumber, "2": self.keyNumber, "3": self.keyNumber, "4": self.keyNumber, "5": self.keyNumber, "6": self.keyNumber, "7": self.keyNumber, "8": self.keyNumber, "9": self.keyNumber }, -1) self.list = [] self["liste"] = ConfigList(self.list) self.list.append(getConfigListEntry(_("Slideshow Interval (sec.)"), config.pic.slidetime)) self.list.append(getConfigListEntry(_("Scaling Mode"), config.pic.resize)) self.list.append(getConfigListEntry(_("Cache Thumbnails"), config.pic.cache)) #self.list.append(getConfigListEntry(_("Rotate Picture"), config.pic.rotate)) def keyLeft(self): self["liste"].handleKey(KEY_LEFT) def keyRight(self): self["liste"].handleKey(KEY_RIGHT) def keyNumber(self, number): self["liste"].handleKey(KEY_0 + number) #------------------------------------------------------------------------------------------ class picmain(Screen): skin = """ """ def __init__(self, session): self.skin = picmain.skin Screen.__init__(self, session) self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "MovieSelectionActions"], { "ok": self.KeyOk, "cancel": self.Exit, "right": self.rightDown, "left": self.leftUp, "up": self.up, "down": self.down, "showEventInfo": self.StartExif, "contextMenu": self.Settings, "red": self.StartThumb }, -1) self.aspect = getAspect() currDir = config.pic.lastDir.value if not os.path.exists(currDir): currDir = "/" self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|png|bmp)") self["filelist"] = self.filelist self["thumbnail"] = Pixmap() self.ThumbTimer = eTimer() self.ThumbTimer.timeout.get().append(self.showThumb) self.ThumbTimer.start(500, True) def up(self): self["filelist"].up() self.ThumbTimer.start(1500, True) def down(self): self["filelist"].down() self.ThumbTimer.start(1500, True) def leftUp(self): self["filelist"].pageUp() self.ThumbTimer.start(1500, True) def rightDown(self): self["filelist"].pageDown() self.ThumbTimer.start(1500, True) def showThumb(self): if not self.filelist.canDescent(): print self.filelist.getCurrentDirectory() cachefile = "" if config.pic.cache.value: cachedir = self.filelist.getCurrentDirectory() + ".Thumbnails/" if not os.path.exists(cachedir): os.mkdir(cachedir) cachefile = cachedir + self.filelist.getSelection()[0] + str(180) + str(160) + str(self.aspect) ptr = loadPic(self.filelist.getCurrentDirectory() + self.filelist.getSelection()[0], 180, 160, self.aspect, int(config.pic.resize.value), 0, 0, cachefile) if ptr != None: self["thumbnail"].show() self["thumbnail"].instance.setPixmap(ptr.__deref__()) else: self["thumbnail"].hide() def KeyOk(self): if self.filelist.canDescent(): self.filelist.descent() else: self.session.openWithCallback(self.returnVal, PicView, self.filelist.getFileList(), self.filelist.getSelection()[0], self.filelist.getCurrentDirectory()) def StartThumb(self): self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getSelection()[0], self.filelist.getCurrentDirectory()) def returnVal(self, val=0): if val > 0: for x in self.filelist.getFileList(): if x[0][1] == True: val += 1 self.filelist.moveToIndex(val) def StartExif(self): if not self.filelist.canDescent(): self.session.open(ExifView, self.filelist.getCurrentDirectory() + self.filelist.getFilename(), self.filelist.getSelection()[0]) def Settings(self): self.session.open(PicSetup) def Exit(self): if self.filelist.getCurrentDirectory() is None: config.pic.lastDir.value = "/" else: config.pic.lastDir.value = self.filelist.getCurrentDirectory() config.pic.save() self.close() #------------------------------------------------------------------------------------------ def main(session, **kwargs): session.open(picmain) def Plugins(**kwargs): return PluginDescriptor(name="PicturePlayer", description="Picture Viewer (BMP, PNG, JPG)", icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main)